Browse Source

[PATCH] RPC: Add helper for waking tasks pending on a transport

 Clean-up: remove only reference to xprt->pending from the socket transport
 implementation.  This makes a cleaner interface for other transport
 implementations as well.

 Test-plan:
 Compile kernel with CONFIG_NFS enabled.

 Version: Thu, 11 Aug 2005 16:06:52 -0400

 Signed-off-by: Chuck Lever <cel@netapp.com>
 Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Chuck Lever 20 years ago
parent
commit
44fbac2288
3 changed files with 19 additions and 7 deletions
  1. 1 0
      include/linux/sunrpc/xprt.h
  2. 16 2
      net/sunrpc/xprt.c
  3. 2 5
      net/sunrpc/xprtsock.c

+ 1 - 0
include/linux/sunrpc/xprt.h

@@ -232,6 +232,7 @@ void			xprt_reserve(struct rpc_task *);
 int			xprt_prepare_transmit(struct rpc_task *);
 int			xprt_prepare_transmit(struct rpc_task *);
 void			xprt_transmit(struct rpc_task *);
 void			xprt_transmit(struct rpc_task *);
 void			xprt_receive(struct rpc_task *);
 void			xprt_receive(struct rpc_task *);
+void			xprt_wake_pending_tasks(struct rpc_xprt *, int);
 int			xprt_adjust_timeout(struct rpc_rqst *req);
 int			xprt_adjust_timeout(struct rpc_rqst *req);
 void			xprt_release(struct rpc_task *);
 void			xprt_release(struct rpc_task *);
 void			xprt_connect(struct rpc_task *);
 void			xprt_connect(struct rpc_task *);

+ 16 - 2
net/sunrpc/xprt.c

@@ -227,6 +227,20 @@ xprt_adjust_cwnd(struct rpc_xprt *xprt, int result)
 	xprt->cwnd = cwnd;
 	xprt->cwnd = cwnd;
 }
 }
 
 
+/**
+ * xprt_wake_pending_tasks - wake all tasks on a transport's pending queue
+ * @xprt: transport with waiting tasks
+ * @status: result code to plant in each task before waking it
+ *
+ */
+void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status)
+{
+	if (status < 0)
+		rpc_wake_up_status(&xprt->pending, status);
+	else
+		rpc_wake_up(&xprt->pending);
+}
+
 static void xprt_reset_majortimeo(struct rpc_rqst *req)
 static void xprt_reset_majortimeo(struct rpc_rqst *req)
 {
 {
 	struct rpc_timeout *to = &req->rq_xprt->timeout;
 	struct rpc_timeout *to = &req->rq_xprt->timeout;
@@ -300,7 +314,7 @@ void xprt_disconnect(struct rpc_xprt *xprt)
 	dprintk("RPC:      disconnected transport %p\n", xprt);
 	dprintk("RPC:      disconnected transport %p\n", xprt);
 	spin_lock_bh(&xprt->transport_lock);
 	spin_lock_bh(&xprt->transport_lock);
 	xprt_clear_connected(xprt);
 	xprt_clear_connected(xprt);
-	rpc_wake_up_status(&xprt->pending, -ENOTCONN);
+	xprt_wake_pending_tasks(xprt, -ENOTCONN);
 	spin_unlock_bh(&xprt->transport_lock);
 	spin_unlock_bh(&xprt->transport_lock);
 }
 }
 
 
@@ -803,7 +817,7 @@ static void xprt_shutdown(struct rpc_xprt *xprt)
 	xprt->shutdown = 1;
 	xprt->shutdown = 1;
 	rpc_wake_up(&xprt->sending);
 	rpc_wake_up(&xprt->sending);
 	rpc_wake_up(&xprt->resend);
 	rpc_wake_up(&xprt->resend);
-	rpc_wake_up(&xprt->pending);
+	xprt_wake_pending_tasks(xprt, -EIO);
 	rpc_wake_up(&xprt->backlog);
 	rpc_wake_up(&xprt->backlog);
 	wake_up(&xprt->cong_wait);
 	wake_up(&xprt->cong_wait);
 	del_timer_sync(&xprt->timer);
 	del_timer_sync(&xprt->timer);

+ 2 - 5
net/sunrpc/xprtsock.c

@@ -703,7 +703,7 @@ static void xs_tcp_state_change(struct sock *sk)
 			xprt->tcp_reclen = 0;
 			xprt->tcp_reclen = 0;
 			xprt->tcp_copied = 0;
 			xprt->tcp_copied = 0;
 			xprt->tcp_flags = XPRT_COPY_RECM | XPRT_COPY_XID;
 			xprt->tcp_flags = XPRT_COPY_RECM | XPRT_COPY_XID;
-			rpc_wake_up(&xprt->pending);
+			xprt_wake_pending_tasks(xprt, 0);
 		}
 		}
 		spin_unlock_bh(&xprt->transport_lock);
 		spin_unlock_bh(&xprt->transport_lock);
 		break;
 		break;
@@ -920,10 +920,7 @@ static void xs_connect_worker(void *args)
 		}
 		}
 	}
 	}
 out:
 out:
-	if (status < 0)
-		rpc_wake_up_status(&xprt->pending, status);
-	else
-		rpc_wake_up(&xprt->pending);
+	xprt_wake_pending_tasks(xprt, status);
 out_clear:
 out_clear:
 	xprt_clear_connecting(xprt);
 	xprt_clear_connecting(xprt);
 }
 }