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