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