From: chencan Date: Sat, 21 Nov 2020 02:41:11 +0000 (+0800) Subject: client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb X-Git-Tag: v16.1.0~234^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8740414908625f58e1a719fa4fdfbe62ed42fada;p=ceph.git client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb Fixes: https://tracker.ceph.com/issues/48318 Signed-off-by: chencan --- diff --git a/src/client/Client.cc b/src/client/Client.cc index aaf9db20c3542..17b15c4410d8b 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -8421,6 +8421,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()) @@ -8438,7 +8439,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; @@ -8523,7 +8527,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; @@ -8556,7 +8560,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; @@ -8622,7 +8626,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; }