Patch "ext4: fix a race in the ext4 shutdown path" has been added to the 4.15-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ext4: fix a race in the ext4 shutdown path
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ext4-fix-a-race-in-the-ext4-shutdown-path.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
abbc3f9395c76d554a9ed27d4b1ebfb5d9b0e4caMon Sep 17 00:00:00 2001
From: Harshad Shirwadkar <[email protected]>
Date: Wed, 10 Jan 2018 00:13:13 -0500
Subject: ext4: fix a race in the ext4 shutdown path
From: Harshad Shirwadkar <[email protected]>
commit abbc3f9395c76d554a9ed27d4b1ebfb5d9b0e4ca upstream.
This patch fixes a race between the shutdown path and bio completion handling. In the ext4 direct io path with async io, after submitting a bio to the block layer, if journal starting fails, ext4_direct_IO_write() would bail out pretending that the IO failed. The caller would have had no way of knowing whether or not the IO was successfully submitted. So instead, we return -EIOCBQUEUED in this case. Now, the caller knows that the IO was submitted. The bio completion handler takes care of the error.
Tested: Ran the shutdown xfstest test 461 in loop for over 2 hours across 4 machines resulting in over 400 runs. Verified that the race didn't occur. Usually the race was seen in about 20-30 iterations.
--- fs/ext4/inode.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
fs/ext4/inode.c +12 -4
@@ -3767,10 +3767,18 @@ static ssize_t ext4_direct_IO_write(stru/* Credits for sb + inode write */ handle =ext4_journal_start (inode,EXT4_HT_INODE ,2 );if (IS_ERR (handle)) { -/* This is really bad luck. We've written the data -* but cannot extend i_size. Bail out and pretend -* the write failed... */ - ret =PTR_ERR (handle); +/* +* We wrote the data but cannot extend +* i_size. Bail out. In async io case, we do +* not return error here because we have +* already submmitted the corresponding +* bio. Returning error here makes the caller +* think that this IO is done and failed +* resulting in race with bio's completion +* handler. +*/ +if (!ret) + ret =PTR_ERR (handle);if (inode->i_nlink)ext4_orphan_del (NULL , inode);
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/ext4-fix-a-race-in-the-ext4-shutdown-path.patch