]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'v9fs/for-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 9 Apr 2015 02:04:29 +0000 (12:04 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 9 Apr 2015 02:04:29 +0000 (12:04 +1000)
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 eb14e055ea83e8509e7ea6ae569e3c1966d3b896..3672b16feac65b7981d93a6b805a39781dd05295 100644 (file)
@@ -243,9 +243,7 @@ static int v9fs_launder_page(struct page *page)
  * v9fs_direct_IO - 9P address space operation for direct I/O
  * @rw: direction (read or write)
  * @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 b40133796b8734d32cf5376b12d1e01672af85db..bdb103f73e34fa0ec9ef440bc85d1984df2604fb 100644 (file)
@@ -149,7 +149,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;
 
@@ -194,7 +194,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;
@@ -212,14 +212,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 ab9127ec5b7a6881e7dd2116e49819186675562f..305e4789f2ccd98b60dcc67248ee573cbbdd2d44 100644 (file)
@@ -273,7 +273,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 **);
 
@@ -448,7 +448,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
                        }
                        break;
                case 'U':{
-                               int32_t count = va_arg(ap, int32_t);
+                               uint32_t count = va_arg(ap, uint32_t);
                                const char __user *udata =
                                                va_arg(ap, const void __user *);
                                errcode = p9pdu_writef(pdu, proto_version, "d",
@@ -479,7 +479,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 80d08f6664cbb5611eef291b959facd5332a61ef..154479d2756d8d88487c17d3f659871fcb59d828 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 36a1a739ad68ff57eace5ba4bc4166faf12c485b..486df019f8752eef6adc1aec7d5a49d656cd3301 100644 (file)
@@ -504,7 +504,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);