[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>
This commit is contained in:
committed by
Trond Myklebust
parent
86b9f57dfd
commit
44fbac2288
@@ -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 *);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
xprt_wake_pending_tasks(xprt, status);
|
||||||
rpc_wake_up_status(&xprt->pending, status);
|
|
||||||
else
|
|
||||||
rpc_wake_up(&xprt->pending);
|
|
||||||
out_clear:
|
out_clear:
|
||||||
xprt_clear_connecting(xprt);
|
xprt_clear_connecting(xprt);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user