diff options
Diffstat (limited to 'fs/jbd2/checkpoint.c')
| -rw-r--r-- | fs/jbd2/checkpoint.c | 24 | 
1 files changed, 13 insertions, 11 deletions
diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c index 1c97e64c4784..951f78634adf 100644 --- a/fs/jbd2/checkpoint.c +++ b/fs/jbd2/checkpoint.c @@ -337,8 +337,6 @@ int jbd2_cleanup_journal_tail(journal_t *journal)  /* Checkpoint list management */ -enum shrink_type {SHRINK_DESTROY, SHRINK_BUSY_STOP, SHRINK_BUSY_SKIP}; -  /*   * journal_shrink_one_cp_list   * @@ -350,7 +348,7 @@ enum shrink_type {SHRINK_DESTROY, SHRINK_BUSY_STOP, SHRINK_BUSY_SKIP};   * Called with j_list_lock held.   */  static unsigned long journal_shrink_one_cp_list(struct journal_head *jh, -						enum shrink_type type, +						enum jbd2_shrink_type type,  						bool *released)  {  	struct journal_head *last_jh; @@ -367,12 +365,12 @@ static unsigned long journal_shrink_one_cp_list(struct journal_head *jh,  		jh = next_jh;  		next_jh = jh->b_cpnext; -		if (type == SHRINK_DESTROY) { +		if (type == JBD2_SHRINK_DESTROY) {  			ret = __jbd2_journal_remove_checkpoint(jh);  		} else {  			ret = jbd2_journal_try_remove_checkpoint(jh);  			if (ret < 0) { -				if (type == SHRINK_BUSY_SKIP) +				if (type == JBD2_SHRINK_BUSY_SKIP)  					continue;  				break;  			} @@ -439,7 +437,7 @@ again:  		tid = transaction->t_tid;  		freed = journal_shrink_one_cp_list(transaction->t_checkpoint_list, -						   SHRINK_BUSY_SKIP, &released); +						   JBD2_SHRINK_BUSY_SKIP, &released);  		nr_freed += freed;  		(*nr_to_scan) -= min(*nr_to_scan, freed);  		if (*nr_to_scan == 0) @@ -472,21 +470,25 @@ out:   * 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. + * If 'type' is JBD2_SHRINK_DESTROY, release all buffers unconditionally. If + * 'type' is JBD2_SHRINK_BUSY_STOP, will stop release buffers if encounters a + * busy buffer. To avoid wasting CPU cycles scanning the buffer list in some + * cases, don't pass JBD2_SHRINK_BUSY_SKIP 'type' for this function.   *   * Called with j_list_lock held.   */ -void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy) +void __jbd2_journal_clean_checkpoint_list(journal_t *journal, +					  enum jbd2_shrink_type type)  {  	transaction_t *transaction, *last_transaction, *next_transaction; -	enum shrink_type type;  	bool released; +	WARN_ON_ONCE(type == JBD2_SHRINK_BUSY_SKIP); +  	transaction = journal->j_checkpoint_transactions;  	if (!transaction)  		return; -	type = destroy ? SHRINK_DESTROY : SHRINK_BUSY_STOP;  	last_transaction = transaction->t_cpprev;  	next_transaction = transaction;  	do { @@ -527,7 +529,7 @@ void jbd2_journal_destroy_checkpoint(journal_t *journal)  			spin_unlock(&journal->j_list_lock);  			break;  		} -		__jbd2_journal_clean_checkpoint_list(journal, true); +		__jbd2_journal_clean_checkpoint_list(journal, JBD2_SHRINK_DESTROY);  		spin_unlock(&journal->j_list_lock);  		cond_resched();  	}  |