diff options
author | Jeff Layton <jlayton@kernel.org> | 2019-05-29 12:23:14 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2019-07-08 08:01:43 -0400 |
commit | ec62b894df1ae69eb8e66d69317dfff517f6d1f3 (patch) | |
tree | 97b3c13227d15de47b820a3a6b15fe1ff1be1ff3 | |
parent | 245ce991cca55eb16cfc43d1655574121b8ed85f (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.c | 18 | ||||
-rw-r--r-- | fs/ceph/snap.c | 1 | ||||
-rw-r--r-- | fs/ceph/super.h | 2 |
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; |