Message ID | 1397846704-14567-3-git-send-email-trond.myklebust@primarydata.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Apr 18, 2014 at 02:43:56PM -0400, Trond Myklebust wrote: > Aside from making it clearer what is non-trivial in create_client(), it > also fixes a bug whereby we can call free_client() before idr_init() > has been called. Thanks, applying for 3.15 and stable. --b. > > Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> > --- > fs/nfsd/nfs4state.c | 24 ++++++++++++------------ > 1 file changed, 12 insertions(+), 12 deletions(-) > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 3ba65979a3cd..230d21cb1717 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -1078,6 +1078,18 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name) > return NULL; > } > clp->cl_name.len = name.len; > + INIT_LIST_HEAD(&clp->cl_sessions); > + idr_init(&clp->cl_stateids); > + atomic_set(&clp->cl_refcount, 0); > + clp->cl_cb_state = NFSD4_CB_UNKNOWN; > + INIT_LIST_HEAD(&clp->cl_idhash); > + INIT_LIST_HEAD(&clp->cl_openowners); > + INIT_LIST_HEAD(&clp->cl_delegations); > + INIT_LIST_HEAD(&clp->cl_lru); > + INIT_LIST_HEAD(&clp->cl_callbacks); > + INIT_LIST_HEAD(&clp->cl_revoked); > + spin_lock_init(&clp->cl_lock); > + rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); > return clp; > } > > @@ -1347,7 +1359,6 @@ static struct nfs4_client *create_client(struct xdr_netobj name, > if (clp == NULL) > return NULL; > > - INIT_LIST_HEAD(&clp->cl_sessions); > ret = copy_cred(&clp->cl_cred, &rqstp->rq_cred); > if (ret) { > spin_lock(&nn->client_lock); > @@ -1355,20 +1366,9 @@ static struct nfs4_client *create_client(struct xdr_netobj name, > spin_unlock(&nn->client_lock); > return NULL; > } > - idr_init(&clp->cl_stateids); > - atomic_set(&clp->cl_refcount, 0); > - clp->cl_cb_state = NFSD4_CB_UNKNOWN; > - INIT_LIST_HEAD(&clp->cl_idhash); > - INIT_LIST_HEAD(&clp->cl_openowners); > - INIT_LIST_HEAD(&clp->cl_delegations); > - INIT_LIST_HEAD(&clp->cl_lru); > - INIT_LIST_HEAD(&clp->cl_callbacks); > - INIT_LIST_HEAD(&clp->cl_revoked); > - spin_lock_init(&clp->cl_lock); > nfsd4_init_callback(&clp->cl_cb_null); > clp->cl_time = get_seconds(); > clear_bit(0, &clp->cl_cb_slot_busy); > - rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); > copy_verf(clp, verf); > rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa); > gen_confirm(clp); > -- > 1.9.0 > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 3ba65979a3cd..230d21cb1717 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -1078,6 +1078,18 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name) return NULL; } clp->cl_name.len = name.len; + INIT_LIST_HEAD(&clp->cl_sessions); + idr_init(&clp->cl_stateids); + atomic_set(&clp->cl_refcount, 0); + clp->cl_cb_state = NFSD4_CB_UNKNOWN; + INIT_LIST_HEAD(&clp->cl_idhash); + INIT_LIST_HEAD(&clp->cl_openowners); + INIT_LIST_HEAD(&clp->cl_delegations); + INIT_LIST_HEAD(&clp->cl_lru); + INIT_LIST_HEAD(&clp->cl_callbacks); + INIT_LIST_HEAD(&clp->cl_revoked); + spin_lock_init(&clp->cl_lock); + rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); return clp; } @@ -1347,7 +1359,6 @@ static struct nfs4_client *create_client(struct xdr_netobj name, if (clp == NULL) return NULL; - INIT_LIST_HEAD(&clp->cl_sessions); ret = copy_cred(&clp->cl_cred, &rqstp->rq_cred); if (ret) { spin_lock(&nn->client_lock); @@ -1355,20 +1366,9 @@ static struct nfs4_client *create_client(struct xdr_netobj name, spin_unlock(&nn->client_lock); return NULL; } - idr_init(&clp->cl_stateids); - atomic_set(&clp->cl_refcount, 0); - clp->cl_cb_state = NFSD4_CB_UNKNOWN; - INIT_LIST_HEAD(&clp->cl_idhash); - INIT_LIST_HEAD(&clp->cl_openowners); - INIT_LIST_HEAD(&clp->cl_delegations); - INIT_LIST_HEAD(&clp->cl_lru); - INIT_LIST_HEAD(&clp->cl_callbacks); - INIT_LIST_HEAD(&clp->cl_revoked); - spin_lock_init(&clp->cl_lock); nfsd4_init_callback(&clp->cl_cb_null); clp->cl_time = get_seconds(); clear_bit(0, &clp->cl_cb_slot_busy); - rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); copy_verf(clp, verf); rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa); gen_confirm(clp);
Aside from making it clearer what is non-trivial in create_client(), it also fixes a bug whereby we can call free_client() before idr_init() has been called. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> --- fs/nfsd/nfs4state.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)