SUNRPC move svc_drop to caller of svc_process_common
authorAndy Adamson <andros@netapp.com>
Thu, 6 Jan 2011 02:04:24 +0000 (02:04 +0000)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 6 Jan 2011 19:46:23 +0000 (14:46 -0500)
The NFSv4.1 shared back channel does not need to call svc_drop because the
callback service never outlives the single connection it services, and it
reuses it's buffers and keeps the trasport.

Signed-off-by: Andy Adamson <andros@netapp.com>
Acked-by: Bruce Fields <bfields@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/svc.c

index 6359c42c49410f73fbf9e8c7c570964f1ca739b1..606d182895a94c96c3c5f10d20a3092c95a1f173 100644 (file)
@@ -1147,7 +1147,6 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
  dropit:
        svc_authorise(rqstp);   /* doesn't hurt to call this twice */
        dprintk("svc: svc_process dropit\n");
-       svc_drop(rqstp);
        return 0;
 
 err_short_len:
@@ -1218,7 +1217,6 @@ svc_process(struct svc_rqst *rqstp)
        struct kvec             *resv = &rqstp->rq_res.head[0];
        struct svc_serv         *serv = rqstp->rq_server;
        u32                     dir;
-       int                     error;
 
        /*
         * Setup response xdr_buf.
@@ -1246,11 +1244,13 @@ svc_process(struct svc_rqst *rqstp)
                return 0;
        }
 
-       error = svc_process_common(rqstp, argv, resv);
-       if (error <= 0)
-               return error;
-
-       return svc_send(rqstp);
+       /* Returns 1 for send, 0 for drop */
+       if (svc_process_common(rqstp, argv, resv))
+               return svc_send(rqstp);
+       else {
+               svc_drop(rqstp);
+               return 0;
+       }
 }
 
 #if defined(CONFIG_NFS_V4_1)
@@ -1264,7 +1264,6 @@ bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
 {
        struct kvec     *argv = &rqstp->rq_arg.head[0];
        struct kvec     *resv = &rqstp->rq_res.head[0];
-       int             error;
 
        /* Build the svc_rqst used by the common processing routine */
        rqstp->rq_xprt = serv->bc_xprt;
@@ -1292,12 +1291,15 @@ bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
        svc_getu32(argv);       /* XID */
        svc_getnl(argv);        /* CALLDIR */
 
-       error = svc_process_common(rqstp, argv, resv);
-       if (error <= 0)
-               return error;
-
-       memcpy(&req->rq_snd_buf, &rqstp->rq_res, sizeof(req->rq_snd_buf));
-       return bc_send(req);
+       /* Returns 1 for send, 0 for drop */
+       if (svc_process_common(rqstp, argv, resv)) {
+               memcpy(&req->rq_snd_buf, &rqstp->rq_res,
+                                               sizeof(req->rq_snd_buf));
+               return bc_send(req);
+       } else {
+               /* Nothing to do to drop request */
+               return 0;
+       }
 }
 EXPORT_SYMBOL(bc_svc_process);
 #endif /* CONFIG_NFS_V4_1 */