From e711a6ca003121dcd0fa3e92b0ba348d66f6ca53 Mon Sep 17 00:00:00 2001 From: Marcus Watts Date: Fri, 27 Jun 2025 20:56:05 -0400 Subject: [PATCH] libcephfs: ll_set_fscrypt_policy_v2 - use in->dirstat 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 (cherry picked from commit ba233f2dda3cf30c67b653b065e9ed47d42cb9d6) --- src/client/Client.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 97ec4b61a5cc3..d0cde09c6b53d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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) -- 2.39.5