summaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2016-12-13 16:03:26 +0800
committerIlya Dryomov <idryomov@gmail.com>2016-12-14 22:39:04 +0100
commit80e80fbb584dc0d0dc894c4965bc2a199c7cd3f2 (patch)
tree1ed1cb12474a097c20c23dadf9261139df083132 /fs/ceph
parentdc24de82d61b1edc3d195badd178e7875ba9398f (diff)
downloadop-kernel-dev-80e80fbb584dc0d0dc894c4965bc2a199c7cd3f2.zip
op-kernel-dev-80e80fbb584dc0d0dc894c4965bc2a199c7cd3f2.tar.gz
ceph: avoid creating orphan object when checking pool permission
Pool permission check needs to write to the first object. But for snapshot, head of the first object may have already been deleted. Skip the check for snapshot inode to avoid creating orphan object. Link: http://tracker.ceph.com/issues/18211 Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/addr.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 7d69f25..a0f1e2b 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1948,6 +1948,15 @@ int ceph_pool_perm_check(struct ceph_inode_info *ci, int need)
struct ceph_string *pool_ns;
int ret, flags;
+ if (ci->i_vino.snap != CEPH_NOSNAP) {
+ /*
+ * Pool permission check needs to write to the first object.
+ * But for snapshot, head of the first object may have alread
+ * been deleted. Skip check to avoid creating orphan object.
+ */
+ return 0;
+ }
+
if (ceph_test_mount_opt(ceph_inode_to_client(&ci->vfs_inode),
NOPOOLPERM))
return 0;
OpenPOWER on IntegriCloud