nfsd4: move callback setup into session init code
authorJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 15 Jun 2010 02:26:31 +0000 (22:26 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 21 Oct 2010 14:11:49 +0000 (10:11 -0400)
The backchannel should  be associated with a session, it isn't really
global to the client.

We do, however, want a pointer global to the client which tracks which
session we're currently using for client-based callbacks.

This is a first step in that direction; for now, just reshuffling of
code with no significant change in behavior.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4state.c
fs/nfsd/state.h

index 7f1282859cd602bf6dc2130c234ec2e968d4671f..db5d8c8537edff282278066636180dffdb989fcf 100644 (file)
@@ -771,6 +771,19 @@ static __be32 alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp
                free_session(&new->se_ref);
                return nfserr_jukebox;
        }
+       if (!clp->cl_cb_session && (cses->flags & SESSION4_BACK_CHAN)) {
+               struct sockaddr *sa = svc_addr(rqstp);
+
+               clp->cl_cb_session = new;
+               clp->cl_cb_conn.cb_xprt = rqstp->rq_xprt;
+               svc_xprt_get(rqstp->rq_xprt);
+               rpc_copy_addr((struct sockaddr *)&clp->cl_cb_conn.cb_addr, sa);
+               clp->cl_cb_conn.cb_addrlen = svc_addr_len(sa);
+               clp->cl_cb_conn.cb_minorversion = 1;
+               clp->cl_cb_conn.cb_prog = cses->callback_prog;
+               clp->cl_cb_seq_nr = 1;
+               nfsd4_probe_callback(clp, &clp->cl_cb_conn);
+       }
        return nfs_ok;
 }
 
@@ -1045,7 +1058,7 @@ static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir,
        clp->cl_flavor = rqstp->rq_flavor;
        copy_cred(&clp->cl_cred, &rqstp->rq_cred);
        gen_confirm(clp);
-
+       clp->cl_cb_session = NULL;
        return clp;
 }
 
@@ -1515,20 +1528,6 @@ nfsd4_create_session(struct svc_rqst *rqstp,
 
                cs_slot->sl_seqid++; /* from 0 to 1 */
                move_to_confirmed(unconf);
-
-               if (cr_ses->flags & SESSION4_BACK_CHAN) {
-                       unconf->cl_cb_conn.cb_xprt = rqstp->rq_xprt;
-                       svc_xprt_get(rqstp->rq_xprt);
-                       rpc_copy_addr(
-                               (struct sockaddr *)&unconf->cl_cb_conn.cb_addr,
-                               sa);
-                       unconf->cl_cb_conn.cb_addrlen = svc_addr_len(sa);
-                       unconf->cl_cb_conn.cb_minorversion =
-                               cstate->minorversion;
-                       unconf->cl_cb_conn.cb_prog = cr_ses->callback_prog;
-                       unconf->cl_cb_seq_nr = 1;
-                       nfsd4_probe_callback(unconf, &unconf->cl_cb_conn);
-               }
                conf = unconf;
        } else {
                status = nfserr_stale_clientid;
index 8d5e2370cce048c4388fd454ed2c4894c8284df5..6e63c1d272bf31067d686d87f86faab1558f661d 100644 (file)
@@ -234,6 +234,7 @@ struct nfs4_client {
        u32                     cl_cb_ident;
        atomic_t                cl_cb_set;
        struct nfsd4_callback   cl_cb_null;
+       struct nfsd4_session    *cl_cb_session;
 
        /* for all client information that callback code might need: */
        spinlock_t              cl_lock;