nilfs2-prevent-general-protection-fault-in-nilfs_clear_dirty_page.patch removed from -mm tree
The quilt patch titled
Subject: nilfs2: prevent general protection fault in nilfs_clear_dirty_page()
has been removed from the -mm tree. Its filename was
nilfs2-prevent-general-protection-fault-in-nilfs_clear_dirty_page.patch
This patch was dropped because it was merged into the mm-hotfixes-stable branch of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
------------------------------------------------------
From: Ryusuke Konishi <[email protected]>
Subject: nilfs2: prevent general protection fault in nilfs_clear_dirty_page()
Date: Mon, 12 Jun 2023 11:14:56 +0900
In a syzbot stress test that deliberately causes file system errors on nilfs2 with a corrupted disk image, it has been reported that nilfs_clear_dirty_page() called from nilfs_clear_dirty_pages() can cause a
general protection fault.
In nilfs_clear_dirty_pages(), when looking up dirty pages from the page cache and calling nilfs_clear_dirty_page() for each dirty page/folio retrieved, the back reference from the argument page to "mapping" may have been changed to NULL (and possibly others). It is necessary to check this after locking the page/folio.
So, fix this issue by not calling nilfs_clear_dirty_page() on a page/folio after locking it in nilfs_clear_dirty_pages() if the back reference "mapping" from the page/folio is different from the "mapping" that held the page/folio just before.
---
fs/nilfs2/page.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
fs/nilfs2/page.c renamed from fs/nilfs2/page.c~nilfs2-prevent-general-protection-fault-in-nilfs_clear_dirty_page +9 -1
@@ -370,7 +370,15 @@ void nilfs_clear_dirty_pages(struct addrstruct folio *folio = fbatch.folios[i];folio_lock (folio); -nilfs_clear_dirty_page (&folio->page, silent); + +/* +* This folio may have been removed from the address +* space by truncation or invalidation when the lock +* was acquired. Skip processing in that case. +*/ +if (likely (folio->mapping == mapping)) +nilfs_clear_dirty_page (&folio->page, silent); +folio_unlock (folio); }folio_batch_release (&fbatch);
_
Patches currently in -mm which might be from [email protected] are