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@xxxxxxxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html