Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f73bee49 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe
Browse files

jbd2: Modify ASYNC_COMMIT code to not rely on queue draining on barrier



Currently JBD2 relies blkdev_issue_flush() draining the queue when ASYNC_COMMIT
feature is set. This property is going away so make JBD2 wait for buffers it
needs on its own before submitting the cache flush.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 4524451e
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -701,6 +701,16 @@ void jbd2_journal_commit_transaction(journal_t *journal)
		}
	}

	err = journal_finish_inode_data_buffers(journal, commit_transaction);
	if (err) {
		printk(KERN_WARNING
			"JBD2: Detected IO errors while flushing file data "
		       "on %s\n", journal->j_devname);
		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
			jbd2_journal_abort(journal, err);
		err = 0;
	}

	/* 
	 * If the journal is not located on the file system device,
	 * then we must flush the file system device before we issue
@@ -719,19 +729,6 @@ void jbd2_journal_commit_transaction(journal_t *journal)
						 &cbh, crc32_sum);
		if (err)
			__jbd2_journal_abort_hard(journal);
		if (journal->j_flags & JBD2_BARRIER)
			blkdev_issue_flush(journal->j_dev, GFP_KERNEL, NULL,
				BLKDEV_IFL_WAIT);
	}

	err = journal_finish_inode_data_buffers(journal, commit_transaction);
	if (err) {
		printk(KERN_WARNING
			"JBD2: Detected IO errors while flushing file data "
		       "on %s\n", journal->j_devname);
		if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR)
			jbd2_journal_abort(journal, err);
		err = 0;
	}

	/* Lo and behold: we have just managed to send a transaction to
@@ -845,6 +842,12 @@ void jbd2_journal_commit_transaction(journal_t *journal)
	}
	if (!err && !is_journal_aborted(journal))
		err = journal_wait_on_commit_record(journal, cbh);
	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
				      JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT) &&
	    journal->j_flags & JBD2_BARRIER) {
		blkdev_issue_flush(journal->j_dev, GFP_KERNEL, NULL,
				   BLKDEV_IFL_WAIT);
	}

	if (err)
		jbd2_journal_abort(journal, err);