Subject: CVE-2024-26696: nilfs2: fix hang in nilfs_lookup_dirty_data_buffers()

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

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

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

nilfs2: fix hang in nilfs_lookup_dirty_data_buffers()

Syzbot reported a hang issue in migrate_pages_batch() called by mbind()
and nilfs_lookup_dirty_data_buffers() called in the log writer of nilfs2.

While migrate_pages_batch() locks a folio and waits for the writeback to
complete, the log writer thread that should bring the writeback to
completion picks up the folio being written back in
nilfs_lookup_dirty_data_buffers() that it calls for subsequent log
creation and was trying to lock the folio.  Thus causing a deadlock.

In the first place, it is unexpected that folios/pages in the middle of
writeback will be updated and become dirty.  Nilfs2 adds a checksum to
verify the validity of the log being written and uses it for recovery at
mount, so data changes during writeback are suppressed.  Since this is
broken, an unclean shutdown could potentially cause recovery to fail.

Investigation revealed that the root cause is that the wait for writeback
completion in nilfs_page_mkwrite() is conditional, and if the backing
device does not require stable writes, data may be modified without
waiting.

Fix these issues by making nilfs_page_mkwrite() wait for writeback to
finish regardless of the stable write requirement of the backing device.

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

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

	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 4.19.307 with commit 228742b2ddfb
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 5.4.269 with commit 862ee4422c38
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 5.10.210 with commit 98a4026b22ff
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 5.15.149 with commit 7e9b622bd074
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 6.1.79 with commit 8494ba2c9ea0
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 6.6.18 with commit ea5ddbc11613
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 6.7.6 with commit e38585401d46
	Issue introduced in 3.9 with commit 1d1d1a767206 and fixed in 6.8 with commit 38296afe3c6e

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-26696
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/nilfs2/file.c

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/228742b2ddfb99dfd71e5a307e6088ab6836272e
	https://git.kernel.org/stable/c/862ee4422c38be5c249844a684b00d0dbe9d1e46
	https://git.kernel.org/stable/c/98a4026b22ff440c7f47056481bcbbe442f607d6
	https://git.kernel.org/stable/c/7e9b622bd0748cc104d66535b76d9b3535f9dc0f
	https://git.kernel.org/stable/c/8494ba2c9ea00a54d5b50e69b22c55a8958bce32
	https://git.kernel.org/stable/c/ea5ddbc11613b55e5128c85f57b08f907abd9b28
	https://git.kernel.org/stable/c/e38585401d464578d30f5868ff4ca54475c34f7d
	https://git.kernel.org/stable/c/38296afe3c6ee07319e01bb249aa4bb47c07b534