diff options
author | Latchesar Ionkov <lucho@ionkov.net> | 2006-01-08 04:04:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-08 23:14:05 -0500 |
commit | 3cf6429a26da5c4d7b795e6d0f8f56ed2e4fdfc0 (patch) | |
tree | a8d856763fd9a0536519634c93ab92da684107fa /fs/9p/trans_fd.c | |
parent | f5ef3c105bee3a52486d7b55cef3330fcde9bca6 (diff) |
[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>
Diffstat (limited to 'fs/9p/trans_fd.c')
-rw-r--r-- | fs/9p/trans_fd.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/fs/9p/trans_fd.c b/fs/9p/trans_fd.c index b7ffb9859588..1a28ef97a3d1 100644 --- a/fs/9p/trans_fd.c +++ b/fs/9p/trans_fd.c | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * File Descriptor Transport Layer | 4 | * File Descriptor Transport Layer |
5 | * | 5 | * |
6 | * Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net> | ||
6 | * Copyright (C) 2005 by Eric Van Hensbergen <ericvh@gmail.com> | 7 | * Copyright (C) 2005 by Eric Van Hensbergen <ericvh@gmail.com> |
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
@@ -106,9 +107,6 @@ v9fs_fd_init(struct v9fs_session_info *v9ses, const char *addr, char *data) | |||
106 | return -ENOPROTOOPT; | 107 | return -ENOPROTOOPT; |
107 | } | 108 | } |
108 | 109 | ||
109 | sema_init(&trans->writelock, 1); | ||
110 | sema_init(&trans->readlock, 1); | ||
111 | |||
112 | ts = kmalloc(sizeof(struct v9fs_trans_fd), GFP_KERNEL); | 110 | ts = kmalloc(sizeof(struct v9fs_trans_fd), GFP_KERNEL); |
113 | 111 | ||
114 | if (!ts) | 112 | if (!ts) |
@@ -163,10 +161,55 @@ static void v9fs_fd_close(struct v9fs_transport *trans) | |||
163 | kfree(ts); | 161 | kfree(ts); |
164 | } | 162 | } |
165 | 163 | ||
164 | static unsigned int | ||
165 | v9fs_fd_poll(struct v9fs_transport *trans, struct poll_table_struct *pt) | ||
166 | { | ||
167 | int ret, n; | ||
168 | struct v9fs_trans_fd *ts; | ||
169 | mm_segment_t oldfs; | ||
170 | |||
171 | if (!trans) | ||
172 | return -EIO; | ||
173 | |||
174 | ts = trans->priv; | ||
175 | if (trans->status != Connected || !ts) | ||
176 | return -EIO; | ||
177 | |||
178 | oldfs = get_fs(); | ||
179 | set_fs(get_ds()); | ||
180 | |||
181 | if (!ts->in_file->f_op || !ts->in_file->f_op->poll) { | ||
182 | ret = -EIO; | ||
183 | goto end; | ||
184 | } | ||
185 | |||
186 | ret = ts->in_file->f_op->poll(ts->in_file, pt); | ||
187 | |||
188 | if (ts->out_file != ts->in_file) { | ||
189 | if (!ts->out_file->f_op || !ts->out_file->f_op->poll) { | ||
190 | ret = -EIO; | ||
191 | goto end; | ||
192 | } | ||
193 | |||
194 | n = ts->out_file->f_op->poll(ts->out_file, pt); | ||
195 | |||
196 | ret &= ~POLLOUT; | ||
197 | n &= ~POLLIN; | ||
198 | |||
199 | ret |= n; | ||
200 | } | ||
201 | |||
202 | end: | ||
203 | set_fs(oldfs); | ||
204 | return ret; | ||
205 | } | ||
206 | |||
207 | |||
166 | struct v9fs_transport v9fs_trans_fd = { | 208 | struct v9fs_transport v9fs_trans_fd = { |
167 | .init = v9fs_fd_init, | 209 | .init = v9fs_fd_init, |
168 | .write = v9fs_fd_send, | 210 | .write = v9fs_fd_send, |
169 | .read = v9fs_fd_recv, | 211 | .read = v9fs_fd_recv, |
170 | .close = v9fs_fd_close, | 212 | .close = v9fs_fd_close, |
213 | .poll = v9fs_fd_poll, | ||
171 | }; | 214 | }; |
172 | 215 | ||