9p: create transport rpc cut-thru

Add a new transport function which allows a cut-thru directly to
the transport instead of processing request through the mux if the
cut-thru exists.

Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>

diff --git a/include/net/9p/transport.h b/include/net/9p/transport.h
index 9dd4a05..adbcafe 100644
--- a/include/net/9p/transport.h
+++ b/include/net/9p/transport.h
@@ -39,6 +39,8 @@
 	int (*read) (struct p9_trans *, void *, int);
 	void (*close) (struct p9_trans *);
 	unsigned int (*poll)(struct p9_trans *, struct poll_table_struct *);
+	int (*rpc) (struct p9_trans *t, struct p9_fcall *tc,
+							struct p9_fcall **rc);
 };
 
 struct p9_trans_module {
diff --git a/net/9p/client.c b/net/9p/client.c
index 069d9aa..b0d08c2 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -39,6 +39,23 @@
 static void p9_fid_destroy(struct p9_fid *fid);
 static struct p9_stat *p9_clone_stat(struct p9_stat *st, int dotu);
 
+/**
+ * p9_client_rpc - sends 9P request and waits until a response is available.
+ *      The function can be interrupted.
+ * @c: client data
+ * @tc: request to be sent
+ * @rc: pointer where a pointer to the response is stored
+ */
+int
+p9_client_rpc(struct p9_client *c, struct p9_fcall *tc,
+	struct p9_fcall **rc)
+{
+	if (c->trans->rpc)
+		return c->trans->rpc(c->trans, tc, rc);
+	else
+		return p9_conn_rpc(c->conn, tc, rc);
+}
+
 struct p9_client *p9_client_create(struct p9_trans *trans, int msize,
 								   int dotu)
 {
@@ -82,7 +99,7 @@
 		goto error;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto error;
 
@@ -174,7 +191,7 @@
 		goto error;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto error;
 
@@ -219,7 +236,7 @@
 		goto error;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto error;
 
@@ -270,7 +287,7 @@
 		goto error;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err) {
 		if (rc && rc->id == P9_RWALK)
 			goto clunk_fid;
@@ -305,7 +322,7 @@
 		goto error;
 	}
 
-	p9_conn_rpc(clnt->conn, tc, &rc);
+	p9_client_rpc(clnt->conn, tc, &rc);
 
 error:
 	kfree(tc);
@@ -339,7 +356,7 @@
 		goto done;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto done;
 
@@ -378,7 +395,7 @@
 		goto done;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto done;
 
@@ -411,7 +428,7 @@
 		goto done;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto done;
 
@@ -443,7 +460,7 @@
 		goto done;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto done;
 
@@ -485,7 +502,7 @@
 			goto error;
 		}
 
-		err = p9_conn_rpc(clnt->conn, tc, &rc);
+		err = p9_client_rpc(clnt->conn, tc, &rc);
 		if (err)
 			goto error;
 
@@ -542,7 +559,7 @@
 			goto error;
 		}
 
-		err = p9_conn_rpc(clnt->conn, tc, &rc);
+		err = p9_client_rpc(clnt->conn, tc, &rc);
 		if (err)
 			goto error;
 
@@ -596,7 +613,7 @@
 			goto error;
 		}
 
-		err = p9_conn_rpc(clnt->conn, tc, &rc);
+		err = p9_client_rpc(clnt->conn, tc, &rc);
 		if (err)
 			goto error;
 
@@ -660,7 +677,7 @@
 			goto error;
 		}
 
-		err = p9_conn_rpc(clnt->conn, tc, &rc);
+		err = p9_client_rpc(clnt->conn, tc, &rc);
 		if (err)
 			goto error;
 
@@ -731,7 +748,7 @@
 		goto error;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 	if (err)
 		goto error;
 
@@ -773,7 +790,7 @@
 		goto done;
 	}
 
-	err = p9_conn_rpc(clnt->conn, tc, &rc);
+	err = p9_client_rpc(clnt->conn, tc, &rc);
 
 done:
 	kfree(tc);
@@ -830,7 +847,7 @@
 				goto error;
 			}
 
-			err = p9_conn_rpc(clnt->conn, tc, &rc);
+			err = p9_client_rpc(clnt->conn, tc, &rc);
 			if (err)
 				goto error;