[PATCH] v9fs: new multiplexer implementation
New multiplexer implementation. Decreases the number of kernel threads
required. Better handling when the user process receives a signal.
Signed-off-by: Latchesar Ionkov <lucho@ionkov.net>
Cc: Eric Van Hensbergen <ericvh@ericvh.myip.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff --git a/fs/9p/9p.c b/fs/9p/9p.c
index e847f50..a3a1ac6 100644
--- a/fs/9p/9p.c
+++ b/fs/9p/9p.c
@@ -52,10 +52,11 @@
dprintk(DEBUG_9P, "msize: %d version: %s\n", msize, version);
msg.id = TVERSION;
+ msg.tag = ~0;
msg.params.tversion.msize = msize;
msg.params.tversion.version = version;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
}
/**
@@ -83,7 +84,30 @@
msg.params.tattach.uname = uname;
msg.params.tattach.aname = aname;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
+}
+
+static void v9fs_t_clunk_cb(void *a, struct v9fs_fcall *tc,
+ struct v9fs_fcall *rc, int err)
+{
+ int fid;
+ struct v9fs_session_info *v9ses;
+
+ if (err)
+ return;
+
+ fid = tc->params.tclunk.fid;
+ kfree(tc);
+
+ if (!rc)
+ return;
+
+ dprintk(DEBUG_9P, "tcall id %d rcall id %d\n", tc->id, rc->id);
+ v9ses = a;
+ if (rc->id == RCLUNK)
+ v9fs_put_idpool(fid, &v9ses->fidpool);
+
+ kfree(rc);
}
/**
@@ -93,18 +117,24 @@
* @fcall: pointer to response fcall pointer
*
*/
-
int
-v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid,
- struct v9fs_fcall **fcall)
+v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid)
{
- struct v9fs_fcall msg;
+ int err;
+ struct v9fs_fcall *tc, *rc;
+
+ tc = kmalloc(sizeof(struct v9fs_fcall), GFP_KERNEL);
dprintk(DEBUG_9P, "fid %d\n", fid);
- msg.id = TCLUNK;
- msg.params.tclunk.fid = fid;
+ tc->id = TCLUNK;
+ tc->params.tclunk.fid = fid;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ err = v9fs_mux_rpc(v9ses->mux, tc, &rc);
+ if (err >= 0) {
+ v9fs_t_clunk_cb(v9ses, tc, rc, 0);
+ }
+
+ return err;
}
/**
@@ -121,7 +151,7 @@
dprintk(DEBUG_9P, "oldtag %d\n", tag);
msg.id = TFLUSH;
msg.params.tflush.oldtag = tag;
- return v9fs_mux_rpc(v9ses, &msg, NULL);
+ return v9fs_mux_rpc(v9ses->mux, &msg, NULL);
}
/**
@@ -143,7 +173,7 @@
msg.id = TSTAT;
msg.params.tstat.fid = fid;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
}
/**
@@ -166,7 +196,7 @@
msg.params.twstat.fid = fid;
msg.params.twstat.stat = stat;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
}
/**
@@ -199,7 +229,7 @@
msg.params.twalk.nwname = 0;
}
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
}
/**
@@ -217,14 +247,14 @@
struct v9fs_fcall **fcall)
{
struct v9fs_fcall msg;
- long errorno = -1;
+ int errorno = -1;
dprintk(DEBUG_9P, "fid %d mode %d\n", fid, mode);
msg.id = TOPEN;
msg.params.topen.fid = fid;
msg.params.topen.mode = mode;
- errorno = v9fs_mux_rpc(v9ses, &msg, fcall);
+ errorno = v9fs_mux_rpc(v9ses->mux, &msg, fcall);
return errorno;
}
@@ -246,7 +276,7 @@
dprintk(DEBUG_9P, "fid %d\n", fid);
msg.id = TREMOVE;
msg.params.tremove.fid = fid;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
}
/**
@@ -275,7 +305,7 @@
msg.params.tcreate.perm = perm;
msg.params.tcreate.mode = mode;
- return v9fs_mux_rpc(v9ses, &msg, fcall);
+ return v9fs_mux_rpc(v9ses->mux, &msg, fcall);
}
/**
@@ -302,7 +332,7 @@
msg.params.tread.fid = fid;
msg.params.tread.offset = offset;
msg.params.tread.count = count;
- errorno = v9fs_mux_rpc(v9ses, &msg, &rc);
+ errorno = v9fs_mux_rpc(v9ses->mux, &msg, &rc);
if (!errorno) {
errorno = rc->params.rread.count;
@@ -345,7 +375,7 @@
msg.params.twrite.count = count;
msg.params.twrite.data = data;
- errorno = v9fs_mux_rpc(v9ses, &msg, &rc);
+ errorno = v9fs_mux_rpc(v9ses->mux, &msg, &rc);
if (!errorno)
errorno = rc->params.rwrite.count;