summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@kernel.org>2019-05-29 12:23:14 -0400
committerIlya Dryomov <idryomov@gmail.com>2019-07-08 08:01:43 -0400
commitec62b894df1ae69eb8e66d69317dfff517f6d1f3 (patch)
tree97b3c13227d15de47b820a3a6b15fe1ff1be1ff3
parent245ce991cca55eb16cfc43d1655574121b8ed85f (diff)
ceph: handle btime in cap messages
Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r--fs/ceph/caps.c18
-rw-r--r--fs/ceph/snap.c1
-rw-r--r--fs/ceph/super.h2
3 files changed, 14 insertions, 7 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 50409d9fdc90..623b82684e90 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1139,7 +1139,7 @@ struct cap_msg_args {
1139 u64 flush_tid, oldest_flush_tid, size, max_size; 1139 u64 flush_tid, oldest_flush_tid, size, max_size;
1140 u64 xattr_version; 1140 u64 xattr_version;
1141 struct ceph_buffer *xattr_buf; 1141 struct ceph_buffer *xattr_buf;
1142 struct timespec64 atime, mtime, ctime; 1142 struct timespec64 atime, mtime, ctime, btime;
1143 int op, caps, wanted, dirty; 1143 int op, caps, wanted, dirty;
1144 u32 seq, issue_seq, mseq, time_warp_seq; 1144 u32 seq, issue_seq, mseq, time_warp_seq;
1145 u32 flags; 1145 u32 flags;
@@ -1160,7 +1160,6 @@ static int send_cap_msg(struct cap_msg_args *arg)
1160 struct ceph_msg *msg; 1160 struct ceph_msg *msg;
1161 void *p; 1161 void *p;
1162 size_t extra_len; 1162 size_t extra_len;
1163 struct timespec64 zerotime = {0};
1164 struct ceph_osd_client *osdc = &arg->session->s_mdsc->fsc->client->osdc; 1163 struct ceph_osd_client *osdc = &arg->session->s_mdsc->fsc->client->osdc;
1165 1164
1166 dout("send_cap_msg %s %llx %llx caps %s wanted %s dirty %s" 1165 dout("send_cap_msg %s %llx %llx caps %s wanted %s dirty %s"
@@ -1251,7 +1250,7 @@ static int send_cap_msg(struct cap_msg_args *arg)
1251 * We just zero these out for now, as the MDS ignores them unless 1250 * We just zero these out for now, as the MDS ignores them unless
1252 * the requisite feature flags are set (which we don't do yet). 1251 * the requisite feature flags are set (which we don't do yet).
1253 */ 1252 */
1254 ceph_encode_timespec64(p, &zerotime); 1253 ceph_encode_timespec64(p, &arg->btime);
1255 p += sizeof(struct ceph_timespec); 1254 p += sizeof(struct ceph_timespec);
1256 ceph_encode_64(&p, 0); 1255 ceph_encode_64(&p, 0);
1257 1256
@@ -1379,6 +1378,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
1379 arg.mtime = inode->i_mtime; 1378 arg.mtime = inode->i_mtime;
1380 arg.atime = inode->i_atime; 1379 arg.atime = inode->i_atime;
1381 arg.ctime = inode->i_ctime; 1380 arg.ctime = inode->i_ctime;
1381 arg.btime = ci->i_btime;
1382 1382
1383 arg.op = op; 1383 arg.op = op;
1384 arg.caps = cap->implemented; 1384 arg.caps = cap->implemented;
@@ -1438,6 +1438,7 @@ static inline int __send_flush_snap(struct inode *inode,
1438 arg.atime = capsnap->atime; 1438 arg.atime = capsnap->atime;
1439 arg.mtime = capsnap->mtime; 1439 arg.mtime = capsnap->mtime;
1440 arg.ctime = capsnap->ctime; 1440 arg.ctime = capsnap->ctime;
1441 arg.btime = capsnap->btime;
1441 1442
1442 arg.op = CEPH_CAP_OP_FLUSHSNAP; 1443 arg.op = CEPH_CAP_OP_FLUSHSNAP;
1443 arg.caps = capsnap->issued; 1444 arg.caps = capsnap->issued;
@@ -3044,6 +3045,7 @@ struct cap_extra_info {
3044 u64 nsubdirs; 3045 u64 nsubdirs;
3045 /* currently issued */ 3046 /* currently issued */
3046 int issued; 3047 int issued;
3048 struct timespec64 btime;
3047}; 3049};
3048 3050
3049/* 3051/*
@@ -3130,6 +3132,7 @@ static void handle_cap_grant(struct inode *inode,
3130 inode->i_mode = le32_to_cpu(grant->mode); 3132 inode->i_mode = le32_to_cpu(grant->mode);
3131 inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(grant->uid)); 3133 inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(grant->uid));
3132 inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(grant->gid)); 3134 inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(grant->gid));
3135 ci->i_btime = extra_info->btime;
3133 dout("%p mode 0%o uid.gid %d.%d\n", inode, inode->i_mode, 3136 dout("%p mode 0%o uid.gid %d.%d\n", inode, inode->i_mode,
3134 from_kuid(&init_user_ns, inode->i_uid), 3137 from_kuid(&init_user_ns, inode->i_uid),
3135 from_kgid(&init_user_ns, inode->i_gid)); 3138 from_kgid(&init_user_ns, inode->i_gid));
@@ -3851,17 +3854,20 @@ void ceph_handle_caps(struct ceph_mds_session *session,
3851 } 3854 }
3852 } 3855 }
3853 3856
3854 if (msg_version >= 11) { 3857 if (msg_version >= 9) {
3855 struct ceph_timespec *btime; 3858 struct ceph_timespec *btime;
3856 u64 change_attr; 3859 u64 change_attr;
3857 u32 flags;
3858 3860
3859 /* version >= 9 */
3860 if (p + sizeof(*btime) > end) 3861 if (p + sizeof(*btime) > end)
3861 goto bad; 3862 goto bad;
3862 btime = p; 3863 btime = p;
3864 ceph_decode_timespec64(&extra_info.btime, btime);
3863 p += sizeof(*btime); 3865 p += sizeof(*btime);
3864 ceph_decode_64_safe(&p, end, change_attr, bad); 3866 ceph_decode_64_safe(&p, end, change_attr, bad);
3867 }
3868
3869 if (msg_version >= 11) {
3870 u32 flags;
3865 /* version >= 10 */ 3871 /* version >= 10 */
3866 ceph_decode_32_safe(&p, end, flags, bad); 3872 ceph_decode_32_safe(&p, end, flags, bad);
3867 /* version >= 11 */ 3873 /* version >= 11 */
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index 72c6c022f02b..854308e13f12 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -606,6 +606,7 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
606 capsnap->mtime = inode->i_mtime; 606 capsnap->mtime = inode->i_mtime;
607 capsnap->atime = inode->i_atime; 607 capsnap->atime = inode->i_atime;
608 capsnap->ctime = inode->i_ctime; 608 capsnap->ctime = inode->i_ctime;
609 capsnap->btime = ci->i_btime;
609 capsnap->time_warp_seq = ci->i_time_warp_seq; 610 capsnap->time_warp_seq = ci->i_time_warp_seq;
610 capsnap->truncate_size = ci->i_truncate_size; 611 capsnap->truncate_size = ci->i_truncate_size;
611 capsnap->truncate_seq = ci->i_truncate_seq; 612 capsnap->truncate_seq = ci->i_truncate_seq;
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 859d1f3a0d4a..2e20fc780f53 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -197,7 +197,7 @@ struct ceph_cap_snap {
197 u64 xattr_version; 197 u64 xattr_version;
198 198
199 u64 size; 199 u64 size;
200 struct timespec64 mtime, atime, ctime; 200 struct timespec64 mtime, atime, ctime, btime;
201 u64 time_warp_seq; 201 u64 time_warp_seq;
202 u64 truncate_size; 202 u64 truncate_size;
203 u32 truncate_seq; 203 u32 truncate_seq;