ceph: add change_attr field to ceph_inode_info
authorJeff Layton <jlayton@kernel.org>
Thu, 6 Jun 2019 11:29:23 +0000 (07:29 -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

index a13b627270f3faf1d3e0e94a6f42d304e48b0494..2c49eb831c6f2d0f4740bf966a57e636cd19c3d9 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/posix_acl.h>
 #include <linux/random.h>
 #include <linux/sort.h>
+#include <linux/iversion.h>
 
 #include "super.h"
 #include "mds_client.h"
@@ -42,6 +43,7 @@ static int ceph_set_ino_cb(struct inode *inode, void *data)
 {
        ceph_inode(inode)->i_vino = *(struct ceph_vino *)data;
        inode->i_ino = ceph_vino_to_ino(*(struct ceph_vino *)data);
+       inode_set_iversion_raw(inode, 0);
        return 0;
 }
 
@@ -796,6 +798,9 @@ static int fill_inode(struct inode *inode, struct page *locked_page,
             le64_to_cpu(info->version) > (ci->i_version & ~1)))
                new_version = true;
 
+       /* Update change_attribute */
+       inode_set_max_iversion_raw(inode, iinfo->change_attr);
+
        __ceph_caps_issued(ci, &issued);
        issued |= __ceph_caps_dirty(ci);
        new_issued = ~issued & info_caps;
index 636d3df47df64b6b76067429eca0793023839389..920e9f048bd8f4b38e26da4cb53ce5d9fb6bcda4 100644 (file)
@@ -156,7 +156,7 @@ static int parse_reply_info_in(void **p, void *end,
                ceph_decode_copy(p, &info->btime, sizeof(info->btime));
 
                /* change attribute */
-               ceph_decode_skip_64(p, end, bad);
+               ceph_decode_64_safe(p, end, info->change_attr, bad);
 
                /* dir pin */
                if (struct_v >= 2) {
@@ -208,7 +208,7 @@ 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);
+                       ceph_decode_64_safe(p, end, info->change_attr, bad);
                }
 
                info->dir_pin = -ENODATA;
index da2f536462171412d7efd85819038740ab5bf4b7..f7c8603484fef7be90184d0cc2dadede5474030e 100644 (file)
@@ -71,6 +71,7 @@ struct ceph_mds_reply_info_in {
        s32 dir_pin;
        struct ceph_timespec btime;
        struct ceph_timespec snap_btime;
+       u64 change_attr;
 };
 
 struct ceph_mds_reply_dir_entry {