Merge tag '9p-for-4.19-2' of git://github.com/martinetd/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Aug 2018 00:27:58 +0000 (17:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Aug 2018 00:27:58 +0000 (17:27 -0700)
Pull 9p updates from Dominique Martinet:
 "This contains mostly fixes (6 to be backported to stable) and a few
  changes, here is the breakdown:

   - rework how fids are attributed by replacing some custom tracking in
     a list by an idr

   - for packet-based transports (virtio/rdma) validate that the packet
     length matches what the header says

   - a few race condition fixes found by syzkaller

   - missing argument check when NULL device is passed in sys_mount

   - a few virtio fixes

   - some spelling and style fixes"

* tag '9p-for-4.19-2' of git://github.com/martinetd/linux: (21 commits)
  net/9p/trans_virtio.c: add null terminal for mount tag
  9p/virtio: fix off-by-one error in sg list bounds check
  9p: fix whitespace issues
  9p: fix multiple NULL-pointer-dereferences
  fs/9p/xattr.c: catch the error of p9_client_clunk when setting xattr failed
  9p: validate PDU length
  net/9p/trans_fd.c: fix race by holding the lock
  net/9p/trans_fd.c: fix race-condition by flushing workqueue before the kfree()
  net/9p/virtio: Fix hard lockup in req_done
  net/9p/trans_virtio.c: fix some spell mistakes in comments
  9p/net: Fix zero-copy path in the 9p virtio transport
  9p: Embed wait_queue_head into p9_req_t
  9p: Replace the fidlist with an IDR
  9p: Change p9_fid_create calling convention
  9p: Fix comment on smp_wmb
  net/9p/client.c: version pointer uninitialized
  fs/9p/v9fs.c: fix spelling mistake "Uknown" -> "Unknown"
  net/9p: fix error path of p9_virtio_probe
  9p/net/protocol.c: return -ENOMEM when kmalloc() failed
  net/9p/client.c: add missing '\n' at the end of p9_debug()
  ...

1  2 
net/9p/trans_rdma.c

diff --combined net/9p/trans_rdma.c
index b06286f253cbf29ea6a8a0e49e10987c86e0e19c,2ab4574183c93f8c403fa79346cb2a3935ce5d02..b513cffeeb3c05d721ac2e203fd5687ad5b2b037
@@@ -320,6 -320,7 +320,7 @@@ recv_done(struct ib_cq *cq, struct ib_w
        if (wc->status != IB_WC_SUCCESS)
                goto err_out;
  
+       c->rc->size = wc->byte_len;
        err = p9_parse_header(c->rc, NULL, NULL, &tag, 1);
        if (err)
                goto err_out;
@@@ -396,7 -397,7 +397,7 @@@ static in
  post_recv(struct p9_client *client, struct p9_rdma_context *c)
  {
        struct p9_trans_rdma *rdma = client->trans;
 -      struct ib_recv_wr wr, *bad_wr;
 +      struct ib_recv_wr wr;
        struct ib_sge sge;
  
        c->busa = ib_dma_map_single(rdma->cm_id->device,
        wr.wr_cqe = &c->cqe;
        wr.sg_list = &sge;
        wr.num_sge = 1;
 -      return ib_post_recv(rdma->qp, &wr, &bad_wr);
 +      return ib_post_recv(rdma->qp, &wr, NULL);
  
   error:
        p9_debug(P9_DEBUG_ERROR, "EIO\n");
  static int rdma_request(struct p9_client *client, struct p9_req_t *req)
  {
        struct p9_trans_rdma *rdma = client->trans;
 -      struct ib_send_wr wr, *bad_wr;
 +      struct ib_send_wr wr;
        struct ib_sge sge;
        int err = 0;
        unsigned long flags;
@@@ -520,7 -521,7 +521,7 @@@ dont_need_post_recv
         * status in case of a very fast reply.
         */
        req->status = REQ_STATUS_SENT;
 -      err = ib_post_send(rdma->qp, &wr, &bad_wr);
 +      err = ib_post_send(rdma->qp, &wr, NULL);
        if (err)
                goto send_error;
  
@@@ -644,6 -645,9 +645,9 @@@ rdma_create_trans(struct p9_client *cli
        struct rdma_conn_param conn_param;
        struct ib_qp_init_attr qp_attr;
  
+       if (addr == NULL)
+               return -EINVAL;
        /* Parse the transport specific mount options */
        err = parse_opts(args, &opts);
        if (err < 0)