[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