9p: Implement LOPEN
authorM. Mohan Kumar <mohan@in.ibm.com>
Tue, 22 Jun 2010 14:17:50 +0000 (19:47 +0530)
committerEric Van Hensbergen <ericvh@gmail.com>
Mon, 2 Aug 2010 19:28:32 +0000 (14:28 -0500)
Implement 9p2000.L version of open(LOPEN) interface in 9p client.

For LOPEN, no need to convert the flags to and from 9p mode to VFS mode.

Synopsis:

    size[4] Tlopen tag[2] fid[4] mode[4]

    size[4] Rlopen tag[2] qid[13] iounit[4]

[Fix mode bit format - jvrao@linux.vnet.ibm.com]

Signed-off-by: M. Mohan Kumar <mohan@in.ibm.com>
Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbegren <ericvh@gmail.com>
fs/9p/vfs_file.c
include/net/9p/9p.h
net/9p/client.c

index 2d686ec322a085190964b97087b72f513b9e0ec6..e97c92bd6f16d51c38fa3f98909e62ff9225e2b6 100644 (file)
@@ -59,9 +59,13 @@ int v9fs_file_open(struct inode *inode, struct file *file)
        struct p9_fid *fid;
        int omode;
 
-       P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p \n", inode, file);
+       P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p\n", inode, file);
        v9ses = v9fs_inode2v9ses(inode);
-       omode = v9fs_uflags2omode(file->f_flags, v9fs_proto_dotu(v9ses));
+       if (v9fs_proto_dotl(v9ses))
+               omode = file->f_flags;
+       else
+               omode = v9fs_uflags2omode(file->f_flags,
+                                       v9fs_proto_dotu(v9ses));
        fid = file->private_data;
        if (!fid) {
                fid = v9fs_fid_clone(file->f_path.dentry);
@@ -73,11 +77,12 @@ int v9fs_file_open(struct inode *inode, struct file *file)
                        p9_client_clunk(fid);
                        return err;
                }
-               if (omode & P9_OTRUNC) {
+               if (file->f_flags & O_TRUNC) {
                        i_size_write(inode, 0);
                        inode->i_blocks = 0;
                }
-               if ((file->f_flags & O_APPEND) && (!v9fs_proto_dotu(v9ses)))
+               if ((file->f_flags & O_APPEND) &&
+                       (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)))
                        generic_file_llseek(file, 0, SEEK_END);
        }
 
index 06d111d61038c9f6a2b64b1b6eb212d00498a1d3..cf580a40e299e1880a0d50e76cc1e21eb98152ae 100644 (file)
@@ -139,6 +139,8 @@ do { \
 enum p9_msg_t {
        P9_TSTATFS = 8,
        P9_RSTATFS,
+       P9_TLOPEN = 12,
+       P9_RLOPEN,
        P9_TLCREATE = 14,
        P9_RLCREATE,
        P9_TSYMLINK = 16,
index e580409b1052677b9f39a4e6275cea7248305e64..c458e042d38436484645186f60511f27bc449796 100644 (file)
@@ -1016,14 +1016,18 @@ int p9_client_open(struct p9_fid *fid, int mode)
        struct p9_qid qid;
        int iounit;
 
-       P9_DPRINTK(P9_DEBUG_9P, ">>> TOPEN fid %d mode %d\n", fid->fid, mode);
-       err = 0;
        clnt = fid->clnt;
+       P9_DPRINTK(P9_DEBUG_9P, ">>> %s fid %d mode %d\n",
+               p9_is_proto_dotl(clnt) ? "TLOPEN" : "TOPEN", fid->fid, mode);
+       err = 0;
 
        if (fid->mode != -1)
                return -EINVAL;
 
-       req = p9_client_rpc(clnt, P9_TOPEN, "db", fid->fid, mode);
+       if (p9_is_proto_dotl(clnt))
+               req = p9_client_rpc(clnt, P9_TLOPEN, "dd", fid->fid, mode);
+       else
+               req = p9_client_rpc(clnt, P9_TOPEN, "db", fid->fid, mode);
        if (IS_ERR(req)) {
                err = PTR_ERR(req);
                goto error;
@@ -1035,10 +1039,9 @@ int p9_client_open(struct p9_fid *fid, int mode)
                goto free_and_error;
        }
 
-       P9_DPRINTK(P9_DEBUG_9P, "<<< ROPEN qid %x.%llx.%x iounit %x\n",
-                               qid.type,
-                               (unsigned long long)qid.path,
-                               qid.version, iounit);
+       P9_DPRINTK(P9_DEBUG_9P, "<<< %s qid %x.%llx.%x iounit %x\n",
+               p9_is_proto_dotl(clnt) ? "RLOPEN" : "ROPEN",  qid.type,
+               (unsigned long long)qid.path, qid.version, iounit);
 
        fid->mode = mode;
        fid->iounit = iounit;