瀏覽代碼

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>
Jim Garlick 13 年之前
父節點
當前提交
a314f2748e
共有 1 個文件被更改,包括 8 次插入0 次删除
  1. 8 0
      net/9p/client.c

+ 8 - 0
net/9p/client.c

@@ -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;