@@ -436,6 +436,9 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
ci->i_inline_version = 0;
ci->i_time_warp_seq = 0;
ci->i_ceph_flags = 0;
+
+ memset(&ci->i_btime, 0, sizeof(ci->i_btime));
+
atomic64_set(&ci->i_ordered_count, 1);
atomic64_set(&ci->i_release_count, 1);
atomic64_set(&ci->i_complete_seq[0], 0);
@@ -798,7 +801,10 @@ static int fill_inode(struct inode *inode, struct page *locked_page,
/* update inode */
ci->i_version = le64_to_cpu(info->version);
- inode->i_version++;
+
+ /* Always take a larger change attr */
+ inode->i_version = max(inode->i_version, iinfo->change_attr);
+
inode->i_rdev = le32_to_cpu(info->rdev);
inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
@@ -807,6 +813,7 @@ static int fill_inode(struct inode *inode, struct page *locked_page,
inode->i_mode = le32_to_cpu(info->mode);
inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(info->uid));
inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(info->gid));
+ ci->i_btime = iinfo->btime;
dout("%p mode 0%o uid.gid %d.%d\n", inode, inode->i_mode,
from_kuid(&init_user_ns, inode->i_uid),
from_kgid(&init_user_ns, inode->i_gid));
@@ -111,6 +111,16 @@ static int parse_reply_info_in(void **p, void *end,
}
}
+ if (features & CEPH_FEATURE_FS_BTIME) {
+ ceph_decode_need(p, end, sizeof(struct ceph_timespec), bad);
+ ceph_decode_timespec(&info->btime, *p);
+ *p += sizeof(struct ceph_timespec);
+ ceph_decode_64_safe(p, end, info->change_attr, bad);
+ } else {
+ memset(&info->btime, 0, sizeof(info->btime));
+ info->change_attr = 0;
+ }
+
return 0;
bad:
return err;
@@ -46,6 +46,8 @@ struct ceph_mds_reply_info_in {
char *inline_data;
u32 pool_ns_len;
char *pool_ns_data;
+ struct timespec btime;
+ u64 change_attr;
};
struct ceph_mds_reply_dir_entry {
@@ -288,6 +288,8 @@ struct ceph_inode_info {
struct ceph_file_layout i_layout;
char *i_symlink;
+ struct timespec i_btime;
+
/* for dirs */
struct timespec i_rctime;
u64 i_rbytes, i_rfiles, i_rsubdirs;
@@ -76,6 +76,8 @@
// duplicated since it was introduced at the same time as CEPH_FEATURE_CRUSH_TUNABLES5
#define CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING (1ULL<<58) /* New, v7 encoding */
#define CEPH_FEATURE_FS_FILE_LAYOUT_V2 (1ULL<<58) /* file_layout_t */
+#define CEPH_FEATURE_FS_BTIME (1ULL<<59) /* btime */
+#define CEPH_FEATURE_FS_CHANGE_ATTR (1ULL<<59) /* change_attr */
/*
* The introduction of CEPH_FEATURE_OSD_SNAPMAPPER caused the feature
Needed so we can send the proper values in cap flushes. Signed-off-by: Jeff Layton <jlayton@redhat.com> --- fs/ceph/inode.c | 9 ++++++++- fs/ceph/mds_client.c | 10 ++++++++++ fs/ceph/mds_client.h | 2 ++ fs/ceph/super.h | 2 ++ include/linux/ceph/ceph_features.h | 2 ++ 5 files changed, 24 insertions(+), 1 deletion(-)