public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup
@ 2024-02-21 21:03 Sandeep Dhavale
  2024-02-22  0:42 ` Gao Xiang
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Sandeep Dhavale @ 2024-02-21 21:03 UTC (permalink / raw)
  To: Gao Xiang, Chao Yu, Yue Hu, Jeffle Xu
  Cc: quic_wenjieli, Sandeep Dhavale, stable, kernel-team, linux-erofs,
	linux-kernel

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@vger.kernel.org
Signed-off-by: Sandeep Dhavale <dhavale@google.com>
---
Changes since v1
- Rearrange the cases as suggested by Gao so there is less duplication
    of the code and it is more readable

 fs/erofs/namei.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/fs/erofs/namei.c b/fs/erofs/namei.c
index d4f631d39f0f..f0110a78acb2 100644
--- a/fs/erofs/namei.c
+++ b/fs/erofs/namei.c
@@ -130,24 +130,24 @@ static void *erofs_find_target_block(struct erofs_buf *target,
 			/* string comparison without already matched prefix */
 			diff = erofs_dirnamecmp(name, &dname, &matched);
 
-			if (!diff) {
-				*_ndirents = 0;
-				goto out;
-			} else if (diff > 0) {
-				head = mid + 1;
-				startprfx = matched;
-
-				if (!IS_ERR(candidate))
-					erofs_put_metabuf(target);
-				*target = buf;
-				candidate = de;
-				*_ndirents = ndirents;
-			} else {
+			if (diff < 0) {
 				erofs_put_metabuf(&buf);
-
 				back = mid - 1;
 				endprfx = matched;
+				continue;
+			}
+
+			if (!IS_ERR(candidate))
+				erofs_put_metabuf(target);
+			*target = buf;
+			if (!diff) {
+				*_ndirents = 0;
+				return de;
 			}
+			head = mid + 1;
+			startprfx = matched;
+			candidate = de;
+			*_ndirents = ndirents;
 			continue;
 		}
 out:		/* free if the candidate is valid */
-- 
2.44.0.rc0.258.g7320e95886-goog


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup
  2024-02-21 21:03 [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup Sandeep Dhavale
@ 2024-02-22  0:42 ` Gao Xiang
  2024-02-22  3:19 ` Jingbo Xu
  2024-02-22  7:35 ` Chao Yu
  2 siblings, 0 replies; 4+ messages in thread
From: Gao Xiang @ 2024-02-22  0:42 UTC (permalink / raw)
  To: Sandeep Dhavale, Gao Xiang, Chao Yu, Yue Hu, Jeffle Xu
  Cc: quic_wenjieli, stable, kernel-team, linux-erofs, linux-kernel



On 2024/2/22 05:03, Sandeep Dhavale wrote:
> 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@vger.kernel.org
> Signed-off-by: Sandeep Dhavale <dhavale@google.com>

Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>

Thanks,
Gao Xiang

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup
  2024-02-21 21:03 [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup Sandeep Dhavale
  2024-02-22  0:42 ` Gao Xiang
@ 2024-02-22  3:19 ` Jingbo Xu
  2024-02-22  7:35 ` Chao Yu
  2 siblings, 0 replies; 4+ messages in thread
From: Jingbo Xu @ 2024-02-22  3:19 UTC (permalink / raw)
  To: Sandeep Dhavale, Gao Xiang, Chao Yu, Yue Hu
  Cc: quic_wenjieli, stable, kernel-team, linux-erofs, linux-kernel



On 2/22/24 5:03 AM, Sandeep Dhavale wrote:
> 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@vger.kernel.org
> Signed-off-by: Sandeep Dhavale <dhavale@google.com>


LGTM.

Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com>


> ---
> Changes since v1
> - Rearrange the cases as suggested by Gao so there is less duplication
>     of the code and it is more readable
> 
>  fs/erofs/namei.c | 28 ++++++++++++++--------------
>  1 file changed, 14 insertions(+), 14 deletions(-)
> 
> diff --git a/fs/erofs/namei.c b/fs/erofs/namei.c
> index d4f631d39f0f..f0110a78acb2 100644
> --- a/fs/erofs/namei.c
> +++ b/fs/erofs/namei.c
> @@ -130,24 +130,24 @@ static void *erofs_find_target_block(struct erofs_buf *target,
>  			/* string comparison without already matched prefix */
>  			diff = erofs_dirnamecmp(name, &dname, &matched);
>  
> -			if (!diff) {
> -				*_ndirents = 0;
> -				goto out;
> -			} else if (diff > 0) {
> -				head = mid + 1;
> -				startprfx = matched;
> -
> -				if (!IS_ERR(candidate))
> -					erofs_put_metabuf(target);
> -				*target = buf;
> -				candidate = de;
> -				*_ndirents = ndirents;
> -			} else {
> +			if (diff < 0) {
>  				erofs_put_metabuf(&buf);
> -
>  				back = mid - 1;
>  				endprfx = matched;
> +				continue;
> +			}
> +
> +			if (!IS_ERR(candidate))
> +				erofs_put_metabuf(target);
> +			*target = buf;
> +			if (!diff) {
> +				*_ndirents = 0;
> +				return de;
>  			}
> +			head = mid + 1;
> +			startprfx = matched;
> +			candidate = de;
> +			*_ndirents = ndirents;
>  			continue;
>  		}
>  out:		/* free if the candidate is valid */

-- 
Thanks,
Jingbo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup
  2024-02-21 21:03 [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup Sandeep Dhavale
  2024-02-22  0:42 ` Gao Xiang
  2024-02-22  3:19 ` Jingbo Xu
@ 2024-02-22  7:35 ` Chao Yu
  2 siblings, 0 replies; 4+ messages in thread
From: Chao Yu @ 2024-02-22  7:35 UTC (permalink / raw)
  To: Sandeep Dhavale, Gao Xiang, Yue Hu, Jeffle Xu
  Cc: quic_wenjieli, stable, kernel-team, linux-erofs, linux-kernel

On 2024/2/22 5:03, Sandeep Dhavale wrote:
> 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@vger.kernel.org
> Signed-off-by: Sandeep Dhavale <dhavale@google.com>

Reviewed-by: Chao Yu <chao@kernel.org>

Thanks,

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-02-22  7:35 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-21 21:03 [PATCH v2] erofs: fix refcount on the metabuf used for inode lookup Sandeep Dhavale
2024-02-22  0:42 ` Gao Xiang
2024-02-22  3:19 ` Jingbo Xu
2024-02-22  7:35 ` Chao Yu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox