]> git.apps.os.sepia.ceph.com Git - ceph.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>
Wed, 5 Nov 2025 13:59:36 +0000 (13:59 +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)

src/client/Client.cc

index 97ec4b61a5cc32a0fb6033f2ac4cb4b9c19b4023..d0cde09c6b53daed11a1a28ed527fa3bf414c173 100644 (file)
@@ -18317,10 +18317,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)