]> 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 38222/head
authorchencan <chen.can2@zte.com.cn>
Sat, 21 Nov 2020 02:41:11 +0000 (10:41 +0800)
committerchencan <chen.can2@zte.com.cn>
Mon, 7 Dec 2020 01:23:11 +0000 (09:23 +0800)
Fixes: https://tracker.ceph.com/issues/48318
Signed-off-by: chencan <chen.can2@zte.com.cn>
src/client/Client.cc

index aaf9db20c35423a2a1496616a5a3f845c18541ab..17b15c4410d8b95e30bca9c4ad828706490ae836 100644 (file)
@@ -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;
       }