int __jbd2_journal_clean_checkpoint_list(journal_t *journal) { transaction_t *transaction, *last_transaction, *next_transaction; int ret = 0; int released; transaction = journal->j_checkpoint_transactions; if (!transaction) goto out; last_transaction = transaction->t_cpprev; next_transaction = transaction; do { transaction = next_transaction; next_transaction = transaction->t_cpnext; ret += journal_clean_one_cp_list(transaction-> t_checkpoint_list, &released); if (need_resched()) goto out; if (released) continue; ret += journal_clean_one_cp_list(transaction-> t_checkpoint_io_list, &released); if (need_resched()) goto out; } while (transaction != last_transaction); out: return ret; }
/* * journal_clean_checkpoint_list * * Find all the written-back checkpoint buffers in the journal and release them. * If 'destroy' is set, release all buffers unconditionally. * * Called with j_list_lock held. */ void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy) { transaction_t *transaction, *last_transaction, *next_transaction; int ret; transaction = journal->j_checkpoint_transactions; if (!transaction) return; last_transaction = transaction->t_cpprev; next_transaction = transaction; do { transaction = next_transaction; next_transaction = transaction->t_cpnext; ret = journal_clean_one_cp_list(transaction->t_checkpoint_list, destroy); /* * This function only frees up some memory if possible so we * dont have an obligation to finish processing. Bail out if * preemption requested: */ if (need_resched()) return; if (ret) continue; /* * It is essential that we are as careful as in the case of * t_checkpoint_list with removing the buffer from the list as * we can possibly see not yet submitted buffers on io_list */ ret = journal_clean_one_cp_list(transaction-> t_checkpoint_io_list, destroy); if (need_resched()) return; /* * Stop scanning if we couldn't free the transaction. This * avoids pointless scanning of transactions which still * weren't checkpointed. */ if (!ret) return; } while (transaction != last_transaction); }
int __jbd2_journal_clean_checkpoint_list(journal_t *journal) { transaction_t *transaction, *last_transaction, *next_transaction; int ret = 0; int released; transaction = journal->j_checkpoint_transactions; if (!transaction) goto out; last_transaction = transaction->t_cpprev; next_transaction = transaction; do { transaction = next_transaction; next_transaction = transaction->t_cpnext; ret += journal_clean_one_cp_list(transaction-> t_checkpoint_list, &released); /* * This function only frees up some memory if possible so we * dont have an obligation to finish processing. Bail out if * preemption requested: */ if (need_resched()) goto out; if (released) continue; /* * It is essential that we are as careful as in the case of * t_checkpoint_list with removing the buffer from the list as * we can possibly see not yet submitted buffers on io_list */ ret += journal_clean_one_cp_list(transaction-> t_checkpoint_io_list, &released); if (need_resched()) goto out; } while (transaction != last_transaction); out: return ret; }