su, blkbits, blksize, blocks);
ceph_set_ino(inode, le64_to_cpu(info->ino));
+
+ spin_lock(&inode->i_lock);
+ dout(30, " got version %llu, had %llu\n",
+ le64_to_cpu(info->version), ci->i_version);
+ if (le64_to_cpu(info->version) > 0 &&
+ ci->i_version == le64_to_cpu(info->version))
+ goto no_change;
+ ci->i_version = le64_to_cpu(info->version);
inode->i_mode = le32_to_cpu(info->mode);
inode->i_uid = le32_to_cpu(info->uid);
inode->i_gid = le32_to_cpu(info->gid);
ceph_decode_timespec(&mtime, &info->mtime);
ceph_decode_timespec(&ctime, &info->ctime);
issued = __ceph_caps_issued(ci);
- spin_lock(&inode->i_lock);
if (issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER)) {
if ((issued & CEPH_CAP_EXCL) == 0) {
if (size > inode->i_size) {
inode->i_atime = atime;
inode->i_ctime = ctime;
}
- spin_unlock(&inode->i_lock);
-
- if (ci->i_hashval != inode->i_ino) {
- insert_inode_hash(inode);
- ci->i_hashval = inode->i_ino;
- }
/* ceph inode */
ci->i_layout = info->layout;
inode->i_mapping->a_ops = &ceph_aops;
+no_change:
+ spin_unlock(&inode->i_lock);
+
+ if (ci->i_hashval != inode->i_ino) {
+ insert_inode_hash(inode);
+ ci->i_hashval = inode->i_ino;
+ }
+
switch (inode->i_mode & S_IFMT) {
case S_IFIFO:
case S_IFBLK:
struct InodeStat {
//inode_t inode;
inodeno_t ino;
+ version_t version;
ceph_file_layout layout;
utime_t ctime, mtime, atime;
unsigned mode, uid, gid, nlink, rdev;
struct ceph_mds_reply_inode e;
::_decode_simple(e, p);
ino = le64_to_cpu(e.ino);
+ version = le64_to_cpu(e.version);
layout = e.layout;
ctime.decode_timeval(&e.ctime);
mtime.decode_timeval(&e.mtime);
struct ceph_mds_reply_inode e;
memset(&e, 0, sizeof(e));
e.ino = cpu_to_le64(in->inode.ino);
+ e.version = cpu_to_le64(in->inode.version);
e.layout = in->inode.layout;
in->inode.ctime.encode_timeval(&e.ctime);
in->inode.mtime.encode_timeval(&e.mtime);