SUNRPC: Kill rpc_clnt->cl_oneshot
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 9 Jun 2007 23:49:36 +0000 (19:49 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 11 Jul 2007 03:40:29 +0000 (23:40 -0400)
Replace it with explicit calls to rpc_shutdown_client() or
rpc_destroy_client() (for the case of asynchronous calls).

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/lockd/mon.c
fs/nfs/mount_clnt.c
include/linux/sunrpc/clnt.h
net/sunrpc/clnt.c
net/sunrpc/rpcb_clnt.c
net/sunrpc/sched.c

index 2102e2d0134dc2db7c9a50da58a29f35aea34711..3353ed8421a7af49e69e98758860d7d7754f7185 100644 (file)
@@ -61,6 +61,7 @@ nsm_mon_unmon(struct nsm_handle *nsm, u32 proc, struct nsm_res *res)
                        status);
        else
                status = 0;
+       rpc_shutdown_client(clnt);
  out:
        return status;
 }
@@ -138,7 +139,6 @@ nsm_create(void)
                .program        = &nsm_program,
                .version        = SM_VERSION,
                .authflavor     = RPC_AUTH_NULL,
-               .flags          = (RPC_CLNT_CREATE_ONESHOT),
        };
 
        return rpc_create(&args);
index ca5a266a3140430266e7c57a2292134218cad6c1..878d7a5cb6d4568a1e1b04d0172fa10a0baab203 100644 (file)
@@ -69,6 +69,7 @@ nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
                msg.rpc_proc = &mnt_clnt->cl_procinfo[MNTPROC_MNT];
 
        status = rpc_call_sync(mnt_clnt, &msg, 0);
+       rpc_shutdown_client(mnt_clnt);
        return status < 0? status : (result.status? -EACCES : 0);
 }
 
@@ -84,8 +85,7 @@ mnt_create(char *hostname, struct sockaddr_in *srvaddr, int version,
                .program        = &mnt_program,
                .version        = version,
                .authflavor     = RPC_AUTH_UNIX,
-               .flags          = (RPC_CLNT_CREATE_ONESHOT |
-                                  RPC_CLNT_CREATE_INTR),
+               .flags          = RPC_CLNT_CREATE_INTR,
        };
 
        return rpc_create(&args);
index ab3ef6d629a711046c6f6bc4a26e83fc053089be..fe7ea65ed0aee830eb946251949e66b4b38e8ef5 100644 (file)
@@ -44,8 +44,7 @@ struct rpc_clnt {
        unsigned int            cl_softrtry : 1,/* soft timeouts */
                                cl_intr     : 1,/* interruptible */
                                cl_discrtry : 1,/* disconnect before retry */
-                               cl_autobind : 1,/* use getport() */
-                               cl_oneshot  : 1;/* dispose after use */
+                               cl_autobind : 1;/* use getport() */
 
        struct rpc_rtt *        cl_rtt;         /* RTO estimator data */
 
@@ -112,10 +111,9 @@ struct rpc_create_args {
 #define RPC_CLNT_CREATE_HARDRTRY       (1UL << 0)
 #define RPC_CLNT_CREATE_INTR           (1UL << 1)
 #define RPC_CLNT_CREATE_AUTOBIND       (1UL << 2)
-#define RPC_CLNT_CREATE_ONESHOT                (1UL << 3)
-#define RPC_CLNT_CREATE_NONPRIVPORT    (1UL << 4)
-#define RPC_CLNT_CREATE_NOPING         (1UL << 5)
-#define RPC_CLNT_CREATE_DISCRTRY       (1UL << 6)
+#define RPC_CLNT_CREATE_NONPRIVPORT    (1UL << 3)
+#define RPC_CLNT_CREATE_NOPING         (1UL << 4)
+#define RPC_CLNT_CREATE_DISCRTRY       (1UL << 5)
 
 struct rpc_clnt *rpc_create(struct rpc_create_args *args);
 struct rpc_clnt        *rpc_bind_new_program(struct rpc_clnt *,
index fb65249538d4745d4785b930535180a4153b2c14..34662dfa9cc0a35e8255f2203aad0e04f565d6ce 100644 (file)
@@ -249,8 +249,6 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
                clnt->cl_intr = 1;
        if (args->flags & RPC_CLNT_CREATE_AUTOBIND)
                clnt->cl_autobind = 1;
-       if (args->flags & RPC_CLNT_CREATE_ONESHOT)
-               clnt->cl_oneshot = 1;
        if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
                clnt->cl_discrtry = 1;
 
@@ -285,7 +283,6 @@ rpc_clone_client(struct rpc_clnt *clnt)
        new->cl_xprt = xprt_get(clnt->cl_xprt);
        /* Turn off autobind on clones */
        new->cl_autobind = 0;
-       new->cl_oneshot = 0;
        INIT_LIST_HEAD(&new->cl_tasks);
        spin_lock_init(&new->cl_lock);
        rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval);
@@ -304,8 +301,7 @@ out_no_clnt:
 
 /*
  * Properly shut down an RPC client, terminating all outstanding
- * requests. Note that we must be certain that cl_oneshot is cleared,
- * or else the client would be destroyed when the last task releases it.
+ * requests.
  */
 int
 rpc_shutdown_client(struct rpc_clnt *clnt)
@@ -314,8 +310,6 @@ rpc_shutdown_client(struct rpc_clnt *clnt)
                        clnt->cl_protname, clnt->cl_server);
 
        while (!list_empty(&clnt->cl_tasks)) {
-               /* Don't let rpc_release_client destroy us */
-               clnt->cl_oneshot = 0;
                rpc_killall_tasks(clnt);
                wait_event_timeout(destroy_wait,
                        list_empty(&clnt->cl_tasks), 1*HZ);
@@ -366,8 +360,6 @@ rpc_release_client(struct rpc_clnt *clnt)
 
        if (list_empty(&clnt->cl_tasks))
                wake_up(&destroy_wait);
-       if (clnt->cl_oneshot)
-               rpc_destroy_client(clnt);
        kref_put(&clnt->cl_kref, rpc_free_client);
 }
 
index 6c7aa8a1f0c65f41ecdab07e61d2958c08569f48..00853a32649930b564191a96663c64c402d481ea 100644 (file)
@@ -184,8 +184,7 @@ static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr,
                .program        = &rpcb_program,
                .version        = version,
                .authflavor     = RPC_AUTH_UNIX,
-               .flags          = (RPC_CLNT_CREATE_ONESHOT |
-                                  RPC_CLNT_CREATE_NOPING),
+               .flags          = RPC_CLNT_CREATE_NOPING,
        };
 
        ((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT);
@@ -238,6 +237,7 @@ int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
 
        error = rpc_call_sync(rpcb_clnt, &msg, 0);
 
+       rpc_shutdown_client(rpcb_clnt);
        if (error < 0)
                printk(KERN_WARNING "RPC: failed to contact local rpcbind "
                                "server (errno %d).\n", -error);
@@ -286,6 +286,7 @@ int rpcb_getport_external(struct sockaddr_in *sin, __u32 prog,
                return PTR_ERR(rpcb_clnt);
 
        status = rpc_call_sync(rpcb_clnt, &msg, 0);
+       rpc_shutdown_client(rpcb_clnt);
 
        if (status >= 0) {
                if (map.r_port != 0)
@@ -379,6 +380,7 @@ void rpcb_getport(struct rpc_task *task)
        }
 
        child = rpc_run_task(rpcb_clnt, RPC_TASK_ASYNC, &rpcb_getport_ops, map);
+       rpc_destroy_client(rpcb_clnt);
        if (IS_ERR(child)) {
                status = -EIO;
                dprintk("RPC: %5u rpcb_getport rpc_run_task failed\n",
index bb12983580a0228b18de128b221ff24afd09737f..d95fe4e40eb468de464cd198d9abc7ef785b9533 100644 (file)
@@ -876,9 +876,7 @@ static void rpc_free_task(struct rcu_head *rcu)
 }
 
 /*
- * Create a new task for the specified client.  We have to
- * clean up after an allocation failure, as the client may
- * have specified "oneshot".
+ * Create a new task for the specified client.
  */
 struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc_call_ops *tk_ops, void *calldata)
 {
@@ -886,7 +884,7 @@ struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc
 
        task = rpc_alloc_task();
        if (!task)
-               goto cleanup;
+               goto out;
 
        rpc_init_task(task, clnt, flags, tk_ops, calldata);
 
@@ -894,14 +892,6 @@ struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc
        task->tk_flags |= RPC_TASK_DYNAMIC;
 out:
        return task;
-
-cleanup:
-       /* Check whether to release the client */
-       if (clnt) {
-               kref_get(&clnt->cl_kref); /* pretend we were used ... */
-               rpc_release_client(clnt);
-       }
-       goto out;
 }
 
 
This page took 0.032358 seconds and 5 git commands to generate.