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/v9fs.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/v9fs.c')
-rw-r--r-- | fs/9p/v9fs.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 418c3743fdee..5e0f79355fdf 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
@@ -213,7 +213,8 @@ retry: | |||
213 | return -1; | 213 | return -1; |
214 | } | 214 | } |
215 | 215 | ||
216 | error = idr_get_new(&p->pool, NULL, &i); | 216 | /* no need to store exactly p, we just need something non-null */ |
217 | error = idr_get_new(&p->pool, p, &i); | ||
217 | up(&p->lock); | 218 | up(&p->lock); |
218 | 219 | ||
219 | if (error == -EAGAIN) | 220 | if (error == -EAGAIN) |
@@ -243,6 +244,16 @@ void v9fs_put_idpool(int id, struct v9fs_idpool *p) | |||
243 | } | 244 | } |
244 | 245 | ||
245 | /** | 246 | /** |
247 | * v9fs_check_idpool - check if the specified id is available | ||
248 | * @id - id to check | ||
249 | * @p - pool | ||
250 | */ | ||
251 | int v9fs_check_idpool(int id, struct v9fs_idpool *p) | ||
252 | { | ||
253 | return idr_find(&p->pool, id) != NULL; | ||
254 | } | ||
255 | |||
256 | /** | ||
246 | * v9fs_session_init - initialize session | 257 | * v9fs_session_init - initialize session |
247 | * @v9ses: session information structure | 258 | * @v9ses: session information structure |
248 | * @dev_name: device being mounted | 259 | * @dev_name: device being mounted |
@@ -281,9 +292,6 @@ v9fs_session_init(struct v9fs_session_info *v9ses, | |||
281 | /* id pools that are session-dependent: FIDs and TIDs */ | 292 | /* id pools that are session-dependent: FIDs and TIDs */ |
282 | idr_init(&v9ses->fidpool.pool); | 293 | idr_init(&v9ses->fidpool.pool); |
283 | init_MUTEX(&v9ses->fidpool.lock); | 294 | init_MUTEX(&v9ses->fidpool.lock); |
284 | idr_init(&v9ses->tidpool.pool); | ||
285 | init_MUTEX(&v9ses->tidpool.lock); | ||
286 | |||
287 | 295 | ||
288 | switch (v9ses->proto) { | 296 | switch (v9ses->proto) { |
289 | case PROTO_TCP: | 297 | case PROTO_TCP: |
@@ -320,7 +328,12 @@ v9fs_session_init(struct v9fs_session_info *v9ses, | |||
320 | v9ses->shutdown = 0; | 328 | v9ses->shutdown = 0; |
321 | v9ses->session_hung = 0; | 329 | v9ses->session_hung = 0; |
322 | 330 | ||
323 | if ((retval = v9fs_mux_init(v9ses, dev_name)) < 0) { | 331 | v9ses->mux = v9fs_mux_init(v9ses->transport, v9ses->maxdata + V9FS_IOHDRSZ, |
332 | &v9ses->extended); | ||
333 | |||
334 | if (IS_ERR(v9ses->mux)) { | ||
335 | retval = PTR_ERR(v9ses->mux); | ||
336 | v9ses->mux = NULL; | ||
324 | dprintk(DEBUG_ERROR, "problem initializing mux\n"); | 337 | dprintk(DEBUG_ERROR, "problem initializing mux\n"); |
325 | goto SessCleanUp; | 338 | goto SessCleanUp; |
326 | } | 339 | } |
@@ -381,7 +394,7 @@ v9fs_session_init(struct v9fs_session_info *v9ses, | |||
381 | } | 394 | } |
382 | 395 | ||
383 | if (v9ses->afid != ~0) { | 396 | if (v9ses->afid != ~0) { |
384 | if (v9fs_t_clunk(v9ses, v9ses->afid, NULL)) | 397 | if (v9fs_t_clunk(v9ses, v9ses->afid)) |
385 | dprintk(DEBUG_ERROR, "clunk failed\n"); | 398 | dprintk(DEBUG_ERROR, "clunk failed\n"); |
386 | } | 399 | } |
387 | 400 | ||
@@ -403,13 +416,16 @@ v9fs_session_init(struct v9fs_session_info *v9ses, | |||
403 | 416 | ||
404 | void v9fs_session_close(struct v9fs_session_info *v9ses) | 417 | void v9fs_session_close(struct v9fs_session_info *v9ses) |
405 | { | 418 | { |
406 | if (v9ses->recvproc) { | 419 | if (v9ses->mux) { |
407 | send_sig(SIGKILL, v9ses->recvproc, 1); | 420 | v9fs_mux_destroy(v9ses->mux); |
408 | wait_for_completion(&v9ses->proccmpl); | 421 | v9ses->mux = NULL; |
409 | } | 422 | } |
410 | 423 | ||
411 | if (v9ses->transport) | 424 | if (v9ses->transport) { |
412 | v9ses->transport->close(v9ses->transport); | 425 | v9ses->transport->close(v9ses->transport); |
426 | kfree(v9ses->transport); | ||
427 | v9ses->transport = NULL; | ||
428 | } | ||
413 | 429 | ||
414 | __putname(v9ses->name); | 430 | __putname(v9ses->name); |
415 | __putname(v9ses->remotename); | 431 | __putname(v9ses->remotename); |
@@ -420,8 +436,9 @@ void v9fs_session_close(struct v9fs_session_info *v9ses) | |||
420 | * and cancel all pending requests. | 436 | * and cancel all pending requests. |
421 | */ | 437 | */ |
422 | void v9fs_session_cancel(struct v9fs_session_info *v9ses) { | 438 | void v9fs_session_cancel(struct v9fs_session_info *v9ses) { |
439 | dprintk(DEBUG_ERROR, "cancel session %p\n", v9ses); | ||
423 | v9ses->transport->status = Disconnected; | 440 | v9ses->transport->status = Disconnected; |
424 | v9fs_mux_cancel_requests(v9ses, -EIO); | 441 | v9fs_mux_cancel(v9ses->mux, -EIO); |
425 | } | 442 | } |
426 | 443 | ||
427 | extern int v9fs_error_init(void); | 444 | extern int v9fs_error_init(void); |
@@ -437,6 +454,7 @@ static int __init init_v9fs(void) | |||
437 | 454 | ||
438 | printk(KERN_INFO "Installing v9fs 9P2000 file system support\n"); | 455 | printk(KERN_INFO "Installing v9fs 9P2000 file system support\n"); |
439 | 456 | ||
457 | v9fs_mux_global_init(); | ||
440 | return register_filesystem(&v9fs_fs_type); | 458 | return register_filesystem(&v9fs_fs_type); |
441 | } | 459 | } |
442 | 460 | ||
@@ -447,6 +465,7 @@ static int __init init_v9fs(void) | |||
447 | 465 | ||
448 | static void __exit exit_v9fs(void) | 466 | static void __exit exit_v9fs(void) |
449 | { | 467 | { |
468 | v9fs_mux_global_exit(); | ||
450 | unregister_filesystem(&v9fs_fs_type); | 469 | unregister_filesystem(&v9fs_fs_type); |
451 | } | 470 | } |
452 | 471 | ||