9p: add 9P2000.L rename operation
authorSripathi Kodi <sripathik@in.ibm.com>
Thu, 25 Mar 2010 12:47:26 +0000 (12:47 +0000)
committerEric Van Hensbergen <ericvh@gmail.com>
Fri, 21 May 2010 21:44:34 +0000 (16:44 -0500)
I made a V2 of this patch on top of my patches for VFS switches.
All the changes were due to change in some offsets.

rename - change name of file or directory

size[4] Trename tag[2] fid[4] newdirfid[4] name[s]
size[4] Rrename tag[2]

The rename message is used to change the name of a file, possibly moving it
to a new directory.  The 9P wstat message can only rename a file within the
same directory.

Signed-off-by: Jim Garlick <garlick@llnl.gov>
Signed-off-by: Sripathi Kodi <sripathik@in.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
fs/9p/vfs_inode.c
include/net/9p/9p.h
include/net/9p/client.h
net/9p/client.c

index 13a8ed6088b8cd654c2b38f86ede0b4201789a06..de9a39590b70eb29b02af909942b8cae2cfd1fc8 100644 (file)
@@ -794,6 +794,13 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                goto clunk_olddir;
        }
 
+       if (v9fs_proto_dotl(v9ses)) {
+               retval = p9_client_rename(oldfid, newdirfid,
+                                       (char *) new_dentry->d_name.name);
+               if (retval != -ENOSYS)
+                       goto clunk_newdir;
+       }
+
        /* 9P can only handle file rename in the same directory */
        if (memcmp(&olddirfid->qid, &newdirfid->qid, sizeof(newdirfid->qid))) {
                P9_DPRINTK(P9_DEBUG_ERROR,
index 59300dc22dd0db45e908496b3676adf0520f2f1f..156c26bb8bd7d0f71057b0ec5d6f3802e4792054 100644 (file)
@@ -88,6 +88,8 @@ do { \
  * enum p9_msg_t - 9P message types
  * @P9_TSTATFS: file system status request
  * @P9_RSTATFS: file system status response
+ * @P9_TRENAME: rename request
+ * @P9_RRENAME: rename response
  * @P9_TVERSION: version handshake request
  * @P9_RVERSION: version handshake response
  * @P9_TAUTH: request to establish authentication channel
@@ -129,6 +131,8 @@ do { \
 enum p9_msg_t {
        P9_TSTATFS = 8,
        P9_RSTATFS,
+       P9_TRENAME = 20,
+       P9_RRENAME,
        P9_TVERSION = 100,
        P9_RVERSION,
        P9_TAUTH = 102,
@@ -370,6 +374,15 @@ struct p9_rstatfs {
        u32 namelen;
 };
 
+struct p9_trename {
+       u32 fid;
+       u32 newdirfid;
+       struct p9_str name;
+};
+
+struct p9_rrename {
+};
+
 struct p9_tversion {
        u32 msize;
        struct p9_str version;
index f83c0d99e592566499a264ee1407d0765993c40f..7dd3ed85c782a928c42cecf878bb3e7bea8f4462 100644 (file)
@@ -196,6 +196,7 @@ struct p9_fid {
 };
 
 int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb);
+int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name);
 int p9_client_version(struct p9_client *);
 struct p9_client *p9_client_create(const char *dev_name, char *options);
 void p9_client_destroy(struct p9_client *clnt);
index 430a1c4a7c6f8632575e4f939a5ef91679a8351b..37c8da07a80b080c6d93f9a2bdd1226873354af8 100644 (file)
@@ -1404,3 +1404,31 @@ error:
        return err;
 }
 EXPORT_SYMBOL(p9_client_statfs);
+
+int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name)
+{
+       int err;
+       struct p9_req_t *req;
+       struct p9_client *clnt;
+
+       err = 0;
+       clnt = fid->clnt;
+
+       P9_DPRINTK(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n",
+                       fid->fid, newdirfid->fid, name);
+
+       req = p9_client_rpc(clnt, P9_TRENAME, "dds", fid->fid,
+                       newdirfid->fid, name);
+       if (IS_ERR(req)) {
+               err = PTR_ERR(req);
+               goto error;
+       }
+
+       P9_DPRINTK(P9_DEBUG_9P, "<<< RRENAME fid %d\n", fid->fid);
+
+       p9_free_req(clnt, req);
+error:
+       return err;
+}
+EXPORT_SYMBOL(p9_client_rename);
+