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@xxxxxxxxxxxxxxx Signed-off-by: Sandeep Dhavale <dhavale@xxxxxxxxxx> --- 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