]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: ensure we take Fs caps when querying dirstat vxattrs
authorJeff Layton <jlayton@redhat.com>
Fri, 20 Nov 2020 15:39:58 +0000 (10:39 -0500)
committerVicente Cheng <freeze.bilsted@gmail.com>
Mon, 18 Jan 2021 14:12:52 +0000 (14:12 +0000)
Dirstats values are only updated when Fs caps are held, so ensure that
we request those caps in the _getattr call when querying for them.

Drop the old XATTR_NAME_CEPH helper and rename XATTR_NAME_CEPH2 to
XATTR_NAME_CEPH. Add a new VXATTR_DIRSTAT field and add that to all of
the dirstats vxattrs.

Fixes: https://tracker.ceph.com/issues/48313
Signed-off-by: Jeff Layton <jlayton@redhat.com>
(cherry picked from commit 3db582b1416dc170a0e25c957166d7bdc58e4c67)

Conflicts:
src/client/Client.cc
  - drop some codes about two features
            ceph.mirror.info and rsnaps

src/client/Client.cc
src/client/Client.h

index 2a7f9bee407bcedff94a9aab76a0920f8786eb61..d577eeb5052b603726b8ce86e403cf36e8443e8b 100755 (executable)
@@ -11477,6 +11477,9 @@ int Client::_getxattr(Inode *in, const char *name, void *value, size_t size,
     if (vxattr->flags & VXATTR_RSTAT) {
       flags |= CEPH_STAT_RSTAT;
     }
+    if (vxattr->flags & VXATTR_DIRSTAT) {
+      flags |= CEPH_CAP_FILE_SHARED;
+    }
     r = _getattr(in, flags, perms, true);
     if (r != 0) {
       // Error from getattr!
@@ -12015,15 +12018,7 @@ size_t Client::_vxattrcb_snap_btime(Inode *in, char *val, size_t size)
 #define CEPH_XATTR_NAME(_type, _name) "ceph." #_type "." #_name
 #define CEPH_XATTR_NAME2(_type, _name, _name2) "ceph." #_type "." #_name "." #_name2
 
-#define XATTR_NAME_CEPH(_type, _name)                          \
-{                                                              \
-  name: CEPH_XATTR_NAME(_type, _name),                         \
-  getxattr_cb: &Client::_vxattrcb_ ## _type ## _ ## _name,     \
-  readonly: true,                                              \
-  exists_cb: NULL,                                             \
-  flags: 0,                                                     \
-}
-#define XATTR_NAME_CEPH2(_type, _name, _flags)                 \
+#define XATTR_NAME_CEPH(_type, _name, _flags)                 \
 {                                                              \
   name: CEPH_XATTR_NAME(_type, _name),                         \
   getxattr_cb: &Client::_vxattrcb_ ## _type ## _ ## _name,     \
@@ -12061,14 +12056,14 @@ const Client::VXattr Client::_dir_vxattrs[] = {
   XATTR_LAYOUT_FIELD(dir, layout, object_size),
   XATTR_LAYOUT_FIELD(dir, layout, pool),
   XATTR_LAYOUT_FIELD(dir, layout, pool_namespace),
-  XATTR_NAME_CEPH(dir, entries),
-  XATTR_NAME_CEPH(dir, files),
-  XATTR_NAME_CEPH(dir, subdirs),
-  XATTR_NAME_CEPH2(dir, rentries, VXATTR_RSTAT),
-  XATTR_NAME_CEPH2(dir, rfiles, VXATTR_RSTAT),
-  XATTR_NAME_CEPH2(dir, rsubdirs, VXATTR_RSTAT),
-  XATTR_NAME_CEPH2(dir, rbytes, VXATTR_RSTAT),
-  XATTR_NAME_CEPH2(dir, rctime, VXATTR_RSTAT),
+  XATTR_NAME_CEPH(dir, entries, VXATTR_DIRSTAT),
+  XATTR_NAME_CEPH(dir, files, VXATTR_DIRSTAT),
+  XATTR_NAME_CEPH(dir, subdirs, VXATTR_DIRSTAT),
+  XATTR_NAME_CEPH(dir, rentries, VXATTR_RSTAT),
+  XATTR_NAME_CEPH(dir, rfiles, VXATTR_RSTAT),
+  XATTR_NAME_CEPH(dir, rsubdirs, VXATTR_RSTAT),
+  XATTR_NAME_CEPH(dir, rbytes, VXATTR_RSTAT),
+  XATTR_NAME_CEPH(dir, rctime, VXATTR_RSTAT),
   {
     name: "ceph.quota",
     getxattr_cb: &Client::_vxattrcb_quota,
index 09f2ef97052b19dbcd2933ca74f2e7dd6e23eb72..fab33cbd81de29aeb9fdbe764e1e2c096c357f6a 100644 (file)
@@ -1007,6 +1007,7 @@ private:
 
   /* Flags for VXattr */
   static const unsigned VXATTR_RSTAT = 0x1;
+  static const unsigned VXATTR_DIRSTAT = 0x2;
 
   static const VXattr _dir_vxattrs[];
   static const VXattr _file_vxattrs[];