]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: set CEPH_STAT_RSTAT mask for dir in readdir_r_cb 38947/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:00:24 +0000 (14:00 +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 2a7f9bee407bcedff94a9aab76a0920f8786eb61..17807754fcec7c447e9ca43520d8e407ac760e70 100755 (executable)
@@ -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;
       }