]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb 38948/head
authorchencan <chen.can2@zte.com.cn>
Sat, 21 Nov 2020 02:41:11 +0000 (10:41 +0800)
committerVicente Cheng <freeze.bilsted@gmail.com>
Mon, 18 Jan 2021 14:02:12 +0000 (14:02 +0000)
Fixes: https://tracker.ceph.com/issues/48318
Signed-off-by: chencan <chen.can2@zte.com.cn>
(cherry picked from commit 8740414908625f58e1a719fa4fdfbe62ed42fada)

src/client/Client.cc

index 2c56b9d3893540566b04aec959c2e5cdc68c4294..d2274a969c345190dba8b1b0134499ee771e0584 100755 (executable)
@@ -8074,6 +8074,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())
@@ -8091,7 +8092,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;
     
@@ -8175,7 +8179,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;
 
@@ -8208,7 +8212,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;
 
@@ -8274,7 +8278,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;
       }