* [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly
@ 2025-02-28 16:51 Alexey Panov
2025-02-28 16:51 ` [PATCH 6.1 1/2] " Alexey Panov
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Alexey Panov @ 2025-02-28 16:51 UTC (permalink / raw)
To: stable, Greg Kroah-Hartman
Cc: Alexey Panov, Gao Xiang, Chao Yu, Yue Hu, Jeffle Xu, linux-erofs,
linux-kernel, lvc-project, Gao Xiang, Max Kellermann
Commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted
images properly") fixes CVE-2024-47736 [1] but brings another problem [2].
So commit 1a2180f6859c ("erofs: fix PSI memstall accounting") should be
backported too.
[1] https://nvd.nist.gov/vuln/detail/CVE-2024-47736
[2] https://lore.kernel.org/all/CAKPOu+8tvSowiJADW2RuKyofL_CSkm_SuyZA7ME5vMLWmL6pqw@mail.gmail.com/
Gao Xiang (2):
erofs: handle overlapped pclusters out of crafted images properly
erofs: fix PSI memstall accounting
fs/erofs/zdata.c | 66 +++++++++++++++++++++++++-----------------------
1 file changed, 34 insertions(+), 32 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-02-28 16:51 [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Alexey Panov
@ 2025-02-28 16:51 ` Alexey Panov
2025-03-01 4:21 ` Sasha Levin
2025-03-02 10:56 ` Fedor Pchelkin
2025-02-28 16:51 ` [PATCH 6.1 2/2] erofs: fix PSI memstall accounting Alexey Panov
2025-03-01 2:52 ` [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Gao Xiang
2 siblings, 2 replies; 13+ messages in thread
From: Alexey Panov @ 2025-02-28 16:51 UTC (permalink / raw)
To: stable, Greg Kroah-Hartman
Cc: Alexey Panov, Gao Xiang, Chao Yu, Yue Hu, Jeffle Xu, linux-erofs,
linux-kernel, syzbot+c8c8238b394be4a1087d, lvc-project, Gao Xiang,
Max Kellermann, syzbot+4fc98ed414ae63d1ada2,
syzbot+de04e06b28cfecf2281c
From: Gao Xiang <hsiangkao@linux.alibaba.com>
commit 9e2f9d34dd12e6e5b244ec488bcebd0c2d566c50 upstream.
syzbot reported a task hang issue due to a deadlock case where it is
waiting for the folio lock of a cached folio that will be used for
cache I/Os.
After looking into the crafted fuzzed image, I found it's formed with
several overlapped big pclusters as below:
Ext: logical offset | length : physical offset | length
0: 0.. 16384 | 16384 : 151552.. 167936 | 16384
1: 16384.. 32768 | 16384 : 155648.. 172032 | 16384
2: 32768.. 49152 | 16384 : 537223168.. 537239552 | 16384
...
Here, extent 0/1 are physically overlapped although it's entirely
_impossible_ for normal filesystem images generated by mkfs.
First, managed folios containing compressed data will be marked as
up-to-date and then unlocked immediately (unlike in-place folios) when
compressed I/Os are complete. If physical blocks are not submitted in
the incremental order, there should be separate BIOs to avoid dependency
issues. However, the current code mis-arranges z_erofs_fill_bio_vec()
and BIO submission which causes unexpected BIO waits.
Second, managed folios will be connected to their own pclusters for
efficient inter-queries. However, this is somewhat hard to implement
easily if overlapped big pclusters exist. Again, these only appear in
fuzzed images so let's simply fall back to temporary short-lived pages
for correctness.
Additionally, it justifies that referenced managed folios cannot be
truncated for now and reverts part of commit 2080ca1ed3e4 ("erofs: tidy
up `struct z_erofs_bvec`") for simplicity although it shouldn't be any
difference.
Reported-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
Reported-by: syzbot+de04e06b28cfecf2281c@syzkaller.appspotmail.com
Reported-by: syzbot+c8c8238b394be4a1087d@syzkaller.appspotmail.com
Tested-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/r/0000000000002fda01061e334873@google.com
Fixes: 8e6c8fa9f2e9 ("erofs: enable big pcluster feature")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240910070847.3356592-1-hsiangkao@linux.alibaba.com
[Alexey: minor fix to resolve merge conflict]
Signed-off-by: Alexey Panov <apanov@astralinux.ru>
---
Backport fix for CVE-2024-47736
fs/erofs/zdata.c | 59 +++++++++++++++++++++++++-----------------------
1 file changed, 31 insertions(+), 28 deletions(-)
diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 94e9e0bf3bbd..ac01c0ede7f7 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -1346,14 +1346,13 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,
goto out;
lock_page(page);
-
- /* only true if page reclaim goes wrong, should never happen */
- DBG_BUGON(justfound && PagePrivate(page));
-
- /* the page is still in manage cache */
- if (page->mapping == mc) {
+ if (likely(page->mapping == mc)) {
WRITE_ONCE(pcl->compressed_bvecs[nr].page, page);
+ /*
+ * The cached folio is still in managed cache but without
+ * a valid `->private` pcluster hint. Let's reconnect them.
+ */
if (!PagePrivate(page)) {
/*
* impossible to be !PagePrivate(page) for
@@ -1367,22 +1366,24 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,
SetPagePrivate(page);
}
- /* no need to submit io if it is already up-to-date */
- if (PageUptodate(page)) {
- unlock_page(page);
- page = NULL;
+ if (likely(page->private == (unsigned long)pcl)) {
+ /* don't submit cache I/Os again if already uptodate */
+ if (PageUptodate(page)) {
+ unlock_page(page);
+ page = NULL;
+
+ }
+ goto out;
}
- goto out;
+ /*
+ * Already linked with another pcluster, which only appears in
+ * crafted images by fuzzers for now. But handle this anyway.
+ */
+ tocache = false; /* use temporary short-lived pages */
+ } else {
+ DBG_BUGON(1); /* referenced managed folios can't be truncated */
+ tocache = true;
}
-
- /*
- * the managed page has been truncated, it's unsafe to
- * reuse this one, let's allocate a new cache-managed page.
- */
- DBG_BUGON(page->mapping);
- DBG_BUGON(!justfound);
-
- tocache = true;
unlock_page(page);
put_page(page);
out_allocpage:
@@ -1536,16 +1537,11 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
end = cur + pcl->pclusterpages;
do {
- struct page *page;
-
- page = pickup_page_for_submission(pcl, i++, pagepool,
- mc);
- if (!page)
- continue;
+ struct page *page = NULL;
if (bio && (cur != last_index + 1 ||
last_bdev != mdev.m_bdev)) {
-submit_bio_retry:
+drain_io:
submit_bio(bio);
if (memstall) {
psi_memstall_leave(&pflags);
@@ -1554,6 +1550,13 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
bio = NULL;
}
+ if (!page) {
+ page = pickup_page_for_submission(pcl, i++,
+ pagepool, mc);
+ if (!page)
+ continue;
+ }
+
if (unlikely(PageWorkingset(page)) && !memstall) {
psi_memstall_enter(&pflags);
memstall = 1;
@@ -1574,7 +1577,7 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
}
if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
- goto submit_bio_retry;
+ goto drain_io;
last_index = cur;
bypass = false;
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6.1 2/2] erofs: fix PSI memstall accounting
2025-02-28 16:51 [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Alexey Panov
2025-02-28 16:51 ` [PATCH 6.1 1/2] " Alexey Panov
@ 2025-02-28 16:51 ` Alexey Panov
2025-03-01 4:20 ` Sasha Levin
2025-03-01 2:52 ` [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Gao Xiang
2 siblings, 1 reply; 13+ messages in thread
From: Alexey Panov @ 2025-02-28 16:51 UTC (permalink / raw)
To: stable, Greg Kroah-Hartman
Cc: Alexey Panov, Gao Xiang, Chao Yu, Yue Hu, Jeffle Xu, linux-erofs,
linux-kernel, lvc-project, Gao Xiang, Max Kellermann
From: Gao Xiang <hsiangkao@linux.alibaba.com>
commit 1a2180f6859c73c674809f9f82e36c94084682ba upstream.
Max Kellermann recently reported psi_group_cpu.tasks[NR_MEMSTALL] is
incorrect in the 6.11.9 kernel.
The root cause appears to be that, since the problematic commit, bio
can be NULL, causing psi_memstall_leave() to be skipped in
z_erofs_submit_queue().
Reported-by: Max Kellermann <max.kellermann@ionos.com>
Closes: https://lore.kernel.org/r/CAKPOu+8tvSowiJADW2RuKyofL_CSkm_SuyZA7ME5vMLWmL6pqw@mail.gmail.com
Fixes: 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241127085236.3538334-1-hsiangkao@linux.alibaba.com
Signed-off-by: Alexey Panov <apanov@astralinux.ru>
---
fs/erofs/zdata.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index ac01c0ede7f7..d175b5d0a2f5 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -1589,11 +1589,10 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
move_to_bypass_jobqueue(pcl, qtail, owned_head);
} while (owned_head != Z_EROFS_PCLUSTER_TAIL);
- if (bio) {
+ if (bio)
submit_bio(bio);
- if (memstall)
- psi_memstall_leave(&pflags);
- }
+ if (memstall)
+ psi_memstall_leave(&pflags);
/*
* although background is preferred, no one is pending for submission.
--
2.39.5
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly
2025-02-28 16:51 [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Alexey Panov
2025-02-28 16:51 ` [PATCH 6.1 1/2] " Alexey Panov
2025-02-28 16:51 ` [PATCH 6.1 2/2] erofs: fix PSI memstall accounting Alexey Panov
@ 2025-03-01 2:52 ` Gao Xiang
2 siblings, 0 replies; 13+ messages in thread
From: Gao Xiang @ 2025-03-01 2:52 UTC (permalink / raw)
To: Alexey Panov, stable, Greg Kroah-Hartman
Cc: Gao Xiang, Chao Yu, Yue Hu, Jeffle Xu, linux-erofs, linux-kernel,
lvc-project, Max Kellermann
On 2025/3/1 00:51, Alexey Panov wrote:
> Commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted
> images properly") fixes CVE-2024-47736 [1] but brings another problem [2].
> So commit 1a2180f6859c ("erofs: fix PSI memstall accounting") should be
> backported too.
>
> [1] https://nvd.nist.gov/vuln/detail/CVE-2024-47736
> [2] https://lore.kernel.org/all/CAKPOu+8tvSowiJADW2RuKyofL_CSkm_SuyZA7ME5vMLWmL6pqw@mail.gmail.com/
>
Thanks for your effort! Patches look good to me.
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 2/2] erofs: fix PSI memstall accounting
2025-02-28 16:51 ` [PATCH 6.1 2/2] erofs: fix PSI memstall accounting Alexey Panov
@ 2025-03-01 4:20 ` Sasha Levin
0 siblings, 0 replies; 13+ messages in thread
From: Sasha Levin @ 2025-03-01 4:20 UTC (permalink / raw)
To: stable; +Cc: Alexey Panov, Sasha Levin
[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected.
No action required from the submitter.
The upstream commit SHA1 provided is correct: 1a2180f6859c73c674809f9f82e36c94084682ba
WARNING: Author mismatch between patch and upstream commit:
Backport author: Alexey Panov<apanov@astralinux.ru>
Commit author: Gao Xiang<hsiangkao@linux.alibaba.com>
Status in newer kernel trees:
6.13.y | Present (exact SHA1)
6.12.y | Present (different SHA1: 0653fa6ee045)
6.6.y | Present (different SHA1: 14f030a807dd)
Note: The patch differs from the upstream commit:
---
1: 1a2180f6859c7 < -: ------------- erofs: fix PSI memstall accounting
-: ------------- > 1: 63f49db1d3fb4 erofs: fix PSI memstall accounting
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-6.1.y | Success | Success |
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-02-28 16:51 ` [PATCH 6.1 1/2] " Alexey Panov
@ 2025-03-01 4:21 ` Sasha Levin
2025-03-02 10:56 ` Fedor Pchelkin
1 sibling, 0 replies; 13+ messages in thread
From: Sasha Levin @ 2025-03-01 4:21 UTC (permalink / raw)
To: stable, apanov; +Cc: Sasha Levin
[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
⚠️ Found follow-up fixes in mainline
The upstream commit SHA1 provided is correct: 9e2f9d34dd12e6e5b244ec488bcebd0c2d566c50
WARNING: Author mismatch between patch and upstream commit:
Backport author: Alexey Panov<apanov@astralinux.ru>
Commit author: Gao Xiang<hsiangkao@linux.alibaba.com>
Status in newer kernel trees:
6.13.y | Present (exact SHA1)
6.12.y | Present (exact SHA1)
6.6.y | Present (different SHA1: 1bf7e414cac3)
Found fixes commits:
1a2180f6859c erofs: fix PSI memstall accounting
Note: The patch differs from the upstream commit:
---
1: 9e2f9d34dd12e < -: ------------- erofs: handle overlapped pclusters out of crafted images properly
-: ------------- > 1: 8b40df2f9aa65 erofs: handle overlapped pclusters out of crafted images properly
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-6.1.y | Success | Success |
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-02-28 16:51 ` [PATCH 6.1 1/2] " Alexey Panov
2025-03-01 4:21 ` Sasha Levin
@ 2025-03-02 10:56 ` Fedor Pchelkin
2025-03-02 17:41 ` Gao Xiang
1 sibling, 1 reply; 13+ messages in thread
From: Fedor Pchelkin @ 2025-03-02 10:56 UTC (permalink / raw)
To: Alexey Panov
Cc: stable, Greg Kroah-Hartman, Max Kellermann, lvc-project,
syzbot+de04e06b28cfecf2281c, syzbot+c8c8238b394be4a1087d, Chao Yu,
linux-kernel, Yue Hu, syzbot+4fc98ed414ae63d1ada2, Jeffle Xu,
Gao Xiang, Gao Xiang, linux-erofs
On Fri, 28. Feb 19:51, Alexey Panov wrote:
> From: Gao Xiang <hsiangkao@linux.alibaba.com>
>
> commit 9e2f9d34dd12e6e5b244ec488bcebd0c2d566c50 upstream.
>
> syzbot reported a task hang issue due to a deadlock case where it is
> waiting for the folio lock of a cached folio that will be used for
> cache I/Os.
>
> After looking into the crafted fuzzed image, I found it's formed with
> several overlapped big pclusters as below:
>
> Ext: logical offset | length : physical offset | length
> 0: 0.. 16384 | 16384 : 151552.. 167936 | 16384
> 1: 16384.. 32768 | 16384 : 155648.. 172032 | 16384
> 2: 32768.. 49152 | 16384 : 537223168.. 537239552 | 16384
> ...
>
> Here, extent 0/1 are physically overlapped although it's entirely
> _impossible_ for normal filesystem images generated by mkfs.
>
> First, managed folios containing compressed data will be marked as
> up-to-date and then unlocked immediately (unlike in-place folios) when
> compressed I/Os are complete. If physical blocks are not submitted in
> the incremental order, there should be separate BIOs to avoid dependency
> issues. However, the current code mis-arranges z_erofs_fill_bio_vec()
> and BIO submission which causes unexpected BIO waits.
>
> Second, managed folios will be connected to their own pclusters for
> efficient inter-queries. However, this is somewhat hard to implement
> easily if overlapped big pclusters exist. Again, these only appear in
> fuzzed images so let's simply fall back to temporary short-lived pages
> for correctness.
>
> Additionally, it justifies that referenced managed folios cannot be
> truncated for now and reverts part of commit 2080ca1ed3e4 ("erofs: tidy
> up `struct z_erofs_bvec`") for simplicity although it shouldn't be any
> difference.
>
> Reported-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
> Reported-by: syzbot+de04e06b28cfecf2281c@syzkaller.appspotmail.com
> Reported-by: syzbot+c8c8238b394be4a1087d@syzkaller.appspotmail.com
> Tested-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
> Closes: https://lore.kernel.org/r/0000000000002fda01061e334873@google.com
> Fixes: 8e6c8fa9f2e9 ("erofs: enable big pcluster feature")
> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
> Link: https://lore.kernel.org/r/20240910070847.3356592-1-hsiangkao@linux.alibaba.com
> [Alexey: minor fix to resolve merge conflict]
Urgh, it doesn't look so minor indeed. Backward struct folio -> struct
page conversions can be tricky sometimes. Please see several comments
below.
> Signed-off-by: Alexey Panov <apanov@astralinux.ru>
> ---
> Backport fix for CVE-2024-47736
>
> fs/erofs/zdata.c | 59 +++++++++++++++++++++++++-----------------------
> 1 file changed, 31 insertions(+), 28 deletions(-)
>
> diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
> index 94e9e0bf3bbd..ac01c0ede7f7 100644
I'm looking at the diff of upstream commit and the first thing it does
is to remove zeroing out the folio/page private field here:
// upstream commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
@@ -1450,7 +1451,6 @@ static void z_erofs_fill_bio_vec(struct bio_vec *bvec,
* file-backed folios will be used instead.
*/
if (folio->private == (void *)Z_EROFS_PREALLOCATED_PAGE) {
- folio->private = 0;
tocache = true;
goto out_tocache;
}
while in 6.1.129 the corresponding fragment seems untouched with the
backport patch. Is it intended?
> --- a/fs/erofs/zdata.c
> +++ b/fs/erofs/zdata.c
> @@ -1346,14 +1346,13 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,
> goto out;
>
> lock_page(page);
> -
> - /* only true if page reclaim goes wrong, should never happen */
> - DBG_BUGON(justfound && PagePrivate(page));
> -
> - /* the page is still in manage cache */
> - if (page->mapping == mc) {
> + if (likely(page->mapping == mc)) {
> WRITE_ONCE(pcl->compressed_bvecs[nr].page, page);
>
> + /*
> + * The cached folio is still in managed cache but without
Are the comments worth to be adapted as well? I don't think the "folio"
stuff would be useful while reading 6.1 source code.
> + * a valid `->private` pcluster hint. Let's reconnect them.
> + */
> if (!PagePrivate(page)) {
> /*
> * impossible to be !PagePrivate(page) for
> @@ -1367,22 +1366,24 @@ static struct page *pickup_page_for_submission(struct z_erofs_pcluster *pcl,
> SetPagePrivate(page);
> }
>
> - /* no need to submit io if it is already up-to-date */
> - if (PageUptodate(page)) {
> - unlock_page(page);
> - page = NULL;
> + if (likely(page->private == (unsigned long)pcl)) {
> + /* don't submit cache I/Os again if already uptodate */
> + if (PageUptodate(page)) {
> + unlock_page(page);
> + page = NULL;
> +
> + }
> + goto out;
> }
> - goto out;
> + /*
> + * Already linked with another pcluster, which only appears in
> + * crafted images by fuzzers for now. But handle this anyway.
> + */
> + tocache = false; /* use temporary short-lived pages */
> + } else {
> + DBG_BUGON(1); /* referenced managed folios can't be truncated */
> + tocache = true;
> }
> -
> - /*
> - * the managed page has been truncated, it's unsafe to
> - * reuse this one, let's allocate a new cache-managed page.
> - */
> - DBG_BUGON(page->mapping);
> - DBG_BUGON(!justfound);
> -
> - tocache = true;
> unlock_page(page);
> put_page(page);
> out_allocpage:
There is a whole bunch of out path handling changes done for this function
in upstream commit, like
// upstream commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
out_allocfolio:
- zbv.page = erofs_allocpage(&f->pagepool, gfp | __GFP_NOFAIL);
+ page = erofs_allocpage(&f->pagepool, gfp | __GFP_NOFAIL);
spin_lock(&pcl->obj.lockref.lock);
- if (pcl->compressed_bvecs[nr].page) {
- erofs_pagepool_add(&f->pagepool, zbv.page);
+ if (unlikely(pcl->compressed_bvecs[nr].page != zbv.page)) {
+ erofs_pagepool_add(&f->pagepool, page);
spin_unlock(&pcl->obj.lockref.lock);
cond_resched();
goto repeat;
}
- bvec->bv_page = pcl->compressed_bvecs[nr].page = zbv.page;
- folio = page_folio(zbv.page);
- /* first mark it as a temporary shortlived folio (now 1 ref) */
- folio->private = (void *)Z_EROFS_SHORTLIVED_PAGE;
+ bvec->bv_page = pcl->compressed_bvecs[nr].page = page;
+ folio = page_folio(page);
spin_unlock(&pcl->obj.lockref.lock);
out_tocache:
if (!tocache || bs != PAGE_SIZE ||
- filemap_add_folio(mc, folio, pcl->obj.index + nr, gfp))
+ filemap_add_folio(mc, folio, pcl->obj.index + nr, gfp)) {
+ /* turn into a temporary shortlived folio (1 ref) */
+ folio->private = (void *)Z_EROFS_SHORTLIVED_PAGE;
return;
+ }
folio_attach_private(folio, pcl);
/* drop a refcount added by allocpage (then 2 refs in total here) */
folio_put(folio);
These changes are probably not relevant for the 6.1.y but this fact is
still usually worth a brief mentioning in the backporter's comment.
> @@ -1536,16 +1537,11 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
> end = cur + pcl->pclusterpages;
>
> do {
> - struct page *page;
> -
> - page = pickup_page_for_submission(pcl, i++, pagepool,
> - mc);
> - if (!page)
> - continue;
> + struct page *page = NULL;
>
> if (bio && (cur != last_index + 1 ||
> last_bdev != mdev.m_bdev)) {
> -submit_bio_retry:
> +drain_io:
> submit_bio(bio);
> if (memstall) {
> psi_memstall_leave(&pflags);
> @@ -1554,6 +1550,13 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
> bio = NULL;
> }
>
> + if (!page) {
> + page = pickup_page_for_submission(pcl, i++,
> + pagepool, mc);
> + if (!page)
> + continue;
> + }
> +
> if (unlikely(PageWorkingset(page)) && !memstall) {
> psi_memstall_enter(&pflags);
> memstall = 1;
> @@ -1574,7 +1577,7 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
> }
>
> if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
> - goto submit_bio_retry;
> + goto drain_io;
>
> last_index = cur;
> bypass = false;
> --
> 2.39.5
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-03-02 10:56 ` Fedor Pchelkin
@ 2025-03-02 17:41 ` Gao Xiang
2025-03-02 17:56 ` Gao Xiang
2025-03-02 18:13 ` Fedor Pchelkin
0 siblings, 2 replies; 13+ messages in thread
From: Gao Xiang @ 2025-03-02 17:41 UTC (permalink / raw)
To: Fedor Pchelkin, Alexey Panov
Cc: stable, Greg Kroah-Hartman, Max Kellermann, lvc-project,
syzbot+de04e06b28cfecf2281c, syzbot+c8c8238b394be4a1087d, Chao Yu,
linux-kernel, Yue Hu, syzbot+4fc98ed414ae63d1ada2, Jeffle Xu,
Gao Xiang, linux-erofs
Hi Fedor,
On 2025/3/2 18:56, Fedor Pchelkin wrote:
> On Fri, 28. Feb 19:51, Alexey Panov wrote:
>> From: Gao Xiang <hsiangkao@linux.alibaba.com>
>>
>> commit 9e2f9d34dd12e6e5b244ec488bcebd0c2d566c50 upstream.
>>
>> syzbot reported a task hang issue due to a deadlock case where it is
>> waiting for the folio lock of a cached folio that will be used for
>> cache I/Os.
>>
>> After looking into the crafted fuzzed image, I found it's formed with
>> several overlapped big pclusters as below:
>>
>> Ext: logical offset | length : physical offset | length
>> 0: 0.. 16384 | 16384 : 151552.. 167936 | 16384
>> 1: 16384.. 32768 | 16384 : 155648.. 172032 | 16384
>> 2: 32768.. 49152 | 16384 : 537223168.. 537239552 | 16384
>> ...
>>
>> Here, extent 0/1 are physically overlapped although it's entirely
>> _impossible_ for normal filesystem images generated by mkfs.
>>
>> First, managed folios containing compressed data will be marked as
>> up-to-date and then unlocked immediately (unlike in-place folios) when
>> compressed I/Os are complete. If physical blocks are not submitted in
>> the incremental order, there should be separate BIOs to avoid dependency
>> issues. However, the current code mis-arranges z_erofs_fill_bio_vec()
>> and BIO submission which causes unexpected BIO waits.
>>
>> Second, managed folios will be connected to their own pclusters for
>> efficient inter-queries. However, this is somewhat hard to implement
>> easily if overlapped big pclusters exist. Again, these only appear in
>> fuzzed images so let's simply fall back to temporary short-lived pages
>> for correctness.
>>
>> Additionally, it justifies that referenced managed folios cannot be
>> truncated for now and reverts part of commit 2080ca1ed3e4 ("erofs: tidy
>> up `struct z_erofs_bvec`") for simplicity although it shouldn't be any
>> difference.
>>
>> Reported-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
>> Reported-by: syzbot+de04e06b28cfecf2281c@syzkaller.appspotmail.com
>> Reported-by: syzbot+c8c8238b394be4a1087d@syzkaller.appspotmail.com
>> Tested-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
>> Closes: https://lore.kernel.org/r/0000000000002fda01061e334873@google.com
>> Fixes: 8e6c8fa9f2e9 ("erofs: enable big pcluster feature")
>> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
>> Link: https://lore.kernel.org/r/20240910070847.3356592-1-hsiangkao@linux.alibaba.com
>> [Alexey: minor fix to resolve merge conflict]
>
> Urgh, it doesn't look so minor indeed. Backward struct folio -> struct
> page conversions can be tricky sometimes. Please see several comments
> below.
I manually backported it for Linux 6.6.y, see
https://web.git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=1bf7e414cac303c9aec1be67872e19be8b64980c
Actually I had a very similiar backport for Linux 6.1.y,
but I forgot to send it out due to other ongoing stuffs.
I think this backport patch is all good, but you could
also mention it follows linux 6.6.y conflict changes
instead of "minor fix to resolve merge conflict".
>
>> Signed-off-by: Alexey Panov <apanov@astralinux.ru>
>> ---
>> Backport fix for CVE-2024-47736
>>
>> fs/erofs/zdata.c | 59 +++++++++++++++++++++++++-----------------------
>> 1 file changed, 31 insertions(+), 28 deletions(-)
>>
>> diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
>> index 94e9e0bf3bbd..ac01c0ede7f7 100644
>
> I'm looking at the diff of upstream commit and the first thing it does
> is to remove zeroing out the folio/page private field here:
>
> // upstream commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
> @@ -1450,7 +1451,6 @@ static void z_erofs_fill_bio_vec(struct bio_vec *bvec,
> * file-backed folios will be used instead.
> */
> if (folio->private == (void *)Z_EROFS_PREALLOCATED_PAGE) {
> - folio->private = 0;
> tocache = true;
> goto out_tocache;
> }
>
> while in 6.1.129 the corresponding fragment seems untouched with the
> backport patch. Is it intended?
Yes, because it was added in
commit 2080ca1ed3e4 ("erofs: tidy up `struct z_erofs_bvec`")
and dropped again.
But for Linux 6.6.y and 6.1.y, we don't need to backport
2080ca1ed3e4.
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-03-02 17:41 ` Gao Xiang
@ 2025-03-02 17:56 ` Gao Xiang
2025-03-02 18:13 ` Fedor Pchelkin
1 sibling, 0 replies; 13+ messages in thread
From: Gao Xiang @ 2025-03-02 17:56 UTC (permalink / raw)
To: Fedor Pchelkin, Alexey Panov
Cc: stable, Greg Kroah-Hartman, Max Kellermann, lvc-project,
syzbot+de04e06b28cfecf2281c, syzbot+c8c8238b394be4a1087d, Chao Yu,
linux-kernel, Yue Hu, syzbot+4fc98ed414ae63d1ada2, Jeffle Xu,
Gao Xiang, linux-erofs
On 2025/3/3 01:41, Gao Xiang wrote:
> Hi Fedor,
>
> On 2025/3/2 18:56, Fedor Pchelkin wrote:
>> On Fri, 28. Feb 19:51, Alexey Panov wrote:
>>> From: Gao Xiang <hsiangkao@linux.alibaba.com>
>>>
>>> commit 9e2f9d34dd12e6e5b244ec488bcebd0c2d566c50 upstream.
>>>
>>> syzbot reported a task hang issue due to a deadlock case where it is
>>> waiting for the folio lock of a cached folio that will be used for
>>> cache I/Os.
>>>
>>> After looking into the crafted fuzzed image, I found it's formed with
>>> several overlapped big pclusters as below:
>>>
>>> Ext: logical offset | length : physical offset | length
>>> 0: 0.. 16384 | 16384 : 151552.. 167936 | 16384
>>> 1: 16384.. 32768 | 16384 : 155648.. 172032 | 16384
>>> 2: 32768.. 49152 | 16384 : 537223168.. 537239552 | 16384
>>> ...
>>>
>>> Here, extent 0/1 are physically overlapped although it's entirely
>>> _impossible_ for normal filesystem images generated by mkfs.
>>>
>>> First, managed folios containing compressed data will be marked as
>>> up-to-date and then unlocked immediately (unlike in-place folios) when
>>> compressed I/Os are complete. If physical blocks are not submitted in
>>> the incremental order, there should be separate BIOs to avoid dependency
>>> issues. However, the current code mis-arranges z_erofs_fill_bio_vec()
>>> and BIO submission which causes unexpected BIO waits.
>>>
>>> Second, managed folios will be connected to their own pclusters for
>>> efficient inter-queries. However, this is somewhat hard to implement
>>> easily if overlapped big pclusters exist. Again, these only appear in
>>> fuzzed images so let's simply fall back to temporary short-lived pages
>>> for correctness.
>>>
>>> Additionally, it justifies that referenced managed folios cannot be
>>> truncated for now and reverts part of commit 2080ca1ed3e4 ("erofs: tidy
>>> up `struct z_erofs_bvec`") for simplicity although it shouldn't be any
>>> difference.
>>>
>>> Reported-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
>>> Reported-by: syzbot+de04e06b28cfecf2281c@syzkaller.appspotmail.com
>>> Reported-by: syzbot+c8c8238b394be4a1087d@syzkaller.appspotmail.com
>>> Tested-by: syzbot+4fc98ed414ae63d1ada2@syzkaller.appspotmail.com
>>> Closes: https://lore.kernel.org/r/0000000000002fda01061e334873@google.com
>>> Fixes: 8e6c8fa9f2e9 ("erofs: enable big pcluster feature")
>>> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
>>> Link: https://lore.kernel.org/r/20240910070847.3356592-1-hsiangkao@linux.alibaba.com
>>> [Alexey: minor fix to resolve merge conflict]
>>
>> Urgh, it doesn't look so minor indeed. Backward struct folio -> struct
>> page conversions can be tricky sometimes. Please see several comments
>> below.
>
> I manually backported it for Linux 6.6.y, see
> https://web.git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.6.y&id=1bf7e414cac303c9aec1be67872e19be8b64980c
>
> Actually I had a very similiar backport for Linux 6.1.y,
> but I forgot to send it out due to other ongoing stuffs.
>
> I think this backport patch is all good, but you could
> also mention it follows linux 6.6.y conflict changes
> instead of "minor fix to resolve merge conflict".
>
>>
>>> Signed-off-by: Alexey Panov <apanov@astralinux.ru>
>>> ---
>>> Backport fix for CVE-2024-47736
>>>
>>> fs/erofs/zdata.c | 59 +++++++++++++++++++++++++-----------------------
>>> 1 file changed, 31 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
>>> index 94e9e0bf3bbd..ac01c0ede7f7 100644
>>
>> I'm looking at the diff of upstream commit and the first thing it does
>> is to remove zeroing out the folio/page private field here:
>>
>> // upstream commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
>> @@ -1450,7 +1451,6 @@ static void z_erofs_fill_bio_vec(struct bio_vec *bvec,
>> * file-backed folios will be used instead.
>> */
>> if (folio->private == (void *)Z_EROFS_PREALLOCATED_PAGE) {
>> - folio->private = 0;
>> tocache = true;
>> goto out_tocache;
>> }
>>
>> while in 6.1.129 the corresponding fragment seems untouched with the
>> backport patch. Is it intended?
>
> Yes, because it was added in
> commit 2080ca1ed3e4 ("erofs: tidy up `struct z_erofs_bvec`")
> and dropped again.
>
> But for Linux 6.6.y and 6.1.y, we don't need to backport
> 2080ca1ed3e4.
Oh, it seems that I missed this part when backporting
for 6.6.y, but it has no actual difference because
`page->private` will be updated in `goto out_tocache`.
so `set_page_private(page, 0);` was actual a redundant
logic, you could follow the upstream to discard
`set_page_private(page, 0);`.
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-03-02 17:41 ` Gao Xiang
2025-03-02 17:56 ` Gao Xiang
@ 2025-03-02 18:13 ` Fedor Pchelkin
2025-03-03 0:31 ` Gao Xiang
1 sibling, 1 reply; 13+ messages in thread
From: Fedor Pchelkin @ 2025-03-02 18:13 UTC (permalink / raw)
To: Gao Xiang
Cc: Alexey Panov, stable, Greg Kroah-Hartman, Max Kellermann,
lvc-project, syzbot+de04e06b28cfecf2281c,
syzbot+c8c8238b394be4a1087d, Chao Yu, linux-kernel, Yue Hu,
syzbot+4fc98ed414ae63d1ada2, Jeffle Xu, Gao Xiang, linux-erofs
On Mon, 03. Mar 01:41, Gao Xiang wrote:
> > > diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
> > > index 94e9e0bf3bbd..ac01c0ede7f7 100644
> >
> > I'm looking at the diff of upstream commit and the first thing it does
> > is to remove zeroing out the folio/page private field here:
> >
> > // upstream commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
> > @@ -1450,7 +1451,6 @@ static void z_erofs_fill_bio_vec(struct bio_vec *bvec,
> > * file-backed folios will be used instead.
> > */
> > if (folio->private == (void *)Z_EROFS_PREALLOCATED_PAGE) {
> > - folio->private = 0;
> > tocache = true;
> > goto out_tocache;
> > }
> >
> > while in 6.1.129 the corresponding fragment seems untouched with the
> > backport patch. Is it intended?
>
> Yes, because it was added in
> commit 2080ca1ed3e4 ("erofs: tidy up `struct z_erofs_bvec`")
> and dropped again.
>
> But for Linux 6.6.y and 6.1.y, we don't need to backport
> 2080ca1ed3e4.
Thanks for overall clarification, Gao!
My concern was that in 6.1 and 6.6 there is still a pattern at that
place, not directly related to 2080ca1ed3e4 ("erofs: tidy up
`struct z_erofs_bvec`"):
1. checking ->private against Z_EROFS_PREALLOCATED_PAGE
2. zeroing out ->private if the previous check holds true
// 6.1/6.6 fragment
if (page->private == Z_EROFS_PREALLOCATED_PAGE) {
WRITE_ONCE(pcl->compressed_bvecs[nr].page, page);
set_page_private(page, 0);
tocache = true;
goto out_tocache;
}
while the upstream patch changed the situation. If it's okay then no
remarks from me. Sorry for the noise..
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-03-02 18:13 ` Fedor Pchelkin
@ 2025-03-03 0:31 ` Gao Xiang
2025-03-03 9:19 ` Fedor Pchelkin
0 siblings, 1 reply; 13+ messages in thread
From: Gao Xiang @ 2025-03-03 0:31 UTC (permalink / raw)
To: Fedor Pchelkin
Cc: Alexey Panov, stable, Greg Kroah-Hartman, Max Kellermann,
lvc-project, syzbot+de04e06b28cfecf2281c,
syzbot+c8c8238b394be4a1087d, Chao Yu, linux-kernel, Yue Hu,
syzbot+4fc98ed414ae63d1ada2, Jeffle Xu, Gao Xiang, linux-erofs
On 2025/3/3 02:13, Fedor Pchelkin wrote:
> On Mon, 03. Mar 01:41, Gao Xiang wrote:
>>>> diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
>>>> index 94e9e0bf3bbd..ac01c0ede7f7 100644
>>>
>>> I'm looking at the diff of upstream commit and the first thing it does
>>> is to remove zeroing out the folio/page private field here:
>>>
>>> // upstream commit 9e2f9d34dd12 ("erofs: handle overlapped pclusters out of crafted images properly")
>>> @@ -1450,7 +1451,6 @@ static void z_erofs_fill_bio_vec(struct bio_vec *bvec,
>>> * file-backed folios will be used instead.
>>> */
>>> if (folio->private == (void *)Z_EROFS_PREALLOCATED_PAGE) {
>>> - folio->private = 0;
>>> tocache = true;
>>> goto out_tocache;
>>> }
>>>
>>> while in 6.1.129 the corresponding fragment seems untouched with the
>>> backport patch. Is it intended?
>>
>> Yes, because it was added in
>> commit 2080ca1ed3e4 ("erofs: tidy up `struct z_erofs_bvec`")
>> and dropped again.
>>
>> But for Linux 6.6.y and 6.1.y, we don't need to backport
>> 2080ca1ed3e4.
>
> Thanks for overall clarification, Gao!
>
> My concern was that in 6.1 and 6.6 there is still a pattern at that
> place, not directly related to 2080ca1ed3e4 ("erofs: tidy up
> `struct z_erofs_bvec`"):
>
> 1. checking ->private against Z_EROFS_PREALLOCATED_PAGE
> 2. zeroing out ->private if the previous check holds true
>
> // 6.1/6.6 fragment
>
> if (page->private == Z_EROFS_PREALLOCATED_PAGE) {
> WRITE_ONCE(pcl->compressed_bvecs[nr].page, page);
> set_page_private(page, 0);
> tocache = true;
> goto out_tocache;
> }
>
> while the upstream patch changed the situation. If it's okay then no
> remarks from me. Sorry for the noise..
Yeah, yet as I mentioned `set_page_private(page, 0);`
seems redundant from the codebase, I'm fine with either
way.
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-03-03 0:31 ` Gao Xiang
@ 2025-03-03 9:19 ` Fedor Pchelkin
2025-03-04 11:18 ` Алексей Панов
0 siblings, 1 reply; 13+ messages in thread
From: Fedor Pchelkin @ 2025-03-03 9:19 UTC (permalink / raw)
To: Gao Xiang
Cc: Alexey Panov, stable, Greg Kroah-Hartman, Max Kellermann,
lvc-project, syzbot+de04e06b28cfecf2281c,
syzbot+c8c8238b394be4a1087d, Chao Yu, linux-kernel, Yue Hu,
syzbot+4fc98ed414ae63d1ada2, Jeffle Xu, Gao Xiang, linux-erofs
On Mon, 03. Mar 08:31, Gao Xiang wrote:
> On 2025/3/3 02:13, Fedor Pchelkin wrote:
> > My concern was that in 6.1 and 6.6 there is still a pattern at that
> > place, not directly related to 2080ca1ed3e4 ("erofs: tidy up
> > `struct z_erofs_bvec`"):
> >
> > 1. checking ->private against Z_EROFS_PREALLOCATED_PAGE
> > 2. zeroing out ->private if the previous check holds true
> >
> > // 6.1/6.6 fragment
> >
> > if (page->private == Z_EROFS_PREALLOCATED_PAGE) {
> > WRITE_ONCE(pcl->compressed_bvecs[nr].page, page);
> > set_page_private(page, 0);
> > tocache = true;
> > goto out_tocache;
> > }
> >
> > while the upstream patch changed the situation. If it's okay then no
> > remarks from me. Sorry for the noise..
>
> Yeah, yet as I mentioned `set_page_private(page, 0);`
> seems redundant from the codebase, I'm fine with either
> way.
Somehow I've written that mail without seeing your last reply there first.
Now everything is clear.
I'll kindly ask Alexey to send the v2 with minor adjustments to
generally non-minor merge conflict resolutions and the backporter's
comment though.
And again, thanks for clarifying all this.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 6.1 1/2] erofs: handle overlapped pclusters out of crafted images properly
2025-03-03 9:19 ` Fedor Pchelkin
@ 2025-03-04 11:18 ` Алексей Панов
0 siblings, 0 replies; 13+ messages in thread
From: Алексей Панов @ 2025-03-04 11:18 UTC (permalink / raw)
To: Fedor Pchelkin, Gao Xiang
Cc: stable, Greg Kroah-Hartman, Max Kellermann, lvc-project,
syzbot+de04e06b28cfecf2281c, syzbot+c8c8238b394be4a1087d, Chao Yu,
linux-kernel, Yue Hu, syzbot+4fc98ed414ae63d1ada2, Jeffle Xu,
Gao Xiang, linux-erofs
Hi Fedor and Gao!
Thanks for your efforts. I've sent out v2 of this patch with the
appropriate changes.
https://lore.kernel.org/all/20250304110558.8315-1-apanov@astralinux.ru/
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-03-04 11:18 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-28 16:51 [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Alexey Panov
2025-02-28 16:51 ` [PATCH 6.1 1/2] " Alexey Panov
2025-03-01 4:21 ` Sasha Levin
2025-03-02 10:56 ` Fedor Pchelkin
2025-03-02 17:41 ` Gao Xiang
2025-03-02 17:56 ` Gao Xiang
2025-03-02 18:13 ` Fedor Pchelkin
2025-03-03 0:31 ` Gao Xiang
2025-03-03 9:19 ` Fedor Pchelkin
2025-03-04 11:18 ` Алексей Панов
2025-02-28 16:51 ` [PATCH 6.1 2/2] erofs: fix PSI memstall accounting Alexey Panov
2025-03-01 4:20 ` Sasha Levin
2025-03-01 2:52 ` [PATCH 6.1 0/2] erofs: handle overlapped pclusters out of crafted images properly Gao Xiang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox