From: Marcus Watts Date: Sat, 28 Jun 2025 00:56:05 +0000 (-0400) Subject: client: ll_set_fscrypt_policy_v2 separate "directory empty" logic X-Git-Tag: testing/wip-vshankar-testing-20260120.085915-debug^2~13^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=53e88865d6e64c8023a8bfdb3e8d4fa816289f1e;p=ceph-ci.git client: ll_set_fscrypt_policy_v2 separate "directory empty" logic Move "directory empty" logic to new method "_is_empty_directory". Future logic will not be a one-liner, so let's keep it separate. Resolves: rhbz#2376757 Signed-off-by: Marcus Watts (cherry picked from commit f0cf85a595876165e2c0eb2ca584e97f44971f9d) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 99aaa944265..97ec4b61a5c 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -18315,10 +18315,21 @@ int Client::set_fscrypt_policy_v2(int fd, const struct fscrypt_policy_v2& policy return ll_set_fscrypt_policy_v2(f->inode.get(), policy); } +int Client::_is_empty_directory(Inode *in, const UserPerm& perms) +{ + if (in->dir && in->dir->dentries.size() != in->dir->num_null_dentries) { + return -ENOTEMPTY; + } + return 0; +} + int Client::ll_set_fscrypt_policy_v2(Inode *in, const struct fscrypt_policy_v2& policy) { - if (!in->is_dir()) + UserPerm perms(in->uid, in->gid); + + if (!in->is_dir()) { return -ENOTDIR; + } if (in->is_fscrypt_enabled()) { struct fscrypt_policy_v2 policy2; @@ -18329,8 +18340,9 @@ int Client::ll_set_fscrypt_policy_v2(Inode *in, const struct fscrypt_policy_v2& return 0; } - if (in->dir && in->dir->dentries.size() != in->dir->num_null_dentries) { - return -ENOTEMPTY; + int r = _is_empty_directory(in, perms); + if (r < 0) { + return r; } FSCryptContext fsc(cct); @@ -18342,13 +18354,11 @@ int Client::ll_set_fscrypt_policy_v2(Inode *in, const struct fscrypt_policy_v2& fsc.init(policy); fsc.generate_new_nonce(); - UserPerm perms(in->uid, in->gid); - bufferlist env_bl; fsc.encode(env_bl); - int r = ll_setxattr(in, "ceph.fscrypt.auth", (void *)env_bl.c_str(), env_bl.length(), CEPH_XATTR_CREATE, perms); + r = ll_setxattr(in, "ceph.fscrypt.auth", (void *)env_bl.c_str(), env_bl.length(), CEPH_XATTR_CREATE, perms); if (r < 0) { ldout(cct, 0) << __func__ << "(): failed to set fscrypt_auth attr: r=" << r << dendl; return r; diff --git a/src/client/Client.h b/src/client/Client.h index df421386a81..60a2d9175c6 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -2148,6 +2148,8 @@ private: Dentry *get_or_create(Inode *dir, const std::string& name); + int _is_empty_directory(Inode *in, const UserPerm& perms); + int xattr_permission(Inode *in, const char *name, unsigned want, const UserPerm& perms); int may_setattr(const InodeRef& in, struct ceph_statx *stx, int mask,