diff options
Diffstat (limited to 'fs/jbd2/commit.c')
| -rw-r--r-- | fs/jbd2/commit.c | 39 | 
1 files changed, 15 insertions, 24 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index f52e5e8049f1..7c068c189d80 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -101,7 +101,6 @@ static int journal_submit_commit_record(journal_t *journal,  	struct commit_header *tmp;  	struct buffer_head *bh;  	int ret; -	int barrier_done = 0;  	struct timespec now = current_kernel_time();  	if (is_journal_aborted(journal)) @@ -136,30 +135,22 @@ static int journal_submit_commit_record(journal_t *journal,  	if (journal->j_flags & JBD2_BARRIER &&  	    !JBD2_HAS_INCOMPAT_FEATURE(journal,  				       JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { -		set_buffer_ordered(bh); -		barrier_done = 1; -	} -	ret = submit_bh(WRITE_SYNC_PLUG, bh); -	if (barrier_done) -		clear_buffer_ordered(bh); - -	/* is it possible for another commit to fail at roughly -	 * the same time as this one?  If so, we don't want to -	 * trust the barrier flag in the super, but instead want -	 * to remember if we sent a barrier request -	 */ -	if (ret == -EOPNOTSUPP && barrier_done) { -		printk(KERN_WARNING -		       "JBD2: Disabling barriers on %s, " -		       "not supported by device\n", journal->j_devname); -		write_lock(&journal->j_state_lock); -		journal->j_flags &= ~JBD2_BARRIER; -		write_unlock(&journal->j_state_lock); +		ret = submit_bh(WRITE_SYNC_PLUG | WRITE_BARRIER, bh); +		if (ret == -EOPNOTSUPP) { +			printk(KERN_WARNING +			       "JBD2: Disabling barriers on %s, " +			       "not supported by device\n", journal->j_devname); +			write_lock(&journal->j_state_lock); +			journal->j_flags &= ~JBD2_BARRIER; +			write_unlock(&journal->j_state_lock); -		/* And try again, without the barrier */ -		lock_buffer(bh); -		set_buffer_uptodate(bh); -		clear_buffer_dirty(bh); +			/* And try again, without the barrier */ +			lock_buffer(bh); +			set_buffer_uptodate(bh); +			clear_buffer_dirty(bh); +			ret = submit_bh(WRITE_SYNC_PLUG, bh); +		} +	} else {  		ret = submit_bh(WRITE_SYNC_PLUG, bh);  	}  	*cbh = bh;  | 
