[pnfs] A Few bug fixes

William A. (Andy) Adamson andros at citi.umich.edu
Fri Jun 1 09:22:12 EDT 2007


Hi Rahul

Would you please re-submit these bug-fix patches?

Thanks

-->Andy

On 5/31/07, William A. (Andy) Adamson <andros at citi.umich.edu> wrote:
>
> comment in line...
>
> -->Andy
>
> On 5/31/07, Benny Halevy <bhalevy at panasas.com> wrote:
> >
> > Rahul, some comments on patches 2-5:
> >
> > patch 2:
> > diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> > index 94cc6dd..8c24516 100644
> > --- a/net/sunrpc/xprtsock.c
> > +++ b/net/sunrpc/xprtsock.c
> > @@ -691,7 +691,14 @@ static inline void xs_tcp_read_request(struct
> > rpc_xprt *xprt, skb_reader_t *desc
> >         calldir = ntohl(xprt->tcp_calldir);
> >         if (calldir == RPC_CALL) {
> >
> > -               req = xprt_alloc_bc_request(xprt);
> > +               if (xprt->bc_mempool)
> > +                       req = xprt_alloc_bc_request(xprt);
> > +               else {
> > +                       /*
> > +                        * Received callback when none is expected
> > +                        */
> > +                       req = NULL;
> > +               }
> >
> >                 if (!req) {
> >                         printk(KERN_NOTICE "Couldn't get rpc_rqst for
> > the allback! Dropping callback...\n");
> >
> > Please print a different warning for the two cases (in one bc_mempool is
> > NULL
> > the other is xprt_alloc_bc_request returning NULL) and fix "allback" to
> > "callback"
> >
> > Eventually we can drop the callback safely in the first case since it
> > was sent
> > when there's no back channel but in the latter case we will need to
> > handle the
> > error differently as we discussed.
> >
> > patch 3:@@ -1245,18 +1245,24 @@ static int nfs4_fill_super(struct
> > super_block *sb, struct nfs4_mount_data *data,
> >                 }
> >         }
> >
> > +       /*
> > +        * This is safe to do because all nfs4_create_client uses is the
> > +        * version number. The version number for all minorversions is 4
> > +        */
> >
> > I'd put this comment only in the commit message rather than in the code
> > since
> > the code is straight forward.
> >
> > +       server->rpc_ops =
> > nfsv4_minorversion_clientops[NFSV4_MAX_MINORVERSION];
> > +       server->client = nfs4_create_client(server, &timeparms,
> > data->proto, authflavour);
> > +       if (IS_ERR(server->client)) {
> > +               err = PTR_ERR(server->client);
> > +                       dprintk("%s: cannot create RPC client. Error =
> > %d\n",
> > +                                       __FUNCTION__, err);
> > +                       goto out_fail;
> >
> > I see that this was cut and pasted from below but there's an
> > extra tab indent in the two statements above which we can fix in
> > process.
> >
> > +       }
> > +
> >
> > @@ -1282,8 +1288,6 @@ static int nfs4_fill_super(struct super_block *sb,
> > struct nfs4_mount_data *data,
> >                                  * Shut down the callback service
> >                                  */
> >                                 nfs_callback_down(i,
> > server->client->cl_xprt);
> > -
> > -                                rpc_shutdown_client(server->client);
> >                          }
> >                         else
> >                                 break;
> >
> > Who destroys the nfs4 client (and rpc client) if setup session
> > failed for all minor versions?
> >
> > patch 4:
> > diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c
> > index 14a918b..aff054b 100644
> > --- a/fs/nfs/nfs4renewd.c
> > +++ b/fs/nfs/nfs4renewd.c
> > @@ -120,6 +120,7 @@ out:
> > no_cred:
> >         printk(KERN_EMERG "couldn't get renew creds!\n");
> >         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
> > +       spin_unlock(&clp->cl_lock);
> >         nfs_expire_all_delegations(clp);
> >         goto out;
> > }
> >
> > 1. I'd move the printk call after the spin_unlock.
> >
> > 2. I see the need for this unlock, good catch!.  When looking for
> >    it I realized that the indentation in this function is quite
> >    confusing.  How about also fixing it:
> >
> >                         if (cred == NULL) {
> >                                 if (IS_ERR(clp->cl_rpcclient))
> >                                         goto no_cred;
> >                                 cred =
> > rpcauth_lookupcred(clp->cl_rpcclient->cl_auth, 0);
> >                                 if (IS_ERR(cred))
> >                                         goto no_cred;
> > -               }
> > -               spin_unlock(&clp->cl_lock);
> > +                       }
> > +                       spin_unlock(&clp->cl_lock);
> >                         if (nfs4_proc_async_sequence(clp, cred))
> >                                 printk(KERN_NOTICE "Could not allocate
> > memory \
> >                                                 for SEQUENCE call!\n");
> >                 }
> >
> >
> > patch 5 looks good
> >
> > Benny
> >
> > Iyer, Rahul wrote:
> > > Forgot the patches
> > > Regards
> > > Rahul
> > >
> > >
> > >> -----Original Message-----
> > >> From: Iyer, Rahul
> > >> Sent: Friday, May 25, 2007 5:54 PM
> > >> To: pnfs at linux-nfs.org
> > >> Subject: [pnfs] A Few bug fixes
> > >>
> > >> Hi All,
> > >> Here are a few Bug fixes I have for the client. Today, I got
> > >> the latest tree and could mount the server. These patches
> > >> apply to the latest tree and do not break anything. I could
> > >> run connectathon on them multiple times.
> > >>
> > >> Thanks
> > >> Regards
> > >> Rahul
> > >>
> > >>
> > >> Summary
> > >> -------
> > >>  fs/nfs/nfs4renewd.c           |    1 +
> > >>  fs/nfs/nfs4state.c            |    2 +-
> > >>  fs/nfs/super.c                |   22 +++++++++++--------
> > >>  include/linux/sunrpc/xprt.h   |    3 ++
> > >>  net/sunrpc/backchannel_rqst.c |   45
> > >> +++++++++++++++++++++++++++++++++++++++++
> > >>  net/sunrpc/xprtsock.c         |    9 +++++++-
> > >>  6 files changed, 71 insertions(+), 11 deletions(-)
> > >>
> > >> Patch Description
> > >> -----------------
> > >>
> > >> [PATCH 1/5] Synchronize callback request allocation with
> > disconnection
> > >>
> > >> Currently, there is no synchronization between disconnection
> > >> of the callback channel and allocation of callback requests.
> > >> This patch ensures that:
> > >> 1. If the channel is being disconnected, requests are not
> > >> allocated 2. If requests are allocated, the channel waits for
> > >> the requests to be
> > >>    deallocated before disconnecting
> > >>
> > >> ----
> > >> [PATCH 2/5] Allocate a callback request only if you have a mempool
> > >>
> > >> This patch adds a check for xprt->bc_mempool != NULL in
> > >> xs_tcp_read_request.
> > >> This is for cases when you may receive a packet with the call
> > >> header set. If you're not expecting callbacks on the channel
> > >> (e.g NFSv4.0), the code will panic
> > >>
> > >> ----
> > >> [PATCH 3/5] Avoid creating nfs4_client on every minorversion
> > >> iteration.
> > >>
> > >> This patch creates an nfs4_client structure once and then
> > >> uses it for the subsequent minorversion iterations until one is
> > found.
> > >>
> > >> As a by product, this also fixes a bug in the refcounting of
> > >> the nfs4_client struct. Since nfs4_create_client is called to
> > >> create the client and rpc_shutdown_client is called to shut
> > >> it down, there is a leak in the cl_users field of the
> > >> nfs4_client struct. As a result if an NFSv4.1 mount fails and
> > >> it falls back to v4.0, on unmount, cl_users isn't
> > >> decremented. As a result, the callback server on the client
> > >> isn't killed.
> > >>
> > >> ----
> > >> [PATCH 4/5] Release cl_lock when unable to find renew creds
> > >> in nfs4_renew_state
> > >>
> > >> If renew creds could not be obtained in the NFSv4 case, the
> > >> spin lock on
> > >> clp->cl_lock wasn't dropped. This resuts in a soft lockup.
> > >>
> > >> ----
> > >> [PATCH 5/5] Move the call to nfs_callback_down to nfs4_put_client.
> > >>
> > >> The callto nfs_callback_down is currently in
> > >> nfs4_free_client. Move this to nfs4_put_client because this
> > >> is where it "fits".
> > >>
> > >> ----
> > >> _______________________________________________
> > >> pNFS mailing list
> > >> pNFS at linux-nfs.org
> > >> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> > >>
> > >>
> > >>
> > ------------------------------------------------------------------------
> > >>
> > >> From bc7afef1f3d5630884c24aa693df07d5e1c88c5a Mon Sep 17 00:00:00
> > 2001
> > >> Message-Id: <bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com
> > >
> > >> From: Rahul Iyer <iyer at netapp.com>
> > >> Date: Fri, 25 May 2007 12:32:44 -0700
> > >> Subject: [PATCH 1/5] Synchronize callback request allocation with
> > disconnection
> > >>
> > >> Currently, there is no synchronization between disconnection of the
> > callback
> > >> channel and allocation of callback requests. This patch ensures that:
> > >> 1. If the channel is being disconnected, requests are not allocated
> > >> 2. If requests are allocated, the channel waits for the requests to
> > be
> > >>    deallocated before disconnecting
> > >>
> > >> Signed-off-by: Rahul Iyer <iyer at netapp.com >
> > >> ---
> > >>  include/linux/sunrpc/xprt.h   |    3 ++
> > >>  net/sunrpc/backchannel_rqst.c |   45
> > +++++++++++++++++++++++++++++++++++++++++
> > >>  2 files changed, 48 insertions(+), 0 deletions(-)
> > >>
> > >> diff --git a/include/linux/sunrpc/xprt.h
> > b/include/linux/sunrpc/xprt.h
> > >> index dd8a5a8..361979f 100644
> > >> --- a/include/linux/sunrpc/xprt.h
> > >> +++ b/include/linux/sunrpc/xprt.h
> > >> @@ -196,6 +196,9 @@ struct rpc_xprt {
> > >>      struct svc_serv *       serv;           /* The svc_serv to queue
> > the callbacks onto */
> > >>      kmem_cache_t *          bc_slab;        /* The slab for the
> > callback request mempool */
> > >>      mempool_t *             bc_mempool;     /* The mempool to
> > allocate rpc_rqst structs from for the callbacks */
> > >> +    unsigned char           destructing;    /* The callback service
> > is being shut down. */
> > >> +    unsigned int            bc_req_count;   /* Number of requests
> > allocated */
> > >> +    wait_queue_head_t       bc_shutdown_wq;
> > >>  #endif
> > >>
> > >>      struct list_head        recv;
> > >> diff --git a/net/sunrpc/backchannel_rqst.c
> > b/net/sunrpc/backchannel_rqst.c
> > >> index 9f740b1..68237f0 100644
> > >> --- a/net/sunrpc/backchannel_rqst.c
> > >> +++ b/net/sunrpc/backchannel_rqst.c
> > >> @@ -58,6 +58,10 @@ int xprt_setup_backchannel(struct rpc_xprt *xprt,
> > unsigned int min_reqs)
> > >>              goto out_free;
> > >>      }
> > >>
> > >> +    xprt->destructing = 0;
> > >> +    xprt->bc_req_count = 0;
> > >> +    init_waitqueue_head(&xprt->bc_shutdown_wq);
> > >> +
> > >>      return 0;
> > >>
> > >>  out_free:
> > >> @@ -70,12 +74,32 @@ EXPORT_SYMBOL(xprt_setup_backchannel);
> > >>
> > >>  void xprt_destroy_backchannel(struct rpc_xprt *xprt)
> > >>  {
> > >> +    DEFINE_WAIT(wq);
> > >> +
> > >> +    prepare_to_wait(&xprt->bc_shutdown_wq, &wq,
> > TASK_UNINTERRUPTIBLE);
> > >> +    spin_lock(&xprt->transport_lock);
> > >> +    xprt->destructing = 1;
> > >> +
> > >> +    if (xprt->bc_req_count) {
> > >> +            spin_unlock(&xprt->transport_lock);
> > >> +            schedule();
> > >> +    }
> > >> +    spin_unlock(&xprt->transport_lock);
> > >> +    finish_wait(&xprt->bc_shutdown_wq, &wq);
> > >> +
> > >>      mempool_destroy(xprt->bc_mempool);
> > >> +    xprt->bc_mempool = NULL;
> > >> +
> > >> +    BUG_ON(!xprt->bc_slab);
> > >>      kmem_cache_destroy(xprt->bc_slab);
> > >>  }
> > >>
> > >>  EXPORT_SYMBOL(xprt_destroy_backchannel);
> > >>
> > >> +/*
> > >> + * Allocate a backchannel request. Must be always called with the
> > >> + * xprt->transport_lock held
> > >> + */
> > >>  struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt)
> > >>  {
> > >>      struct rpc_rqst *req;
> > >> @@ -84,11 +108,24 @@ struct rpc_rqst *xprt_alloc_bc_request(struct
> > rpc_xprt *xprt)
> > >>
> > >>      BUG_ON(xprt->bc_mempool == NULL);
> > >>
> > >> +    if (xprt->destructing) {
>
>
>
> Don't you need to take the xprt->transport_lock before inspecting
> xprt->destructing?
>
>
> >> +            /*
> > >> +             * This callback channel is being torn down. Do not
> > honour this
> > >> +             * request
> > >> +             */
> > >> +            goto out;
> > >> +    }
> > >> +
> > >>      req = mempool_alloc(xprt->bc_mempool, GFP_ATOMIC);
> > >>
> > >>      if (!req)
> > >>              goto out;
> > >>
> > >> +    /*
> > >> +     * Increment the allocated request count
> > >> +     */
> > >> +    ++xprt->bc_req_count;
>
>
>
> also take the xprt->transport_lock before inc/dec bc_req_count?
>
>
> >> +
> > >>      req->rq_xprt = xprt;
> > >>      req->rq_xid = xprt->tcp_xid;
> > >>
> > >> @@ -124,6 +161,7 @@ struct rpc_rqst *xprt_alloc_bc_request(struct
> > rpc_xprt *xprt)
> > >>  out_free_page:
> > >>      free_page((unsigned long)xbufp->head[0].iov_base);
> > >>  out_free:
> > >> +    --xprt->bc_req_count;
>
>
> nee to take the xprt->transport_lock to dec?
>
>
> >>      mempool_free(req, xprt->bc_mempool);
> > >>  out:
> > >>      return NULL;
> > >> @@ -141,6 +179,13 @@ void xprt_free_bc_request(struct rpc_rqst *req)
> > >>      free_page((unsigned long)xbufp->head[0].iov_base);
> > >>
> > >>      mempool_free(req, xprt->bc_mempool);
> > >> +
> > >> +    BUG_ON(!xprt->bc_req_count);
> > >> +
> > >> +    spin_lock(&xprt->transport_lock);
> > >> +    --xprt->bc_req_count;
> > >> +    wake_up(&xprt->bc_shutdown_wq);
> > >> +    spin_unlock(&xprt->transport_lock);
> > >>  }
> > >>
> > >>  #endif
> > >>
> > >>
> > ------------------------------------------------------------------------
> > >>
> > >> From e8f5e610582908efe478a32520e3b167469f64a2 Mon Sep 17 00:00:00
> > 2001
> > >> Message-Id: <
> > e8f5e610582908efe478a32520e3b167469f64a2.1180138977.git.iyer at netapp.com>
> > >> In-Reply-To: <
> > bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com>
> > >> References: <bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com
> > >
> > >> From: Rahul Iyer <iyer at netapp.com>
> > >> Date: Fri, 25 May 2007 15:18:09 -0700
> > >> Subject: [PATCH 2/5] Allocate a callback request only if you have a
> > mempool
> > >>
> > >> This patch adds a check for xprt->bc_mempool != NULL in
> > xs_tcp_read_request.
> > >> This is for cases when you may receive a packet with the call header
> > set. If
> > >> you're not expecting callbacks on the channel (e.g NFSv4.0), the code
> > will
> > >> panic
> > >>
> > >> Signed-off-by: Rahul Iyer <iyer at netapp.com>
> > >> ---
> > >>  net/sunrpc/xprtsock.c |    9 ++++++++-
> > >>  1 files changed, 8 insertions(+), 1 deletions(-)
> > >>
> > >> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> > >> index 94cc6dd..8c24516 100644
> > >> --- a/net/sunrpc/xprtsock.c
> > >> +++ b/net/sunrpc/xprtsock.c
> > >> @@ -691,7 +691,14 @@ static inline void xs_tcp_read_request(struct
> > rpc_xprt *xprt, skb_reader_t *desc
> > >>      calldir = ntohl(xprt->tcp_calldir);
> > >>      if (calldir == RPC_CALL) {
> > >>
> > >> -            req = xprt_alloc_bc_request(xprt);
> > >> +            if (xprt->bc_mempool)
> > >> +                    req = xprt_alloc_bc_request(xprt);
> > >> +            else {
> > >> +                    /*
> > >> +                     * Received callback when none is expected
> > >> +                     */
> > >> +                    req = NULL;
> > >> +            }
> > >>
> > >>              if (!req) {
> > >>                      printk(KERN_NOTICE "Couldn't get rpc_rqst for
> > the allback! Dropping callback...\n");
> > >>
> > >>
> > ------------------------------------------------------------------------
> > >>
> > >> From 683c5ff48227c2a3f69abcf752ee08abb791808a Mon Sep 17 00:00:00
> > 2001
> > >> Message-Id: <
> > 683c5ff48227c2a3f69abcf752ee08abb791808a.1180138977.git.iyer at netapp.com>
> > >> In-Reply-To: <
> > bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com>
> > >> References: <bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com
> > >
> > >> From: Rahul Iyer <iyer at netapp.com>
> > >> Date: Fri, 25 May 2007 15:24:04 -0700
> > >> Subject: [PATCH 3/5] Avoid creating nfs4_client on every minorversion
> > iteration.
> > >>
> > >> This patch creates an nfs4_client structure once and then uses it for
> > the
> > >> subsequent minorversion iterations until one is found.
> > >>
> > >> As a by product, this also fixes a bug in the refcounting of the
> > nfs4_client
> > >> struct. Since nfs4_create_client is called to create the client and
> > >> rpc_shutdown_client is called to shut it down, there is a leak in the
> > cl_users
> > >> field of the nfs4_client struct. As a result if an NFSv4.1 mount
> > fails and it
> > >> falls back to v4.0, on unmount, cl_users isn't decremented. As a
> > result, the
> > >> callback server on the client isn't killed.
> > >>
> > >> Signed-off-by: Rahul Iyer <iyer at netapp.com>
> > >> ---
> > >>  fs/nfs/super.c |   22 +++++++++++++---------
> > >>  1 files changed, 13 insertions(+), 9 deletions(-)
> > >>
> > >> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
> > >> index fc18c8c..1721c01 100644
> > >> --- a/fs/nfs/super.c
> > >> +++ b/fs/nfs/super.c
> > >> @@ -1245,18 +1245,24 @@ static int nfs4_fill_super(struct super_block
> > *sb, struct nfs4_mount_data *data,
> > >>              }
> > >>      }
> > >>
> > >> +    /*
> > >> +     * This is safe to do because all nfs4_create_client uses is the
> > >> +     * version number. The version number for all minorversions is 4
> >
> > >> +     */
> > >> +    server->rpc_ops =
> > nfsv4_minorversion_clientops[NFSV4_MAX_MINORVERSION];
> > >> +    server->client = nfs4_create_client(server, &timeparms,
> > data->proto, authflavour);
> > >> +    if (IS_ERR(server->client)) {
> > >> +            err = PTR_ERR(server->client);
> > >> +                    dprintk("%s: cannot create RPC client. Error =
> > %d\n",
> > >> +                                    __FUNCTION__, err);
> > >> +                    goto out_fail;
> > >> +    }
> > >> +
> > >>          for (i = NFSV4_MAX_MINORVERSION; i >= 0; --i) {
> > >>                  nfs_version4 = *nfs4_minorversions[i];
> > >>                  nfs4_procedures = nfs4_minorversion_procedures[i];
> > >>                  server->rpc_ops = nfsv4_minorversion_clientops[i];
> > >>
> > >> -                server->client = nfs4_create_client(server,
> > &timeparms, data->proto, authflavour);
> > >> -                if (IS_ERR(server->client)) {
> > >> -                        err = PTR_ERR(server->client);
> > >> -                                dprintk("%s: cannot create RPC
> > client. Error = %d\n",
> > >> -                                                __FUNCTION__, err);
> > >> -                                goto out_fail;
> > >> -                }
> > >>                  server->nfs4_state->cl_minorversion = i;
> > >>
> > >>              /*
> > >> @@ -1282,8 +1288,6 @@ static int nfs4_fill_super(struct super_block
> > *sb, struct nfs4_mount_data *data,
> > >>                               * Shut down the callback service
> > >>                               */
> > >>                              nfs_callback_down(i,
> > server->client->cl_xprt);
> > >> -
> > >> -                                rpc_shutdown_client(server->client);
> > >>                          }
> > >>                      else
> > >>                              break;
> > >>
> > >>
> > ------------------------------------------------------------------------
> > >>
> > >> From 8d73dafc0cb7cf428079803154420cb235ad25c7 Mon Sep 17 00:00:00
> > 2001
> > >> Message-Id: <8d73dafc0cb7cf428079803154420cb235ad25c7.1180138977.git.iyer at netapp.com
> > >
> > >> In-Reply-To: <
> > bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com>
> > >> References: <
> > bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com>
> > >> From: Rahul Iyer < iyer at netapp.com>
> > >> Date: Fri, 25 May 2007 15:27:19 -0700
> > >> Subject: [PATCH 4/5] Release cl_lock when unable to find renew creds
> > in nfs4_renew_state
> > >>
> > >> If renew creds could not be obtained in the NFSv4 case, the spin lock
> > on
> > >> clp->cl_lock wasn't dropped. This resuts in a soft lockup.
> > >>
> > >> Signed-off-by: Rahul Iyer <iyer at netapp.com>
> > >> ---
> > >>  fs/nfs/nfs4renewd.c |    1 +
> > >>  1 files changed, 1 insertions(+), 0 deletions(-)
> > >>
> > >> diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c
> > >> index 14a918b..aff054b 100644
> > >> --- a/fs/nfs/nfs4renewd.c
> > >> +++ b/fs/nfs/nfs4renewd.c
> > >> @@ -120,6 +120,7 @@ out:
> > >>  no_cred:
> > >>      printk(KERN_EMERG "couldn't get renew creds!\n");
>
>
>
> don't like KERN_EMERG. just a printk would do ......
>
>
> >>      set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
> > >> +    spin_unlock(&clp->cl_lock);
> > >>      nfs_expire_all_delegations(clp);
> > >>      goto out;
> > >>  }
> > >>
> > >>
> > ------------------------------------------------------------------------
> > >>
> > >> From 5fe3a61025d7052a1a4e77f15413b0c3d1e81b6c Mon Sep 17 00:00:00
> > 2001
> > >> Message-Id: <
> > 5fe3a61025d7052a1a4e77f15413b0c3d1e81b6c.1180138977.git.iyer at netapp.com>
> > >> In-Reply-To: <
> > bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com>
> > >> References: <bc7afef1f3d5630884c24aa693df07d5e1c88c5a.1180138977.git.iyer at netapp.com
> > >
> > >> From: Rahul Iyer <iyer at netapp.com>
> > >> Date: Fri, 25 May 2007 16:45:11 -0700
> > >> Subject: [PATCH 5/5] Move the call to nfs_callback_down to
> > nfs4_put_client.
> > >>
> > >> The callto nfs_callback_down is currently in nfs4_free_client. Move
> > this to
> > >> nfs4_put_client because this is where it "fits".
> > >>
> > >> Signed-off-by: Rahul Iyer <iyer at netapp.com>
> > >> ---
> > >>  fs/nfs/nfs4state.c |    2 +-
> > >>  1 files changed, 1 insertions(+), 1 deletions(-)
> > >>
> > >> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > >> index 9c0d53a..f276779 100644
> > >> --- a/fs/nfs/nfs4state.c
> > >> +++ b/fs/nfs/nfs4state.c
> > >> @@ -125,7 +125,6 @@ nfs4_free_client(struct nfs4_client *clp)
> > >>      }
> > >>      BUG_ON(!list_empty(&clp->cl_state_owners));
> > >>      nfs_idmap_delete(clp);
> > >> -    nfs_callback_down(minorversion, clp->cl_rpcclient->cl_xprt);
> > >>      if (!IS_ERR(clp->cl_rpcclient))
> > >>              rpc_shutdown_client(clp->cl_rpcclient);
> > >>      kfree(clp);
> > >> @@ -189,6 +188,7 @@ nfs4_put_client(struct nfs4_client *clp)
> > >>      spin_unlock(&state_spinlock);
> > >>      BUG_ON(!list_empty(&clp->cl_superblocks));
> > >>      rpc_wake_up(&clp->cl_rpcwaitq);
> > >> +    nfs_callback_down(clp->cl_minorversion,
> > clp->cl_rpcclient->cl_xprt);
> > >>      nfs4_kill_renewd(clp);
> > >>      nfs4_free_client(clp);
> > >>  }
> > >>
> > >>
> > ------------------------------------------------------------------------
> > >>
> > >> _______________________________________________
> > >> pNFS mailing list
> > >> pNFS at linux-nfs.org
> > >> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> >
> > _______________________________________________
> > pNFS mailing list
> > pNFS at linux-nfs.org
> > http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://linux-nfs.org/pipermail/pnfs/attachments/20070601/fe9c9fb8/attachment-0001.htm 


More information about the pNFS mailing list