]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
client: ll_set_fscrypt_policy_v2 separate "directory empty" logic
authorMarcus Watts <mwatts@redhat.com>
Sat, 28 Jun 2025 00:56:05 +0000 (20:56 -0400)
committerChristopher Hoffman <choffman@redhat.com>
Wed, 5 Nov 2025 13:59:36 +0000 (13:59 +0000)
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 <mwatts@redhat.com>
(cherry picked from commit f0cf85a595876165e2c0eb2ca584e97f44971f9d)

src/client/Client.cc
src/client/Client.h

index 99aaa9442654b0894bd3fa31d056c6dc3a296055..97ec4b61a5cc32a0fb6033f2ac4cb4b9c19b4023 100644 (file)
@@ -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;
index df421386a8117713ade285b8799bf0d05e783800..60a2d9175c6705252f9353cdcbb2cd058eaf85b2 100644 (file)
@@ -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,