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-Tag: testing/wip-pdonnell-testing-20260323.122957-tentacle~727 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6a963ef3527b71ec382f650dca11108d255faa55;p=ceph-ci.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) (cherry picked from commit abe90cadf4fae6d213cb75dab705ca8e05ac1210) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e242fcccd5b..b35f3152ad5 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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)