Merge remote-tracking branch 'stable/linux-5.15.y' into rpi-5.15.y
[platform/kernel/linux-rpi.git] / net / 9p / client.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * net/9p/clnt.c
4  *
5  * 9P Client
6  *
7  *  Copyright (C) 2008 by Eric Van Hensbergen <ericvh@gmail.com>
8  *  Copyright (C) 2007 by Latchesar Ionkov <lucho@ionkov.net>
9  */
10
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12
13 #include <linux/module.h>
14 #include <linux/errno.h>
15 #include <linux/fs.h>
16 #include <linux/poll.h>
17 #include <linux/idr.h>
18 #include <linux/mutex.h>
19 #include <linux/slab.h>
20 #include <linux/sched/signal.h>
21 #include <linux/uaccess.h>
22 #include <linux/uio.h>
23 #include <net/9p/9p.h>
24 #include <linux/parser.h>
25 #include <linux/seq_file.h>
26 #include <net/9p/client.h>
27 #include <net/9p/transport.h>
28 #include "protocol.h"
29
30 #define CREATE_TRACE_POINTS
31 #include <trace/events/9p.h>
32
33 #define DEFAULT_MSIZE (128 * 1024)
34
35 /* Client Option Parsing (code inspired by NFS code)
36  *  - a little lazy - parse all client options
37  */
38
39 enum {
40         Opt_msize,
41         Opt_trans,
42         Opt_legacy,
43         Opt_version,
44         Opt_err,
45 };
46
47 static const match_table_t tokens = {
48         {Opt_msize, "msize=%u"},
49         {Opt_legacy, "noextend"},
50         {Opt_trans, "trans=%s"},
51         {Opt_version, "version=%s"},
52         {Opt_err, NULL},
53 };
54
55 inline int p9_is_proto_dotl(struct p9_client *clnt)
56 {
57         return clnt->proto_version == p9_proto_2000L;
58 }
59 EXPORT_SYMBOL(p9_is_proto_dotl);
60
61 inline int p9_is_proto_dotu(struct p9_client *clnt)
62 {
63         return clnt->proto_version == p9_proto_2000u;
64 }
65 EXPORT_SYMBOL(p9_is_proto_dotu);
66
67 int p9_show_client_options(struct seq_file *m, struct p9_client *clnt)
68 {
69         if (clnt->msize != DEFAULT_MSIZE)
70                 seq_printf(m, ",msize=%u", clnt->msize);
71         seq_printf(m, ",trans=%s", clnt->trans_mod->name);
72
73         switch (clnt->proto_version) {
74         case p9_proto_legacy:
75                 seq_puts(m, ",noextend");
76                 break;
77         case p9_proto_2000u:
78                 seq_puts(m, ",version=9p2000.u");
79                 break;
80         case p9_proto_2000L:
81                 /* Default */
82                 break;
83         }
84
85         if (clnt->trans_mod->show_options)
86                 return clnt->trans_mod->show_options(m, clnt);
87         return 0;
88 }
89 EXPORT_SYMBOL(p9_show_client_options);
90
91 /* Some error codes are taken directly from the server replies,
92  * make sure they are valid.
93  */
94 static int safe_errno(int err)
95 {
96         if (err > 0 || err < -MAX_ERRNO) {
97                 p9_debug(P9_DEBUG_ERROR, "Invalid error code %d\n", err);
98                 return -EPROTO;
99         }
100         return err;
101 }
102
103 /* Interpret mount option for protocol version */
104 static int get_protocol_version(char *s)
105 {
106         int version = -EINVAL;
107
108         if (!strcmp(s, "9p2000")) {
109                 version = p9_proto_legacy;
110                 p9_debug(P9_DEBUG_9P, "Protocol version: Legacy\n");
111         } else if (!strcmp(s, "9p2000.u")) {
112                 version = p9_proto_2000u;
113                 p9_debug(P9_DEBUG_9P, "Protocol version: 9P2000.u\n");
114         } else if (!strcmp(s, "9p2000.L")) {
115                 version = p9_proto_2000L;
116                 p9_debug(P9_DEBUG_9P, "Protocol version: 9P2000.L\n");
117         } else {
118                 pr_info("Unknown protocol version %s\n", s);
119         }
120
121         return version;
122 }
123
124 /**
125  * parse_opts - parse mount options into client structure
126  * @opts: options string passed from mount
127  * @clnt: existing v9fs client information
128  *
129  * Return 0 upon success, -ERRNO upon failure
130  */
131
132 static int parse_opts(char *opts, struct p9_client *clnt)
133 {
134         char *options, *tmp_options;
135         char *p;
136         substring_t args[MAX_OPT_ARGS];
137         int option;
138         char *s;
139         int ret = 0;
140
141         clnt->proto_version = p9_proto_2000L;
142         clnt->msize = DEFAULT_MSIZE;
143
144         if (!opts)
145                 return 0;
146
147         tmp_options = kstrdup(opts, GFP_KERNEL);
148         if (!tmp_options)
149                 return -ENOMEM;
150         options = tmp_options;
151
152         while ((p = strsep(&options, ",")) != NULL) {
153                 int token, r;
154
155                 if (!*p)
156                         continue;
157                 token = match_token(p, tokens, args);
158                 switch (token) {
159                 case Opt_msize:
160                         r = match_int(&args[0], &option);
161                         if (r < 0) {
162                                 p9_debug(P9_DEBUG_ERROR,
163                                          "integer field, but no integer?\n");
164                                 ret = r;
165                                 continue;
166                         }
167                         if (option < 4096) {
168                                 p9_debug(P9_DEBUG_ERROR,
169                                          "msize should be at least 4k\n");
170                                 ret = -EINVAL;
171                                 continue;
172                         }
173                         clnt->msize = option;
174                         break;
175                 case Opt_trans:
176                         s = match_strdup(&args[0]);
177                         if (!s) {
178                                 ret = -ENOMEM;
179                                 p9_debug(P9_DEBUG_ERROR,
180                                          "problem allocating copy of trans arg\n");
181                                 goto free_and_return;
182                         }
183
184                         v9fs_put_trans(clnt->trans_mod);
185                         clnt->trans_mod = v9fs_get_trans_by_name(s);
186                         if (!clnt->trans_mod) {
187                                 pr_info("Could not find request transport: %s\n",
188                                         s);
189                                 ret = -EINVAL;
190                         }
191                         kfree(s);
192                         break;
193                 case Opt_legacy:
194                         clnt->proto_version = p9_proto_legacy;
195                         break;
196                 case Opt_version:
197                         s = match_strdup(&args[0]);
198                         if (!s) {
199                                 ret = -ENOMEM;
200                                 p9_debug(P9_DEBUG_ERROR,
201                                          "problem allocating copy of version arg\n");
202                                 goto free_and_return;
203                         }
204                         r = get_protocol_version(s);
205                         if (r < 0)
206                                 ret = r;
207                         else
208                                 clnt->proto_version = r;
209                         kfree(s);
210                         break;
211                 default:
212                         continue;
213                 }
214         }
215
216 free_and_return:
217         if (ret)
218                 v9fs_put_trans(clnt->trans_mod);
219         kfree(tmp_options);
220         return ret;
221 }
222
223 static int p9_fcall_init(struct p9_client *c, struct p9_fcall *fc,
224                          int alloc_msize)
225 {
226         if (likely(c->fcall_cache) && alloc_msize == c->msize) {
227                 fc->sdata = kmem_cache_alloc(c->fcall_cache, GFP_NOFS);
228                 fc->cache = c->fcall_cache;
229         } else {
230                 fc->sdata = kmalloc(alloc_msize, GFP_NOFS);
231                 fc->cache = NULL;
232         }
233         if (!fc->sdata)
234                 return -ENOMEM;
235         fc->capacity = alloc_msize;
236         return 0;
237 }
238
239 void p9_fcall_fini(struct p9_fcall *fc)
240 {
241         /* sdata can be NULL for interrupted requests in trans_rdma,
242          * and kmem_cache_free does not do NULL-check for us
243          */
244         if (unlikely(!fc->sdata))
245                 return;
246
247         if (fc->cache)
248                 kmem_cache_free(fc->cache, fc->sdata);
249         else
250                 kfree(fc->sdata);
251 }
252 EXPORT_SYMBOL(p9_fcall_fini);
253
254 static struct kmem_cache *p9_req_cache;
255
256 /**
257  * p9_tag_alloc - Allocate a new request.
258  * @c: Client session.
259  * @type: Transaction type.
260  * @max_size: Maximum packet size for this request.
261  *
262  * Context: Process context.
263  * Return: Pointer to new request.
264  */
265 static struct p9_req_t *
266 p9_tag_alloc(struct p9_client *c, int8_t type, unsigned int max_size)
267 {
268         struct p9_req_t *req = kmem_cache_alloc(p9_req_cache, GFP_NOFS);
269         int alloc_msize = min(c->msize, max_size);
270         int tag;
271
272         if (!req)
273                 return ERR_PTR(-ENOMEM);
274
275         if (p9_fcall_init(c, &req->tc, alloc_msize))
276                 goto free_req;
277         if (p9_fcall_init(c, &req->rc, alloc_msize))
278                 goto free;
279
280         p9pdu_reset(&req->tc);
281         p9pdu_reset(&req->rc);
282         req->t_err = 0;
283         req->status = REQ_STATUS_ALLOC;
284         init_waitqueue_head(&req->wq);
285         INIT_LIST_HEAD(&req->req_list);
286
287         idr_preload(GFP_NOFS);
288         spin_lock_irq(&c->lock);
289         if (type == P9_TVERSION)
290                 tag = idr_alloc(&c->reqs, req, P9_NOTAG, P9_NOTAG + 1,
291                                 GFP_NOWAIT);
292         else
293                 tag = idr_alloc(&c->reqs, req, 0, P9_NOTAG, GFP_NOWAIT);
294         req->tc.tag = tag;
295         spin_unlock_irq(&c->lock);
296         idr_preload_end();
297         if (tag < 0)
298                 goto free;
299
300         /* Init ref to two because in the general case there is one ref
301          * that is put asynchronously by a writer thread, one ref
302          * temporarily given by p9_tag_lookup and put by p9_client_cb
303          * in the recv thread, and one ref put by p9_tag_remove in the
304          * main thread. The only exception is virtio that does not use
305          * p9_tag_lookup but does not have a writer thread either
306          * (the write happens synchronously in the request/zc_request
307          * callback), so p9_client_cb eats the second ref there
308          * as the pointer is duplicated directly by virtqueue_add_sgs()
309          */
310         refcount_set(&req->refcount, 2);
311
312         return req;
313
314 free:
315         p9_fcall_fini(&req->tc);
316         p9_fcall_fini(&req->rc);
317 free_req:
318         kmem_cache_free(p9_req_cache, req);
319         return ERR_PTR(-ENOMEM);
320 }
321
322 /**
323  * p9_tag_lookup - Look up a request by tag.
324  * @c: Client session.
325  * @tag: Transaction ID.
326  *
327  * Context: Any context.
328  * Return: A request, or %NULL if there is no request with that tag.
329  */
330 struct p9_req_t *p9_tag_lookup(struct p9_client *c, u16 tag)
331 {
332         struct p9_req_t *req;
333
334         rcu_read_lock();
335 again:
336         req = idr_find(&c->reqs, tag);
337         if (req) {
338                 /* We have to be careful with the req found under rcu_read_lock
339                  * Thanks to SLAB_TYPESAFE_BY_RCU we can safely try to get the
340                  * ref again without corrupting other data, then check again
341                  * that the tag matches once we have the ref
342                  */
343                 if (!p9_req_try_get(req))
344                         goto again;
345                 if (req->tc.tag != tag) {
346                         p9_req_put(c, req);
347                         goto again;
348                 }
349         }
350         rcu_read_unlock();
351
352         return req;
353 }
354 EXPORT_SYMBOL(p9_tag_lookup);
355
356 /**
357  * p9_tag_remove - Remove a tag.
358  * @c: Client session.
359  * @r: Request of reference.
360  *
361  * Context: Any context.
362  */
363 static int p9_tag_remove(struct p9_client *c, struct p9_req_t *r)
364 {
365         unsigned long flags;
366         u16 tag = r->tc.tag;
367
368         p9_debug(P9_DEBUG_MUX, "clnt %p req %p tag: %d\n", c, r, tag);
369         spin_lock_irqsave(&c->lock, flags);
370         idr_remove(&c->reqs, tag);
371         spin_unlock_irqrestore(&c->lock, flags);
372         return p9_req_put(c, r);
373 }
374
375 int p9_req_put(struct p9_client *c, struct p9_req_t *r)
376 {
377         if (refcount_dec_and_test(&r->refcount)) {
378                 p9_fcall_fini(&r->tc);
379                 p9_fcall_fini(&r->rc);
380                 kmem_cache_free(p9_req_cache, r);
381                 return 1;
382         }
383         return 0;
384 }
385 EXPORT_SYMBOL(p9_req_put);
386
387 /**
388  * p9_tag_cleanup - cleans up tags structure and reclaims resources
389  * @c:  v9fs client struct
390  *
391  * This frees resources associated with the tags structure
392  *
393  */
394 static void p9_tag_cleanup(struct p9_client *c)
395 {
396         struct p9_req_t *req;
397         int id;
398
399         rcu_read_lock();
400         idr_for_each_entry(&c->reqs, req, id) {
401                 pr_info("Tag %d still in use\n", id);
402                 if (p9_tag_remove(c, req) == 0)
403                         pr_warn("Packet with tag %d has still references",
404                                 req->tc.tag);
405         }
406         rcu_read_unlock();
407 }
408
409 /**
410  * p9_client_cb - call back from transport to client
411  * @c: client state
412  * @req: request received
413  * @status: request status, one of REQ_STATUS_*
414  *
415  */
416 void p9_client_cb(struct p9_client *c, struct p9_req_t *req, int status)
417 {
418         p9_debug(P9_DEBUG_MUX, " tag %d\n", req->tc.tag);
419
420         /* This barrier is needed to make sure any change made to req before
421          * the status change is visible to another thread
422          */
423         smp_wmb();
424         req->status = status;
425
426         wake_up(&req->wq);
427         p9_debug(P9_DEBUG_MUX, "wakeup: %d\n", req->tc.tag);
428         p9_req_put(c, req);
429 }
430 EXPORT_SYMBOL(p9_client_cb);
431
432 /**
433  * p9_parse_header - parse header arguments out of a packet
434  * @pdu: packet to parse
435  * @size: size of packet
436  * @type: type of request
437  * @tag: tag of packet
438  * @rewind: set if we need to rewind offset afterwards
439  */
440
441 int
442 p9_parse_header(struct p9_fcall *pdu, int32_t *size, int8_t *type,
443                 int16_t *tag, int rewind)
444 {
445         s8 r_type;
446         s16 r_tag;
447         s32 r_size;
448         int offset = pdu->offset;
449         int err;
450
451         pdu->offset = 0;
452
453         err = p9pdu_readf(pdu, 0, "dbw", &r_size, &r_type, &r_tag);
454         if (err)
455                 goto rewind_and_exit;
456
457         if (type)
458                 *type = r_type;
459         if (tag)
460                 *tag = r_tag;
461         if (size)
462                 *size = r_size;
463
464         if (pdu->size != r_size || r_size < 7) {
465                 err = -EINVAL;
466                 goto rewind_and_exit;
467         }
468
469         pdu->id = r_type;
470         pdu->tag = r_tag;
471
472         p9_debug(P9_DEBUG_9P, "<<< size=%d type: %d tag: %d\n",
473                  pdu->size, pdu->id, pdu->tag);
474
475 rewind_and_exit:
476         if (rewind)
477                 pdu->offset = offset;
478         return err;
479 }
480 EXPORT_SYMBOL(p9_parse_header);
481
482 /**
483  * p9_check_errors - check 9p packet for error return and process it
484  * @c: current client instance
485  * @req: request to parse and check for error conditions
486  *
487  * returns error code if one is discovered, otherwise returns 0
488  *
489  * this will have to be more complicated if we have multiple
490  * error packet types
491  */
492
493 static int p9_check_errors(struct p9_client *c, struct p9_req_t *req)
494 {
495         s8 type;
496         int err;
497         int ecode;
498
499         err = p9_parse_header(&req->rc, NULL, &type, NULL, 0);
500         if (req->rc.size >= c->msize) {
501                 p9_debug(P9_DEBUG_ERROR,
502                          "requested packet size too big: %d\n",
503                          req->rc.size);
504                 return -EIO;
505         }
506         /* dump the response from server
507          * This should be after check errors which poplulate pdu_fcall.
508          */
509         trace_9p_protocol_dump(c, &req->rc);
510         if (err) {
511                 p9_debug(P9_DEBUG_ERROR, "couldn't parse header %d\n", err);
512                 return err;
513         }
514         if (type != P9_RERROR && type != P9_RLERROR)
515                 return 0;
516
517         if (!p9_is_proto_dotl(c)) {
518                 char *ename;
519
520                 err = p9pdu_readf(&req->rc, c->proto_version, "s?d",
521                                   &ename, &ecode);
522                 if (err)
523                         goto out_err;
524
525                 if (p9_is_proto_dotu(c) && ecode < 512)
526                         err = -ecode;
527
528                 if (!err) {
529                         err = p9_errstr2errno(ename, strlen(ename));
530
531                         p9_debug(P9_DEBUG_9P, "<<< RERROR (%d) %s\n",
532                                  -ecode, ename);
533                 }
534                 kfree(ename);
535         } else {
536                 err = p9pdu_readf(&req->rc, c->proto_version, "d", &ecode);
537                 if (err)
538                         goto out_err;
539                 err = -ecode;
540
541                 p9_debug(P9_DEBUG_9P, "<<< RLERROR (%d)\n", -ecode);
542         }
543
544         return err;
545
546 out_err:
547         p9_debug(P9_DEBUG_ERROR, "couldn't parse error%d\n", err);
548
549         return err;
550 }
551
552 /**
553  * p9_check_zc_errors - check 9p packet for error return and process it
554  * @c: current client instance
555  * @req: request to parse and check for error conditions
556  * @uidata: external buffer containing error
557  * @in_hdrlen: Size of response protocol buffer.
558  *
559  * returns error code if one is discovered, otherwise returns 0
560  *
561  * this will have to be more complicated if we have multiple
562  * error packet types
563  */
564
565 static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req,
566                               struct iov_iter *uidata, int in_hdrlen)
567 {
568         int err;
569         int ecode;
570         s8 type;
571         char *ename = NULL;
572
573         err = p9_parse_header(&req->rc, NULL, &type, NULL, 0);
574         /* dump the response from server
575          * This should be after parse_header which poplulate pdu_fcall.
576          */
577         trace_9p_protocol_dump(c, &req->rc);
578         if (err) {
579                 p9_debug(P9_DEBUG_ERROR, "couldn't parse header %d\n", err);
580                 return err;
581         }
582
583         if (type != P9_RERROR && type != P9_RLERROR)
584                 return 0;
585
586         if (!p9_is_proto_dotl(c)) {
587                 /* Error is reported in string format */
588                 int len;
589                 /* 7 = header size for RERROR; */
590                 int inline_len = in_hdrlen - 7;
591
592                 len = req->rc.size - req->rc.offset;
593                 if (len > (P9_ZC_HDR_SZ - 7)) {
594                         err = -EFAULT;
595                         goto out_err;
596                 }
597
598                 ename = &req->rc.sdata[req->rc.offset];
599                 if (len > inline_len) {
600                         /* We have error in external buffer */
601                         if (!copy_from_iter_full(ename + inline_len,
602                                                  len - inline_len, uidata)) {
603                                 err = -EFAULT;
604                                 goto out_err;
605                         }
606                 }
607                 ename = NULL;
608                 err = p9pdu_readf(&req->rc, c->proto_version, "s?d",
609                                   &ename, &ecode);
610                 if (err)
611                         goto out_err;
612
613                 if (p9_is_proto_dotu(c) && ecode < 512)
614                         err = -ecode;
615
616                 if (!err) {
617                         err = p9_errstr2errno(ename, strlen(ename));
618
619                         p9_debug(P9_DEBUG_9P, "<<< RERROR (%d) %s\n",
620                                  -ecode, ename);
621                 }
622                 kfree(ename);
623         } else {
624                 err = p9pdu_readf(&req->rc, c->proto_version, "d", &ecode);
625                 err = -ecode;
626
627                 p9_debug(P9_DEBUG_9P, "<<< RLERROR (%d)\n", -ecode);
628         }
629         return err;
630
631 out_err:
632         p9_debug(P9_DEBUG_ERROR, "couldn't parse error%d\n", err);
633         return err;
634 }
635
636 static struct p9_req_t *
637 p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...);
638
639 /**
640  * p9_client_flush - flush (cancel) a request
641  * @c: client state
642  * @oldreq: request to cancel
643  *
644  * This sents a flush for a particular request and links
645  * the flush request to the original request.  The current
646  * code only supports a single flush request although the protocol
647  * allows for multiple flush requests to be sent for a single request.
648  *
649  */
650
651 static int p9_client_flush(struct p9_client *c, struct p9_req_t *oldreq)
652 {
653         struct p9_req_t *req;
654         s16 oldtag;
655         int err;
656
657         err = p9_parse_header(&oldreq->tc, NULL, NULL, &oldtag, 1);
658         if (err)
659                 return err;
660
661         p9_debug(P9_DEBUG_9P, ">>> TFLUSH tag %d\n", oldtag);
662
663         req = p9_client_rpc(c, P9_TFLUSH, "w", oldtag);
664         if (IS_ERR(req))
665                 return PTR_ERR(req);
666
667         /* if we haven't received a response for oldreq,
668          * remove it from the list
669          */
670         if (oldreq->status == REQ_STATUS_SENT) {
671                 if (c->trans_mod->cancelled)
672                         c->trans_mod->cancelled(c, oldreq);
673         }
674
675         p9_tag_remove(c, req);
676         return 0;
677 }
678
679 static struct p9_req_t *p9_client_prepare_req(struct p9_client *c,
680                                               int8_t type, int req_size,
681                                               const char *fmt, va_list ap)
682 {
683         int err;
684         struct p9_req_t *req;
685
686         p9_debug(P9_DEBUG_MUX, "client %p op %d\n", c, type);
687
688         /* we allow for any status other than disconnected */
689         if (c->status == Disconnected)
690                 return ERR_PTR(-EIO);
691
692         /* if status is begin_disconnected we allow only clunk request */
693         if (c->status == BeginDisconnect && type != P9_TCLUNK)
694                 return ERR_PTR(-EIO);
695
696         req = p9_tag_alloc(c, type, req_size);
697         if (IS_ERR(req))
698                 return req;
699
700         /* marshall the data */
701         p9pdu_prepare(&req->tc, req->tc.tag, type);
702         err = p9pdu_vwritef(&req->tc, c->proto_version, fmt, ap);
703         if (err)
704                 goto reterr;
705         p9pdu_finalize(c, &req->tc);
706         trace_9p_client_req(c, type, req->tc.tag);
707         return req;
708 reterr:
709         p9_tag_remove(c, req);
710         /* We have to put also the 2nd reference as it won't be used */
711         p9_req_put(c, req);
712         return ERR_PTR(err);
713 }
714
715 /**
716  * p9_client_rpc - issue a request and wait for a response
717  * @c: client session
718  * @type: type of request
719  * @fmt: protocol format string (see protocol.c)
720  *
721  * Returns request structure (which client must free using p9_tag_remove)
722  */
723
724 static struct p9_req_t *
725 p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...)
726 {
727         va_list ap;
728         int sigpending, err;
729         unsigned long flags;
730         struct p9_req_t *req;
731
732         va_start(ap, fmt);
733         req = p9_client_prepare_req(c, type, c->msize, fmt, ap);
734         va_end(ap);
735         if (IS_ERR(req))
736                 return req;
737
738         if (signal_pending(current)) {
739                 sigpending = 1;
740                 clear_thread_flag(TIF_SIGPENDING);
741         } else {
742                 sigpending = 0;
743         }
744
745         err = c->trans_mod->request(c, req);
746         if (err < 0) {
747                 /* write won't happen */
748                 p9_req_put(c, req);
749                 if (err != -ERESTARTSYS && err != -EFAULT)
750                         c->status = Disconnected;
751                 goto recalc_sigpending;
752         }
753 again:
754         /* Wait for the response */
755         err = wait_event_killable(req->wq, req->status >= REQ_STATUS_RCVD);
756
757         /* Make sure our req is coherent with regard to updates in other
758          * threads - echoes to wmb() in the callback
759          */
760         smp_rmb();
761
762         if (err == -ERESTARTSYS && c->status == Connected &&
763             type == P9_TFLUSH) {
764                 sigpending = 1;
765                 clear_thread_flag(TIF_SIGPENDING);
766                 goto again;
767         }
768
769         if (req->status == REQ_STATUS_ERROR) {
770                 p9_debug(P9_DEBUG_ERROR, "req_status error %d\n", req->t_err);
771                 err = req->t_err;
772         }
773         if (err == -ERESTARTSYS && c->status == Connected) {
774                 p9_debug(P9_DEBUG_MUX, "flushing\n");
775                 sigpending = 1;
776                 clear_thread_flag(TIF_SIGPENDING);
777
778                 if (c->trans_mod->cancel(c, req))
779                         p9_client_flush(c, req);
780
781                 /* if we received the response anyway, don't signal error */
782                 if (req->status == REQ_STATUS_RCVD)
783                         err = 0;
784         }
785 recalc_sigpending:
786         if (sigpending) {
787                 spin_lock_irqsave(&current->sighand->siglock, flags);
788                 recalc_sigpending();
789                 spin_unlock_irqrestore(&current->sighand->siglock, flags);
790         }
791         if (err < 0)
792                 goto reterr;
793
794         err = p9_check_errors(c, req);
795         trace_9p_client_res(c, type, req->rc.tag, err);
796         if (!err)
797                 return req;
798 reterr:
799         p9_tag_remove(c, req);
800         return ERR_PTR(safe_errno(err));
801 }
802
803 /**
804  * p9_client_zc_rpc - issue a request and wait for a response
805  * @c: client session
806  * @type: type of request
807  * @uidata: destination for zero copy read
808  * @uodata: source for zero copy write
809  * @inlen: read buffer size
810  * @olen: write buffer size
811  * @in_hdrlen: reader header size, This is the size of response protocol data
812  * @fmt: protocol format string (see protocol.c)
813  *
814  * Returns request structure (which client must free using p9_tag_remove)
815  */
816 static struct p9_req_t *p9_client_zc_rpc(struct p9_client *c, int8_t type,
817                                          struct iov_iter *uidata,
818                                          struct iov_iter *uodata,
819                                          int inlen, int olen, int in_hdrlen,
820                                          const char *fmt, ...)
821 {
822         va_list ap;
823         int sigpending, err;
824         unsigned long flags;
825         struct p9_req_t *req;
826
827         va_start(ap, fmt);
828         /* We allocate a inline protocol data of only 4k bytes.
829          * The actual content is passed in zero-copy fashion.
830          */
831         req = p9_client_prepare_req(c, type, P9_ZC_HDR_SZ, fmt, ap);
832         va_end(ap);
833         if (IS_ERR(req))
834                 return req;
835
836         if (signal_pending(current)) {
837                 sigpending = 1;
838                 clear_thread_flag(TIF_SIGPENDING);
839         } else {
840                 sigpending = 0;
841         }
842
843         err = c->trans_mod->zc_request(c, req, uidata, uodata,
844                                        inlen, olen, in_hdrlen);
845         if (err < 0) {
846                 if (err == -EIO)
847                         c->status = Disconnected;
848                 if (err != -ERESTARTSYS)
849                         goto recalc_sigpending;
850         }
851         if (req->status == REQ_STATUS_ERROR) {
852                 p9_debug(P9_DEBUG_ERROR, "req_status error %d\n", req->t_err);
853                 err = req->t_err;
854         }
855         if (err == -ERESTARTSYS && c->status == Connected) {
856                 p9_debug(P9_DEBUG_MUX, "flushing\n");
857                 sigpending = 1;
858                 clear_thread_flag(TIF_SIGPENDING);
859
860                 if (c->trans_mod->cancel(c, req))
861                         p9_client_flush(c, req);
862
863                 /* if we received the response anyway, don't signal error */
864                 if (req->status == REQ_STATUS_RCVD)
865                         err = 0;
866         }
867 recalc_sigpending:
868         if (sigpending) {
869                 spin_lock_irqsave(&current->sighand->siglock, flags);
870                 recalc_sigpending();
871                 spin_unlock_irqrestore(&current->sighand->siglock, flags);
872         }
873         if (err < 0)
874                 goto reterr;
875
876         err = p9_check_zc_errors(c, req, uidata, in_hdrlen);
877         trace_9p_client_res(c, type, req->rc.tag, err);
878         if (!err)
879                 return req;
880 reterr:
881         p9_tag_remove(c, req);
882         return ERR_PTR(safe_errno(err));
883 }
884
885 static struct p9_fid *p9_fid_create(struct p9_client *clnt)
886 {
887         int ret;
888         struct p9_fid *fid;
889
890         p9_debug(P9_DEBUG_FID, "clnt %p\n", clnt);
891         fid = kzalloc(sizeof(*fid), GFP_KERNEL);
892         if (!fid)
893                 return NULL;
894
895         fid->mode = -1;
896         fid->uid = current_fsuid();
897         fid->clnt = clnt;
898         refcount_set(&fid->count, 1);
899
900         idr_preload(GFP_KERNEL);
901         spin_lock_irq(&clnt->lock);
902         ret = idr_alloc_u32(&clnt->fids, fid, &fid->fid, P9_NOFID - 1,
903                             GFP_NOWAIT);
904         spin_unlock_irq(&clnt->lock);
905         idr_preload_end();
906         if (!ret)
907                 return fid;
908
909         kfree(fid);
910         return NULL;
911 }
912
913 static void p9_fid_destroy(struct p9_fid *fid)
914 {
915         struct p9_client *clnt;
916         unsigned long flags;
917
918         p9_debug(P9_DEBUG_FID, "fid %d\n", fid->fid);
919         clnt = fid->clnt;
920         spin_lock_irqsave(&clnt->lock, flags);
921         idr_remove(&clnt->fids, fid->fid);
922         spin_unlock_irqrestore(&clnt->lock, flags);
923         kfree(fid->rdir);
924         kfree(fid);
925 }
926
927 static int p9_client_version(struct p9_client *c)
928 {
929         int err = 0;
930         struct p9_req_t *req;
931         char *version = NULL;
932         int msize;
933
934         p9_debug(P9_DEBUG_9P, ">>> TVERSION msize %d protocol %d\n",
935                  c->msize, c->proto_version);
936
937         switch (c->proto_version) {
938         case p9_proto_2000L:
939                 req = p9_client_rpc(c, P9_TVERSION, "ds",
940                                     c->msize, "9P2000.L");
941                 break;
942         case p9_proto_2000u:
943                 req = p9_client_rpc(c, P9_TVERSION, "ds",
944                                     c->msize, "9P2000.u");
945                 break;
946         case p9_proto_legacy:
947                 req = p9_client_rpc(c, P9_TVERSION, "ds",
948                                     c->msize, "9P2000");
949                 break;
950         default:
951                 return -EINVAL;
952         }
953
954         if (IS_ERR(req))
955                 return PTR_ERR(req);
956
957         err = p9pdu_readf(&req->rc, c->proto_version, "ds", &msize, &version);
958         if (err) {
959                 p9_debug(P9_DEBUG_9P, "version error %d\n", err);
960                 trace_9p_protocol_dump(c, &req->rc);
961                 goto error;
962         }
963
964         p9_debug(P9_DEBUG_9P, "<<< RVERSION msize %d %s\n", msize, version);
965         if (!strncmp(version, "9P2000.L", 8)) {
966                 c->proto_version = p9_proto_2000L;
967         } else if (!strncmp(version, "9P2000.u", 8)) {
968                 c->proto_version = p9_proto_2000u;
969         } else if (!strncmp(version, "9P2000", 6)) {
970                 c->proto_version = p9_proto_legacy;
971         } else {
972                 p9_debug(P9_DEBUG_ERROR,
973                          "server returned an unknown version: %s\n", version);
974                 err = -EREMOTEIO;
975                 goto error;
976         }
977
978         if (msize < 4096) {
979                 p9_debug(P9_DEBUG_ERROR,
980                          "server returned a msize < 4096: %d\n", msize);
981                 err = -EREMOTEIO;
982                 goto error;
983         }
984         if (msize < c->msize)
985                 c->msize = msize;
986
987 error:
988         kfree(version);
989         p9_tag_remove(c, req);
990
991         return err;
992 }
993
994 struct p9_client *p9_client_create(const char *dev_name, char *options)
995 {
996         int err;
997         struct p9_client *clnt;
998         char *client_id;
999
1000         err = 0;
1001         clnt = kmalloc(sizeof(*clnt), GFP_KERNEL);
1002         if (!clnt)
1003                 return ERR_PTR(-ENOMEM);
1004
1005         clnt->trans_mod = NULL;
1006         clnt->trans = NULL;
1007         clnt->fcall_cache = NULL;
1008
1009         client_id = utsname()->nodename;
1010         memcpy(clnt->name, client_id, strlen(client_id) + 1);
1011
1012         spin_lock_init(&clnt->lock);
1013         idr_init(&clnt->fids);
1014         idr_init(&clnt->reqs);
1015
1016         err = parse_opts(options, clnt);
1017         if (err < 0)
1018                 goto free_client;
1019
1020         if (!clnt->trans_mod)
1021                 clnt->trans_mod = v9fs_get_default_trans();
1022
1023         if (!clnt->trans_mod) {
1024                 err = -EPROTONOSUPPORT;
1025                 p9_debug(P9_DEBUG_ERROR,
1026                          "No transport defined or default transport\n");
1027                 goto free_client;
1028         }
1029
1030         p9_debug(P9_DEBUG_MUX, "clnt %p trans %p msize %d protocol %d\n",
1031                  clnt, clnt->trans_mod, clnt->msize, clnt->proto_version);
1032
1033         err = clnt->trans_mod->create(clnt, dev_name, options);
1034         if (err)
1035                 goto put_trans;
1036
1037         if (clnt->msize > clnt->trans_mod->maxsize)
1038                 clnt->msize = clnt->trans_mod->maxsize;
1039
1040         if (clnt->msize < 4096) {
1041                 p9_debug(P9_DEBUG_ERROR,
1042                          "Please specify a msize of at least 4k\n");
1043                 err = -EINVAL;
1044                 goto close_trans;
1045         }
1046
1047         err = p9_client_version(clnt);
1048         if (err)
1049                 goto close_trans;
1050
1051         /* P9_HDRSZ + 4 is the smallest packet header we can have that is
1052          * followed by data accessed from userspace by read
1053          */
1054         clnt->fcall_cache =
1055                 kmem_cache_create_usercopy("9p-fcall-cache", clnt->msize,
1056                                            0, 0, P9_HDRSZ + 4,
1057                                            clnt->msize - (P9_HDRSZ + 4),
1058                                            NULL);
1059
1060         return clnt;
1061
1062 close_trans:
1063         clnt->trans_mod->close(clnt);
1064 put_trans:
1065         v9fs_put_trans(clnt->trans_mod);
1066 free_client:
1067         kfree(clnt);
1068         return ERR_PTR(err);
1069 }
1070 EXPORT_SYMBOL(p9_client_create);
1071
1072 void p9_client_destroy(struct p9_client *clnt)
1073 {
1074         struct p9_fid *fid;
1075         int id;
1076
1077         p9_debug(P9_DEBUG_MUX, "clnt %p\n", clnt);
1078
1079         if (clnt->trans_mod)
1080                 clnt->trans_mod->close(clnt);
1081
1082         v9fs_put_trans(clnt->trans_mod);
1083
1084         idr_for_each_entry(&clnt->fids, fid, id) {
1085                 pr_info("Found fid %d not clunked\n", fid->fid);
1086                 p9_fid_destroy(fid);
1087         }
1088
1089         p9_tag_cleanup(clnt);
1090
1091         kmem_cache_destroy(clnt->fcall_cache);
1092         kfree(clnt);
1093 }
1094 EXPORT_SYMBOL(p9_client_destroy);
1095
1096 void p9_client_disconnect(struct p9_client *clnt)
1097 {
1098         p9_debug(P9_DEBUG_9P, "clnt %p\n", clnt);
1099         clnt->status = Disconnected;
1100 }
1101 EXPORT_SYMBOL(p9_client_disconnect);
1102
1103 void p9_client_begin_disconnect(struct p9_client *clnt)
1104 {
1105         p9_debug(P9_DEBUG_9P, "clnt %p\n", clnt);
1106         clnt->status = BeginDisconnect;
1107 }
1108 EXPORT_SYMBOL(p9_client_begin_disconnect);
1109
1110 struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
1111                                 const char *uname, kuid_t n_uname,
1112                                 const char *aname)
1113 {
1114         int err = 0;
1115         struct p9_req_t *req;
1116         struct p9_fid *fid;
1117         struct p9_qid qid;
1118
1119         p9_debug(P9_DEBUG_9P, ">>> TATTACH afid %d uname %s aname %s\n",
1120                  afid ? afid->fid : -1, uname, aname);
1121         fid = p9_fid_create(clnt);
1122         if (!fid) {
1123                 err = -ENOMEM;
1124                 goto error;
1125         }
1126         fid->uid = n_uname;
1127
1128         req = p9_client_rpc(clnt, P9_TATTACH, "ddss?u", fid->fid,
1129                             afid ? afid->fid : P9_NOFID, uname, aname, n_uname);
1130         if (IS_ERR(req)) {
1131                 err = PTR_ERR(req);
1132                 goto error;
1133         }
1134
1135         err = p9pdu_readf(&req->rc, clnt->proto_version, "Q", &qid);
1136         if (err) {
1137                 trace_9p_protocol_dump(clnt, &req->rc);
1138                 p9_tag_remove(clnt, req);
1139                 goto error;
1140         }
1141
1142         p9_debug(P9_DEBUG_9P, "<<< RATTACH qid %x.%llx.%x\n",
1143                  qid.type, qid.path, qid.version);
1144
1145         memmove(&fid->qid, &qid, sizeof(struct p9_qid));
1146
1147         p9_tag_remove(clnt, req);
1148         return fid;
1149
1150 error:
1151         if (fid)
1152                 p9_fid_destroy(fid);
1153         return ERR_PTR(err);
1154 }
1155 EXPORT_SYMBOL(p9_client_attach);
1156
1157 struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname,
1158                               const unsigned char * const *wnames, int clone)
1159 {
1160         int err;
1161         struct p9_client *clnt;
1162         struct p9_fid *fid;
1163         struct p9_qid *wqids;
1164         struct p9_req_t *req;
1165         u16 nwqids, count;
1166
1167         err = 0;
1168         wqids = NULL;
1169         clnt = oldfid->clnt;
1170         if (clone) {
1171                 fid = p9_fid_create(clnt);
1172                 if (!fid) {
1173                         err = -ENOMEM;
1174                         goto error;
1175                 }
1176
1177                 fid->uid = oldfid->uid;
1178         } else {
1179                 fid = oldfid;
1180         }
1181
1182         p9_debug(P9_DEBUG_9P, ">>> TWALK fids %d,%d nwname %ud wname[0] %s\n",
1183                  oldfid->fid, fid->fid, nwname, wnames ? wnames[0] : NULL);
1184         req = p9_client_rpc(clnt, P9_TWALK, "ddT", oldfid->fid, fid->fid,
1185                             nwname, wnames);
1186         if (IS_ERR(req)) {
1187                 err = PTR_ERR(req);
1188                 goto error;
1189         }
1190
1191         err = p9pdu_readf(&req->rc, clnt->proto_version, "R", &nwqids, &wqids);
1192         if (err) {
1193                 trace_9p_protocol_dump(clnt, &req->rc);
1194                 p9_tag_remove(clnt, req);
1195                 goto clunk_fid;
1196         }
1197         p9_tag_remove(clnt, req);
1198
1199         p9_debug(P9_DEBUG_9P, "<<< RWALK nwqid %d:\n", nwqids);
1200
1201         if (nwqids != nwname) {
1202                 err = -ENOENT;
1203                 goto clunk_fid;
1204         }
1205
1206         for (count = 0; count < nwqids; count++)
1207                 p9_debug(P9_DEBUG_9P, "<<<     [%d] %x.%llx.%x\n",
1208                          count, wqids[count].type,
1209                          wqids[count].path,
1210                          wqids[count].version);
1211
1212         if (nwname)
1213                 memmove(&fid->qid, &wqids[nwqids - 1], sizeof(struct p9_qid));
1214         else
1215                 memmove(&fid->qid, &oldfid->qid, sizeof(struct p9_qid));
1216
1217         kfree(wqids);
1218         return fid;
1219
1220 clunk_fid:
1221         kfree(wqids);
1222         p9_client_clunk(fid);
1223         fid = NULL;
1224
1225 error:
1226         if (fid && fid != oldfid)
1227                 p9_fid_destroy(fid);
1228
1229         return ERR_PTR(err);
1230 }
1231 EXPORT_SYMBOL(p9_client_walk);
1232
1233 int p9_client_open(struct p9_fid *fid, int mode)
1234 {
1235         int err;
1236         struct p9_client *clnt;
1237         struct p9_req_t *req;
1238         struct p9_qid qid;
1239         int iounit;
1240
1241         clnt = fid->clnt;
1242         p9_debug(P9_DEBUG_9P, ">>> %s fid %d mode %d\n",
1243                  p9_is_proto_dotl(clnt) ? "TLOPEN" : "TOPEN", fid->fid, mode);
1244         err = 0;
1245
1246         if (fid->mode != -1)
1247                 return -EINVAL;
1248
1249         if (p9_is_proto_dotl(clnt))
1250                 req = p9_client_rpc(clnt, P9_TLOPEN, "dd", fid->fid, mode);
1251         else
1252                 req = p9_client_rpc(clnt, P9_TOPEN, "db", fid->fid, mode);
1253         if (IS_ERR(req)) {
1254                 err = PTR_ERR(req);
1255                 goto error;
1256         }
1257
1258         err = p9pdu_readf(&req->rc, clnt->proto_version, "Qd", &qid, &iounit);
1259         if (err) {
1260                 trace_9p_protocol_dump(clnt, &req->rc);
1261                 goto free_and_error;
1262         }
1263
1264         p9_debug(P9_DEBUG_9P, "<<< %s qid %x.%llx.%x iounit %x\n",
1265                  p9_is_proto_dotl(clnt) ? "RLOPEN" : "ROPEN",  qid.type,
1266                  qid.path, qid.version, iounit);
1267
1268         memmove(&fid->qid, &qid, sizeof(struct p9_qid));
1269         fid->mode = mode;
1270         fid->iounit = iounit;
1271
1272 free_and_error:
1273         p9_tag_remove(clnt, req);
1274 error:
1275         return err;
1276 }
1277 EXPORT_SYMBOL(p9_client_open);
1278
1279 int p9_client_create_dotl(struct p9_fid *ofid, const char *name, u32 flags,
1280                           u32 mode, kgid_t gid, struct p9_qid *qid)
1281 {
1282         int err = 0;
1283         struct p9_client *clnt;
1284         struct p9_req_t *req;
1285         int iounit;
1286
1287         p9_debug(P9_DEBUG_9P,
1288                  ">>> TLCREATE fid %d name %s flags %d mode %d gid %d\n",
1289                  ofid->fid, name, flags, mode,
1290                  from_kgid(&init_user_ns, gid));
1291         clnt = ofid->clnt;
1292
1293         if (ofid->mode != -1)
1294                 return -EINVAL;
1295
1296         req = p9_client_rpc(clnt, P9_TLCREATE, "dsddg", ofid->fid, name, flags,
1297                             mode, gid);
1298         if (IS_ERR(req)) {
1299                 err = PTR_ERR(req);
1300                 goto error;
1301         }
1302
1303         err = p9pdu_readf(&req->rc, clnt->proto_version, "Qd", qid, &iounit);
1304         if (err) {
1305                 trace_9p_protocol_dump(clnt, &req->rc);
1306                 goto free_and_error;
1307         }
1308
1309         p9_debug(P9_DEBUG_9P, "<<< RLCREATE qid %x.%llx.%x iounit %x\n",
1310                  qid->type, qid->path, qid->version, iounit);
1311
1312         memmove(&ofid->qid, qid, sizeof(struct p9_qid));
1313         ofid->mode = mode;
1314         ofid->iounit = iounit;
1315
1316 free_and_error:
1317         p9_tag_remove(clnt, req);
1318 error:
1319         return err;
1320 }
1321 EXPORT_SYMBOL(p9_client_create_dotl);
1322
1323 int p9_client_fcreate(struct p9_fid *fid, const char *name, u32 perm, int mode,
1324                      char *extension)
1325 {
1326         int err;
1327         struct p9_client *clnt;
1328         struct p9_req_t *req;
1329         struct p9_qid qid;
1330         int iounit;
1331
1332         p9_debug(P9_DEBUG_9P, ">>> TCREATE fid %d name %s perm %d mode %d\n",
1333                  fid->fid, name, perm, mode);
1334         err = 0;
1335         clnt = fid->clnt;
1336
1337         if (fid->mode != -1)
1338                 return -EINVAL;
1339
1340         req = p9_client_rpc(clnt, P9_TCREATE, "dsdb?s", fid->fid, name, perm,
1341                             mode, extension);
1342         if (IS_ERR(req)) {
1343                 err = PTR_ERR(req);
1344                 goto error;
1345         }
1346
1347         err = p9pdu_readf(&req->rc, clnt->proto_version, "Qd", &qid, &iounit);
1348         if (err) {
1349                 trace_9p_protocol_dump(clnt, &req->rc);
1350                 goto free_and_error;
1351         }
1352
1353         p9_debug(P9_DEBUG_9P, "<<< RCREATE qid %x.%llx.%x iounit %x\n",
1354                  qid.type, qid.path, qid.version, iounit);
1355
1356         memmove(&fid->qid, &qid, sizeof(struct p9_qid));
1357         fid->mode = mode;
1358         fid->iounit = iounit;
1359
1360 free_and_error:
1361         p9_tag_remove(clnt, req);
1362 error:
1363         return err;
1364 }
1365 EXPORT_SYMBOL(p9_client_fcreate);
1366
1367 int p9_client_symlink(struct p9_fid *dfid, const char *name,
1368                       const char *symtgt, kgid_t gid, struct p9_qid *qid)
1369 {
1370         int err = 0;
1371         struct p9_client *clnt;
1372         struct p9_req_t *req;
1373
1374         p9_debug(P9_DEBUG_9P, ">>> TSYMLINK dfid %d name %s  symtgt %s\n",
1375                  dfid->fid, name, symtgt);
1376         clnt = dfid->clnt;
1377
1378         req = p9_client_rpc(clnt, P9_TSYMLINK, "dssg", dfid->fid, name, symtgt,
1379                             gid);
1380         if (IS_ERR(req)) {
1381                 err = PTR_ERR(req);
1382                 goto error;
1383         }
1384
1385         err = p9pdu_readf(&req->rc, clnt->proto_version, "Q", qid);
1386         if (err) {
1387                 trace_9p_protocol_dump(clnt, &req->rc);
1388                 goto free_and_error;
1389         }
1390
1391         p9_debug(P9_DEBUG_9P, "<<< RSYMLINK qid %x.%llx.%x\n",
1392                  qid->type, qid->path, qid->version);
1393
1394 free_and_error:
1395         p9_tag_remove(clnt, req);
1396 error:
1397         return err;
1398 }
1399 EXPORT_SYMBOL(p9_client_symlink);
1400
1401 int p9_client_link(struct p9_fid *dfid, struct p9_fid *oldfid, const char *newname)
1402 {
1403         struct p9_client *clnt;
1404         struct p9_req_t *req;
1405
1406         p9_debug(P9_DEBUG_9P, ">>> TLINK dfid %d oldfid %d newname %s\n",
1407                  dfid->fid, oldfid->fid, newname);
1408         clnt = dfid->clnt;
1409         req = p9_client_rpc(clnt, P9_TLINK, "dds", dfid->fid, oldfid->fid,
1410                             newname);
1411         if (IS_ERR(req))
1412                 return PTR_ERR(req);
1413
1414         p9_debug(P9_DEBUG_9P, "<<< RLINK\n");
1415         p9_tag_remove(clnt, req);
1416         return 0;
1417 }
1418 EXPORT_SYMBOL(p9_client_link);
1419
1420 int p9_client_fsync(struct p9_fid *fid, int datasync)
1421 {
1422         int err;
1423         struct p9_client *clnt;
1424         struct p9_req_t *req;
1425
1426         p9_debug(P9_DEBUG_9P, ">>> TFSYNC fid %d datasync:%d\n",
1427                  fid->fid, datasync);
1428         err = 0;
1429         clnt = fid->clnt;
1430
1431         req = p9_client_rpc(clnt, P9_TFSYNC, "dd", fid->fid, datasync);
1432         if (IS_ERR(req)) {
1433                 err = PTR_ERR(req);
1434                 goto error;
1435         }
1436
1437         p9_debug(P9_DEBUG_9P, "<<< RFSYNC fid %d\n", fid->fid);
1438
1439         p9_tag_remove(clnt, req);
1440
1441 error:
1442         return err;
1443 }
1444 EXPORT_SYMBOL(p9_client_fsync);
1445
1446 int p9_client_clunk(struct p9_fid *fid)
1447 {
1448         int err;
1449         struct p9_client *clnt;
1450         struct p9_req_t *req;
1451         int retries = 0;
1452
1453         if (!fid || IS_ERR(fid)) {
1454                 pr_warn("%s (%d): Trying to clunk with invalid fid\n",
1455                         __func__, task_pid_nr(current));
1456                 dump_stack();
1457                 return 0;
1458         }
1459         if (!refcount_dec_and_test(&fid->count))
1460                 return 0;
1461
1462 again:
1463         p9_debug(P9_DEBUG_9P, ">>> TCLUNK fid %d (try %d)\n",
1464                  fid->fid, retries);
1465         err = 0;
1466         clnt = fid->clnt;
1467
1468         req = p9_client_rpc(clnt, P9_TCLUNK, "d", fid->fid);
1469         if (IS_ERR(req)) {
1470                 err = PTR_ERR(req);
1471                 goto error;
1472         }
1473
1474         p9_debug(P9_DEBUG_9P, "<<< RCLUNK fid %d\n", fid->fid);
1475
1476         p9_tag_remove(clnt, req);
1477 error:
1478         /* Fid is not valid even after a failed clunk
1479          * If interrupted, retry once then give up and
1480          * leak fid until umount.
1481          */
1482         if (err == -ERESTARTSYS) {
1483                 if (retries++ == 0)
1484                         goto again;
1485         } else {
1486                 p9_fid_destroy(fid);
1487         }
1488         return err;
1489 }
1490 EXPORT_SYMBOL(p9_client_clunk);
1491
1492 int p9_client_remove(struct p9_fid *fid)
1493 {
1494         int err;
1495         struct p9_client *clnt;
1496         struct p9_req_t *req;
1497
1498         p9_debug(P9_DEBUG_9P, ">>> TREMOVE fid %d\n", fid->fid);
1499         err = 0;
1500         clnt = fid->clnt;
1501
1502         req = p9_client_rpc(clnt, P9_TREMOVE, "d", fid->fid);
1503         if (IS_ERR(req)) {
1504                 err = PTR_ERR(req);
1505                 goto error;
1506         }
1507
1508         p9_debug(P9_DEBUG_9P, "<<< RREMOVE fid %d\n", fid->fid);
1509
1510         p9_tag_remove(clnt, req);
1511 error:
1512         if (err == -ERESTARTSYS)
1513                 p9_client_clunk(fid);
1514         else
1515                 p9_fid_destroy(fid);
1516         return err;
1517 }
1518 EXPORT_SYMBOL(p9_client_remove);
1519
1520 int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags)
1521 {
1522         int err = 0;
1523         struct p9_req_t *req;
1524         struct p9_client *clnt;
1525
1526         p9_debug(P9_DEBUG_9P, ">>> TUNLINKAT fid %d %s %d\n",
1527                  dfid->fid, name, flags);
1528
1529         clnt = dfid->clnt;
1530         req = p9_client_rpc(clnt, P9_TUNLINKAT, "dsd", dfid->fid, name, flags);
1531         if (IS_ERR(req)) {
1532                 err = PTR_ERR(req);
1533                 goto error;
1534         }
1535         p9_debug(P9_DEBUG_9P, "<<< RUNLINKAT fid %d %s\n", dfid->fid, name);
1536
1537         p9_tag_remove(clnt, req);
1538 error:
1539         return err;
1540 }
1541 EXPORT_SYMBOL(p9_client_unlinkat);
1542
1543 int
1544 p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
1545 {
1546         int total = 0;
1547         *err = 0;
1548
1549         while (iov_iter_count(to)) {
1550                 int count;
1551
1552                 count = p9_client_read_once(fid, offset, to, err);
1553                 if (!count || *err)
1554                         break;
1555                 offset += count;
1556                 total += count;
1557         }
1558         return total;
1559 }
1560 EXPORT_SYMBOL(p9_client_read);
1561
1562 int
1563 p9_client_read_once(struct p9_fid *fid, u64 offset, struct iov_iter *to,
1564                     int *err)
1565 {
1566         struct p9_client *clnt = fid->clnt;
1567         struct p9_req_t *req;
1568         int count = iov_iter_count(to);
1569         int rsize, non_zc = 0;
1570         char *dataptr;
1571
1572         *err = 0;
1573         p9_debug(P9_DEBUG_9P, ">>> TREAD fid %d offset %llu %zu\n",
1574                  fid->fid, offset, iov_iter_count(to));
1575
1576         rsize = fid->iounit;
1577         if (!rsize || rsize > clnt->msize - P9_IOHDRSZ)
1578                 rsize = clnt->msize - P9_IOHDRSZ;
1579
1580         if (count < rsize)
1581                 rsize = count;
1582
1583         /* Don't bother zerocopy for small IO (< 1024) */
1584         if (clnt->trans_mod->zc_request && rsize > 1024) {
1585                 /* response header len is 11
1586                  * PDU Header(7) + IO Size (4)
1587                  */
1588                 req = p9_client_zc_rpc(clnt, P9_TREAD, to, NULL, rsize,
1589                                        0, 11, "dqd", fid->fid,
1590                                        offset, rsize);
1591         } else {
1592                 non_zc = 1;
1593                 req = p9_client_rpc(clnt, P9_TREAD, "dqd", fid->fid, offset,
1594                                     rsize);
1595         }
1596         if (IS_ERR(req)) {
1597                 *err = PTR_ERR(req);
1598                 return 0;
1599         }
1600
1601         *err = p9pdu_readf(&req->rc, clnt->proto_version,
1602                            "D", &count, &dataptr);
1603         if (*err) {
1604                 trace_9p_protocol_dump(clnt, &req->rc);
1605                 p9_tag_remove(clnt, req);
1606                 return 0;
1607         }
1608         if (rsize < count) {
1609                 pr_err("bogus RREAD count (%d > %d)\n", count, rsize);
1610                 count = rsize;
1611         }
1612
1613         p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count);
1614
1615         if (non_zc) {
1616                 int n = copy_to_iter(dataptr, count, to);
1617
1618                 if (n != count) {
1619                         *err = -EFAULT;
1620                         p9_tag_remove(clnt, req);
1621                         return n;
1622                 }
1623         } else {
1624                 iov_iter_advance(to, count);
1625         }
1626         p9_tag_remove(clnt, req);
1627         return count;
1628 }
1629 EXPORT_SYMBOL(p9_client_read_once);
1630
1631 int
1632 p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err)
1633 {
1634         struct p9_client *clnt = fid->clnt;
1635         struct p9_req_t *req;
1636         int total = 0;
1637         *err = 0;
1638
1639         p9_debug(P9_DEBUG_9P, ">>> TWRITE fid %d offset %llu count %zd\n",
1640                  fid->fid, offset, iov_iter_count(from));
1641
1642         while (iov_iter_count(from)) {
1643                 int count = iov_iter_count(from);
1644                 int rsize = fid->iounit;
1645
1646                 if (!rsize || rsize > clnt->msize - P9_IOHDRSZ)
1647                         rsize = clnt->msize - P9_IOHDRSZ;
1648
1649                 if (count < rsize)
1650                         rsize = count;
1651
1652                 /* Don't bother zerocopy for small IO (< 1024) */
1653                 if (clnt->trans_mod->zc_request && rsize > 1024) {
1654                         req = p9_client_zc_rpc(clnt, P9_TWRITE, NULL, from, 0,
1655                                                rsize, P9_ZC_HDR_SZ, "dqd",
1656                                                fid->fid, offset, rsize);
1657                 } else {
1658                         req = p9_client_rpc(clnt, P9_TWRITE, "dqV", fid->fid,
1659                                             offset, rsize, from);
1660                 }
1661                 if (IS_ERR(req)) {
1662                         *err = PTR_ERR(req);
1663                         break;
1664                 }
1665
1666                 *err = p9pdu_readf(&req->rc, clnt->proto_version, "d", &count);
1667                 if (*err) {
1668                         trace_9p_protocol_dump(clnt, &req->rc);
1669                         p9_tag_remove(clnt, req);
1670                         break;
1671                 }
1672                 if (rsize < count) {
1673                         pr_err("bogus RWRITE count (%d > %d)\n", count, rsize);
1674                         count = rsize;
1675                 }
1676
1677                 p9_debug(P9_DEBUG_9P, "<<< RWRITE count %d\n", count);
1678
1679                 p9_tag_remove(clnt, req);
1680                 iov_iter_advance(from, count);
1681                 total += count;
1682                 offset += count;
1683         }
1684         return total;
1685 }
1686 EXPORT_SYMBOL(p9_client_write);
1687
1688 struct p9_wstat *p9_client_stat(struct p9_fid *fid)
1689 {
1690         int err;
1691         struct p9_client *clnt;
1692         struct p9_wstat *ret;
1693         struct p9_req_t *req;
1694         u16 ignored;
1695
1696         p9_debug(P9_DEBUG_9P, ">>> TSTAT fid %d\n", fid->fid);
1697
1698         ret = kmalloc(sizeof(*ret), GFP_KERNEL);
1699         if (!ret)
1700                 return ERR_PTR(-ENOMEM);
1701
1702         err = 0;
1703         clnt = fid->clnt;
1704
1705         req = p9_client_rpc(clnt, P9_TSTAT, "d", fid->fid);
1706         if (IS_ERR(req)) {
1707                 err = PTR_ERR(req);
1708                 goto error;
1709         }
1710
1711         err = p9pdu_readf(&req->rc, clnt->proto_version, "wS", &ignored, ret);
1712         if (err) {
1713                 trace_9p_protocol_dump(clnt, &req->rc);
1714                 p9_tag_remove(clnt, req);
1715                 goto error;
1716         }
1717
1718         p9_debug(P9_DEBUG_9P,
1719                  "<<< RSTAT sz=%x type=%x dev=%x qid=%x.%llx.%x\n"
1720                  "<<<    mode=%8.8x atime=%8.8x mtime=%8.8x length=%llx\n"
1721                  "<<<    name=%s uid=%s gid=%s muid=%s extension=(%s)\n"
1722                  "<<<    uid=%d gid=%d n_muid=%d\n",
1723                  ret->size, ret->type, ret->dev, ret->qid.type, ret->qid.path,
1724                  ret->qid.version, ret->mode,
1725                  ret->atime, ret->mtime, ret->length,
1726                  ret->name, ret->uid, ret->gid, ret->muid, ret->extension,
1727                  from_kuid(&init_user_ns, ret->n_uid),
1728                  from_kgid(&init_user_ns, ret->n_gid),
1729                  from_kuid(&init_user_ns, ret->n_muid));
1730
1731         p9_tag_remove(clnt, req);
1732         return ret;
1733
1734 error:
1735         kfree(ret);
1736         return ERR_PTR(err);
1737 }
1738 EXPORT_SYMBOL(p9_client_stat);
1739
1740 struct p9_stat_dotl *p9_client_getattr_dotl(struct p9_fid *fid,
1741                                             u64 request_mask)
1742 {
1743         int err;
1744         struct p9_client *clnt;
1745         struct p9_stat_dotl *ret;
1746         struct p9_req_t *req;
1747
1748         p9_debug(P9_DEBUG_9P, ">>> TGETATTR fid %d, request_mask %lld\n",
1749                  fid->fid, request_mask);
1750
1751         ret = kmalloc(sizeof(*ret), GFP_KERNEL);
1752         if (!ret)
1753                 return ERR_PTR(-ENOMEM);
1754
1755         err = 0;
1756         clnt = fid->clnt;
1757
1758         req = p9_client_rpc(clnt, P9_TGETATTR, "dq", fid->fid, request_mask);
1759         if (IS_ERR(req)) {
1760                 err = PTR_ERR(req);
1761                 goto error;
1762         }
1763
1764         err = p9pdu_readf(&req->rc, clnt->proto_version, "A", ret);
1765         if (err) {
1766                 trace_9p_protocol_dump(clnt, &req->rc);
1767                 p9_tag_remove(clnt, req);
1768                 goto error;
1769         }
1770
1771         p9_debug(P9_DEBUG_9P, "<<< RGETATTR st_result_mask=%lld\n"
1772                  "<<< qid=%x.%llx.%x\n"
1773                  "<<< st_mode=%8.8x st_nlink=%llu\n"
1774                  "<<< st_uid=%d st_gid=%d\n"
1775                  "<<< st_rdev=%llx st_size=%llx st_blksize=%llu st_blocks=%llu\n"
1776                  "<<< st_atime_sec=%lld st_atime_nsec=%lld\n"
1777                  "<<< st_mtime_sec=%lld st_mtime_nsec=%lld\n"
1778                  "<<< st_ctime_sec=%lld st_ctime_nsec=%lld\n"
1779                  "<<< st_btime_sec=%lld st_btime_nsec=%lld\n"
1780                  "<<< st_gen=%lld st_data_version=%lld\n",
1781                  ret->st_result_mask,
1782                  ret->qid.type, ret->qid.path, ret->qid.version,
1783                  ret->st_mode, ret->st_nlink,
1784                  from_kuid(&init_user_ns, ret->st_uid),
1785                  from_kgid(&init_user_ns, ret->st_gid),
1786                  ret->st_rdev, ret->st_size, ret->st_blksize, ret->st_blocks,
1787                  ret->st_atime_sec, ret->st_atime_nsec,
1788                  ret->st_mtime_sec, ret->st_mtime_nsec,
1789                  ret->st_ctime_sec, ret->st_ctime_nsec,
1790                  ret->st_btime_sec, ret->st_btime_nsec,
1791                  ret->st_gen, ret->st_data_version);
1792
1793         p9_tag_remove(clnt, req);
1794         return ret;
1795
1796 error:
1797         kfree(ret);
1798         return ERR_PTR(err);
1799 }
1800 EXPORT_SYMBOL(p9_client_getattr_dotl);
1801
1802 static int p9_client_statsize(struct p9_wstat *wst, int proto_version)
1803 {
1804         int ret;
1805
1806         /* NOTE: size shouldn't include its own length */
1807         /* size[2] type[2] dev[4] qid[13] */
1808         /* mode[4] atime[4] mtime[4] length[8]*/
1809         /* name[s] uid[s] gid[s] muid[s] */
1810         ret = 2 + 4 + 13 + 4 + 4 + 4 + 8 + 2 + 2 + 2 + 2;
1811
1812         if (wst->name)
1813                 ret += strlen(wst->name);
1814         if (wst->uid)
1815                 ret += strlen(wst->uid);
1816         if (wst->gid)
1817                 ret += strlen(wst->gid);
1818         if (wst->muid)
1819                 ret += strlen(wst->muid);
1820
1821         if (proto_version == p9_proto_2000u ||
1822             proto_version == p9_proto_2000L) {
1823                 /* extension[s] n_uid[4] n_gid[4] n_muid[4] */
1824                 ret += 2 + 4 + 4 + 4;
1825                 if (wst->extension)
1826                         ret += strlen(wst->extension);
1827         }
1828
1829         return ret;
1830 }
1831
1832 int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst)
1833 {
1834         int err;
1835         struct p9_req_t *req;
1836         struct p9_client *clnt;
1837
1838         err = 0;
1839         clnt = fid->clnt;
1840         wst->size = p9_client_statsize(wst, clnt->proto_version);
1841         p9_debug(P9_DEBUG_9P, ">>> TWSTAT fid %d\n",
1842                  fid->fid);
1843         p9_debug(P9_DEBUG_9P,
1844                  "     sz=%x type=%x dev=%x qid=%x.%llx.%x\n"
1845                  "     mode=%8.8x atime=%8.8x mtime=%8.8x length=%llx\n"
1846                  "     name=%s uid=%s gid=%s muid=%s extension=(%s)\n"
1847                  "     uid=%d gid=%d n_muid=%d\n",
1848                  wst->size, wst->type, wst->dev, wst->qid.type,
1849                  wst->qid.path, wst->qid.version,
1850                  wst->mode, wst->atime, wst->mtime, wst->length,
1851                  wst->name, wst->uid, wst->gid, wst->muid, wst->extension,
1852                  from_kuid(&init_user_ns, wst->n_uid),
1853                  from_kgid(&init_user_ns, wst->n_gid),
1854                  from_kuid(&init_user_ns, wst->n_muid));
1855
1856         req = p9_client_rpc(clnt, P9_TWSTAT, "dwS",
1857                             fid->fid, wst->size + 2, wst);
1858         if (IS_ERR(req)) {
1859                 err = PTR_ERR(req);
1860                 goto error;
1861         }
1862
1863         p9_debug(P9_DEBUG_9P, "<<< RWSTAT fid %d\n", fid->fid);
1864
1865         p9_tag_remove(clnt, req);
1866 error:
1867         return err;
1868 }
1869 EXPORT_SYMBOL(p9_client_wstat);
1870
1871 int p9_client_setattr(struct p9_fid *fid, struct p9_iattr_dotl *p9attr)
1872 {
1873         int err;
1874         struct p9_req_t *req;
1875         struct p9_client *clnt;
1876
1877         err = 0;
1878         clnt = fid->clnt;
1879         p9_debug(P9_DEBUG_9P, ">>> TSETATTR fid %d\n", fid->fid);
1880         p9_debug(P9_DEBUG_9P, "    valid=%x mode=%x uid=%d gid=%d size=%lld\n",
1881                  p9attr->valid, p9attr->mode,
1882                  from_kuid(&init_user_ns, p9attr->uid),
1883                  from_kgid(&init_user_ns, p9attr->gid),
1884                  p9attr->size);
1885         p9_debug(P9_DEBUG_9P, "    atime_sec=%lld atime_nsec=%lld\n",
1886                  p9attr->atime_sec, p9attr->atime_nsec);
1887         p9_debug(P9_DEBUG_9P, "    mtime_sec=%lld mtime_nsec=%lld\n",
1888                  p9attr->mtime_sec, p9attr->mtime_nsec);
1889
1890         req = p9_client_rpc(clnt, P9_TSETATTR, "dI", fid->fid, p9attr);
1891
1892         if (IS_ERR(req)) {
1893                 err = PTR_ERR(req);
1894                 goto error;
1895         }
1896         p9_debug(P9_DEBUG_9P, "<<< RSETATTR fid %d\n", fid->fid);
1897         p9_tag_remove(clnt, req);
1898 error:
1899         return err;
1900 }
1901 EXPORT_SYMBOL(p9_client_setattr);
1902
1903 int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb)
1904 {
1905         int err;
1906         struct p9_req_t *req;
1907         struct p9_client *clnt;
1908
1909         err = 0;
1910         clnt = fid->clnt;
1911
1912         p9_debug(P9_DEBUG_9P, ">>> TSTATFS fid %d\n", fid->fid);
1913
1914         req = p9_client_rpc(clnt, P9_TSTATFS, "d", fid->fid);
1915         if (IS_ERR(req)) {
1916                 err = PTR_ERR(req);
1917                 goto error;
1918         }
1919
1920         err = p9pdu_readf(&req->rc, clnt->proto_version, "ddqqqqqqd", &sb->type,
1921                           &sb->bsize, &sb->blocks, &sb->bfree, &sb->bavail,
1922                           &sb->files, &sb->ffree, &sb->fsid, &sb->namelen);
1923         if (err) {
1924                 trace_9p_protocol_dump(clnt, &req->rc);
1925                 p9_tag_remove(clnt, req);
1926                 goto error;
1927         }
1928
1929         p9_debug(P9_DEBUG_9P,
1930                  "<<< RSTATFS fid %d type 0x%x bsize %u blocks %llu bfree %llu bavail %llu files %llu ffree %llu fsid %llu namelen %u\n",
1931                  fid->fid, sb->type, sb->bsize, sb->blocks, sb->bfree,
1932                  sb->bavail, sb->files, sb->ffree, sb->fsid, sb->namelen);
1933
1934         p9_tag_remove(clnt, req);
1935 error:
1936         return err;
1937 }
1938 EXPORT_SYMBOL(p9_client_statfs);
1939
1940 int p9_client_rename(struct p9_fid *fid,
1941                      struct p9_fid *newdirfid, const char *name)
1942 {
1943         int err;
1944         struct p9_req_t *req;
1945         struct p9_client *clnt;
1946
1947         err = 0;
1948         clnt = fid->clnt;
1949
1950         p9_debug(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n",
1951                  fid->fid, newdirfid->fid, name);
1952
1953         req = p9_client_rpc(clnt, P9_TRENAME, "dds", fid->fid,
1954                             newdirfid->fid, name);
1955         if (IS_ERR(req)) {
1956                 err = PTR_ERR(req);
1957                 goto error;
1958         }
1959
1960         p9_debug(P9_DEBUG_9P, "<<< RRENAME fid %d\n", fid->fid);
1961
1962         p9_tag_remove(clnt, req);
1963 error:
1964         return err;
1965 }
1966 EXPORT_SYMBOL(p9_client_rename);
1967
1968 int p9_client_renameat(struct p9_fid *olddirfid, const char *old_name,
1969                        struct p9_fid *newdirfid, const char *new_name)
1970 {
1971         int err;
1972         struct p9_req_t *req;
1973         struct p9_client *clnt;
1974
1975         err = 0;
1976         clnt = olddirfid->clnt;
1977
1978         p9_debug(P9_DEBUG_9P,
1979                  ">>> TRENAMEAT olddirfid %d old name %s newdirfid %d new name %s\n",
1980                  olddirfid->fid, old_name, newdirfid->fid, new_name);
1981
1982         req = p9_client_rpc(clnt, P9_TRENAMEAT, "dsds", olddirfid->fid,
1983                             old_name, newdirfid->fid, new_name);
1984         if (IS_ERR(req)) {
1985                 err = PTR_ERR(req);
1986                 goto error;
1987         }
1988
1989         p9_debug(P9_DEBUG_9P, "<<< RRENAMEAT newdirfid %d new name %s\n",
1990                  newdirfid->fid, new_name);
1991
1992         p9_tag_remove(clnt, req);
1993 error:
1994         return err;
1995 }
1996 EXPORT_SYMBOL(p9_client_renameat);
1997
1998 /* An xattrwalk without @attr_name gives the fid for the lisxattr namespace
1999  */
2000 struct p9_fid *p9_client_xattrwalk(struct p9_fid *file_fid,
2001                                    const char *attr_name, u64 *attr_size)
2002 {
2003         int err;
2004         struct p9_req_t *req;
2005         struct p9_client *clnt;
2006         struct p9_fid *attr_fid;
2007
2008         err = 0;
2009         clnt = file_fid->clnt;
2010         attr_fid = p9_fid_create(clnt);
2011         if (!attr_fid) {
2012                 err = -ENOMEM;
2013                 goto error;
2014         }
2015         p9_debug(P9_DEBUG_9P,
2016                  ">>> TXATTRWALK file_fid %d, attr_fid %d name %s\n",
2017                  file_fid->fid, attr_fid->fid, attr_name);
2018
2019         req = p9_client_rpc(clnt, P9_TXATTRWALK, "dds",
2020                             file_fid->fid, attr_fid->fid, attr_name);
2021         if (IS_ERR(req)) {
2022                 err = PTR_ERR(req);
2023                 goto error;
2024         }
2025         err = p9pdu_readf(&req->rc, clnt->proto_version, "q", attr_size);
2026         if (err) {
2027                 trace_9p_protocol_dump(clnt, &req->rc);
2028                 p9_tag_remove(clnt, req);
2029                 goto clunk_fid;
2030         }
2031         p9_tag_remove(clnt, req);
2032         p9_debug(P9_DEBUG_9P, "<<<  RXATTRWALK fid %d size %llu\n",
2033                  attr_fid->fid, *attr_size);
2034         return attr_fid;
2035 clunk_fid:
2036         p9_client_clunk(attr_fid);
2037         attr_fid = NULL;
2038 error:
2039         if (attr_fid && attr_fid != file_fid)
2040                 p9_fid_destroy(attr_fid);
2041
2042         return ERR_PTR(err);
2043 }
2044 EXPORT_SYMBOL_GPL(p9_client_xattrwalk);
2045
2046 int p9_client_xattrcreate(struct p9_fid *fid, const char *name,
2047                           u64 attr_size, int flags)
2048 {
2049         int err;
2050         struct p9_req_t *req;
2051         struct p9_client *clnt;
2052
2053         p9_debug(P9_DEBUG_9P,
2054                  ">>> TXATTRCREATE fid %d name  %s size %llu flag %d\n",
2055                  fid->fid, name, attr_size, flags);
2056         err = 0;
2057         clnt = fid->clnt;
2058         req = p9_client_rpc(clnt, P9_TXATTRCREATE, "dsqd",
2059                             fid->fid, name, attr_size, flags);
2060         if (IS_ERR(req)) {
2061                 err = PTR_ERR(req);
2062                 goto error;
2063         }
2064         p9_debug(P9_DEBUG_9P, "<<< RXATTRCREATE fid %d\n", fid->fid);
2065         p9_tag_remove(clnt, req);
2066 error:
2067         return err;
2068 }
2069 EXPORT_SYMBOL_GPL(p9_client_xattrcreate);
2070
2071 int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset)
2072 {
2073         int err, rsize, non_zc = 0;
2074         struct p9_client *clnt;
2075         struct p9_req_t *req;
2076         char *dataptr;
2077         struct kvec kv = {.iov_base = data, .iov_len = count};
2078         struct iov_iter to;
2079
2080         iov_iter_kvec(&to, READ, &kv, 1, count);
2081
2082         p9_debug(P9_DEBUG_9P, ">>> TREADDIR fid %d offset %llu count %d\n",
2083                  fid->fid, offset, count);
2084
2085         err = 0;
2086         clnt = fid->clnt;
2087
2088         rsize = fid->iounit;
2089         if (!rsize || rsize > clnt->msize - P9_READDIRHDRSZ)
2090                 rsize = clnt->msize - P9_READDIRHDRSZ;
2091
2092         if (count < rsize)
2093                 rsize = count;
2094
2095         /* Don't bother zerocopy for small IO (< 1024) */
2096         if (clnt->trans_mod->zc_request && rsize > 1024) {
2097                 /* response header len is 11
2098                  * PDU Header(7) + IO Size (4)
2099                  */
2100                 req = p9_client_zc_rpc(clnt, P9_TREADDIR, &to, NULL, rsize, 0,
2101                                        11, "dqd", fid->fid, offset, rsize);
2102         } else {
2103                 non_zc = 1;
2104                 req = p9_client_rpc(clnt, P9_TREADDIR, "dqd", fid->fid,
2105                                     offset, rsize);
2106         }
2107         if (IS_ERR(req)) {
2108                 err = PTR_ERR(req);
2109                 goto error;
2110         }
2111
2112         err = p9pdu_readf(&req->rc, clnt->proto_version, "D", &count, &dataptr);
2113         if (err) {
2114                 trace_9p_protocol_dump(clnt, &req->rc);
2115                 goto free_and_error;
2116         }
2117         if (rsize < count) {
2118                 pr_err("bogus RREADDIR count (%d > %d)\n", count, rsize);
2119                 count = rsize;
2120         }
2121
2122         p9_debug(P9_DEBUG_9P, "<<< RREADDIR count %d\n", count);
2123
2124         if (non_zc)
2125                 memmove(data, dataptr, count);
2126
2127         p9_tag_remove(clnt, req);
2128         return count;
2129
2130 free_and_error:
2131         p9_tag_remove(clnt, req);
2132 error:
2133         return err;
2134 }
2135 EXPORT_SYMBOL(p9_client_readdir);
2136
2137 int p9_client_mknod_dotl(struct p9_fid *fid, const char *name, int mode,
2138                          dev_t rdev, kgid_t gid, struct p9_qid *qid)
2139 {
2140         int err;
2141         struct p9_client *clnt;
2142         struct p9_req_t *req;
2143
2144         err = 0;
2145         clnt = fid->clnt;
2146         p9_debug(P9_DEBUG_9P,
2147                  ">>> TMKNOD fid %d name %s mode %d major %d minor %d\n",
2148                  fid->fid, name, mode, MAJOR(rdev), MINOR(rdev));
2149         req = p9_client_rpc(clnt, P9_TMKNOD, "dsdddg", fid->fid, name, mode,
2150                             MAJOR(rdev), MINOR(rdev), gid);
2151         if (IS_ERR(req))
2152                 return PTR_ERR(req);
2153
2154         err = p9pdu_readf(&req->rc, clnt->proto_version, "Q", qid);
2155         if (err) {
2156                 trace_9p_protocol_dump(clnt, &req->rc);
2157                 goto error;
2158         }
2159         p9_debug(P9_DEBUG_9P, "<<< RMKNOD qid %x.%llx.%x\n",
2160                  qid->type, qid->path, qid->version);
2161
2162 error:
2163         p9_tag_remove(clnt, req);
2164         return err;
2165 }
2166 EXPORT_SYMBOL(p9_client_mknod_dotl);
2167
2168 int p9_client_mkdir_dotl(struct p9_fid *fid, const char *name, int mode,
2169                          kgid_t gid, struct p9_qid *qid)
2170 {
2171         int err;
2172         struct p9_client *clnt;
2173         struct p9_req_t *req;
2174
2175         err = 0;
2176         clnt = fid->clnt;
2177         p9_debug(P9_DEBUG_9P, ">>> TMKDIR fid %d name %s mode %d gid %d\n",
2178                  fid->fid, name, mode, from_kgid(&init_user_ns, gid));
2179         req = p9_client_rpc(clnt, P9_TMKDIR, "dsdg",
2180                             fid->fid, name, mode, gid);
2181         if (IS_ERR(req))
2182                 return PTR_ERR(req);
2183
2184         err = p9pdu_readf(&req->rc, clnt->proto_version, "Q", qid);
2185         if (err) {
2186                 trace_9p_protocol_dump(clnt, &req->rc);
2187                 goto error;
2188         }
2189         p9_debug(P9_DEBUG_9P, "<<< RMKDIR qid %x.%llx.%x\n", qid->type,
2190                  qid->path, qid->version);
2191
2192 error:
2193         p9_tag_remove(clnt, req);
2194         return err;
2195 }
2196 EXPORT_SYMBOL(p9_client_mkdir_dotl);
2197
2198 int p9_client_lock_dotl(struct p9_fid *fid, struct p9_flock *flock, u8 *status)
2199 {
2200         int err;
2201         struct p9_client *clnt;
2202         struct p9_req_t *req;
2203
2204         err = 0;
2205         clnt = fid->clnt;
2206         p9_debug(P9_DEBUG_9P,
2207                  ">>> TLOCK fid %d type %i flags %d start %lld length %lld proc_id %d client_id %s\n",
2208                  fid->fid, flock->type, flock->flags, flock->start,
2209                  flock->length, flock->proc_id, flock->client_id);
2210
2211         req = p9_client_rpc(clnt, P9_TLOCK, "dbdqqds", fid->fid, flock->type,
2212                             flock->flags, flock->start, flock->length,
2213                             flock->proc_id, flock->client_id);
2214
2215         if (IS_ERR(req))
2216                 return PTR_ERR(req);
2217
2218         err = p9pdu_readf(&req->rc, clnt->proto_version, "b", status);
2219         if (err) {
2220                 trace_9p_protocol_dump(clnt, &req->rc);
2221                 goto error;
2222         }
2223         p9_debug(P9_DEBUG_9P, "<<< RLOCK status %i\n", *status);
2224 error:
2225         p9_tag_remove(clnt, req);
2226         return err;
2227 }
2228 EXPORT_SYMBOL(p9_client_lock_dotl);
2229
2230 int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *glock)
2231 {
2232         int err;
2233         struct p9_client *clnt;
2234         struct p9_req_t *req;
2235
2236         err = 0;
2237         clnt = fid->clnt;
2238         p9_debug(P9_DEBUG_9P,
2239                  ">>> TGETLOCK fid %d, type %i start %lld length %lld proc_id %d client_id %s\n",
2240                  fid->fid, glock->type, glock->start, glock->length,
2241                  glock->proc_id, glock->client_id);
2242
2243         req = p9_client_rpc(clnt, P9_TGETLOCK, "dbqqds", fid->fid,
2244                             glock->type, glock->start, glock->length,
2245                             glock->proc_id, glock->client_id);
2246
2247         if (IS_ERR(req))
2248                 return PTR_ERR(req);
2249
2250         err = p9pdu_readf(&req->rc, clnt->proto_version, "bqqds", &glock->type,
2251                           &glock->start, &glock->length, &glock->proc_id,
2252                           &glock->client_id);
2253         if (err) {
2254                 trace_9p_protocol_dump(clnt, &req->rc);
2255                 goto error;
2256         }
2257         p9_debug(P9_DEBUG_9P,
2258                  "<<< RGETLOCK type %i start %lld length %lld proc_id %d client_id %s\n",
2259                  glock->type, glock->start, glock->length,
2260                  glock->proc_id, glock->client_id);
2261 error:
2262         p9_tag_remove(clnt, req);
2263         return err;
2264 }
2265 EXPORT_SYMBOL(p9_client_getlock_dotl);
2266
2267 int p9_client_readlink(struct p9_fid *fid, char **target)
2268 {
2269         int err;
2270         struct p9_client *clnt;
2271         struct p9_req_t *req;
2272
2273         err = 0;
2274         clnt = fid->clnt;
2275         p9_debug(P9_DEBUG_9P, ">>> TREADLINK fid %d\n", fid->fid);
2276
2277         req = p9_client_rpc(clnt, P9_TREADLINK, "d", fid->fid);
2278         if (IS_ERR(req))
2279                 return PTR_ERR(req);
2280
2281         err = p9pdu_readf(&req->rc, clnt->proto_version, "s", target);
2282         if (err) {
2283                 trace_9p_protocol_dump(clnt, &req->rc);
2284                 goto error;
2285         }
2286         p9_debug(P9_DEBUG_9P, "<<< RREADLINK target %s\n", *target);
2287 error:
2288         p9_tag_remove(clnt, req);
2289         return err;
2290 }
2291 EXPORT_SYMBOL(p9_client_readlink);
2292
2293 int __init p9_client_init(void)
2294 {
2295         p9_req_cache = KMEM_CACHE(p9_req_t, SLAB_TYPESAFE_BY_RCU);
2296         return p9_req_cache ? 0 : -ENOMEM;
2297 }
2298
2299 void __exit p9_client_exit(void)
2300 {
2301         kmem_cache_destroy(p9_req_cache);
2302 }