#include <linux/posix_acl.h>
 #include <linux/random.h>
 #include <linux/sort.h>
+#include <linux/iversion.h>
 
 #include "super.h"
 #include "mds_client.h"
 {
        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;
 }
 
             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;
 
                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) {
                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;