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)
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)