From: Marcus Watts Date: Sat, 28 Jun 2025 00:56:05 +0000 (-0400) Subject: libcephfs: ll_set_fscrypt_policy_v2 - use in->dirstat X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e711a6ca003121dcd0fa3e92b0ba348d66f6ca53;p=ceph.git 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) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 97ec4b61a5c..d0cde09c6b5 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)