mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 15:22:21 -04:00
erofs: skip sufficiently large global buffers when resizing
z_erofs_gbuf_nrpages is advanced only after every global buffer has been
grown. If a resize fails after some buffers were enlarged, a retry
revisits those enlarged buffers.
Retrying the same size then returns -ENOMEM because alloc_pages_bulk()
has no pages to add and the unchanged return value is treated as a
failure. Retrying an intermediate size allocates a temporary pointer
array smaller than gbuf->nrpages and copies more existing pointers than
the array can hold.
Skip buffers that already satisfy the request. Once all remaining
buffers have caught up, advancing z_erofs_gbuf_nrpages again describes
the guaranteed minimum size across the pool.
Fixes: d6db47e571 ("erofs: do not use pagepool in z_erofs_gbuf_growsize()")
Cc: stable@vger.kernel.org # 6.10+
Signed-off-by: Nikhil Gurudasani <nikhilgurudasani314@gmail.com>
Reviewed-by: Gao Xiang <xiang@kernel.org>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <xiang@kernel.org>
This commit is contained in:
committed by
Gao Xiang
parent
c77516e1e6
commit
a7d097cf01
@@ -79,6 +79,8 @@ int z_erofs_gbuf_growsize(unsigned int nrpages)
|
||||
|
||||
for (i = 0; i < z_erofs_gbuf_count; ++i) {
|
||||
gbuf = &z_erofs_gbufpool[i];
|
||||
if (gbuf->nrpages >= nrpages)
|
||||
continue;
|
||||
tmp_pages = kzalloc_objs(*tmp_pages, nrpages);
|
||||
if (!tmp_pages)
|
||||
goto out;
|
||||
|
||||
Reference in New Issue
Block a user