]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
libcephfs: ll_set_fscrypt_policy_v2 - use in->dirstat
authorMarcus Watts <mwatts@redhat.com>
Sat, 28 Jun 2025 00:56:05 +0000 (20:56 -0400)
committerChristopher Hoffman <choffman@redhat.com>
Thu, 18 Sep 2025 18:52:41 +0000 (18:52 +0000)
Better check for empty direcotry.
It turns out in->dirstat contains a count of files and subdirectories
from a directory, so all we have to do is make sure that's valid.

Resolves: rhbz#2376757
Signed-off-by: Marcus Watts <mwatts@redhat.com>
(cherry picked from commit ba233f2dda3cf30c67b653b065e9ed47d42cb9d6)
(cherry picked from commit abe90cadf4fae6d213cb75dab705ca8e05ac1210)

src/client/Client.cc

index e242fcccd5bcba7867fb275b69cd0f6741d3434b..b35f3152ad52900339025180c3d9724bc19ae77a 100644 (file)
@@ -18134,10 +18134,19 @@ int Client::set_fscrypt_policy_v2(int fd, const struct fscrypt_policy_v2& 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;
+  int r = 0;
+  unsigned mask = CEPH_CAP_FILE_SHARED;
+
+  std::scoped_lock lock(client_lock);
+
+  if (!in->caps_issued_mask(mask, true)) {
+    r = _ll_getattr(in, mask, perms);
   }
-  return 0;
+  if (!r && (in->dirstat.nsubdirs | in->dirstat.nfiles)) {
+    r = -ENOTEMPTY;
+  }
+
+  return r;
 }
 
 int Client::ll_set_fscrypt_policy_v2(Inode *in, const struct fscrypt_policy_v2& policy)