diff options
author | Zhang Yi <yi.zhang@huawei.com> | 2021-09-10 16:03:16 +0800 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2021-10-01 00:10:28 -0400 |
commit | f2c77973507fd116c3657df1dc048864a2b16a1c (patch) | |
tree | 66ee04744214e8e2e030e925b5d99c7613e50de3 /fs | |
parent | 42cb447410d024e9d54139ae9c21ea132a8c384c (diff) | |
download | linux-stable-f2c77973507fd116c3657df1dc048864a2b16a1c.tar.gz linux-stable-f2c77973507fd116c3657df1dc048864a2b16a1c.tar.bz2 linux-stable-f2c77973507fd116c3657df1dc048864a2b16a1c.zip |
ext4: recheck buffer uptodate bit under buffer lock
Commit 8e33fadf945a ("ext4: remove an unnecessary if statement in
__ext4_get_inode_loc()") forget to recheck buffer's uptodate bit again
under buffer lock, which may overwrite the buffer if someone else have
already brought it uptodate and changed it.
Fixes: 8e33fadf945a ("ext4: remove an unnecessary if statement in __ext4_get_inode_loc()")
Cc: stable@kernel.org
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Link: https://lore.kernel.org/r/20210910080316.70421-1-yi.zhang@huawei.com
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/inode.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 9df1ab070fa5..b7c561ad38dd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4277,6 +4277,12 @@ static int __ext4_get_inode_loc(struct super_block *sb, unsigned long ino, goto has_buffer; lock_buffer(bh); + if (ext4_buffer_uptodate(bh)) { + /* Someone brought it uptodate while we waited */ + unlock_buffer(bh); + goto has_buffer; + } + /* * If we have all information of the inode in memory and this * is the only valid inode in the block, we need not read the |