summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhang Yi <yi.zhang@huawei.com>2021-09-10 10:03:16 +0200
committerTheodore Ts'o <tytso@mit.edu>2021-10-01 06:10:28 +0200
commitf2c77973507fd116c3657df1dc048864a2b16a1c (patch)
tree66ee04744214e8e2e030e925b5d99c7613e50de3
parentext4: fix potential infinite loop in ext4_dx_readdir() (diff)
downloadlinux-f2c77973507fd116c3657df1dc048864a2b16a1c.tar.xz
linux-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
-rw-r--r--fs/ext4/inode.c6
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