Re: [PATCH 2/2] ceph: use GFP_KERNEL consistently in __ceph_pool_perm_get()

Viacheslav Dubeyko <[email protected]> Thu, 23 Jul 2026 10:11:10 -0700
Newsgroups org.kernel.vger.ceph-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Thu, 2026-07-23 at 13:47 +0800, Xiubo Li via B4 Relay wrote:
> From: Xiubo Li <[email protected]>
> 
> __ceph_pool_perm_get() has four allocations for building OSD STAT
> requests, three of which used GFP_NOFS and one (the page vector
> allocation) used GFP_KERNEL, making them inconsistent.

__ceph_pool_perm_get() has six allocation calls, not four:

2457: rd_req = ceph_osdc_alloc_request(..., GFP_NOFS);      // (1) NOT
touched by this patch
2471: err = ceph_osdc_alloc_messages(rd_req, GFP_NOFS);     // (2)
changed -> GFP_KERNEL
2475: wr_req = ceph_osdc_alloc_request(..., GFP_NOFS);      // (3)
changed -> GFP_KERNEL
2487: err = ceph_osdc_alloc_messages(wr_req, GFP_NOFS);     // (4)
changed -> GFP_KERNEL
2492: pages = ceph_alloc_page_vector(1, GFP_KERNEL);         // (5)
already GFP_KERNEL
2526: perm = kmalloc_flex(*perm, pool_ns, ..., GFP_NOFS);    // (6) NOT
touched by this patch

Should we change other places too?

Thanks,
Slava.

> 
> The function is only called from ceph_try_get_caps() and
> __ceph_get_caps(), both of which are in the user I/O path (read,
> write, fallocate, mmap fault), not in the writeback path.  There is
> no risk of recursive writeback, so GFP_NOFS is unnecessarily
> restrictive.  Use GFP_KERNEL consistently for all four allocations.
> 
> Signed-off-by: Xiubo Li <[email protected]>
> ---
>  fs/ceph/addr.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index e2da3ab9f808..d2ac3df47e97 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -2479,12 +2479,12 @@ static int __ceph_pool_perm_get(struct
> ceph_inode_info *ci,
>  		rd_req->r_base_oloc.pool_ns =
> ceph_get_string(pool_ns);
>  	ceph_oid_printf(&rd_req->r_base_oid, "%llx.00000000", ci-
> >i_vino.ino);
>  
> -	err = ceph_osdc_alloc_messages(rd_req, GFP_NOFS);
> +	err = ceph_osdc_alloc_messages(rd_req, GFP_KERNEL);
>  	if (err)
>  		goto out_unlock;
>  
>  	wr_req = ceph_osdc_alloc_request(&fsc->client->osdc, NULL,
> -					 1, false, GFP_NOFS);
> +					 1, false, GFP_KERNEL);
>  	if (!wr_req) {
>  		err = -ENOMEM;
>  		goto out_unlock;
> @@ -2495,7 +2495,7 @@ static int __ceph_pool_perm_get(struct
> ceph_inode_info *ci,
>  	ceph_oloc_copy(&wr_req->r_base_oloc, &rd_req->r_base_oloc);
>  	ceph_oid_copy(&wr_req->r_base_oid, &rd_req->r_base_oid);
>  
> -	err = ceph_osdc_alloc_messages(wr_req, GFP_NOFS);
> +	err = ceph_osdc_alloc_messages(wr_req, GFP_KERNEL);
>  	if (err)
>  		goto out_unlock;
>