diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-04-07 03:36:32 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2015-04-22 11:33:41 -0400 |
commit | 0ea611a3bc5fb8f6a0bb1a76fe2dbf8ebe4bdf77 (patch) | |
tree | 8abb5d00c3614f5b7703b1fc39fea8b09efdd061 /fs/ceph | |
parent | c0bd50e2eeddf139d8f61e709d7003210301e93a (diff) |
ceph: rename snapshot support
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/dir.c | 13 | ||||
-rw-r--r-- | fs/ceph/strings.c | 1 |
2 files changed, 10 insertions, 4 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 98c71e895e81..e729b79812b4 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -947,16 +947,20 @@ static int ceph_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
947 | struct ceph_fs_client *fsc = ceph_sb_to_client(old_dir->i_sb); | 947 | struct ceph_fs_client *fsc = ceph_sb_to_client(old_dir->i_sb); |
948 | struct ceph_mds_client *mdsc = fsc->mdsc; | 948 | struct ceph_mds_client *mdsc = fsc->mdsc; |
949 | struct ceph_mds_request *req; | 949 | struct ceph_mds_request *req; |
950 | int op = CEPH_MDS_OP_RENAME; | ||
950 | int err; | 951 | int err; |
951 | 952 | ||
952 | if (ceph_snap(old_dir) != ceph_snap(new_dir)) | 953 | if (ceph_snap(old_dir) != ceph_snap(new_dir)) |
953 | return -EXDEV; | 954 | return -EXDEV; |
954 | if (ceph_snap(old_dir) != CEPH_NOSNAP || | 955 | if (ceph_snap(old_dir) != CEPH_NOSNAP) { |
955 | ceph_snap(new_dir) != CEPH_NOSNAP) | 956 | if (old_dir == new_dir && ceph_snap(old_dir) == CEPH_SNAPDIR) |
956 | return -EROFS; | 957 | op = CEPH_MDS_OP_RENAMESNAP; |
958 | else | ||
959 | return -EROFS; | ||
960 | } | ||
957 | dout("rename dir %p dentry %p to dir %p dentry %p\n", | 961 | dout("rename dir %p dentry %p to dir %p dentry %p\n", |
958 | old_dir, old_dentry, new_dir, new_dentry); | 962 | old_dir, old_dentry, new_dir, new_dentry); |
959 | req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_RENAME, USE_AUTH_MDS); | 963 | req = ceph_mdsc_create_request(mdsc, op, USE_AUTH_MDS); |
960 | if (IS_ERR(req)) | 964 | if (IS_ERR(req)) |
961 | return PTR_ERR(req); | 965 | return PTR_ERR(req); |
962 | ihold(old_dir); | 966 | ihold(old_dir); |
@@ -1387,6 +1391,7 @@ const struct inode_operations ceph_snapdir_iops = { | |||
1387 | .getattr = ceph_getattr, | 1391 | .getattr = ceph_getattr, |
1388 | .mkdir = ceph_mkdir, | 1392 | .mkdir = ceph_mkdir, |
1389 | .rmdir = ceph_unlink, | 1393 | .rmdir = ceph_unlink, |
1394 | .rename = ceph_rename, | ||
1390 | }; | 1395 | }; |
1391 | 1396 | ||
1392 | const struct dentry_operations ceph_dentry_ops = { | 1397 | const struct dentry_operations ceph_dentry_ops = { |
diff --git a/fs/ceph/strings.c b/fs/ceph/strings.c index 51cc23e48111..89e6bc321df3 100644 --- a/fs/ceph/strings.c +++ b/fs/ceph/strings.c | |||
@@ -75,6 +75,7 @@ const char *ceph_mds_op_name(int op) | |||
75 | case CEPH_MDS_OP_LSSNAP: return "lssnap"; | 75 | case CEPH_MDS_OP_LSSNAP: return "lssnap"; |
76 | case CEPH_MDS_OP_MKSNAP: return "mksnap"; | 76 | case CEPH_MDS_OP_MKSNAP: return "mksnap"; |
77 | case CEPH_MDS_OP_RMSNAP: return "rmsnap"; | 77 | case CEPH_MDS_OP_RMSNAP: return "rmsnap"; |
78 | case CEPH_MDS_OP_RENAMESNAP: return "renamesnap"; | ||
78 | case CEPH_MDS_OP_SETFILELOCK: return "setfilelock"; | 79 | case CEPH_MDS_OP_SETFILELOCK: return "setfilelock"; |
79 | case CEPH_MDS_OP_GETFILELOCK: return "getfilelock"; | 80 | case CEPH_MDS_OP_GETFILELOCK: return "getfilelock"; |
80 | } | 81 | } |