Matthew Wilcox wrote on Thu, Jun 28, 2018:
> diff --git a/net/9p/client.c b/net/9p/client.c
> index f8d58b0852fe..bbab82f22c20 100644
> --- a/net/9p/client.c
> +++ b/net/9p/client.c
> @@ -908,30 +908,27 @@ static struct p9_fid *p9_fid_create(struct p9_client 
> *clnt)
>  {
>       int ret;
>       struct p9_fid *fid;
> -     unsigned long flags;
>  
>       p9_debug(P9_DEBUG_FID, "clnt %p\n", clnt);
>       fid = kmalloc(sizeof(struct p9_fid), GFP_KERNEL);
>       if (!fid)
>               return NULL;
>  
> -     ret = p9_idpool_get(clnt->fidpool);
> -     if (ret < 0)
> -             goto error;
> -     fid->fid = ret;
> -
>       memset(&fid->qid, 0, sizeof(struct p9_qid));
>       fid->mode = -1;
>       fid->uid = current_fsuid();
>       fid->clnt = clnt;
>       fid->rdir = NULL;
> -     spin_lock_irqsave(&clnt->lock, flags);
> -     list_add(&fid->flist, &clnt->fidlist);
> -     spin_unlock_irqrestore(&clnt->lock, flags);
>  
> -     return fid;
> +     idr_preload(GFP_KERNEL);
> +     spin_lock_irq(&clnt->lock);
> +     ret = idr_alloc_u32(&clnt->fids, fid, &fid->fid, UINT_MAX, GFP_NOWAIT);

There's also a P9_NOFID that we shouldn't use, so the max here should be
P9_NOFID - 1

That aside this introduces a change of behaviour that fid used to be
alloc'd linearily from 0 which no longer holds true, that breaks one
serveur (nfs-ganesha just returns ERANGE) but others seem to handle this
just fine so they'll just need to fix that server.
max aside this looks good.

-- 
Dominique Martinet

Reply via email to