Merge tag 'for-linus-4.1-merge-window' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Apr 2015 21:45:30 +0000 (17:45 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 18 Apr 2015 21:45:30 +0000 (17:45 -0400)
Pull 9pfs updates from Eric Van Hensbergen:
 "Some accumulated cleanup patches for kerneldoc and unused variables as
  well as some lock bug fixes and adding privateport option for RDMA"

* tag 'for-linus-4.1-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
  net/9p: add a privport option for RDMA transport.
  fs/9p: Initialize status in v9fs_file_do_lock.
  net/9p: Initialize opts->privport as it should be.
  net/9p: use memcpy() instead of snprintf() in p9_mount_tag_show()
  9p: use unsigned integers for nwqid/count
  9p: do not crash on unknown lock status code
  9p: fix error handling in v9fs_file_do_lock
  9p: remove unused variable in p9_fd_create()
  9p: kerneldoc warning fixes

fs/9p/v9fs.h
fs/9p/vfs_addr.c
fs/9p/vfs_file.c
net/9p/protocol.c
net/9p/trans_fd.c
net/9p/trans_rdma.c
net/9p/trans_virtio.c

index 099c7712631ca698cf43dd6337d483e7e9ebf126..fb9ffcb432779b55620909090b825ead7ddbcede 100644 (file)
@@ -78,7 +78,6 @@ enum p9_cache_modes {
  * @cache: cache mode of type &p9_cache_modes
  * @cachetag: the tag of the cache associated with this session
  * @fscache: session cookie associated with FS-Cache
- * @options: copy of options string given by user
  * @uname: string user name to mount hierarchy as
  * @aname: mount specifier for remote hierarchy
  * @maxdata: maximum data to be sent/recvd per protocol message
index be35d05a4d0efc00c5955cc047ac20bea293149a..e9e04376c52ce8ef4673d041281c1db1e2c4ac99 100644 (file)
@@ -231,9 +231,7 @@ static int v9fs_launder_page(struct page *page)
 /**
  * v9fs_direct_IO - 9P address space operation for direct I/O
  * @iocb: target I/O control block
- * @iov: array of vectors that define I/O buffer
  * @pos: offset in file to begin the operation
- * @nr_segs: size of iovec array
  *
  * The presence of v9fs_direct_IO() in the address space ops vector
  * allowes open() O_DIRECT flags which would have failed otherwise.
index 2a9dd37dc426d6cf38eeac64727217164c903ae6..1ef16bd8280b595c0d261bcfa4246d5473d7015e 100644 (file)
@@ -151,7 +151,7 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
 {
        struct p9_flock flock;
        struct p9_fid *fid;
-       uint8_t status;
+       uint8_t status = P9_LOCK_ERROR;
        int res = 0;
        unsigned char fl_type;
 
@@ -196,7 +196,7 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
        for (;;) {
                res = p9_client_lock_dotl(fid, &flock, &status);
                if (res < 0)
-                       break;
+                       goto out_unlock;
 
                if (status != P9_LOCK_BLOCKED)
                        break;
@@ -214,14 +214,16 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
        case P9_LOCK_BLOCKED:
                res = -EAGAIN;
                break;
+       default:
+               WARN_ONCE(1, "unknown lock status code: %d\n", status);
+               /* fallthough */
        case P9_LOCK_ERROR:
        case P9_LOCK_GRACE:
                res = -ENOLCK;
                break;
-       default:
-               BUG();
        }
 
+out_unlock:
        /*
         * incase server returned error for lock request, revert
         * it locally
index e9d0f0c1a04827f0d1cc0f554f6b4dfaabb2c414..16d28756598789504f9a30a07476256a2146b2e3 100644 (file)
@@ -275,7 +275,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt,
                        }
                        break;
                case 'R':{
-                               int16_t *nwqid = va_arg(ap, int16_t *);
+                               uint16_t *nwqid = va_arg(ap, uint16_t *);
                                struct p9_qid **wqids =
                                    va_arg(ap, struct p9_qid **);
 
@@ -440,7 +440,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
                                                 stbuf->n_gid, stbuf->n_muid);
                        } break;
                case 'V':{
-                               int32_t count = va_arg(ap, int32_t);
+                               uint32_t count = va_arg(ap, uint32_t);
                                struct iov_iter *from =
                                                va_arg(ap, struct iov_iter *);
                                errcode = p9pdu_writef(pdu, proto_version, "d",
@@ -471,7 +471,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
                        }
                        break;
                case 'R':{
-                               int16_t nwqid = va_arg(ap, int);
+                               uint16_t nwqid = va_arg(ap, int);
                                struct p9_qid *wqids =
                                    va_arg(ap, struct p9_qid *);
 
index 3e3d82d8ff70506c2878d4b55bf44269ed26b5cb..bced8c074c1280c6ff175576cb035bf048f18ddd 100644 (file)
@@ -734,6 +734,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts)
        opts->port = P9_PORT;
        opts->rfd = ~0;
        opts->wfd = ~0;
+       opts->privport = 0;
 
        if (!params)
                return 0;
@@ -1013,7 +1014,6 @@ p9_fd_create(struct p9_client *client, const char *addr, char *args)
 {
        int err;
        struct p9_fd_opts opts;
-       struct p9_trans_fd *p;
 
        parse_opts(args, &opts);
 
@@ -1026,7 +1026,6 @@ p9_fd_create(struct p9_client *client, const char *addr, char *args)
        if (err < 0)
                return err;
 
-       p = (struct p9_trans_fd *) client->trans;
        p9_conn_create(client);
 
        return 0;
index 14ad43b5cf89a323f3de9d2ca03879f4b4c9bf35..3533d2a53ab649e634487edfa63dcc965a3ffa07 100644 (file)
@@ -139,6 +139,7 @@ struct p9_rdma_opts {
        int sq_depth;
        int rq_depth;
        long timeout;
+       int privport;
 };
 
 /*
@@ -146,7 +147,10 @@ struct p9_rdma_opts {
  */
 enum {
        /* Options that take integer arguments */
-       Opt_port, Opt_rq_depth, Opt_sq_depth, Opt_timeout, Opt_err,
+       Opt_port, Opt_rq_depth, Opt_sq_depth, Opt_timeout,
+       /* Options that take no argument */
+       Opt_privport,
+       Opt_err,
 };
 
 static match_table_t tokens = {
@@ -154,6 +158,7 @@ static match_table_t tokens = {
        {Opt_sq_depth, "sq=%u"},
        {Opt_rq_depth, "rq=%u"},
        {Opt_timeout, "timeout=%u"},
+       {Opt_privport, "privport"},
        {Opt_err, NULL},
 };
 
@@ -175,6 +180,7 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
        opts->sq_depth = P9_RDMA_SQ_DEPTH;
        opts->rq_depth = P9_RDMA_RQ_DEPTH;
        opts->timeout = P9_RDMA_TIMEOUT;
+       opts->privport = 0;
 
        if (!params)
                return 0;
@@ -193,13 +199,13 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
                if (!*p)
                        continue;
                token = match_token(p, tokens, args);
-               if (token == Opt_err)
-                       continue;
-               r = match_int(&args[0], &option);
-               if (r < 0) {
-                       p9_debug(P9_DEBUG_ERROR,
-                                "integer field, but no integer?\n");
-                       continue;
+               if ((token != Opt_err) && (token != Opt_privport)) {
+                       r = match_int(&args[0], &option);
+                       if (r < 0) {
+                               p9_debug(P9_DEBUG_ERROR,
+                                        "integer field, but no integer?\n");
+                               continue;
+                       }
                }
                switch (token) {
                case Opt_port:
@@ -214,6 +220,9 @@ static int parse_opts(char *params, struct p9_rdma_opts *opts)
                case Opt_timeout:
                        opts->timeout = option;
                        break;
+               case Opt_privport:
+                       opts->privport = 1;
+                       break;
                default:
                        continue;
                }
@@ -607,6 +616,23 @@ static int rdma_cancelled(struct p9_client *client, struct p9_req_t *req)
        return 0;
 }
 
+static int p9_rdma_bind_privport(struct p9_trans_rdma *rdma)
+{
+       struct sockaddr_in cl = {
+               .sin_family = AF_INET,
+               .sin_addr.s_addr = htonl(INADDR_ANY),
+       };
+       int port, err = -EINVAL;
+
+       for (port = P9_DEF_MAX_RESVPORT; port >= P9_DEF_MIN_RESVPORT; port--) {
+               cl.sin_port = htons((ushort)port);
+               err = rdma_bind_addr(rdma->cm_id, (struct sockaddr *)&cl);
+               if (err != -EADDRINUSE)
+                       break;
+       }
+       return err;
+}
+
 /**
  * trans_create_rdma - Transport method for creating atransport instance
  * @client: client instance
@@ -642,6 +668,16 @@ rdma_create_trans(struct p9_client *client, const char *addr, char *args)
        /* Associate the client with the transport */
        client->trans = rdma;
 
+       /* Bind to a privileged port if we need to */
+       if (opts.privport) {
+               err = p9_rdma_bind_privport(rdma);
+               if (err < 0) {
+                       pr_err("%s (%d): problem binding to privport: %d\n",
+                              __func__, task_pid_nr(current), -err);
+                       goto error;
+               }
+       }
+
        /* Resolve the server's address */
        rdma->addr.sin_family = AF_INET;
        rdma->addr.sin_addr.s_addr = in_aton(addr);
index e62bcbbabb5e3cd43717f7980fce3e280aba3ded..9dd49ca67dbc22a905999de21b8355475ba40052 100644 (file)
@@ -525,7 +525,10 @@ static ssize_t p9_mount_tag_show(struct device *dev,
        vdev = dev_to_virtio(dev);
        chan = vdev->priv;
 
-       return snprintf(buf, chan->tag_len + 1, "%s", chan->tag);
+       memcpy(buf, chan->tag, chan->tag_len);
+       buf[chan->tag_len] = 0;
+
+       return chan->tag_len + 1;
 }
 
 static DEVICE_ATTR(mount_tag, 0444, p9_mount_tag_show, NULL);