From a8d9a256dc1c7f4186f293eb25c4edc54f69eda3 Mon Sep 17 00:00:00 2001 From: Rishabh Dave Date: Wed, 15 Feb 2023 18:49:10 +0530 Subject: [PATCH] client: correct quota check in Client::_rename() Client::_rename() only checks for max files quota. As a result, max bytes quota is not enforced. Thus the following code (copied from qa/workunits/fs/quota/quota.sh), runs successfully instead of exiting with error "Disk quota exceeded" - mkdir files limit setfattr limit -n ceph.quota.max_bytes -v 1000 truncate filles/file1 -s 1M mv files limit This patch makes Client::_rename() enforce both kinds of quota which leads command "mv files limit" from above script to fail with "Disk quota exceeded" error. This is the expected behaviour in this case. Introduced-by: dde1a19d4105f1db41477752a71d8fe40c45cd7f Fixes: https://tracker.ceph.com/issues/58220 Signed-off-by: Rishabh Dave --- src/client/Client.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index dd06dfcad2d90..8d7cca8225c7b 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -14121,11 +14121,13 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch else return -CEPHFS_EROFS; } + + // don't allow cross-quota renames if (cct->_conf.get_val("client_quota") && fromdir != todir) { Inode *fromdir_root = - fromdir->quota.is_enabled(QUOTA_MAX_FILES) ? fromdir : get_quota_root(fromdir, perm, QUOTA_MAX_FILES); + fromdir->quota.is_enabled() ? fromdir : get_quota_root(fromdir, perm); Inode *todir_root = - todir->quota.is_enabled(QUOTA_MAX_FILES) ? todir : get_quota_root(todir, perm, QUOTA_MAX_FILES); + todir->quota.is_enabled() ? todir : get_quota_root(todir, perm); if (fromdir_root != todir_root) { return -CEPHFS_EXDEV; } -- 2.39.5