[PATCH v1] erofs: fix refcount on the metabuf used for inode lookup
Sandeep Dhavale
dhavale at google.com
Wed Feb 21 06:11:13 AEDT 2024
In erofs_find_target_block() when erofs_dirnamecmp() returns 0,
we do not assign the target metabuf. This causes the caller
erofs_namei()'s erofs_put_metabuf() at the end to be not effective
leaving the refcount on the page.
As the page from metabuf (buf->page) is never put, such page cannot be
migrated or reclaimed. Fix it now by putting the metabuf from
previous loop and assigning the current metabuf to target before
returning so caller erofs_namei() can do the final put as it was
intended.
Fixes: 500edd095648 ("erofs: use meta buffers for inode lookup")
Cc: stable at vger.kernel.org
Signed-off-by: Sandeep Dhavale <dhavale at google.com>
---
fs/erofs/namei.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/fs/erofs/namei.c b/fs/erofs/namei.c
index d4f631d39f0f..bfe1c926436b 100644
--- a/fs/erofs/namei.c
+++ b/fs/erofs/namei.c
@@ -132,7 +132,10 @@ static void *erofs_find_target_block(struct erofs_buf *target,
if (!diff) {
*_ndirents = 0;
- goto out;
+ if (!IS_ERR(candidate))
+ erofs_put_metabuf(target);
+ *target = buf;
+ return de;
} else if (diff > 0) {
head = mid + 1;
startprfx = matched;
--
2.44.0.rc0.258.g7320e95886-goog
More information about the Linux-erofs
mailing list