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

Commit 99aa7846 authored by Shaohua Li's avatar Shaohua Li Committed by Theodore Ts'o
Browse files

jbd2: use GFP_NOFS for blkdev_issue_flush



flush request is issued in transaction commit code path, so looks using
GFP_KERNEL to allocate memory for flush request bio falls into the classic
deadlock issue.  I saw btrfs and dm get it right, but ext4, xfs and md are
using GFP.

Signed-off-by: default avatarShaohua Li <shli@fusionio.com>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Cc: stable@vger.kernel.org
parent 57f73c2c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -723,7 +723,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
	if (commit_transaction->t_need_data_flush &&
	    (journal->j_fs_dev != journal->j_dev) &&
	    (journal->j_flags & JBD2_BARRIER))
		blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL);
		blkdev_issue_flush(journal->j_fs_dev, GFP_NOFS, NULL);

	/* Done it all: now write the commit record asynchronously. */
	if (JBD2_HAS_INCOMPAT_FEATURE(journal,
@@ -859,7 +859,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
	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_issue_flush(journal->j_dev, GFP_NOFS, NULL);
	}

	if (err)