diff options
author | Jim Garlick <garlick@llnl.gov> | 2012-02-01 15:48:53 -0500 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@gmail.com> | 2012-02-26 15:27:21 -0500 |
commit | a314f2748e76c866222a18e639c640d584d277fb (patch) | |
tree | c81f5c6cf3b509c48c1b599885b7f7359c31f74e /net/9p/client.c | |
parent | 3c761ea05a8900a907f32b628611873f6bef24b2 (diff) |
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>
Diffstat (limited to 'net/9p/client.c')
-rw-r--r-- | net/9p/client.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 776618cd2be5..6efbb334c3ad 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -740,10 +740,18 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) | |||
740 | c->status = Disconnected; | 740 | c->status = Disconnected; |
741 | goto reterr; | 741 | goto reterr; |
742 | } | 742 | } |
743 | again: | ||
743 | /* Wait for the response */ | 744 | /* Wait for the response */ |
744 | err = wait_event_interruptible(*req->wq, | 745 | err = wait_event_interruptible(*req->wq, |
745 | req->status >= REQ_STATUS_RCVD); | 746 | req->status >= REQ_STATUS_RCVD); |
746 | 747 | ||
748 | if ((err == -ERESTARTSYS) && (c->status == Connected) | ||
749 | && (type == P9_TFLUSH)) { | ||
750 | sigpending = 1; | ||
751 | clear_thread_flag(TIF_SIGPENDING); | ||
752 | goto again; | ||
753 | } | ||
754 | |||
747 | if (req->status == REQ_STATUS_ERROR) { | 755 | if (req->status == REQ_STATUS_ERROR) { |
748 | p9_debug(P9_DEBUG_ERROR, "req_status error %d\n", req->t_err); | 756 | p9_debug(P9_DEBUG_ERROR, "req_status error %d\n", req->t_err); |
749 | err = req->t_err; | 757 | err = req->t_err; |