jbd2: use GFP_NOFS for blkdev_issue_flush
Subsystems (2)
RFC 1/1 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_KERNEL, which makes me confused. Hoping filesystem developers clarify.
--- fs/jbd2/commit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/jbd2/commit.c +2 -2
@@ -723,7 +723,7 @@ start_journal_io: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 @@ wait_for_iobuf: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)
Quoted 6 lines · Shaohua Li
flush request is issued in transaction commit code path, so looks using
GFP_KERNELto 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 usingGFP_KERNEL, which makes me confused. Hoping filesystem developers clarify.
Only one of the 5 calls XFS makes to blkdev_issue_flush() is questionable. Probably should use GFP_NOFS by default, though, so we don't trip over this problem...
Cheers,
Dave.
Signature · 2 lines
Dave Chinner [email protected]
Quoted 8 lines · Shaohua Li
flush request is issued in transaction commit code path, so looks using
GFP_KERNELto 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 usingGFP_KERNEL, which makes me confused. Hoping filesystem developers clarify.Signed-off-by Shaohua Li <[email protected]>
Yeah, ext4 (jbd2) should use GFP_NOFS since we are in a kjournald and
reclaim could possibly need to start a transaction thus blocking on kjournald. So you have my:
Honza
Quoted 30 lines
--- fs/jbd2/commit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)Index:
linux/fs/jbd2/commit.c
===================================================================fs/jbd2/commit.c +2
-3@@ -723,7 +723,7 @@ start_journal_io: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 @@ wait_for_iobuf: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) --To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR
Quoted 8 lines · Shaohua Li
flush request is issued in transaction commit code path, so looks using
GFP_KERNELto 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 usingGFP_KERNEL, which makes me confused. Hoping filesystem developers clarify.Signed-off-by Shaohua Li <[email protected]>
Thanks, applied.
- Ted