Subject: CVE-2024-47660: fsnotify: clear PARENT_WATCHED flags lazily

From: Greg Kroah-Hartman <[email-masked]>

Description
===========

In the Linux kernel, the following vulnerability has been resolved:

fsnotify: clear PARENT_WATCHED flags lazily

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.

The Linux kernel CVE team has assigned CVE-2024-47660 to this issue.

Affected and fixed versions
===========================

	Fixed in 5.10.226 with commit 3f3ef1d9f66b
	Fixed in 5.15.167 with commit f9a48bc3dd90
	Fixed in 6.1.109 with commit d8c42405fc35
	Fixed in 6.6.50 with commit fc1b1e135c3f
	Fixed in 6.10.9 with commit 7ef1d2e240c3
	Fixed in 6.11 with commit 172e422ffea2

Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.

Unaffected versions might change over time as fixes are backported to
older supported kernel versions.  The official CVE entry at
	https://cve.org/CVERecord/?id=CVE-2024-47660
will be updated if fixes are backported, please check that for the most
up to date information about this issue.

Affected files
==============

The file(s) affected by this issue are:
	fs/notify/fsnotify.c
	fs/notify/fsnotify.h
	fs/notify/mark.c
	include/linux/fsnotify_backend.h

Mitigation
==========

The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes.  Individual
changes are never tested alone, but rather are part of a larger kernel
release.  Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all.  If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
	https://git.kernel.org/stable/c/3f3ef1d9f66b93913ce2171120d9226b55acd41d
	https://git.kernel.org/stable/c/f9a48bc3dd9099935751458a5bbbea4b7c28abc8
	https://git.kernel.org/stable/c/d8c42405fc3507cc43ba7e4986a773c3fc633f6e
	https://git.kernel.org/stable/c/fc1b1e135c3f72382f792e6c319fc088d5523ad5
	https://git.kernel.org/stable/c/7ef1d2e240c32b1f337a37232d037b07e3919e1a
	https://git.kernel.org/stable/c/172e422ffea20a89bfdc672741c1aad6fbb5044e