]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
include version in mds reply
authorSage Weil <sage@newdream.net>
Tue, 15 Apr 2008 01:14:50 +0000 (18:14 -0700)
committerSage Weil <sage@newdream.net>
Tue, 15 Apr 2008 01:14:50 +0000 (18:14 -0700)
src/include/ceph_fs.h
src/kernel/inode.c
src/kernel/super.c
src/kernel/super.h
src/messages/MClientReply.h

index 45da3cfc870d93948e00c643c8afec63c85798e5..57f9fa0b297f12691db10d4982cd9713f00ab033 100644 (file)
@@ -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;
index 00f4159433c029d9b3a1db2a43e884141ad75fb1..e94eecd267e76694898e485b1655d7535868be2e 100644 (file)
@@ -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:
index 283d8106d006202f89a32e3f45eff973ebb99cba..cc8fd239c91b6ab1e59a5f5e7d8214e03fb77bc9 100644 (file)
@@ -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;
index 5d41a000df3bb179a1ce6551c14e2229ebb31fea..0e44ee5a704742051f6d2eb8dec791edbc08b523 100644 (file)
@@ -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;
index a509ca8f28cac791dcb11f6fd19c16fadbe7defb..1cc9c1d4304221e809d12c64320056105e571483 100644 (file)
@@ -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);