]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: do not update when already holding EXCL cap
authorSage Weil <sage@newdream.net>
Sun, 4 Jan 2009 19:38:31 +0000 (11:38 -0800)
committerSage Weil <sage@newdream.net>
Sun, 4 Jan 2009 19:38:31 +0000 (11:38 -0800)
src/client/Client.cc
src/kernel/inode.c

index a4cbeac826f37e9e9503d210b33bdc240f9c96cd..89f90d58466c46dcdab148e94ee4cc5e085ffe93 100644 (file)
@@ -385,6 +385,8 @@ void Client::update_inode(Inode *in, InodeStat *st, utime_t from, int mds)
   //dout(12) << "update_inode mask " << lease->mask << " ttl " << ttl << dendl;
   dout(12) << "update_inode caps " << ccap_string(st->cap.caps) << dendl;
 
+  int issued = in->caps_issued();
+
   if (st->cap.caps) {
     if (in->snapid == CEPH_NOSNAP)
       add_update_cap(in, mds, st->cap.caps, st->cap.seq, st->cap.mseq, inodeno_t(st->cap.realm));
@@ -392,27 +394,28 @@ void Client::update_inode(Inode *in, InodeStat *st, utime_t from, int mds)
       in->snap_caps |= st->cap.caps;
     }
   }
-
+  
   if (st->cap.caps & CEPH_CAP_PIN) {
     in->inode.ino = st->vino.ino;
     in->snapid = st->vino.snapid;
     in->inode.rdev = st->rdev;
     in->dirfragtree = st->dirfragtree;  // FIXME look at the mask!
-  }
-  if (st->cap.caps & CEPH_CAP_AUTH_RDCACHE) {
-    in->inode.mode = st->mode;
-    in->inode.uid = st->uid;
-    in->inode.gid = st->gid;
-  }
-  if (st->cap.caps & CEPH_CAP_LINK_RDCACHE) {
-    in->inode.nlink = st->nlink;
-    in->inode.anchored = false;  /* lie */
-  }
-  if (st->cap.caps & CEPH_CAP_XATTR_RDCACHE) {
-    in->xattrs.swap(st->xattrs);
-  }
 
-  if (st->cap.caps & CEPH_CAP_PIN) {
+    if ((issued & CEPH_CAP_AUTH_EXCL) == 0) {
+      in->inode.mode = st->mode;
+      in->inode.uid = st->uid;
+      in->inode.gid = st->gid;
+    }
+
+    if ((issued & CEPH_CAP_LINK_EXCL) == 0) {
+      in->inode.nlink = st->nlink;
+      in->inode.anchored = false;  /* lie */
+    }
+
+    if ((issued & CEPH_CAP_XATTR_EXCL) == 0) {
+      in->xattrs.swap(st->xattrs);
+    }
+
     in->inode.dirstat = st->dirstat;
     in->inode.rstat = st->rstat;
 
index 3821caf958217d0aff3b4a507ec7f04f68f9eb6b..fb3e5672f0eabbf904631f1d15337ed95c0afaa5 100644 (file)
@@ -417,20 +417,27 @@ static int fill_inode(struct inode *inode,
            ci->i_version == le64_to_cpu(info->version))
                goto no_change;
 
+       issued = __ceph_caps_issued(ci, NULL);
+
        /* update inode */
        ci->i_version = le64_to_cpu(info->version);
        inode->i_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);
-       inode->i_nlink = le32_to_cpu(info->nlink);
        inode->i_rdev = le32_to_cpu(info->rdev);
 
+       if ((issued & CEPH_CAP_AUTH_EXCL) == 0) {
+               inode->i_mode = le32_to_cpu(info->mode);
+               inode->i_uid = le32_to_cpu(info->uid);
+               inode->i_gid = le32_to_cpu(info->gid);
+       }
+
+       if ((issued & CEPH_CAP_LINK_EXCL) == 0) {
+               inode->i_nlink = le32_to_cpu(info->nlink);
+       }
+
        /* be careful with mtime, atime, size */
        ceph_decode_timespec(&atime, &info->atime);
        ceph_decode_timespec(&mtime, &info->mtime);
        ceph_decode_timespec(&ctime, &info->ctime);
-       issued = __ceph_caps_issued(ci, NULL);
        ceph_fill_file_bits(inode, issued,
                            le64_to_cpu(info->truncate_seq),
                            le64_to_cpu(info->size),
@@ -442,7 +449,7 @@ static int fill_inode(struct inode *inode,
        inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
 
        /* xattrs */
-       if (iinfo->xattr_len) {
+       if (iinfo->xattr_len && (issued & CEPH_CAP_XATTR_EXCL) == 0) {
                if (ci->i_xattr_len != iinfo->xattr_len) {
                        kfree(ci->i_xattr_data);
                        ci->i_xattr_len = iinfo->xattr_len;