+21
−10
+1
−1
+29
−3
Loading
stable inclusion from stable-v5.10.226 commit 3f3ef1d9f66b93913ce2171120d9226b55acd41d category: bugfix bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAVU3A CVE: CVE-2024-47660 Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=3f3ef1d9f66b93913ce2171120d9226b55acd41d -------------------------------- [ Upstream commit 172e422ffea20a89bfdc672741c1aad6fbb5044e ] In some setups directories can have many (usually negative) dentries. Hence __fsnotify_update_child_dentry_flags() function can take a significant amount of time. Since the bulk of this function happens under inode->i_lock this causes a significant contention on the lock when we remove the watch from the directory as the __fsnotify_update_child_dentry_flags() call from fsnotify_recalc_mask() races with __fsnotify_update_child_dentry_flags() calls from __fsnotify_parent() happening on children. This can lead upto softlockup reports reported by users. Fix the problem by calling fsnotify_update_children_dentry_flags() to set PARENT_WATCHED flags only when parent starts watching children. When parent stops watching children, clear false positive PARENT_WATCHED flags lazily in __fsnotify_parent() for each accessed child. Suggested-by:Jan Kara <jack@suse.cz> Signed-off-by:
Amir Goldstein <amir73il@gmail.com> Signed-off-by:
Stephen Brennan <stephen.s.brennan@oracle.com> Signed-off-by:
Jan Kara <jack@suse.cz> Signed-off-by:
Sasha Levin <sashal@kernel.org> Conflicts: fs/notify/mark.c [Context differences because there is no commit c3638b5b ("fsnotify: allow adding an inode mark without pinning inode").] Signed-off-by:
Baokun Li <libaokun1@huawei.com>