From: Sage Weil Date: Tue, 15 Apr 2008 01:14:50 +0000 (-0700) Subject: include version in mds reply X-Git-Tag: v0.2~204^2~30 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1a62a112b9717207e90500356a290ef600094e9f;p=ceph.git include version in mds reply --- diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 45da3cfc870..57f9fa0b297 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -469,6 +469,7 @@ struct ceph_frag_tree_head { struct ceph_mds_reply_inode { ceph_ino_t ino; + __le64 version; struct ceph_file_layout layout; struct ceph_timespec ctime, mtime, atime; __u32 mode, uid, gid; diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 00f4159433c..e94eecd267e 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -71,6 +71,14 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) 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); @@ -82,7 +90,6 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) 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) { @@ -105,12 +112,6 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) 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; @@ -138,6 +139,14 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) 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: diff --git a/src/kernel/super.c b/src/kernel/super.c index 283d8106d00..cc8fd239c91 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -124,6 +124,7 @@ static struct inode *ceph_alloc_inode(struct super_block *sb) dout(10, "alloc_inode %p vfsi %p\n", ci, &ci->vfs_inode); + ci->i_version = 0; ci->i_symlink = 0; ci->i_lease_session = 0; diff --git a/src/kernel/super.h b/src/kernel/super.h index 5d41a000df3..0e44ee5a704 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -145,8 +145,9 @@ enum { struct ceph_inode_info { u64 i_ceph_ino; - struct ceph_file_layout i_layout; + u64 i_version; + struct ceph_file_layout i_layout; char *i_symlink; int i_lease_mask; diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index a509ca8f28c..1cc9c1d4304 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -100,6 +100,7 @@ struct DirStat { 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; @@ -118,6 +119,7 @@ struct InodeStat { 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); @@ -148,6 +150,7 @@ struct InodeStat { 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);