GNU Linux-libre 4.14.332-gnu1
[releases.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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
29
30 #include <linux/in.h>
31 #include <linux/module.h>
32 #include <linux/net.h>
33 #include <linux/ipv6.h>
34 #include <linux/kthread.h>
35 #include <linux/errno.h>
36 #include <linux/kernel.h>
37 #include <linux/un.h>
38 #include <linux/uaccess.h>
39 #include <linux/inet.h>
40 #include <linux/idr.h>
41 #include <linux/file.h>
42 #include <linux/parser.h>
43 #include <linux/slab.h>
44 #include <linux/seq_file.h>
45 #include <net/9p/9p.h>
46 #include <net/9p/client.h>
47 #include <net/9p/transport.h>
48
49 #include <linux/syscalls.h> /* killme */
50
51 #define P9_PORT 564
52 #define MAX_SOCK_BUF (64*1024)
53 #define MAXPOLLWADDR    2
54
55 static struct p9_trans_module p9_tcp_trans;
56 static struct p9_trans_module p9_fd_trans;
57
58 /**
59  * struct p9_fd_opts - per-transport options
60  * @rfd: file descriptor for reading (trans=fd)
61  * @wfd: file descriptor for writing (trans=fd)
62  * @port: port to connect to (trans=tcp)
63  *
64  */
65
66 struct p9_fd_opts {
67         int rfd;
68         int wfd;
69         u16 port;
70         bool privport;
71 };
72
73 /*
74   * Option Parsing (code inspired by NFS code)
75   *  - a little lazy - parse all fd-transport options
76   */
77
78 enum {
79         /* Options that take integer arguments */
80         Opt_port, Opt_rfdno, Opt_wfdno, Opt_err,
81         /* Options that take no arguments */
82         Opt_privport,
83 };
84
85 static const match_table_t tokens = {
86         {Opt_port, "port=%u"},
87         {Opt_rfdno, "rfdno=%u"},
88         {Opt_wfdno, "wfdno=%u"},
89         {Opt_privport, "privport"},
90         {Opt_err, NULL},
91 };
92
93 enum {
94         Rworksched = 1,         /* read work scheduled or running */
95         Rpending = 2,           /* can read */
96         Wworksched = 4,         /* write work scheduled or running */
97         Wpending = 8,           /* can write */
98 };
99
100 struct p9_poll_wait {
101         struct p9_conn *conn;
102         wait_queue_entry_t wait;
103         wait_queue_head_t *wait_addr;
104 };
105
106 /**
107  * struct p9_conn - fd mux connection state information
108  * @mux_list: list link for mux to manage multiple connections (?)
109  * @client: reference to client instance for this connection
110  * @err: error state
111  * @req_list: accounting for requests which have been sent
112  * @unsent_req_list: accounting for requests that haven't been sent
113  * @req: current request being processed (if any)
114  * @tmp_buf: temporary buffer to read in header
115  * @rc: temporary fcall for reading current frame
116  * @wpos: write position for current frame
117  * @wsize: amount of data to write for current frame
118  * @wbuf: current write buffer
119  * @poll_pending_link: pending links to be polled per conn
120  * @poll_wait: array of wait_q's for various worker threads
121  * @pt: poll state
122  * @rq: current read work
123  * @wq: current write work
124  * @wsched: ????
125  *
126  */
127
128 struct p9_conn {
129         struct list_head mux_list;
130         struct p9_client *client;
131         int err;
132         struct list_head req_list;
133         struct list_head unsent_req_list;
134         struct p9_req_t *req;
135         char tmp_buf[7];
136         struct p9_fcall rc;
137         int wpos;
138         int wsize;
139         char *wbuf;
140         struct list_head poll_pending_link;
141         struct p9_poll_wait poll_wait[MAXPOLLWADDR];
142         poll_table pt;
143         struct work_struct rq;
144         struct work_struct wq;
145         unsigned long wsched;
146 };
147
148 /**
149  * struct p9_trans_fd - transport state
150  * @rd: reference to file to read from
151  * @wr: reference of file to write to
152  * @conn: connection state reference
153  *
154  */
155
156 struct p9_trans_fd {
157         struct file *rd;
158         struct file *wr;
159         struct p9_conn conn;
160 };
161
162 static void p9_poll_workfn(struct work_struct *work);
163
164 static DEFINE_SPINLOCK(p9_poll_lock);
165 static LIST_HEAD(p9_poll_pending_list);
166 static DECLARE_WORK(p9_poll_work, p9_poll_workfn);
167
168 static unsigned int p9_ipport_resv_min = P9_DEF_MIN_RESVPORT;
169 static unsigned int p9_ipport_resv_max = P9_DEF_MAX_RESVPORT;
170
171 static void p9_mux_poll_stop(struct p9_conn *m)
172 {
173         unsigned long flags;
174         int i;
175
176         for (i = 0; i < ARRAY_SIZE(m->poll_wait); i++) {
177                 struct p9_poll_wait *pwait = &m->poll_wait[i];
178
179                 if (pwait->wait_addr) {
180                         remove_wait_queue(pwait->wait_addr, &pwait->wait);
181                         pwait->wait_addr = NULL;
182                 }
183         }
184
185         spin_lock_irqsave(&p9_poll_lock, flags);
186         list_del_init(&m->poll_pending_link);
187         spin_unlock_irqrestore(&p9_poll_lock, flags);
188
189         flush_work(&p9_poll_work);
190 }
191
192 /**
193  * p9_conn_cancel - cancel all pending requests with error
194  * @m: mux data
195  * @err: error code
196  *
197  */
198
199 static void p9_conn_cancel(struct p9_conn *m, int err)
200 {
201         struct p9_req_t *req, *rtmp;
202         LIST_HEAD(cancel_list);
203
204         p9_debug(P9_DEBUG_ERROR, "mux %p err %d\n", m, err);
205
206         spin_lock(&m->client->lock);
207
208         if (m->err) {
209                 spin_unlock(&m->client->lock);
210                 return;
211         }
212
213         m->err = err;
214
215         list_for_each_entry_safe(req, rtmp, &m->req_list, req_list) {
216                 list_move(&req->req_list, &cancel_list);
217                 req->status = REQ_STATUS_ERROR;
218         }
219         list_for_each_entry_safe(req, rtmp, &m->unsent_req_list, req_list) {
220                 list_move(&req->req_list, &cancel_list);
221                 req->status = REQ_STATUS_ERROR;
222         }
223
224         spin_unlock(&m->client->lock);
225
226         list_for_each_entry_safe(req, rtmp, &cancel_list, req_list) {
227                 p9_debug(P9_DEBUG_ERROR, "call back req %p\n", req);
228                 list_del(&req->req_list);
229                 if (!req->t_err)
230                         req->t_err = err;
231                 p9_client_cb(m->client, req, REQ_STATUS_ERROR);
232         }
233 }
234
235 static int
236 p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt)
237 {
238         int ret, n;
239         struct p9_trans_fd *ts = NULL;
240
241         if (client && client->status == Connected)
242                 ts = client->trans;
243
244         if (!ts)
245                 return -EREMOTEIO;
246
247         if (!ts->rd->f_op->poll)
248                 return -EIO;
249
250         if (!ts->wr->f_op->poll)
251                 return -EIO;
252
253         ret = ts->rd->f_op->poll(ts->rd, pt);
254         if (ret < 0)
255                 return ret;
256
257         if (ts->rd != ts->wr) {
258                 n = ts->wr->f_op->poll(ts->wr, pt);
259                 if (n < 0)
260                         return n;
261                 ret = (ret & ~POLLOUT) | (n & ~POLLIN);
262         }
263
264         return ret;
265 }
266
267 /**
268  * p9_fd_read- read from a fd
269  * @client: client instance
270  * @v: buffer to receive data into
271  * @len: size of receive buffer
272  *
273  */
274
275 static int p9_fd_read(struct p9_client *client, void *v, int len)
276 {
277         int ret;
278         struct p9_trans_fd *ts = NULL;
279         loff_t pos;
280
281         if (client && client->status != Disconnected)
282                 ts = client->trans;
283
284         if (!ts)
285                 return -EREMOTEIO;
286
287         if (!(ts->rd->f_flags & O_NONBLOCK))
288                 p9_debug(P9_DEBUG_ERROR, "blocking read ...\n");
289
290         pos = ts->rd->f_pos;
291         ret = kernel_read(ts->rd, v, len, &pos);
292         if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
293                 client->status = Disconnected;
294         return ret;
295 }
296
297 /**
298  * p9_read_work - called when there is some data to be read from a transport
299  * @work: container of work to be done
300  *
301  */
302
303 static void p9_read_work(struct work_struct *work)
304 {
305         int n, err;
306         struct p9_conn *m;
307
308         m = container_of(work, struct p9_conn, rq);
309
310         if (m->err < 0)
311                 return;
312
313         p9_debug(P9_DEBUG_TRANS, "start mux %p pos %zd\n", m, m->rc.offset);
314
315         if (!m->rc.sdata) {
316                 m->rc.sdata = m->tmp_buf;
317                 m->rc.offset = 0;
318                 m->rc.capacity = 7; /* start by reading header */
319         }
320
321         clear_bit(Rpending, &m->wsched);
322         p9_debug(P9_DEBUG_TRANS, "read mux %p pos %zd size: %zd = %zd\n",
323                  m, m->rc.offset, m->rc.capacity,
324                  m->rc.capacity - m->rc.offset);
325         err = p9_fd_read(m->client, m->rc.sdata + m->rc.offset,
326                          m->rc.capacity - m->rc.offset);
327         p9_debug(P9_DEBUG_TRANS, "mux %p got %d bytes\n", m, err);
328         if (err == -EAGAIN)
329                 goto end_clear;
330
331         if (err <= 0)
332                 goto error;
333
334         m->rc.offset += err;
335
336         /* header read in */
337         if ((!m->req) && (m->rc.offset == m->rc.capacity)) {
338                 p9_debug(P9_DEBUG_TRANS, "got new header\n");
339
340                 err = p9_parse_header(&m->rc, NULL, NULL, NULL, 0);
341                 if (err) {
342                         p9_debug(P9_DEBUG_ERROR,
343                                  "error parsing header: %d\n", err);
344                         goto error;
345                 }
346
347                 if (m->rc.size >= m->client->msize) {
348                         p9_debug(P9_DEBUG_ERROR,
349                                  "requested packet size too big: %d\n",
350                                  m->rc.size);
351                         err = -EIO;
352                         goto error;
353                 }
354
355                 p9_debug(P9_DEBUG_TRANS,
356                          "mux %p pkt: size: %d bytes tag: %d\n",
357                          m, m->rc.size, m->rc.tag);
358
359                 m->req = p9_tag_lookup(m->client, m->rc.tag);
360                 if (!m->req || (m->req->status != REQ_STATUS_SENT)) {
361                         p9_debug(P9_DEBUG_ERROR, "Unexpected packet tag %d\n",
362                                  m->rc.tag);
363                         err = -EIO;
364                         goto error;
365                 }
366
367                 if (m->req->rc == NULL) {
368                         p9_debug(P9_DEBUG_ERROR,
369                                  "No recv fcall for tag %d (req %p), disconnecting!\n",
370                                  m->rc.tag, m->req);
371                         m->req = NULL;
372                         err = -EIO;
373                         goto error;
374                 }
375                 m->rc.sdata = (char *)m->req->rc + sizeof(struct p9_fcall);
376                 memcpy(m->rc.sdata, m->tmp_buf, m->rc.capacity);
377                 m->rc.capacity = m->rc.size;
378         }
379
380         /* packet is read in
381          * not an else because some packets (like clunk) have no payload
382          */
383         if ((m->req) && (m->rc.offset == m->rc.capacity)) {
384                 p9_debug(P9_DEBUG_TRANS, "got new packet\n");
385                 spin_lock(&m->client->lock);
386                 if (m->req->status == REQ_STATUS_SENT) {
387                         list_del(&m->req->req_list);
388                         p9_client_cb(m->client, m->req, REQ_STATUS_RCVD);
389                 } else if (m->req->status == REQ_STATUS_FLSHD) {
390                         /* Ignore replies associated with a cancelled request. */
391                         p9_debug(P9_DEBUG_TRANS,
392                                  "Ignore replies associated with a cancelled request\n");
393                 } else {
394                         spin_unlock(&m->client->lock);
395                         p9_debug(P9_DEBUG_ERROR,
396                                  "Request tag %d errored out while we were reading the reply\n",
397                                  m->rc.tag);
398                         err = -EIO;
399                         goto error;
400                 }
401                 spin_unlock(&m->client->lock);
402                 m->rc.sdata = NULL;
403                 m->rc.offset = 0;
404                 m->rc.capacity = 0;
405                 m->req = NULL;
406         }
407
408 end_clear:
409         clear_bit(Rworksched, &m->wsched);
410
411         if (!list_empty(&m->req_list)) {
412                 if (test_and_clear_bit(Rpending, &m->wsched))
413                         n = POLLIN;
414                 else
415                         n = p9_fd_poll(m->client, NULL);
416
417                 if ((n & POLLIN) && !test_and_set_bit(Rworksched, &m->wsched)) {
418                         p9_debug(P9_DEBUG_TRANS, "sched read work %p\n", m);
419                         schedule_work(&m->rq);
420                 }
421         }
422
423         return;
424 error:
425         p9_conn_cancel(m, err);
426         clear_bit(Rworksched, &m->wsched);
427 }
428
429 /**
430  * p9_fd_write - write to a socket
431  * @client: client instance
432  * @v: buffer to send data from
433  * @len: size of send buffer
434  *
435  */
436
437 static int p9_fd_write(struct p9_client *client, void *v, int len)
438 {
439         ssize_t ret;
440         struct p9_trans_fd *ts = NULL;
441
442         if (client && client->status != Disconnected)
443                 ts = client->trans;
444
445         if (!ts)
446                 return -EREMOTEIO;
447
448         if (!(ts->wr->f_flags & O_NONBLOCK))
449                 p9_debug(P9_DEBUG_ERROR, "blocking write ...\n");
450
451         ret = kernel_write(ts->wr, v, len, &ts->wr->f_pos);
452         if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN)
453                 client->status = Disconnected;
454         return ret;
455 }
456
457 /**
458  * p9_write_work - called when a transport can send some data
459  * @work: container for work to be done
460  *
461  */
462
463 static void p9_write_work(struct work_struct *work)
464 {
465         int n, err;
466         struct p9_conn *m;
467         struct p9_req_t *req;
468
469         m = container_of(work, struct p9_conn, wq);
470
471         if (m->err < 0) {
472                 clear_bit(Wworksched, &m->wsched);
473                 return;
474         }
475
476         if (!m->wsize) {
477                 spin_lock(&m->client->lock);
478                 if (list_empty(&m->unsent_req_list)) {
479                         clear_bit(Wworksched, &m->wsched);
480                         spin_unlock(&m->client->lock);
481                         return;
482                 }
483
484                 req = list_entry(m->unsent_req_list.next, struct p9_req_t,
485                                req_list);
486                 req->status = REQ_STATUS_SENT;
487                 p9_debug(P9_DEBUG_TRANS, "move req %p\n", req);
488                 list_move_tail(&req->req_list, &m->req_list);
489
490                 m->wbuf = req->tc->sdata;
491                 m->wsize = req->tc->size;
492                 m->wpos = 0;
493                 spin_unlock(&m->client->lock);
494         }
495
496         p9_debug(P9_DEBUG_TRANS, "mux %p pos %d size %d\n",
497                  m, m->wpos, m->wsize);
498         clear_bit(Wpending, &m->wsched);
499         err = p9_fd_write(m->client, m->wbuf + m->wpos, m->wsize - m->wpos);
500         p9_debug(P9_DEBUG_TRANS, "mux %p sent %d bytes\n", m, err);
501         if (err == -EAGAIN)
502                 goto end_clear;
503
504
505         if (err < 0)
506                 goto error;
507         else if (err == 0) {
508                 err = -EREMOTEIO;
509                 goto error;
510         }
511
512         m->wpos += err;
513         if (m->wpos == m->wsize)
514                 m->wpos = m->wsize = 0;
515
516 end_clear:
517         clear_bit(Wworksched, &m->wsched);
518
519         if (m->wsize || !list_empty(&m->unsent_req_list)) {
520                 if (test_and_clear_bit(Wpending, &m->wsched))
521                         n = POLLOUT;
522                 else
523                         n = p9_fd_poll(m->client, NULL);
524
525                 if ((n & POLLOUT) &&
526                    !test_and_set_bit(Wworksched, &m->wsched)) {
527                         p9_debug(P9_DEBUG_TRANS, "sched write work %p\n", m);
528                         schedule_work(&m->wq);
529                 }
530         }
531
532         return;
533
534 error:
535         p9_conn_cancel(m, err);
536         clear_bit(Wworksched, &m->wsched);
537 }
538
539 static int p9_pollwake(wait_queue_entry_t *wait, unsigned int mode, int sync, void *key)
540 {
541         struct p9_poll_wait *pwait =
542                 container_of(wait, struct p9_poll_wait, wait);
543         struct p9_conn *m = pwait->conn;
544         unsigned long flags;
545
546         spin_lock_irqsave(&p9_poll_lock, flags);
547         if (list_empty(&m->poll_pending_link))
548                 list_add_tail(&m->poll_pending_link, &p9_poll_pending_list);
549         spin_unlock_irqrestore(&p9_poll_lock, flags);
550
551         schedule_work(&p9_poll_work);
552         return 1;
553 }
554
555 /**
556  * p9_pollwait - add poll task to the wait queue
557  * @filp: file pointer being polled
558  * @wait_address: wait_q to block on
559  * @p: poll state
560  *
561  * called by files poll operation to add v9fs-poll task to files wait queue
562  */
563
564 static void
565 p9_pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p)
566 {
567         struct p9_conn *m = container_of(p, struct p9_conn, pt);
568         struct p9_poll_wait *pwait = NULL;
569         int i;
570
571         for (i = 0; i < ARRAY_SIZE(m->poll_wait); i++) {
572                 if (m->poll_wait[i].wait_addr == NULL) {
573                         pwait = &m->poll_wait[i];
574                         break;
575                 }
576         }
577
578         if (!pwait) {
579                 p9_debug(P9_DEBUG_ERROR, "not enough wait_address slots\n");
580                 return;
581         }
582
583         pwait->conn = m;
584         pwait->wait_addr = wait_address;
585         init_waitqueue_func_entry(&pwait->wait, p9_pollwake);
586         add_wait_queue(wait_address, &pwait->wait);
587 }
588
589 /**
590  * p9_conn_create - initialize the per-session mux data
591  * @client: client instance
592  *
593  * Note: Creates the polling task if this is the first session.
594  */
595
596 static void p9_conn_create(struct p9_client *client)
597 {
598         int n;
599         struct p9_trans_fd *ts = client->trans;
600         struct p9_conn *m = &ts->conn;
601
602         p9_debug(P9_DEBUG_TRANS, "client %p msize %d\n", client, client->msize);
603
604         INIT_LIST_HEAD(&m->mux_list);
605         m->client = client;
606
607         INIT_LIST_HEAD(&m->req_list);
608         INIT_LIST_HEAD(&m->unsent_req_list);
609         INIT_WORK(&m->rq, p9_read_work);
610         INIT_WORK(&m->wq, p9_write_work);
611         INIT_LIST_HEAD(&m->poll_pending_link);
612         init_poll_funcptr(&m->pt, p9_pollwait);
613
614         n = p9_fd_poll(client, &m->pt);
615         if (n & POLLIN) {
616                 p9_debug(P9_DEBUG_TRANS, "mux %p can read\n", m);
617                 set_bit(Rpending, &m->wsched);
618         }
619
620         if (n & POLLOUT) {
621                 p9_debug(P9_DEBUG_TRANS, "mux %p can write\n", m);
622                 set_bit(Wpending, &m->wsched);
623         }
624 }
625
626 /**
627  * p9_poll_mux - polls a mux and schedules read or write works if necessary
628  * @m: connection to poll
629  *
630  */
631
632 static void p9_poll_mux(struct p9_conn *m)
633 {
634         int n;
635
636         if (m->err < 0)
637                 return;
638
639         n = p9_fd_poll(m->client, NULL);
640         if (n < 0 || n & (POLLERR | POLLHUP | POLLNVAL)) {
641                 p9_debug(P9_DEBUG_TRANS, "error mux %p err %d\n", m, n);
642                 if (n >= 0)
643                         n = -ECONNRESET;
644                 p9_conn_cancel(m, n);
645         }
646
647         if (n & POLLIN) {
648                 set_bit(Rpending, &m->wsched);
649                 p9_debug(P9_DEBUG_TRANS, "mux %p can read\n", m);
650                 if (!test_and_set_bit(Rworksched, &m->wsched)) {
651                         p9_debug(P9_DEBUG_TRANS, "sched read work %p\n", m);
652                         schedule_work(&m->rq);
653                 }
654         }
655
656         if (n & POLLOUT) {
657                 set_bit(Wpending, &m->wsched);
658                 p9_debug(P9_DEBUG_TRANS, "mux %p can write\n", m);
659                 if ((m->wsize || !list_empty(&m->unsent_req_list)) &&
660                     !test_and_set_bit(Wworksched, &m->wsched)) {
661                         p9_debug(P9_DEBUG_TRANS, "sched write work %p\n", m);
662                         schedule_work(&m->wq);
663                 }
664         }
665 }
666
667 /**
668  * p9_fd_request - send 9P request
669  * The function can sleep until the request is scheduled for sending.
670  * The function can be interrupted. Return from the function is not
671  * a guarantee that the request is sent successfully.
672  *
673  * @client: client instance
674  * @req: request to be sent
675  *
676  */
677
678 static int p9_fd_request(struct p9_client *client, struct p9_req_t *req)
679 {
680         int n;
681         struct p9_trans_fd *ts = client->trans;
682         struct p9_conn *m = &ts->conn;
683
684         p9_debug(P9_DEBUG_TRANS, "mux %p task %p tcall %p id %d\n",
685                  m, current, req->tc, req->tc->id);
686         if (m->err < 0)
687                 return m->err;
688
689         spin_lock(&client->lock);
690         req->status = REQ_STATUS_UNSENT;
691         list_add_tail(&req->req_list, &m->unsent_req_list);
692         spin_unlock(&client->lock);
693
694         if (test_and_clear_bit(Wpending, &m->wsched))
695                 n = POLLOUT;
696         else
697                 n = p9_fd_poll(m->client, NULL);
698
699         if (n & POLLOUT && !test_and_set_bit(Wworksched, &m->wsched))
700                 schedule_work(&m->wq);
701
702         return 0;
703 }
704
705 static int p9_fd_cancel(struct p9_client *client, struct p9_req_t *req)
706 {
707         int ret = 1;
708
709         p9_debug(P9_DEBUG_TRANS, "client %p req %p\n", client, req);
710
711         spin_lock(&client->lock);
712
713         if (req->status == REQ_STATUS_UNSENT) {
714                 list_del(&req->req_list);
715                 req->status = REQ_STATUS_FLSHD;
716                 ret = 0;
717         }
718         spin_unlock(&client->lock);
719
720         return ret;
721 }
722
723 static int p9_fd_cancelled(struct p9_client *client, struct p9_req_t *req)
724 {
725         p9_debug(P9_DEBUG_TRANS, "client %p req %p\n", client, req);
726
727         spin_lock(&client->lock);
728         /* Ignore cancelled request if message has been received
729          * before lock.
730          */
731         if (req->status == REQ_STATUS_RCVD) {
732                 spin_unlock(&client->lock);
733                 return 0;
734         }
735
736         /* we haven't received a response for oldreq,
737          * remove it from the list.
738          */
739         list_del(&req->req_list);
740         req->status = REQ_STATUS_FLSHD;
741         spin_unlock(&client->lock);
742
743         return 0;
744 }
745
746 static int p9_fd_show_options(struct seq_file *m, struct p9_client *clnt)
747 {
748         if (clnt->trans_mod == &p9_tcp_trans) {
749                 if (clnt->trans_opts.tcp.port != P9_PORT)
750                         seq_printf(m, ",port=%u", clnt->trans_opts.tcp.port);
751         } else if (clnt->trans_mod == &p9_fd_trans) {
752                 if (clnt->trans_opts.fd.rfd != ~0)
753                         seq_printf(m, ",rfd=%u", clnt->trans_opts.fd.rfd);
754                 if (clnt->trans_opts.fd.wfd != ~0)
755                         seq_printf(m, ",wfd=%u", clnt->trans_opts.fd.wfd);
756         }
757         return 0;
758 }
759
760 /**
761  * parse_opts - parse mount options into p9_fd_opts structure
762  * @params: options string passed from mount
763  * @opts: fd transport-specific structure to parse options into
764  *
765  * Returns 0 upon success, -ERRNO upon failure
766  */
767
768 static int parse_opts(char *params, struct p9_fd_opts *opts)
769 {
770         char *p;
771         substring_t args[MAX_OPT_ARGS];
772         int option;
773         char *options, *tmp_options;
774
775         opts->port = P9_PORT;
776         opts->rfd = ~0;
777         opts->wfd = ~0;
778         opts->privport = false;
779
780         if (!params)
781                 return 0;
782
783         tmp_options = kstrdup(params, GFP_KERNEL);
784         if (!tmp_options) {
785                 p9_debug(P9_DEBUG_ERROR,
786                          "failed to allocate copy of option string\n");
787                 return -ENOMEM;
788         }
789         options = tmp_options;
790
791         while ((p = strsep(&options, ",")) != NULL) {
792                 int token;
793                 int r;
794                 if (!*p)
795                         continue;
796                 token = match_token(p, tokens, args);
797                 if ((token != Opt_err) && (token != Opt_privport)) {
798                         r = match_int(&args[0], &option);
799                         if (r < 0) {
800                                 p9_debug(P9_DEBUG_ERROR,
801                                          "integer field, but no integer?\n");
802                                 continue;
803                         }
804                 }
805                 switch (token) {
806                 case Opt_port:
807                         opts->port = option;
808                         break;
809                 case Opt_rfdno:
810                         opts->rfd = option;
811                         break;
812                 case Opt_wfdno:
813                         opts->wfd = option;
814                         break;
815                 case Opt_privport:
816                         opts->privport = true;
817                         break;
818                 default:
819                         continue;
820                 }
821         }
822
823         kfree(tmp_options);
824         return 0;
825 }
826
827 static int p9_fd_open(struct p9_client *client, int rfd, int wfd)
828 {
829         struct p9_trans_fd *ts = kzalloc(sizeof(struct p9_trans_fd),
830                                            GFP_KERNEL);
831         if (!ts)
832                 return -ENOMEM;
833
834         ts->rd = fget(rfd);
835         if (!ts->rd)
836                 goto out_free_ts;
837         if (!(ts->rd->f_mode & FMODE_READ))
838                 goto out_put_rd;
839         /* prevent workers from hanging on IO when fd is a pipe */
840         ts->rd->f_flags |= O_NONBLOCK;
841         ts->wr = fget(wfd);
842         if (!ts->wr)
843                 goto out_put_rd;
844         if (!(ts->wr->f_mode & FMODE_WRITE))
845                 goto out_put_wr;
846         ts->wr->f_flags |= O_NONBLOCK;
847
848         client->trans = ts;
849         client->status = Connected;
850
851         return 0;
852
853 out_put_wr:
854         fput(ts->wr);
855 out_put_rd:
856         fput(ts->rd);
857 out_free_ts:
858         kfree(ts);
859         return -EIO;
860 }
861
862 static int p9_socket_open(struct p9_client *client, struct socket *csocket)
863 {
864         struct p9_trans_fd *p;
865         struct file *file;
866
867         p = kzalloc(sizeof(struct p9_trans_fd), GFP_KERNEL);
868         if (!p) {
869                 sock_release(csocket);
870                 return -ENOMEM;
871         }
872
873         csocket->sk->sk_allocation = GFP_NOIO;
874         file = sock_alloc_file(csocket, 0, NULL);
875         if (IS_ERR(file)) {
876                 pr_err("%s (%d): failed to map fd\n",
877                        __func__, task_pid_nr(current));
878                 sock_release(csocket);
879                 kfree(p);
880                 return PTR_ERR(file);
881         }
882
883         get_file(file);
884         p->wr = p->rd = file;
885         client->trans = p;
886         client->status = Connected;
887
888         p->rd->f_flags |= O_NONBLOCK;
889
890         p9_conn_create(client);
891         return 0;
892 }
893
894 /**
895  * p9_mux_destroy - cancels all pending requests of mux
896  * @m: mux to destroy
897  *
898  */
899
900 static void p9_conn_destroy(struct p9_conn *m)
901 {
902         p9_debug(P9_DEBUG_TRANS, "mux %p prev %p next %p\n",
903                  m, m->mux_list.prev, m->mux_list.next);
904
905         p9_mux_poll_stop(m);
906         cancel_work_sync(&m->rq);
907         cancel_work_sync(&m->wq);
908
909         p9_conn_cancel(m, -ECONNRESET);
910
911         m->client = NULL;
912 }
913
914 /**
915  * p9_fd_close - shutdown file descriptor transport
916  * @client: client instance
917  *
918  */
919
920 static void p9_fd_close(struct p9_client *client)
921 {
922         struct p9_trans_fd *ts;
923
924         if (!client)
925                 return;
926
927         ts = client->trans;
928         if (!ts)
929                 return;
930
931         client->status = Disconnected;
932
933         p9_conn_destroy(&ts->conn);
934
935         if (ts->rd)
936                 fput(ts->rd);
937         if (ts->wr)
938                 fput(ts->wr);
939
940         kfree(ts);
941 }
942
943 /*
944  * stolen from NFS - maybe should be made a generic function?
945  */
946 static inline int valid_ipaddr4(const char *buf)
947 {
948         int rc, count, in[4];
949
950         rc = sscanf(buf, "%d.%d.%d.%d", &in[0], &in[1], &in[2], &in[3]);
951         if (rc != 4)
952                 return -EINVAL;
953         for (count = 0; count < 4; count++) {
954                 if (in[count] > 255)
955                         return -EINVAL;
956         }
957         return 0;
958 }
959
960 static int p9_bind_privport(struct socket *sock)
961 {
962         struct sockaddr_in cl;
963         int port, err = -EINVAL;
964
965         memset(&cl, 0, sizeof(cl));
966         cl.sin_family = AF_INET;
967         cl.sin_addr.s_addr = INADDR_ANY;
968         for (port = p9_ipport_resv_max; port >= p9_ipport_resv_min; port--) {
969                 cl.sin_port = htons((ushort)port);
970                 err = kernel_bind(sock, (struct sockaddr *)&cl, sizeof(cl));
971                 if (err != -EADDRINUSE)
972                         break;
973         }
974         return err;
975 }
976
977
978 static int
979 p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args)
980 {
981         int err;
982         struct socket *csocket;
983         struct sockaddr_in sin_server;
984         struct p9_fd_opts opts;
985
986         err = parse_opts(args, &opts);
987         if (err < 0)
988                 return err;
989
990         if (addr == NULL || valid_ipaddr4(addr) < 0)
991                 return -EINVAL;
992
993         csocket = NULL;
994
995         client->trans_opts.tcp.port = opts.port;
996         client->trans_opts.tcp.privport = opts.privport;
997         sin_server.sin_family = AF_INET;
998         sin_server.sin_addr.s_addr = in_aton(addr);
999         sin_server.sin_port = htons(opts.port);
1000         err = __sock_create(current->nsproxy->net_ns, PF_INET,
1001                             SOCK_STREAM, IPPROTO_TCP, &csocket, 1);
1002         if (err) {
1003                 pr_err("%s (%d): problem creating socket\n",
1004                        __func__, task_pid_nr(current));
1005                 return err;
1006         }
1007
1008         if (opts.privport) {
1009                 err = p9_bind_privport(csocket);
1010                 if (err < 0) {
1011                         pr_err("%s (%d): problem binding to privport\n",
1012                                __func__, task_pid_nr(current));
1013                         sock_release(csocket);
1014                         return err;
1015                 }
1016         }
1017
1018         err = csocket->ops->connect(csocket,
1019                                     (struct sockaddr *)&sin_server,
1020                                     sizeof(struct sockaddr_in), 0);
1021         if (err < 0) {
1022                 pr_err("%s (%d): problem connecting socket to %s\n",
1023                        __func__, task_pid_nr(current), addr);
1024                 sock_release(csocket);
1025                 return err;
1026         }
1027
1028         return p9_socket_open(client, csocket);
1029 }
1030
1031 static int
1032 p9_fd_create_unix(struct p9_client *client, const char *addr, char *args)
1033 {
1034         int err;
1035         struct socket *csocket;
1036         struct sockaddr_un sun_server;
1037
1038         csocket = NULL;
1039
1040         if (!addr || !strlen(addr))
1041                 return -EINVAL;
1042
1043         if (strlen(addr) >= UNIX_PATH_MAX) {
1044                 pr_err("%s (%d): address too long: %s\n",
1045                        __func__, task_pid_nr(current), addr);
1046                 return -ENAMETOOLONG;
1047         }
1048
1049         sun_server.sun_family = PF_UNIX;
1050         strcpy(sun_server.sun_path, addr);
1051         err = __sock_create(current->nsproxy->net_ns, PF_UNIX,
1052                             SOCK_STREAM, 0, &csocket, 1);
1053         if (err < 0) {
1054                 pr_err("%s (%d): problem creating socket\n",
1055                        __func__, task_pid_nr(current));
1056
1057                 return err;
1058         }
1059         err = csocket->ops->connect(csocket, (struct sockaddr *)&sun_server,
1060                         sizeof(struct sockaddr_un) - 1, 0);
1061         if (err < 0) {
1062                 pr_err("%s (%d): problem connecting socket: %s: %d\n",
1063                        __func__, task_pid_nr(current), addr, err);
1064                 sock_release(csocket);
1065                 return err;
1066         }
1067
1068         return p9_socket_open(client, csocket);
1069 }
1070
1071 static int
1072 p9_fd_create(struct p9_client *client, const char *addr, char *args)
1073 {
1074         int err;
1075         struct p9_fd_opts opts;
1076
1077         parse_opts(args, &opts);
1078         client->trans_opts.fd.rfd = opts.rfd;
1079         client->trans_opts.fd.wfd = opts.wfd;
1080
1081         if (opts.rfd == ~0 || opts.wfd == ~0) {
1082                 pr_err("Insufficient options for proto=fd\n");
1083                 return -ENOPROTOOPT;
1084         }
1085
1086         err = p9_fd_open(client, opts.rfd, opts.wfd);
1087         if (err < 0)
1088                 return err;
1089
1090         p9_conn_create(client);
1091
1092         return 0;
1093 }
1094
1095 static struct p9_trans_module p9_tcp_trans = {
1096         .name = "tcp",
1097         .maxsize = MAX_SOCK_BUF,
1098         .def = 0,
1099         .create = p9_fd_create_tcp,
1100         .close = p9_fd_close,
1101         .request = p9_fd_request,
1102         .cancel = p9_fd_cancel,
1103         .cancelled = p9_fd_cancelled,
1104         .show_options = p9_fd_show_options,
1105         .owner = THIS_MODULE,
1106 };
1107
1108 static struct p9_trans_module p9_unix_trans = {
1109         .name = "unix",
1110         .maxsize = MAX_SOCK_BUF,
1111         .def = 0,
1112         .create = p9_fd_create_unix,
1113         .close = p9_fd_close,
1114         .request = p9_fd_request,
1115         .cancel = p9_fd_cancel,
1116         .cancelled = p9_fd_cancelled,
1117         .show_options = p9_fd_show_options,
1118         .owner = THIS_MODULE,
1119 };
1120
1121 static struct p9_trans_module p9_fd_trans = {
1122         .name = "fd",
1123         .maxsize = MAX_SOCK_BUF,
1124         .def = 0,
1125         .create = p9_fd_create,
1126         .close = p9_fd_close,
1127         .request = p9_fd_request,
1128         .cancel = p9_fd_cancel,
1129         .cancelled = p9_fd_cancelled,
1130         .show_options = p9_fd_show_options,
1131         .owner = THIS_MODULE,
1132 };
1133
1134 /**
1135  * p9_poll_proc - poll worker thread
1136  * @a: thread state and arguments
1137  *
1138  * polls all v9fs transports for new events and queues the appropriate
1139  * work to the work queue
1140  *
1141  */
1142
1143 static void p9_poll_workfn(struct work_struct *work)
1144 {
1145         unsigned long flags;
1146
1147         p9_debug(P9_DEBUG_TRANS, "start %p\n", current);
1148
1149         spin_lock_irqsave(&p9_poll_lock, flags);
1150         while (!list_empty(&p9_poll_pending_list)) {
1151                 struct p9_conn *conn = list_first_entry(&p9_poll_pending_list,
1152                                                         struct p9_conn,
1153                                                         poll_pending_link);
1154                 list_del_init(&conn->poll_pending_link);
1155                 spin_unlock_irqrestore(&p9_poll_lock, flags);
1156
1157                 p9_poll_mux(conn);
1158
1159                 spin_lock_irqsave(&p9_poll_lock, flags);
1160         }
1161         spin_unlock_irqrestore(&p9_poll_lock, flags);
1162
1163         p9_debug(P9_DEBUG_TRANS, "finish\n");
1164 }
1165
1166 int p9_trans_fd_init(void)
1167 {
1168         v9fs_register_trans(&p9_tcp_trans);
1169         v9fs_register_trans(&p9_unix_trans);
1170         v9fs_register_trans(&p9_fd_trans);
1171
1172         return 0;
1173 }
1174
1175 void p9_trans_fd_exit(void)
1176 {
1177         flush_work(&p9_poll_work);
1178         v9fs_unregister_trans(&p9_tcp_trans);
1179         v9fs_unregister_trans(&p9_unix_trans);
1180         v9fs_unregister_trans(&p9_fd_trans);
1181 }