ceph: add btime field to ceph_inode_info
authorJeff Layton <jlayton@kernel.org>
Wed, 29 May 2019 15:19:42 +0000 (11:19 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 8 Jul 2019 12:01:43 +0000 (14:01 +0200)
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/inode.c
fs/ceph/mds_client.c
fs/ceph/mds_client.h
fs/ceph/super.h

index b2988e9f8e15853feace26b6031db84b200ce6b1..909f13d4d6644944a018382a7ccf10d765a6235b 100644 (file)
@@ -509,6 +509,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
 
        INIT_WORK(&ci->i_work, ceph_inode_work);
        ci->i_work_mask = 0;
+       memset(&ci->i_btime, '\0', sizeof(ci->i_btime));
 
        ceph_fscache_inode_init(ci);
 
@@ -813,6 +814,7 @@ static int fill_inode(struct inode *inode, struct page *locked_page,
                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));
+               ceph_decode_timespec64(&ci->i_btime, &iinfo->btime);
                ceph_decode_timespec64(&ci->i_snap_btime, &iinfo->snap_btime);
        }
 
index 598a3fa280a7342449ebbf0fd4b5bf0bd3259fe5..636d3df47df64b6b76067429eca0793023839389 100644 (file)
@@ -150,14 +150,13 @@ static int parse_reply_info_in(void **p, void *end,
                        info->pool_ns_data = *p;
                        *p += info->pool_ns_len;
                }
-               /* btime, change_attr */
-               {
-                       struct ceph_timespec btime;
-                       u64 change_attr;
-                       ceph_decode_need(p, end, sizeof(btime), bad);
-                       ceph_decode_copy(p, &btime, sizeof(btime));
-                       ceph_decode_64_safe(p, end, change_attr, bad);
-               }
+
+               /* btime */
+               ceph_decode_need(p, end, sizeof(info->btime), bad);
+               ceph_decode_copy(p, &info->btime, sizeof(info->btime));
+
+               /* change attribute */
+               ceph_decode_skip_64(p, end, bad);
 
                /* dir pin */
                if (struct_v >= 2) {
@@ -206,6 +205,12 @@ static int parse_reply_info_in(void **p, void *end,
                        }
                }
 
+               if (features & CEPH_FEATURE_FS_BTIME) {
+                       ceph_decode_need(p, end, sizeof(info->btime), bad);
+                       ceph_decode_copy(p, &info->btime, sizeof(info->btime));
+                       ceph_decode_skip_64(p, end, bad);
+               }
+
                info->dir_pin = -ENODATA;
                /* info->snap_btime remains zero */
        }
index 330769ecb601bc7a5df60207e5774aa7dfb9a8ad..da2f536462171412d7efd85819038740ab5bf4b7 100644 (file)
@@ -69,6 +69,7 @@ struct ceph_mds_reply_info_in {
        u64 max_bytes;
        u64 max_files;
        s32 dir_pin;
+       struct ceph_timespec btime;
        struct ceph_timespec snap_btime;
 };
 
index 81bbb197fc3c56334c59dec4f273e2721c7c1995..859d1f3a0d4aa52abdab086f1497978348412a82 100644 (file)
@@ -384,6 +384,7 @@ struct ceph_inode_info {
        int i_snap_realm_counter; /* snap realm (if caps) */
        struct list_head i_snap_realm_item;
        struct list_head i_snap_flush_item;
+       struct timespec64 i_btime;
        struct timespec64 i_snap_btime;
 
        struct work_struct i_work;