From a85c1a25aa3387929e59d4b14baf7598d1a59bf5 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Wed, 20 Mar 2019 16:35:38 +0100 Subject: [PATCH] client: add ceph.snap.btime vxattr The ceph.snap.btime vxattr carries the snapshot creation time for files and directories residing within a snapshot. Fixes: https://tracker.ceph.com/issues/38838 Signed-off-by: David Disseldorp --- src/client/Client.cc | 28 ++++++++++++++++++++++++++++ src/client/Client.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/src/client/Client.cc b/src/client/Client.cc index c7757b4b9cfe1..dd60e1cf61435 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -11792,6 +11792,18 @@ size_t Client::_vxattrcb_dir_pin(Inode *in, char *val, size_t size) return snprintf(val, size, "%ld", (long)in->dir_pin); } +bool Client::_vxattrcb_snap_btime_exists(Inode *in) +{ + return !in->snap_btime.is_zero(); +} + +size_t Client::_vxattrcb_snap_btime(Inode *in, char *val, size_t size) +{ + return snprintf(val, size, "%llu.09%lu", + (long long unsigned)in->snap_btime.sec(), + (long unsigned)in->snap_btime.nsec()); +} + #define CEPH_XATTR_NAME(_type, _name) "ceph." #_type "." #_name #define CEPH_XATTR_NAME2(_type, _name, _name2) "ceph." #_type "." #_name "." #_name2 @@ -11872,6 +11884,14 @@ const Client::VXattr Client::_dir_vxattrs[] = { exists_cb: &Client::_vxattrcb_dir_pin_exists, flags: 0, }, + { + name: "ceph.snap.btime", + getxattr_cb: &Client::_vxattrcb_snap_btime, + readonly: true, + hidden: false, + exists_cb: &Client::_vxattrcb_snap_btime_exists, + flags: 0, + }, { name: "" } /* Required table terminator */ }; @@ -11889,6 +11909,14 @@ const Client::VXattr Client::_file_vxattrs[] = { XATTR_LAYOUT_FIELD(file, layout, object_size), XATTR_LAYOUT_FIELD(file, layout, pool), XATTR_LAYOUT_FIELD(file, layout, pool_namespace), + { + name: "ceph.snap.btime", + getxattr_cb: &Client::_vxattrcb_snap_btime, + readonly: true, + hidden: false, + exists_cb: &Client::_vxattrcb_snap_btime_exists, + flags: 0, + }, { name: "" } /* Required table terminator */ }; diff --git a/src/client/Client.h b/src/client/Client.h index 3c00d2294f407..952579f0916a8 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -1165,6 +1165,9 @@ private: bool _vxattrcb_dir_pin_exists(Inode *in); size_t _vxattrcb_dir_pin(Inode *in, char *val, size_t size); + bool _vxattrcb_snap_btime_exists(Inode *in); + size_t _vxattrcb_snap_btime(Inode *in, char *val, size_t size); + size_t _vxattrs_calcu_name_size(const VXattr *vxattrs); static const VXattr *_get_vxattrs(Inode *in); -- 2.39.5