From: Greg Farnum Date: Wed, 14 Dec 2016 20:09:44 +0000 (-0800) Subject: client: fix the cross-quota rename boundary check conditions X-Git-Tag: v12.0.0~76^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F12489%2Fhead;p=ceph.git client: fix the cross-quota rename boundary check conditions We were previously rejecting a rename if either of the involved directories was a quota root, even if the other directory was part of the same quota "tree". What we really want to do is identify the correct quota root (whether local or ancestral) for each directory and compare them. So now we do. Signed-off-by: Greg Farnum --- diff --git a/src/client/Client.cc b/src/client/Client.cc index ff3618f27c21..8196df45328f 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -11524,11 +11524,14 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch return -EROFS; } if (cct->_conf->client_quota && - fromdir != todir && - (fromdir->quota.is_enable() || - todir->quota.is_enable() || - get_quota_root(fromdir, perm) != get_quota_root(todir, perm))) { - return -EXDEV; + fromdir != todir) { + Inode *fromdir_root = + fromdir->quota.is_enable() ? fromdir : get_quota_root(fromdir, perm); + Inode *todir_root = + todir->quota.is_enable() ? todir : get_quota_root(todir, perm); + if (fromdir_root != todir_root) { + return -EXDEV; + } } InodeRef target;