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