From 1b7d06a9c9413716a0a23f1ac669e44c742a1643 Mon Sep 17 00:00:00 2001 From: Yanhu Cao Date: Fri, 28 Aug 2020 09:49:20 +0800 Subject: [PATCH] client: support getting ceph.dir.rsnaps vxattr Fixes: https://tracker.ceph.com/issues/47168 Signed-off-by: Yanhu Cao --- src/client/Client.cc | 5 +++++ src/client/Client.h | 1 + src/mds/CInode.cc | 3 ++- src/messages/MClientReply.h | 5 ++++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index d4286a4139820..1ff5cd731e377 100755 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -12163,6 +12163,10 @@ size_t Client::_vxattrcb_dir_rsubdirs(Inode *in, char *val, size_t size) { return snprintf(val, size, "%llu", (unsigned long long)in->rstat.rsubdirs); } +size_t Client::_vxattrcb_dir_rsnaps(Inode *in, char *val, size_t size) +{ + return snprintf(val, size, "%llu", (unsigned long long)in->rstat.rsnaps); +} size_t Client::_vxattrcb_dir_rbytes(Inode *in, char *val, size_t size) { return snprintf(val, size, "%llu", (unsigned long long)in->rstat.rbytes); @@ -12248,6 +12252,7 @@ const Client::VXattr Client::_dir_vxattrs[] = { 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, rsnaps, VXATTR_RSTAT), XATTR_NAME_CEPH2(dir, rbytes, VXATTR_RSTAT), XATTR_NAME_CEPH2(dir, rctime, VXATTR_RSTAT), { diff --git a/src/client/Client.h b/src/client/Client.h index 43af41c4e686a..b32241490318a 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1282,6 +1282,7 @@ private: size_t _vxattrcb_dir_rentries(Inode *in, char *val, size_t size); size_t _vxattrcb_dir_rfiles(Inode *in, char *val, size_t size); size_t _vxattrcb_dir_rsubdirs(Inode *in, char *val, size_t size); + size_t _vxattrcb_dir_rsnaps(Inode *in, char *val, size_t size); size_t _vxattrcb_dir_rbytes(Inode *in, char *val, size_t size); size_t _vxattrcb_dir_rctime(Inode *in, char *val, size_t size); diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 69cd3bdab0198..55464e25649e6 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -3994,7 +3994,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, * note: encoding matches MClientReply::InodeStat */ if (session->info.has_feature(CEPHFS_FEATURE_REPLY_ENCODING)) { - ENCODE_START(3, 1, bl); + ENCODE_START(4, 1, bl); encode(oi->ino, bl); encode(snapid, bl); encode(oi->rdev, bl); @@ -4037,6 +4037,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, encode(any_i->change_attr, bl); encode(file_i->export_pin, bl); encode(snap_btime, bl); + encode(file_i->rstat.rsnaps, bl); ENCODE_FINISH(bl); } else { diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index fc7911e5e3e6b..49304f9ce159a 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -145,7 +145,7 @@ struct InodeStat { void decode(ceph::buffer::list::const_iterator &p, const uint64_t features) { using ceph::decode; if (features == (uint64_t)-1) { - DECODE_START(3, p); + DECODE_START(4, p); decode(vino.ino, p); decode(vino.snapid, p); decode(rdev, p); @@ -193,6 +193,9 @@ struct InodeStat { if (struct_v >= 3) { decode(snap_btime, p); } // else remains zero + if (struct_v >= 4) { + decode(rstat.rsnaps, p); + } // else remains zero DECODE_FINISH(p); } else { -- 2.39.5