]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - net/9p/trans_fd.c
9p-trans_fd: use single poller
[linux-2.6-omap-h63xx.git] / net / 9p / trans_fd.c
1 /*
2  * linux/fs/9p/trans_fd.c
3  *
4  * Fd transport layer.  Includes deprecated socket layer.
5  *
6  *  Copyright (C) 2006 by Russ Cox <rsc@swtch.com>
7  *  Copyright (C) 2004-2005 by Latchesar Ionkov <lucho@ionkov.net>
8  *  Copyright (C) 2004-2008 by Eric Van Hensbergen <ericvh@gmail.com>
9  *  Copyright (C) 1997-2002 by Ron Minnich <rminnich@sarnoff.com>
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License version 2
13  *  as published by the Free Software Foundation.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to:
22  *  Free Software Foundation
23  *  51 Franklin Street, Fifth Floor
24  *  Boston, MA  02111-1301  USA
25  *
26  */
27
28 #include <linux/in.h>
29 #include <linux/module.h>
30 #include <linux/net.h>
31 #include <linux/ipv6.h>
32 #include <linux/kthread.h>
33 #include <linux/errno.h>
34 #include <linux/kernel.h>
35 #include <linux/un.h>
36 #include <linux/uaccess.h>
37 #include <linux/inet.h>
38 #include <linux/idr.h>
39 #include <linux/file.h>
40 #include <linux/parser.h>
41 #include <net/9p/9p.h>
42 #include <net/9p/transport.h>
43
44 #define P9_PORT 564
45 #define MAX_SOCK_BUF (64*1024)
46 #define ERREQFLUSH      1
47 #define MAXPOLLWADDR    2
48
49 /**
50  * struct p9_fd_opts - per-transport options
51  * @rfd: file descriptor for reading (trans=fd)
52  * @wfd: file descriptor for writing (trans=fd)
53  * @port: port to connect to (trans=tcp)
54  *
55  */
56
57 struct p9_fd_opts {
58         int rfd;
59         int wfd;
60         u16 port;
61 };
62
63
64 /**
65  * struct p9_trans_fd - transport state
66  * @rd: reference to file to read from
67  * @wr: reference of file to write to
68  * @conn: connection state reference
69  *
70  */
71
72 struct p9_trans_fd {
73         struct file *rd;
74         struct file *wr;
75         struct p9_conn *conn;
76 };
77
78 /*
79   * Option Parsing (code inspired by NFS code)
80   *  - a little lazy - parse all fd-transport options
81   */
82
83 enum {
84         /* Options that take integer arguments */
85         Opt_port, Opt_rfdno, Opt_wfdno, Opt_err,
86 };
87
88 static const match_table_t tokens = {
89         {Opt_port, "port=%u"},
90         {Opt_rfdno, "rfdno=%u"},
91         {Opt_wfdno, "wfdno=%u"},
92         {Opt_err, NULL},
93 };
94
95 enum {
96         Rworksched = 1,         /* read work scheduled or running */
97         Rpending = 2,           /* can read */
98         Wworksched = 4,         /* write work scheduled or running */
99         Wpending = 8,           /* can write */
100 };
101
102 enum {
103         None,
104         Flushing,
105         Flushed,
106 };
107
108 struct p9_req;
109 typedef void (*p9_conn_req_callback)(struct p9_req *req, void *a);
110
111 /**
112  * struct p9_req - fd mux encoding of an rpc transaction
113  * @lock: protects req_list
114  * @tag: numeric tag for rpc transaction
115  * @tcall: request &p9_fcall structure
116  * @rcall: response &p9_fcall structure
117  * @err: error state
118  * @cb: callback for when response is received
119  * @cba: argument to pass to callback
120  * @flush: flag to indicate RPC has been flushed
121  * @req_list: list link for higher level objects to chain requests
122  *
123  */
124
125 struct p9_req {
126         spinlock_t lock;
127         int tag;
128         struct p9_fcall *tcall;
129         struct p9_fcall *rcall;
130         int err;
131         p9_conn_req_callback cb;
132         void *cba;
133         int flush;
134         struct list_head req_list;
135 };
136
137 struct p9_poll_wait {
138         struct p9_conn *conn;
139         wait_queue_t wait;
140         wait_queue_head_t *wait_addr;
141 };
142
143 /**
144  * struct p9_conn - fd mux connection state information
145  * @lock: protects mux_list (?)
146  * @mux_list: list link for mux to manage multiple connections (?)
147  * @msize: maximum size for connection (dup)
148  * @extended: 9p2000.u flag (dup)
149  * @trans: reference to transport instance for this connection
150  * @tagpool: id accounting for transactions
151  * @err: error state
152  * @req_list: accounting for requests which have been sent
153  * @unsent_req_list: accounting for requests that haven't been sent
154  * @rcall: current response &p9_fcall structure
155  * @rpos: read position in current frame
156  * @rbuf: current read buffer
157  * @wpos: write position for current frame
158  * @wsize: amount of data to write for current frame
159  * @wbuf: current write buffer
160  * @poll_wait: array of wait_q's for various worker threads
161  * @poll_waddr: ????
162  * @pt: poll state
163  * @rq: current read work
164  * @wq: current write work
165  * @wsched: ????
166  *
167  */
168
169 struct p9_conn {
170         spinlock_t lock; /* protect lock structure */
171         struct list_head mux_list;
172         int msize;
173         unsigned char extended;
174         struct p9_trans *trans;
175         struct p9_idpool *tagpool;
176         int err;
177         struct list_head req_list;
178         struct list_head unsent_req_list;
179         struct p9_fcall *rcall;
180         int rpos;
181         char *rbuf;
182         int wpos;
183         int wsize;
184         char *wbuf;
185         struct list_head poll_pending_link;
186         struct p9_poll_wait poll_wait[MAXPOLLWADDR];
187         poll_table pt;
188         struct work_struct rq;
189         struct work_struct wq;
190         unsigned long wsched;
191 };
192
193 /**
194  * struct p9_mux_rpc - fd mux rpc accounting structure
195  * @m: connection this request was issued on
196  * @err: error state
197  * @tcall: request &p9_fcall
198  * @rcall: response &p9_fcall
199  * @wqueue: wait queue that client is blocked on for this rpc
200  *
201  * Bug: isn't this information duplicated elsewhere like &p9_req
202  */
203
204 struct p9_mux_rpc {
205         struct p9_conn *m;
206         int err;
207         struct p9_fcall *tcall;
208         struct p9_fcall *rcall;
209         wait_queue_head_t wqueue;
210 };
211
212 static int p9_poll_proc(void *);
213 static void p9_read_work(struct work_struct *work);
214 static void p9_write_work(struct work_struct *work);
215 static void p9_pollwait(struct file *filp, wait_queue_head_t *wait_address,
216                                                                 poll_table *p);
217 static int p9_fd_write(struct p9_trans *trans, void *v, int len);
218 static int p9_fd_read(struct p9_trans *trans, void *v, int len);
219
220 static DEFINE_SPINLOCK(p9_poll_lock);
221 static LIST_HEAD(p9_poll_pending_list);
222 static struct workqueue_struct *p9_mux_wq;
223 static struct task_struct *p9_poll_task;
224
225 static void p9_conn_destroy(struct p9_conn *);
226 static unsigned int p9_fd_poll(struct p9_trans *trans,
227                                                 struct poll_table_struct *pt);
228
229 #ifdef P9_NONBLOCK
230 static int p9_conn_rpcnb(struct p9_conn *m, struct p9_fcall *tc,
231         p9_conn_req_callback cb, void *a);
232 #endif /* P9_NONBLOCK */
233
234 static void p9_conn_cancel(struct p9_conn *m, int err);
235
236 static u16 p9_mux_get_tag(struct p9_conn *m)
237 {
238         int tag;
239
240         tag = p9_idpool_get(m->tagpool);
241         if (tag < 0)
242                 return P9_NOTAG;
243         else
244                 return (u16) tag;
245 }
246
247 static void p9_mux_put_tag(struct p9_conn *m, u16 tag)
248 {
249         if (tag != P9_NOTAG && p9_idpool_check(tag, m->tagpool))
250                 p9_idpool_put(tag, m->tagpool);
251 }
252
253 static void p9_mux_poll_stop(struct p9_conn *m)
254 {
255         unsigned long flags;
256         int i;
257
258         for (i = 0; i < ARRAY_SIZE(m->poll_wait); i++) {
259                 struct p9_poll_wait *pwait = &m->poll_wait[i];
260
261                 if (pwait->wait_addr) {
262                         remove_wait_queue(pwait->wait_addr, &pwait->wait);
263                         pwait->wait_addr = NULL;
264                 }
265         }
266
267         spin_lock_irqsave(&p9_poll_lock, flags);
268         list_del_init(&m->poll_pending_link);
269         spin_unlock_irqrestore(&p9_poll_lock, flags);
270 }
271
272 /**
273  * p9_conn_create - allocate and initialize the per-session mux data
274  * @trans: transport structure
275  *
276  * Note: Creates the polling task if this is the first session.
277  */
278
279 static struct p9_conn *p9_conn_create(struct p9_trans *trans)
280 {
281         int i, n;
282         struct p9_conn *m;
283
284         P9_DPRINTK(P9_DEBUG_MUX, "transport %p msize %d\n", trans,
285                                                                 trans->msize);
286         m = kzalloc(sizeof(struct p9_conn), GFP_KERNEL);
287         if (!m)
288                 return ERR_PTR(-ENOMEM);
289
290         spin_lock_init(&m->lock);
291         INIT_LIST_HEAD(&m->mux_list);
292         m->msize = trans->msize;
293         m->extended = trans->extended;
294         m->trans = trans;
295         m->tagpool = p9_idpool_create();
296         if (IS_ERR(m->tagpool)) {
297                 kfree(m);
298                 return ERR_PTR(-ENOMEM);
299         }
300
301         INIT_LIST_HEAD(&m->req_list);
302         INIT_LIST_HEAD(&m->unsent_req_list);
303         INIT_WORK(&m->rq, p9_read_work);
304         INIT_WORK(&m->wq, p9_write_work);
305         INIT_LIST_HEAD(&m->poll_pending_link);
306         init_poll_funcptr(&m->pt, p9_pollwait);
307
308         n = p9_fd_poll(trans, &m->pt);
309         if (n & POLLIN) {
310                 P9_DPRINTK(P9_DEBUG_MUX, "mux %p can read\n", m);
311                 set_bit(Rpending, &m->wsched);
312         }
313
314         if (n & POLLOUT) {
315                 P9_DPRINTK(P9_DEBUG_MUX, "mux %p can write\n", m);
316                 set_bit(Wpending, &m->wsched);
317         }
318
319         for (i = 0; i < ARRAY_SIZE(m->poll_wait); i++) {
320                 if (IS_ERR(m->poll_wait[i].wait_addr)) {
321                         p9_mux_poll_stop(m);
322                         kfree(m);
323                         /* return the error code */
324                         return (void *)m->poll_wait[i].wait_addr;
325                 }
326         }
327
328         return m;
329 }
330
331 /**
332  * p9_mux_destroy - cancels all pending requests and frees mux resources
333  * @m: mux to destroy
334  *
335  */
336
337 static void p9_conn_destroy(struct p9_conn *m)
338 {
339         P9_DPRINTK(P9_DEBUG_MUX, "mux %p prev %p next %p\n", m,
340                 m->mux_list.prev, m->mux_list.next);
341
342         p9_mux_poll_stop(m);
343         cancel_work_sync(&m->rq);
344         cancel_work_sync(&m->wq);
345
346         p9_conn_cancel(m, -ECONNRESET);
347
348         m->trans = NULL;
349         p9_idpool_destroy(m->tagpool);
350         kfree(m);
351 }
352
353 static int p9_pollwake(wait_queue_t *wait, unsigned mode, int sync, void *key)
354 {
355         struct p9_poll_wait *pwait =
356                 container_of(wait, struct p9_poll_wait, wait);
357         struct p9_conn *m = pwait->conn;
358         unsigned long flags;
359         DECLARE_WAITQUEUE(dummy_wait, p9_poll_task);
360
361         spin_lock_irqsave(&p9_poll_lock, flags);
362         if (list_empty(&m->poll_pending_link))
363                 list_add_tail(&m->poll_pending_link, &p9_poll_pending_list);
364         spin_unlock_irqrestore(&p9_poll_lock, flags);
365
366         /* perform the default wake up operation */
367         return default_wake_function(&dummy_wait, mode, sync, key);
368 }
369
370 /**
371  * p9_pollwait - add poll task to the wait queue
372  * @filp: file pointer being polled
373  * @wait_address: wait_q to block on
374  * @p: poll state
375  *
376  * called by files poll operation to add v9fs-poll task to files wait queue
377  */
378
379 static void
380 p9_pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p)
381 {
382         struct p9_conn *m = container_of(p, struct p9_conn, pt);
383         struct p9_poll_wait *pwait = NULL;
384         int i;
385
386         for (i = 0; i < ARRAY_SIZE(m->poll_wait); i++) {
387                 if (m->poll_wait[i].wait_addr == NULL) {
388                         pwait = &m->poll_wait[i];
389                         break;
390                 }
391         }
392
393         if (!pwait) {
394                 P9_DPRINTK(P9_DEBUG_ERROR, "not enough wait_address slots\n");
395                 return;
396         }
397
398         if (!wait_address) {
399                 P9_DPRINTK(P9_DEBUG_ERROR, "no wait_address\n");
400                 pwait->wait_addr = ERR_PTR(-EIO);
401                 return;
402         }
403
404         pwait->conn = m;
405         pwait->wait_addr = wait_address;
406         init_waitqueue_func_entry(&pwait->wait, p9_pollwake);
407         add_wait_queue(wait_address, &pwait->wait);
408 }
409
410 /**
411  * p9_poll_mux - polls a mux and schedules read or write works if necessary
412  * @m: connection to poll
413  *
414  */
415
416 static void p9_poll_mux(struct p9_conn *m)
417 {
418         int n;
419
420         if (m->err < 0)
421                 return;
422
423         n = p9_fd_poll(m->trans, NULL);
424         if (n < 0 || n & (POLLERR | POLLHUP | POLLNVAL)) {
425                 P9_DPRINTK(P9_DEBUG_MUX, "error mux %p err %d\n", m, n);
426                 if (n >= 0)
427                         n = -ECONNRESET;
428                 p9_conn_cancel(m, n);
429         }
430
431         if (n & POLLIN) {
432                 set_bit(Rpending, &m->wsched);
433                 P9_DPRINTK(P9_DEBUG_MUX, "mux %p can read\n", m);
434                 if (!test_and_set_bit(Rworksched, &m->wsched)) {
435                         P9_DPRINTK(P9_DEBUG_MUX, "schedule read work %p\n", m);
436                         queue_work(p9_mux_wq, &m->rq);
437                 }
438         }
439
440         if (n & POLLOUT) {
441                 set_bit(Wpending, &m->wsched);
442                 P9_DPRINTK(P9_DEBUG_MUX, "mux %p can write\n", m);
443                 if ((m->wsize || !list_empty(&m->unsent_req_list))
444                     && !test_and_set_bit(Wworksched, &m->wsched)) {
445                         P9_DPRINTK(P9_DEBUG_MUX, "schedule write work %p\n", m);
446                         queue_work(p9_mux_wq, &m->wq);
447                 }
448         }
449 }
450
451 /**
452  * p9_poll_proc - poll worker thread
453  * @a: thread state and arguments
454  *
455  * polls all v9fs transports for new events and queues the appropriate
456  * work to the work queue
457  *
458  */
459
460 static int p9_poll_proc(void *a)
461 {
462         unsigned long flags;
463
464         P9_DPRINTK(P9_DEBUG_MUX, "start %p\n", current);
465  repeat:
466         spin_lock_irqsave(&p9_poll_lock, flags);
467         while (!list_empty(&p9_poll_pending_list)) {
468                 struct p9_conn *conn = list_first_entry(&p9_poll_pending_list,
469                                                         struct p9_conn,
470                                                         poll_pending_link);
471                 list_del_init(&conn->poll_pending_link);
472                 spin_unlock_irqrestore(&p9_poll_lock, flags);
473
474                 p9_poll_mux(conn);
475
476                 spin_lock_irqsave(&p9_poll_lock, flags);
477         }
478         spin_unlock_irqrestore(&p9_poll_lock, flags);
479
480         set_current_state(TASK_INTERRUPTIBLE);
481         if (list_empty(&p9_poll_pending_list)) {
482                 P9_DPRINTK(P9_DEBUG_MUX, "sleeping...\n");
483                 schedule();
484         }
485         __set_current_state(TASK_RUNNING);
486
487         if (!kthread_should_stop())
488                 goto repeat;
489
490         P9_DPRINTK(P9_DEBUG_MUX, "finish\n");
491         return 0;
492 }
493
494 /**
495  * p9_write_work - called when a transport can send some data
496  * @work: container for work to be done
497  *
498  */
499
500 static void p9_write_work(struct work_struct *work)
501 {
502         int n, err;
503         struct p9_conn *m;
504         struct p9_req *req;
505
506         m = container_of(work, struct p9_conn, wq);
507
508         if (m->err < 0) {
509                 clear_bit(Wworksched, &m->wsched);
510                 return;
511         }
512
513         if (!m->wsize) {
514                 if (list_empty(&m->unsent_req_list)) {
515                         clear_bit(Wworksched, &m->wsched);
516                         return;
517                 }
518
519                 spin_lock(&m->lock);
520 again:
521                 req = list_entry(m->unsent_req_list.next, struct p9_req,
522                                req_list);
523                 list_move_tail(&req->req_list, &m->req_list);
524                 if (req->err == ERREQFLUSH)
525                         goto again;
526
527                 m->wbuf = req->tcall->sdata;
528                 m->wsize = req->tcall->size;
529                 m->wpos = 0;
530                 spin_unlock(&m->lock);
531         }
532
533         P9_DPRINTK(P9_DEBUG_MUX, "mux %p pos %d size %d\n", m, m->wpos,
534                                                                 m->wsize);
535         clear_bit(Wpending, &m->wsched);
536         err = p9_fd_write(m->trans, m->wbuf + m->wpos, m->wsize - m->wpos);
537         P9_DPRINTK(P9_DEBUG_MUX, "mux %p sent %d bytes\n", m, err);
538         if (err == -EAGAIN) {
539                 clear_bit(Wworksched, &m->wsched);
540                 return;
541         }
542
543         if (err < 0)
544                 goto error;
545         else if (err == 0) {
546                 err = -EREMOTEIO;
547                 goto error;
548         }
549
550         m->wpos += err;
551         if (m->wpos == m->wsize)
552                 m->wpos = m->wsize = 0;
553
554         if (m->wsize == 0 && !list_empty(&m->unsent_req_list)) {
555                 if (test_and_clear_bit(Wpending, &m->wsched))
556                         n = POLLOUT;
557                 else
558                         n = p9_fd_poll(m->trans, NULL);
559
560                 if (n & POLLOUT) {
561                         P9_DPRINTK(P9_DEBUG_MUX, "schedule write work %p\n", m);
562                         queue_work(p9_mux_wq, &m->wq);
563                 } else
564                         clear_bit(Wworksched, &m->wsched);
565         } else
566                 clear_bit(Wworksched, &m->wsched);
567
568         return;
569
570 error:
571         p9_conn_cancel(m, err);
572         clear_bit(Wworksched, &m->wsched);
573 }
574
575 static void process_request(struct p9_conn *m, struct p9_req *req)
576 {
577         int ecode;
578         struct p9_str *ename;
579
580         if (!req->err && req->rcall->id == P9_RERROR) {
581                 ecode = req->rcall->params.rerror.errno;
582                 ename = &req->rcall->params.rerror.error;
583
584                 P9_DPRINTK(P9_DEBUG_MUX, "Rerror %.*s\n", ename->len,
585                                                                 ename->str);
586
587                 if (m->extended)
588                         req->err = -ecode;
589
590                 if (!req->err) {
591                         req->err = p9_errstr2errno(ename->str, ename->len);
592
593                         /* string match failed */
594                         if (!req->err) {
595                                 PRINT_FCALL_ERROR("unknown error", req->rcall);
596                                 req->err = -ESERVERFAULT;
597                         }
598                 }
599         } else if (req->tcall && req->rcall->id != req->tcall->id + 1) {
600                 P9_DPRINTK(P9_DEBUG_ERROR,
601                                 "fcall mismatch: expected %d, got %d\n",
602                                 req->tcall->id + 1, req->rcall->id);
603                 if (!req->err)
604                         req->err = -EIO;
605         }
606 }
607
608 /**
609  * p9_read_work - called when there is some data to be read from a transport
610  * @work: container of work to be done
611  *
612  */
613
614 static void p9_read_work(struct work_struct *work)
615 {
616         int n, err;
617         struct p9_conn *m;
618         struct p9_req *req, *rptr, *rreq;
619         struct p9_fcall *rcall;
620         char *rbuf;
621
622         m = container_of(work, struct p9_conn, rq);
623
624         if (m->err < 0)
625                 return;
626
627         rcall = NULL;
628         P9_DPRINTK(P9_DEBUG_MUX, "start mux %p pos %d\n", m, m->rpos);
629
630         if (!m->rcall) {
631                 m->rcall =
632                     kmalloc(sizeof(struct p9_fcall) + m->msize, GFP_KERNEL);
633                 if (!m->rcall) {
634                         err = -ENOMEM;
635                         goto error;
636                 }
637
638                 m->rbuf = (char *)m->rcall + sizeof(struct p9_fcall);
639                 m->rpos = 0;
640         }
641
642         clear_bit(Rpending, &m->wsched);
643         err = p9_fd_read(m->trans, m->rbuf + m->rpos, m->msize - m->rpos);
644         P9_DPRINTK(P9_DEBUG_MUX, "mux %p got %d bytes\n", m, err);
645         if (err == -EAGAIN) {
646                 clear_bit(Rworksched, &m->wsched);
647                 return;
648         }
649
650         if (err <= 0)
651                 goto error;
652
653         m->rpos += err;
654         while (m->rpos > 4) {
655                 n = le32_to_cpu(*(__le32 *) m->rbuf);
656                 if (n >= m->msize) {
657                         P9_DPRINTK(P9_DEBUG_ERROR,
658                                 "requested packet size too big: %d\n", n);
659                         err = -EIO;
660                         goto error;
661                 }
662
663                 if (m->rpos < n)
664                         break;
665
666                 err =
667                     p9_deserialize_fcall(m->rbuf, n, m->rcall, m->extended);
668                 if (err < 0)
669                         goto error;
670
671 #ifdef CONFIG_NET_9P_DEBUG
672                 if ((p9_debug_level&P9_DEBUG_FCALL) == P9_DEBUG_FCALL) {
673                         char buf[150];
674
675                         p9_printfcall(buf, sizeof(buf), m->rcall,
676                                 m->extended);
677                         printk(KERN_NOTICE ">>> %p %s\n", m, buf);
678                 }
679 #endif
680
681                 rcall = m->rcall;
682                 rbuf = m->rbuf;
683                 if (m->rpos > n) {
684                         m->rcall = kmalloc(sizeof(struct p9_fcall) + m->msize,
685                                            GFP_KERNEL);
686                         if (!m->rcall) {
687                                 err = -ENOMEM;
688                                 goto error;
689                         }
690
691                         m->rbuf = (char *)m->rcall + sizeof(struct p9_fcall);
692                         memmove(m->rbuf, rbuf + n, m->rpos - n);
693                         m->rpos -= n;
694                 } else {
695                         m->rcall = NULL;
696                         m->rbuf = NULL;
697                         m->rpos = 0;
698                 }
699
700                 P9_DPRINTK(P9_DEBUG_MUX, "mux %p fcall id %d tag %d\n", m,
701                                                         rcall->id, rcall->tag);
702
703                 req = NULL;
704                 spin_lock(&m->lock);
705                 list_for_each_entry_safe(rreq, rptr, &m->req_list, req_list) {
706                         if (rreq->tag == rcall->tag) {
707                                 req = rreq;
708                                 if (req->flush != Flushing)
709                                         list_del(&req->req_list);
710                                 break;
711                         }
712                 }
713                 spin_unlock(&m->lock);
714
715                 if (req) {
716                         req->rcall = rcall;
717                         process_request(m, req);
718
719                         if (req->flush != Flushing) {
720                                 if (req->cb)
721                                         (*req->cb) (req, req->cba);
722                                 else
723                                         kfree(req->rcall);
724                         }
725                 } else {
726                         if (err >= 0 && rcall->id != P9_RFLUSH)
727                                 P9_DPRINTK(P9_DEBUG_ERROR,
728                                   "unexpected response mux %p id %d tag %d\n",
729                                   m, rcall->id, rcall->tag);
730                         kfree(rcall);
731                 }
732         }
733
734         if (!list_empty(&m->req_list)) {
735                 if (test_and_clear_bit(Rpending, &m->wsched))
736                         n = POLLIN;
737                 else
738                         n = p9_fd_poll(m->trans, NULL);
739
740                 if (n & POLLIN) {
741                         P9_DPRINTK(P9_DEBUG_MUX, "schedule read work %p\n", m);
742                         queue_work(p9_mux_wq, &m->rq);
743                 } else
744                         clear_bit(Rworksched, &m->wsched);
745         } else
746                 clear_bit(Rworksched, &m->wsched);
747
748         return;
749
750 error:
751         p9_conn_cancel(m, err);
752         clear_bit(Rworksched, &m->wsched);
753 }
754
755 /**
756  * p9_send_request - send 9P request
757  * The function can sleep until the request is scheduled for sending.
758  * The function can be interrupted. Return from the function is not
759  * a guarantee that the request is sent successfully. Can return errors
760  * that can be retrieved by PTR_ERR macros.
761  *
762  * @m: mux data
763  * @tc: request to be sent
764  * @cb: callback function to call when response is received
765  * @cba: parameter to pass to the callback function
766  *
767  */
768
769 static struct p9_req *p9_send_request(struct p9_conn *m,
770                                           struct p9_fcall *tc,
771                                           p9_conn_req_callback cb, void *cba)
772 {
773         int n;
774         struct p9_req *req;
775
776         P9_DPRINTK(P9_DEBUG_MUX, "mux %p task %p tcall %p id %d\n", m, current,
777                 tc, tc->id);
778         if (m->err < 0)
779                 return ERR_PTR(m->err);
780
781         req = kmalloc(sizeof(struct p9_req), GFP_KERNEL);
782         if (!req)
783                 return ERR_PTR(-ENOMEM);
784
785         if (tc->id == P9_TVERSION)
786                 n = P9_NOTAG;
787         else
788                 n = p9_mux_get_tag(m);
789
790         if (n < 0) {
791                 kfree(req);
792                 return ERR_PTR(-ENOMEM);
793         }
794
795         p9_set_tag(tc, n);
796
797 #ifdef CONFIG_NET_9P_DEBUG
798         if ((p9_debug_level&P9_DEBUG_FCALL) == P9_DEBUG_FCALL) {
799                 char buf[150];
800
801                 p9_printfcall(buf, sizeof(buf), tc, m->extended);
802                 printk(KERN_NOTICE "<<< %p %s\n", m, buf);
803         }
804 #endif
805
806         spin_lock_init(&req->lock);
807         req->tag = n;
808         req->tcall = tc;
809         req->rcall = NULL;
810         req->err = 0;
811         req->cb = cb;
812         req->cba = cba;
813         req->flush = None;
814
815         spin_lock(&m->lock);
816         list_add_tail(&req->req_list, &m->unsent_req_list);
817         spin_unlock(&m->lock);
818
819         if (test_and_clear_bit(Wpending, &m->wsched))
820                 n = POLLOUT;
821         else
822                 n = p9_fd_poll(m->trans, NULL);
823
824         if (n & POLLOUT && !test_and_set_bit(Wworksched, &m->wsched))
825                 queue_work(p9_mux_wq, &m->wq);
826
827         return req;
828 }
829
830 static void p9_mux_free_request(struct p9_conn *m, struct p9_req *req)
831 {
832         p9_mux_put_tag(m, req->tag);
833         kfree(req);
834 }
835
836 static void p9_mux_flush_cb(struct p9_req *freq, void *a)
837 {
838         int tag;
839         struct p9_conn *m;
840         struct p9_req *req, *rreq, *rptr;
841
842         m = a;
843         P9_DPRINTK(P9_DEBUG_MUX, "mux %p tc %p rc %p err %d oldtag %d\n", m,
844                 freq->tcall, freq->rcall, freq->err,
845                 freq->tcall->params.tflush.oldtag);
846
847         spin_lock(&m->lock);
848         tag = freq->tcall->params.tflush.oldtag;
849         req = NULL;
850         list_for_each_entry_safe(rreq, rptr, &m->req_list, req_list) {
851                 if (rreq->tag == tag) {
852                         req = rreq;
853                         list_del(&req->req_list);
854                         break;
855                 }
856         }
857         spin_unlock(&m->lock);
858
859         if (req) {
860                 spin_lock(&req->lock);
861                 req->flush = Flushed;
862                 spin_unlock(&req->lock);
863
864                 if (req->cb)
865                         (*req->cb) (req, req->cba);
866                 else
867                         kfree(req->rcall);
868         }
869
870         kfree(freq->tcall);
871         kfree(freq->rcall);
872         p9_mux_free_request(m, freq);
873 }
874
875 static int
876 p9_mux_flush_request(struct p9_conn *m, struct p9_req *req)
877 {
878         struct p9_fcall *fc;
879         struct p9_req *rreq, *rptr;
880
881         P9_DPRINTK(P9_DEBUG_MUX, "mux %p req %p tag %d\n", m, req, req->tag);
882
883         /* if a response was received for a request, do nothing */
884         spin_lock(&req->lock);
885         if (req->rcall || req->err) {
886                 spin_unlock(&req->lock);
887                 P9_DPRINTK(P9_DEBUG_MUX,
888                         "mux %p req %p response already received\n", m, req);
889                 return 0;
890         }
891
892         req->flush = Flushing;
893         spin_unlock(&req->lock);
894
895         spin_lock(&m->lock);
896         /* if the request is not sent yet, just remove it from the list */
897         list_for_each_entry_safe(rreq, rptr, &m->unsent_req_list, req_list) {
898                 if (rreq->tag == req->tag) {
899                         P9_DPRINTK(P9_DEBUG_MUX,
900                            "mux %p req %p request is not sent yet\n", m, req);
901                         list_del(&rreq->req_list);
902                         req->flush = Flushed;
903                         spin_unlock(&m->lock);
904                         if (req->cb)
905                                 (*req->cb) (req, req->cba);
906                         return 0;
907                 }
908         }
909         spin_unlock(&m->lock);
910
911         clear_thread_flag(TIF_SIGPENDING);
912         fc = p9_create_tflush(req->tag);
913         p9_send_request(m, fc, p9_mux_flush_cb, m);
914         return 1;
915 }
916
917 static void
918 p9_conn_rpc_cb(struct p9_req *req, void *a)
919 {
920         struct p9_mux_rpc *r;
921
922         P9_DPRINTK(P9_DEBUG_MUX, "req %p r %p\n", req, a);
923         r = a;
924         r->rcall = req->rcall;
925         r->err = req->err;
926
927         if (req->flush != None && !req->err)
928                 r->err = -ERESTARTSYS;
929
930         wake_up(&r->wqueue);
931 }
932
933 /**
934  * p9_fd_rpc- sends 9P request and waits until a response is available.
935  *      The function can be interrupted.
936  * @t: transport data
937  * @tc: request to be sent
938  * @rc: pointer where a pointer to the response is stored
939  *
940  */
941
942 int
943 p9_fd_rpc(struct p9_trans *t, struct p9_fcall *tc, struct p9_fcall **rc)
944 {
945         struct p9_trans_fd *p = t->priv;
946         struct p9_conn *m = p->conn;
947         int err, sigpending;
948         unsigned long flags;
949         struct p9_req *req;
950         struct p9_mux_rpc r;
951
952         r.err = 0;
953         r.tcall = tc;
954         r.rcall = NULL;
955         r.m = m;
956         init_waitqueue_head(&r.wqueue);
957
958         if (rc)
959                 *rc = NULL;
960
961         sigpending = 0;
962         if (signal_pending(current)) {
963                 sigpending = 1;
964                 clear_thread_flag(TIF_SIGPENDING);
965         }
966
967         req = p9_send_request(m, tc, p9_conn_rpc_cb, &r);
968         if (IS_ERR(req)) {
969                 err = PTR_ERR(req);
970                 P9_DPRINTK(P9_DEBUG_MUX, "error %d\n", err);
971                 return err;
972         }
973
974         err = wait_event_interruptible(r.wqueue, r.rcall != NULL || r.err < 0);
975         if (r.err < 0)
976                 err = r.err;
977
978         if (err == -ERESTARTSYS && m->trans->status == Connected
979                                                         && m->err == 0) {
980                 if (p9_mux_flush_request(m, req)) {
981                         /* wait until we get response of the flush message */
982                         do {
983                                 clear_thread_flag(TIF_SIGPENDING);
984                                 err = wait_event_interruptible(r.wqueue,
985                                         r.rcall || r.err);
986                         } while (!r.rcall && !r.err && err == -ERESTARTSYS &&
987                                 m->trans->status == Connected && !m->err);
988
989                         err = -ERESTARTSYS;
990                 }
991                 sigpending = 1;
992         }
993
994         if (sigpending) {
995                 spin_lock_irqsave(&current->sighand->siglock, flags);
996                 recalc_sigpending();
997                 spin_unlock_irqrestore(&current->sighand->siglock, flags);
998         }
999
1000         if (rc)
1001                 *rc = r.rcall;
1002         else
1003                 kfree(r.rcall);
1004
1005         p9_mux_free_request(m, req);
1006         if (err > 0)
1007                 err = -EIO;
1008
1009         return err;
1010 }
1011
1012 #ifdef P9_NONBLOCK
1013 /**
1014  * p9_conn_rpcnb - sends 9P request without waiting for response.
1015  * @m: mux data
1016  * @tc: request to be sent
1017  * @cb: callback function to be called when response arrives
1018  * @a: value to pass to the callback function
1019  *
1020  */
1021
1022 int p9_conn_rpcnb(struct p9_conn *m, struct p9_fcall *tc,
1023                    p9_conn_req_callback cb, void *a)
1024 {
1025         int err;
1026         struct p9_req *req;
1027
1028         req = p9_send_request(m, tc, cb, a);
1029         if (IS_ERR(req)) {
1030                 err = PTR_ERR(req);
1031                 P9_DPRINTK(P9_DEBUG_MUX, "error %d\n", err);
1032                 return PTR_ERR(req);
1033         }
1034
1035         P9_DPRINTK(P9_DEBUG_MUX, "mux %p tc %p tag %d\n", m, tc, req->tag);
1036         return 0;
1037 }
1038 #endif /* P9_NONBLOCK */
1039
1040 /**
1041  * p9_conn_cancel - cancel all pending requests with error
1042  * @m: mux data
1043  * @err: error code
1044  *
1045  */
1046
1047 void p9_conn_cancel(struct p9_conn *m, int err)
1048 {
1049         struct p9_req *req, *rtmp;
1050         LIST_HEAD(cancel_list);
1051
1052         P9_DPRINTK(P9_DEBUG_ERROR, "mux %p err %d\n", m, err);
1053         m->err = err;
1054         spin_lock(&m->lock);
1055         list_for_each_entry_safe(req, rtmp, &m->req_list, req_list) {
1056                 list_move(&req->req_list, &cancel_list);
1057         }
1058         list_for_each_entry_safe(req, rtmp, &m->unsent_req_list, req_list) {
1059                 list_move(&req->req_list, &cancel_list);
1060         }
1061         spin_unlock(&m->lock);
1062
1063         list_for_each_entry_safe(req, rtmp, &cancel_list, req_list) {
1064                 list_del(&req->req_list);
1065                 if (!req->err)
1066                         req->err = err;
1067
1068                 if (req->cb)
1069                         (*req->cb) (req, req->cba);
1070                 else
1071                         kfree(req->rcall);
1072         }
1073 }
1074
1075 /**
1076  * parse_options - parse mount options into session structure
1077  * @options: options string passed from mount
1078  * @opts: transport-specific structure to parse options into
1079  *
1080  * Returns 0 upon success, -ERRNO upon failure
1081  */
1082
1083 static int parse_opts(char *params, struct p9_fd_opts *opts)
1084 {
1085         char *p;
1086         substring_t args[MAX_OPT_ARGS];
1087         int option;
1088         char *options;
1089         int ret;
1090
1091         opts->port = P9_PORT;
1092         opts->rfd = ~0;
1093         opts->wfd = ~0;
1094
1095         if (!params)
1096                 return 0;
1097
1098         options = kstrdup(params, GFP_KERNEL);
1099         if (!options) {
1100                 P9_DPRINTK(P9_DEBUG_ERROR,
1101                                 "failed to allocate copy of option string\n");
1102                 return -ENOMEM;
1103         }
1104
1105         while ((p = strsep(&options, ",")) != NULL) {
1106                 int token;
1107                 int r;
1108                 if (!*p)
1109                         continue;
1110                 token = match_token(p, tokens, args);
1111                 r = match_int(&args[0], &option);
1112                 if (r < 0) {
1113                         P9_DPRINTK(P9_DEBUG_ERROR,
1114                          "integer field, but no integer?\n");
1115                         ret = r;
1116                         continue;
1117                 }
1118                 switch (token) {
1119                 case Opt_port:
1120                         opts->port = option;
1121                         break;
1122                 case Opt_rfdno:
1123                         opts->rfd = option;
1124                         break;
1125                 case Opt_wfdno:
1126                         opts->wfd = option;
1127                         break;
1128                 default:
1129                         continue;
1130                 }
1131         }
1132         kfree(options);
1133         return 0;
1134 }
1135
1136 static int p9_fd_open(struct p9_trans *trans, int rfd, int wfd)
1137 {
1138         struct p9_trans_fd *ts = kmalloc(sizeof(struct p9_trans_fd),
1139                                            GFP_KERNEL);
1140         if (!ts)
1141                 return -ENOMEM;
1142
1143         ts->rd = fget(rfd);
1144         ts->wr = fget(wfd);
1145         if (!ts->rd || !ts->wr) {
1146                 if (ts->rd)
1147                         fput(ts->rd);
1148                 if (ts->wr)
1149                         fput(ts->wr);
1150                 kfree(ts);
1151                 return -EIO;
1152         }
1153
1154         trans->priv = ts;
1155         trans->status = Connected;
1156
1157         return 0;
1158 }
1159
1160 static int p9_socket_open(struct p9_trans *trans, struct socket *csocket)
1161 {
1162         int fd, ret;
1163
1164         csocket->sk->sk_allocation = GFP_NOIO;
1165         fd = sock_map_fd(csocket, 0);
1166         if (fd < 0) {
1167                 P9_EPRINTK(KERN_ERR, "p9_socket_open: failed to map fd\n");
1168                 return fd;
1169         }
1170
1171         ret = p9_fd_open(trans, fd, fd);
1172         if (ret < 0) {
1173                 P9_EPRINTK(KERN_ERR, "p9_socket_open: failed to open fd\n");
1174                 sockfd_put(csocket);
1175                 return ret;
1176         }
1177
1178         ((struct p9_trans_fd *)trans->priv)->rd->f_flags |= O_NONBLOCK;
1179
1180         return 0;
1181 }
1182
1183 /**
1184  * p9_fd_read- read from a fd
1185  * @trans: transport instance state
1186  * @v: buffer to receive data into
1187  * @len: size of receive buffer
1188  *
1189  */
1190
1191 static int p9_fd_read(struct p9_trans *trans, void *v, int len)
1192 {
1193         int ret;
1194         struct p9_trans_fd *ts = NULL;
1195
1196         if (trans && trans->status != Disconnected)
1197                 ts = trans->priv;
1198
1199         if (!ts)
1200                 return -EREMOTEIO;
1201
1202         if (!(ts->rd->f_flags & O_NONBLOCK))
1203                 P9_DPRINTK(P9_DEBUG_ERROR, "blocking read ...\n");
1204
1205         ret = kernel_read(ts->rd, ts->rd->f_pos, v, len);
1206         if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
1207                 trans->status = Disconnected;
1208         return ret;
1209 }
1210
1211 /**
1212  * p9_fd_write - write to a socket
1213  * @trans: transport instance state
1214  * @v: buffer to send data from
1215  * @len: size of send buffer
1216  *
1217  */
1218
1219 static int p9_fd_write(struct p9_trans *trans, void *v, int len)
1220 {
1221         int ret;
1222         mm_segment_t oldfs;
1223         struct p9_trans_fd *ts = NULL;
1224
1225         if (trans && trans->status != Disconnected)
1226                 ts = trans->priv;
1227
1228         if (!ts)
1229                 return -EREMOTEIO;
1230
1231         if (!(ts->wr->f_flags & O_NONBLOCK))
1232                 P9_DPRINTK(P9_DEBUG_ERROR, "blocking write ...\n");
1233
1234         oldfs = get_fs();
1235         set_fs(get_ds());
1236         /* The cast to a user pointer is valid due to the set_fs() */
1237         ret = vfs_write(ts->wr, (void __user *)v, len, &ts->wr->f_pos);
1238         set_fs(oldfs);
1239
1240         if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
1241                 trans->status = Disconnected;
1242         return ret;
1243 }
1244
1245 static unsigned int
1246 p9_fd_poll(struct p9_trans *trans, struct poll_table_struct *pt)
1247 {
1248         int ret, n;
1249         struct p9_trans_fd *ts = NULL;
1250
1251         if (trans && trans->status == Connected)
1252                 ts = trans->priv;
1253
1254         if (!ts)
1255                 return -EREMOTEIO;
1256
1257         if (!ts->rd->f_op || !ts->rd->f_op->poll)
1258                 return -EIO;
1259
1260         if (!ts->wr->f_op || !ts->wr->f_op->poll)
1261                 return -EIO;
1262
1263         ret = ts->rd->f_op->poll(ts->rd, pt);
1264         if (ret < 0)
1265                 return ret;
1266
1267         if (ts->rd != ts->wr) {
1268                 n = ts->wr->f_op->poll(ts->wr, pt);
1269                 if (n < 0)
1270                         return n;
1271                 ret = (ret & ~POLLOUT) | (n & ~POLLIN);
1272         }
1273
1274         return ret;
1275 }
1276
1277 /**
1278  * p9_fd_close - shutdown socket
1279  * @trans: private socket structure
1280  *
1281  */
1282
1283 static void p9_fd_close(struct p9_trans *trans)
1284 {
1285         struct p9_trans_fd *ts;
1286
1287         if (!trans)
1288                 return;
1289
1290         ts = xchg(&trans->priv, NULL);
1291
1292         if (!ts)
1293                 return;
1294
1295         p9_conn_destroy(ts->conn);
1296
1297         trans->status = Disconnected;
1298         if (ts->rd)
1299                 fput(ts->rd);
1300         if (ts->wr)
1301                 fput(ts->wr);
1302         kfree(ts);
1303 }
1304
1305 /*
1306  * stolen from NFS - maybe should be made a generic function?
1307  */
1308 static inline int valid_ipaddr4(const char *buf)
1309 {
1310         int rc, count, in[4];
1311
1312         rc = sscanf(buf, "%d.%d.%d.%d", &in[0], &in[1], &in[2], &in[3]);
1313         if (rc != 4)
1314                 return -EINVAL;
1315         for (count = 0; count < 4; count++) {
1316                 if (in[count] > 255)
1317                         return -EINVAL;
1318         }
1319         return 0;
1320 }
1321
1322 static struct p9_trans *
1323 p9_trans_create_tcp(const char *addr, char *args, int msize, unsigned char dotu)
1324 {
1325         int err;
1326         struct p9_trans *trans;
1327         struct socket *csocket;
1328         struct sockaddr_in sin_server;
1329         struct p9_fd_opts opts;
1330         struct p9_trans_fd *p;
1331
1332         err = parse_opts(args, &opts);
1333         if (err < 0)
1334                 return ERR_PTR(err);
1335
1336         if (valid_ipaddr4(addr) < 0)
1337                 return ERR_PTR(-EINVAL);
1338
1339         csocket = NULL;
1340         trans = kmalloc(sizeof(struct p9_trans), GFP_KERNEL);
1341         if (!trans)
1342                 return ERR_PTR(-ENOMEM);
1343         trans->msize = msize;
1344         trans->extended = dotu;
1345         trans->rpc = p9_fd_rpc;
1346         trans->close = p9_fd_close;
1347
1348         sin_server.sin_family = AF_INET;
1349         sin_server.sin_addr.s_addr = in_aton(addr);
1350         sin_server.sin_port = htons(opts.port);
1351         sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &csocket);
1352
1353         if (!csocket) {
1354                 P9_EPRINTK(KERN_ERR, "p9_trans_tcp: problem creating socket\n");
1355                 err = -EIO;
1356                 goto error;
1357         }
1358
1359         err = csocket->ops->connect(csocket,
1360                                     (struct sockaddr *)&sin_server,
1361                                     sizeof(struct sockaddr_in), 0);
1362         if (err < 0) {
1363                 P9_EPRINTK(KERN_ERR,
1364                         "p9_trans_tcp: problem connecting socket to %s\n",
1365                         addr);
1366                 goto error;
1367         }
1368
1369         err = p9_socket_open(trans, csocket);
1370         if (err < 0)
1371                 goto error;
1372
1373         p = (struct p9_trans_fd *) trans->priv;
1374         p->conn = p9_conn_create(trans);
1375         if (IS_ERR(p->conn)) {
1376                 err = PTR_ERR(p->conn);
1377                 p->conn = NULL;
1378                 goto error;
1379         }
1380
1381         return trans;
1382
1383 error:
1384         if (csocket)
1385                 sock_release(csocket);
1386
1387         kfree(trans);
1388         return ERR_PTR(err);
1389 }
1390
1391 static struct p9_trans *
1392 p9_trans_create_unix(const char *addr, char *args, int msize,
1393                                                         unsigned char dotu)
1394 {
1395         int err;
1396         struct socket *csocket;
1397         struct sockaddr_un sun_server;
1398         struct p9_trans *trans;
1399         struct p9_trans_fd *p;
1400
1401         csocket = NULL;
1402         trans = kmalloc(sizeof(struct p9_trans), GFP_KERNEL);
1403         if (!trans)
1404                 return ERR_PTR(-ENOMEM);
1405
1406         trans->rpc = p9_fd_rpc;
1407         trans->close = p9_fd_close;
1408
1409         if (strlen(addr) > UNIX_PATH_MAX) {
1410                 P9_EPRINTK(KERN_ERR, "p9_trans_unix: address too long: %s\n",
1411                         addr);
1412                 err = -ENAMETOOLONG;
1413                 goto error;
1414         }
1415
1416         sun_server.sun_family = PF_UNIX;
1417         strcpy(sun_server.sun_path, addr);
1418         sock_create_kern(PF_UNIX, SOCK_STREAM, 0, &csocket);
1419         err = csocket->ops->connect(csocket, (struct sockaddr *)&sun_server,
1420                         sizeof(struct sockaddr_un) - 1, 0);
1421         if (err < 0) {
1422                 P9_EPRINTK(KERN_ERR,
1423                         "p9_trans_unix: problem connecting socket: %s: %d\n",
1424                         addr, err);
1425                 goto error;
1426         }
1427
1428         err = p9_socket_open(trans, csocket);
1429         if (err < 0)
1430                 goto error;
1431
1432         trans->msize = msize;
1433         trans->extended = dotu;
1434         p = (struct p9_trans_fd *) trans->priv;
1435         p->conn = p9_conn_create(trans);
1436         if (IS_ERR(p->conn)) {
1437                 err = PTR_ERR(p->conn);
1438                 p->conn = NULL;
1439                 goto error;
1440         }
1441
1442         return trans;
1443
1444 error:
1445         if (csocket)
1446                 sock_release(csocket);
1447
1448         kfree(trans);
1449         return ERR_PTR(err);
1450 }
1451
1452 static struct p9_trans *
1453 p9_trans_create_fd(const char *name, char *args, int msize,
1454                                                         unsigned char extended)
1455 {
1456         int err;
1457         struct p9_trans *trans;
1458         struct p9_fd_opts opts;
1459         struct p9_trans_fd *p;
1460
1461         parse_opts(args, &opts);
1462
1463         if (opts.rfd == ~0 || opts.wfd == ~0) {
1464                 printk(KERN_ERR "v9fs: Insufficient options for proto=fd\n");
1465                 return ERR_PTR(-ENOPROTOOPT);
1466         }
1467
1468         trans = kmalloc(sizeof(struct p9_trans), GFP_KERNEL);
1469         if (!trans)
1470                 return ERR_PTR(-ENOMEM);
1471
1472         trans->rpc = p9_fd_rpc;
1473         trans->close = p9_fd_close;
1474
1475         err = p9_fd_open(trans, opts.rfd, opts.wfd);
1476         if (err < 0)
1477                 goto error;
1478
1479         trans->msize = msize;
1480         trans->extended = extended;
1481         p = (struct p9_trans_fd *) trans->priv;
1482         p->conn = p9_conn_create(trans);
1483         if (IS_ERR(p->conn)) {
1484                 err = PTR_ERR(p->conn);
1485                 p->conn = NULL;
1486                 goto error;
1487         }
1488
1489         return trans;
1490
1491 error:
1492         kfree(trans);
1493         return ERR_PTR(err);
1494 }
1495
1496 static struct p9_trans_module p9_tcp_trans = {
1497         .name = "tcp",
1498         .maxsize = MAX_SOCK_BUF,
1499         .def = 1,
1500         .create = p9_trans_create_tcp,
1501         .owner = THIS_MODULE,
1502 };
1503
1504 static struct p9_trans_module p9_unix_trans = {
1505         .name = "unix",
1506         .maxsize = MAX_SOCK_BUF,
1507         .def = 0,
1508         .create = p9_trans_create_unix,
1509         .owner = THIS_MODULE,
1510 };
1511
1512 static struct p9_trans_module p9_fd_trans = {
1513         .name = "fd",
1514         .maxsize = MAX_SOCK_BUF,
1515         .def = 0,
1516         .create = p9_trans_create_fd,
1517         .owner = THIS_MODULE,
1518 };
1519
1520 int p9_trans_fd_init(void)
1521 {
1522         p9_mux_wq = create_workqueue("v9fs");
1523         if (!p9_mux_wq) {
1524                 printk(KERN_WARNING "v9fs: mux: creating workqueue failed\n");
1525                 return -ENOMEM;
1526         }
1527
1528         p9_poll_task = kthread_run(p9_poll_proc, NULL, "v9fs-poll");
1529         if (IS_ERR(p9_poll_task)) {
1530                 destroy_workqueue(p9_mux_wq);
1531                 printk(KERN_WARNING "v9fs: mux: creating poll task failed\n");
1532                 return PTR_ERR(p9_poll_task);
1533         }
1534
1535         v9fs_register_trans(&p9_tcp_trans);
1536         v9fs_register_trans(&p9_unix_trans);
1537         v9fs_register_trans(&p9_fd_trans);
1538
1539         return 0;
1540 }
1541
1542 void p9_trans_fd_exit(void)
1543 {
1544         kthread_stop(p9_poll_task);
1545         v9fs_unregister_trans(&p9_tcp_trans);
1546         v9fs_unregister_trans(&p9_unix_trans);
1547         v9fs_unregister_trans(&p9_fd_trans);
1548
1549         destroy_workqueue(p9_mux_wq);
1550 }