diff options
author | Sripathi Kodi <sripathik@in.ibm.com> | 2010-03-25 08:47:26 -0400 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@gmail.com> | 2010-05-21 17:44:34 -0400 |
commit | 4681dbdacb5cdc4d3273c3a97a1858d6e00a5fe7 (patch) | |
tree | e29be0d9f98caa7ee176cf0a1a3c3a22fca4934d | |
parent | bda8e7752063cdbdd1d308bc1705400a8cec1aeb (diff) |
9p: add 9P2000.L rename operation
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>
-rw-r--r-- | fs/9p/vfs_inode.c | 7 | ||||
-rw-r--r-- | include/net/9p/9p.h | 13 | ||||
-rw-r--r-- | include/net/9p/client.h | 1 | ||||
-rw-r--r-- | net/9p/client.c | 28 |
4 files changed, 49 insertions, 0 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 13a8ed6088b8..de9a39590b70 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -794,6 +794,13 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
794 | goto clunk_olddir; | 794 | goto clunk_olddir; |
795 | } | 795 | } |
796 | 796 | ||
797 | if (v9fs_proto_dotl(v9ses)) { | ||
798 | retval = p9_client_rename(oldfid, newdirfid, | ||
799 | (char *) new_dentry->d_name.name); | ||
800 | if (retval != -ENOSYS) | ||
801 | goto clunk_newdir; | ||
802 | } | ||
803 | |||
797 | /* 9P can only handle file rename in the same directory */ | 804 | /* 9P can only handle file rename in the same directory */ |
798 | if (memcmp(&olddirfid->qid, &newdirfid->qid, sizeof(newdirfid->qid))) { | 805 | if (memcmp(&olddirfid->qid, &newdirfid->qid, sizeof(newdirfid->qid))) { |
799 | P9_DPRINTK(P9_DEBUG_ERROR, | 806 | P9_DPRINTK(P9_DEBUG_ERROR, |
diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h index 59300dc22dd0..156c26bb8bd7 100644 --- a/include/net/9p/9p.h +++ b/include/net/9p/9p.h | |||
@@ -88,6 +88,8 @@ do { \ | |||
88 | * enum p9_msg_t - 9P message types | 88 | * enum p9_msg_t - 9P message types |
89 | * @P9_TSTATFS: file system status request | 89 | * @P9_TSTATFS: file system status request |
90 | * @P9_RSTATFS: file system status response | 90 | * @P9_RSTATFS: file system status response |
91 | * @P9_TRENAME: rename request | ||
92 | * @P9_RRENAME: rename response | ||
91 | * @P9_TVERSION: version handshake request | 93 | * @P9_TVERSION: version handshake request |
92 | * @P9_RVERSION: version handshake response | 94 | * @P9_RVERSION: version handshake response |
93 | * @P9_TAUTH: request to establish authentication channel | 95 | * @P9_TAUTH: request to establish authentication channel |
@@ -129,6 +131,8 @@ do { \ | |||
129 | enum p9_msg_t { | 131 | enum p9_msg_t { |
130 | P9_TSTATFS = 8, | 132 | P9_TSTATFS = 8, |
131 | P9_RSTATFS, | 133 | P9_RSTATFS, |
134 | P9_TRENAME = 20, | ||
135 | P9_RRENAME, | ||
132 | P9_TVERSION = 100, | 136 | P9_TVERSION = 100, |
133 | P9_RVERSION, | 137 | P9_RVERSION, |
134 | P9_TAUTH = 102, | 138 | P9_TAUTH = 102, |
@@ -370,6 +374,15 @@ struct p9_rstatfs { | |||
370 | u32 namelen; | 374 | u32 namelen; |
371 | }; | 375 | }; |
372 | 376 | ||
377 | struct p9_trename { | ||
378 | u32 fid; | ||
379 | u32 newdirfid; | ||
380 | struct p9_str name; | ||
381 | }; | ||
382 | |||
383 | struct p9_rrename { | ||
384 | }; | ||
385 | |||
373 | struct p9_tversion { | 386 | struct p9_tversion { |
374 | u32 msize; | 387 | u32 msize; |
375 | struct p9_str version; | 388 | struct p9_str version; |
diff --git a/include/net/9p/client.h b/include/net/9p/client.h index f83c0d99e592..7dd3ed85c782 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h | |||
@@ -196,6 +196,7 @@ struct p9_fid { | |||
196 | }; | 196 | }; |
197 | 197 | ||
198 | int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb); | 198 | int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb); |
199 | int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name); | ||
199 | int p9_client_version(struct p9_client *); | 200 | int p9_client_version(struct p9_client *); |
200 | struct p9_client *p9_client_create(const char *dev_name, char *options); | 201 | struct p9_client *p9_client_create(const char *dev_name, char *options); |
201 | void p9_client_destroy(struct p9_client *clnt); | 202 | void p9_client_destroy(struct p9_client *clnt); |
diff --git a/net/9p/client.c b/net/9p/client.c index 430a1c4a7c6f..37c8da07a80b 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -1404,3 +1404,31 @@ error: | |||
1404 | return err; | 1404 | return err; |
1405 | } | 1405 | } |
1406 | EXPORT_SYMBOL(p9_client_statfs); | 1406 | EXPORT_SYMBOL(p9_client_statfs); |
1407 | |||
1408 | int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name) | ||
1409 | { | ||
1410 | int err; | ||
1411 | struct p9_req_t *req; | ||
1412 | struct p9_client *clnt; | ||
1413 | |||
1414 | err = 0; | ||
1415 | clnt = fid->clnt; | ||
1416 | |||
1417 | P9_DPRINTK(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n", | ||
1418 | fid->fid, newdirfid->fid, name); | ||
1419 | |||
1420 | req = p9_client_rpc(clnt, P9_TRENAME, "dds", fid->fid, | ||
1421 | newdirfid->fid, name); | ||
1422 | if (IS_ERR(req)) { | ||
1423 | err = PTR_ERR(req); | ||
1424 | goto error; | ||
1425 | } | ||
1426 | |||
1427 | P9_DPRINTK(P9_DEBUG_9P, "<<< RRENAME fid %d\n", fid->fid); | ||
1428 | |||
1429 | p9_free_req(clnt, req); | ||
1430 | error: | ||
1431 | return err; | ||
1432 | } | ||
1433 | EXPORT_SYMBOL(p9_client_rename); | ||
1434 | |||