NFS use svc_create_xprt for NFSv4.1 callback service
authorAndy Adamson <andros@netapp.com>
Thu, 6 Jan 2011 02:04:28 +0000 (02:04 +0000)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 6 Jan 2011 19:46:24 +0000 (14:46 -0500)
The new back channel transport means we call the normal creation routine as
well as svc_xprt_put.

Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/callback.c

index 93a8b3bd69e37871795b93355e0550970cf7f421..0e9fae831dfa7bc2cdda5ea5488f5c832de2b2d2 100644 (file)
@@ -177,30 +177,38 @@ nfs41_callback_svc(void *vrqstp)
 struct svc_rqst *
 nfs41_callback_up(struct svc_serv *serv, struct rpc_xprt *xprt)
 {
-       struct svc_xprt *bc_xprt;
-       struct svc_rqst *rqstp = ERR_PTR(-ENOMEM);
+       struct svc_rqst *rqstp;
+       int ret;
 
-       dprintk("--> %s\n", __func__);
-       /* Create a svc_sock for the service */
-       bc_xprt = svc_sock_create(serv, xprt->prot);
-       if (!bc_xprt)
+       /*
+        * Create an svc_sock for the back channel service that shares the
+        * fore channel connection.
+        * Returns the input port (0) and sets the svc_serv bc_xprt on success
+        */
+       ret = svc_create_xprt(serv, "tcp-bc", &init_net, PF_INET, 0,
+                             SVC_SOCK_ANONYMOUS);
+       if (ret < 0) {
+               rqstp = ERR_PTR(ret);
                goto out;
+       }
 
        /*
         * Save the svc_serv in the transport so that it can
         * be referenced when the session backchannel is initialized
         */
-       serv->bc_xprt = bc_xprt;
        xprt->bc_serv = serv;
 
        INIT_LIST_HEAD(&serv->sv_cb_list);
        spin_lock_init(&serv->sv_cb_lock);
        init_waitqueue_head(&serv->sv_cb_waitq);
        rqstp = svc_prepare_thread(serv, &serv->sv_pools[0]);
-       if (IS_ERR(rqstp))
-               svc_sock_destroy(bc_xprt);
+       if (IS_ERR(rqstp)) {
+               svc_xprt_put(serv->bc_xprt);
+               serv->bc_xprt = NULL;
+       }
 out:
-       dprintk("--> %s return %p\n", __func__, rqstp);
+       dprintk("--> %s return %ld\n", __func__,
+               IS_ERR(rqstp) ? PTR_ERR(rqstp) : 0);
        return rqstp;
 }