From adc774462902c5c48eca7680ab666d71e5c59683 Mon Sep 17 00:00:00 2001 From: chencan Date: Sat, 21 Nov 2020 10:41:11 +0800 Subject: [PATCH] client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb Fixes: https://tracker.ceph.com/issues/48318 Signed-off-by: chencan (cherry picked from commit 8740414908625f58e1a719fa4fdfbe62ed42fada) --- src/client/Client.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 2a7f9bee407bc..17807754fcec7 100755 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -8136,6 +8136,7 @@ int Client::_readdir_cache_cb(dir_result_t *dirp, add_dirent_cb_t cb, void *p, string dn_name; while (true) { + int mask = caps; if (!dirp->inode->is_complete_and_ordered()) return -EAGAIN; if (pd == dir->readdir_cache.end()) @@ -8153,7 +8154,10 @@ int Client::_readdir_cache_cb(dir_result_t *dirp, add_dirent_cb_t cb, void *p, } int idx = pd - dir->readdir_cache.begin(); - int r = _getattr(dn->inode, caps, dirp->perms); + if (dn->inode->is_dir()) { + mask |= CEPH_STAT_RSTAT; + } + int r = _getattr(dn->inode, mask, dirp->perms); if (r < 0) return r; @@ -8237,7 +8241,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p, uint64_t next_off = 1; int r; - r = _getattr(diri, caps, dirp->perms); + r = _getattr(diri, caps | CEPH_STAT_RSTAT, dirp->perms); if (r < 0) return r; @@ -8270,7 +8274,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p, in = diri->get_first_parent()->dir->parent_inode; int r; - r = _getattr(in, caps, dirp->perms); + r = _getattr(in, caps | CEPH_STAT_RSTAT, dirp->perms); if (r < 0) return r; @@ -8336,7 +8340,11 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p, int r; if (check_caps) { - r = _getattr(entry.inode, caps, dirp->perms); + int mask = caps; + if(entry.inode->is_dir()){ + mask |= CEPH_STAT_RSTAT; + } + r = _getattr(entry.inode, mask, dirp->perms); if (r < 0) return r; } -- 2.39.5