net/9p: don't allow Tflush to be interrupted
When a signal is received while sending a Tflush, the client, which has recursed into p9_client_rpc() while sending another request, should wait for Rflush as long as the transport is still up. Signed-off-by: Jim Garlick <garlick@llnl.gov> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
committed by
Eric Van Hensbergen
parent
3c761ea05a
commit
a314f2748e
@@ -740,10 +740,18 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...)
|
|||||||
c->status = Disconnected;
|
c->status = Disconnected;
|
||||||
goto reterr;
|
goto reterr;
|
||||||
}
|
}
|
||||||
|
again:
|
||||||
/* Wait for the response */
|
/* Wait for the response */
|
||||||
err = wait_event_interruptible(*req->wq,
|
err = wait_event_interruptible(*req->wq,
|
||||||
req->status >= REQ_STATUS_RCVD);
|
req->status >= REQ_STATUS_RCVD);
|
||||||
|
|
||||||
|
if ((err == -ERESTARTSYS) && (c->status == Connected)
|
||||||
|
&& (type == P9_TFLUSH)) {
|
||||||
|
sigpending = 1;
|
||||||
|
clear_thread_flag(TIF_SIGPENDING);
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
|
|
||||||
if (req->status == REQ_STATUS_ERROR) {
|
if (req->status == REQ_STATUS_ERROR) {
|
||||||
p9_debug(P9_DEBUG_ERROR, "req_status error %d\n", req->t_err);
|
p9_debug(P9_DEBUG_ERROR, "req_status error %d\n", req->t_err);
|
||||||
err = req->t_err;
|
err = req->t_err;
|
||||||
|
|||||||
Reference in New Issue
Block a user