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

From: Xiubo Li

Date: Wed Aug 12 2026 - 03:24:28 EST


Hi Slava,

Sorry for the late reply. I think I just missed your email.

Yeah, you are right. Let me fix it.

Thanks
- XIubo

On Thu, 23 Jul 2026 at 10:11, Viacheslav Dubeyko <slava@xxxxxxxxxxx> wrote:
>
> On Thu, 2026-07-23 at 13:47 +0800, Xiubo Li via B4 Relay wrote:
> > From: Xiubo Li <xiubo.li@xxxxxxxxx>
> >
> > __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 <xiubo.li@xxxxxxxxx>
> > ---
> > 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;
> >