]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sunrpc/xprtsock.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/scsi...
[karo-tx-linux.git] / net / sunrpc / xprtsock.c
index 0ef4dd4414ec9886f3bcb1bb05b809e50f2dae90..c431f5a579605bfa5ea33161ff45188ab4bd570d 100644 (file)
@@ -770,7 +770,7 @@ static void xs_destroy(struct rpc_xprt *xprt)
 
        dprintk("RPC:       xs_destroy xprt %p\n", xprt);
 
-       cancel_rearming_delayed_work(&transport->connect_worker);
+       cancel_delayed_work_sync(&transport->connect_worker);
 
        xs_close(xprt);
        xs_free_peer_addresses(xprt);
@@ -2359,6 +2359,15 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
        struct svc_sock *bc_sock;
        struct rpc_xprt *ret;
 
+       if (args->bc_xprt->xpt_bc_xprt) {
+               /*
+                * This server connection already has a backchannel
+                * export; we can't create a new one, as we wouldn't be
+                * able to match replies based on xid any more.  So,
+                * reuse the already-existing one:
+                */
+                return args->bc_xprt->xpt_bc_xprt;
+       }
        xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries);
        if (IS_ERR(xprt))
                return xprt;
@@ -2396,15 +2405,6 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
                        xprt->address_strings[RPC_DISPLAY_PORT],
                        xprt->address_strings[RPC_DISPLAY_PROTO]);
 
-       /*
-        * The backchannel uses the same socket connection as the
-        * forechannel
-        */
-       if (args->bc_xprt->xpt_bc_xprt) {
-               /* XXX: actually, want to catch this case... */
-               ret = ERR_PTR(-EINVAL);
-               goto out_err;
-       }
        /*
         * Once we've associated a backchannel xprt with a connection,
         * we want to keep it around as long as long as the connection