]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: include xattr updates in cap messages; accept xattr cap updates
authorSage Weil <sage@newdream.net>
Tue, 27 Jan 2009 04:21:17 +0000 (20:21 -0800)
committerSage Weil <sage@newdream.net>
Tue, 27 Jan 2009 04:21:17 +0000 (20:21 -0800)
src/mds/CInode.cc
src/mds/Locker.cc

index 4922e81f2ba536afc2f8170030c246a61758f2f7..8b16a9e38093137bc54ec6003f8c4404225b49a1 100644 (file)
@@ -1548,11 +1548,15 @@ void CInode::encode_cap_message(MClientCaps *m, Capability *cap)
   i = plink ? pi:oi;
   m->head.nlink = i->nlink;
 
-  /*
   i = pxattr ? pi:oi;
-  bool had_latest_xattrs = cap && (cap->issued() & CEPH_CAP_XATTR_RDCACHE) &&
-    cap->client_xattr_version == i->xattr_version;
-  */
+  map<string,bufferptr> *ix = pxattr ? get_projected_xattrs() : &xattrs;
+  if ((cap->pending() & CEPH_CAP_XATTR_RDCACHE) &&
+      i->xattr_version > cap->client_xattr_version) {
+    dout(10) << "    including xattrs v " << i->xattr_version << dendl;
+    ::encode(*ix, m->xattrbl);
+    m->head.xattr_version = i->xattr_version;
+    cap->client_xattr_version = i->xattr_version;
+  }
 }
 
 
index 477d8a5fb631f3082616f215ed06482ee9300430..df12c91315ff3ec049689dcd7575668df1efc564 100644 (file)
@@ -1036,15 +1036,6 @@ bool Locker::issue_caps(CInode *in)
                                         cap->get_mseq());
        in->encode_cap_message(m, cap);
 
-       // include xattrs if they're newer than what the client has
-       if ((after & CEPH_CAP_XATTR_RDCACHE) &&
-           in->inode.xattr_version > cap->client_xattr_version) {
-         dout(10) << "    including xattrs v " << in->inode.xattr_version << dendl;
-         ::encode(in->xattrs, m->xattrbl);
-         m->head.xattr_version = in->inode.xattr_version;
-         cap->client_xattr_version = in->inode.xattr_version;
-       }
-       
        mds->send_message_client(m, it->first);
       }
     }
@@ -1617,7 +1608,15 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap,
 
   // do the update.
   EUpdate *le = new EUpdate(mds->mdlog, "cap update");
-  inode_t *pi = in->project_inode();
+
+  // xattrs update?
+  map<string,bufferptr> *px = 0;
+  if ((dirty & CEPH_CAP_XATTR_EXCL) && 
+      m->xattrbl.length() &&
+      m->head.xattr_version > in->get_projected_inode()->xattr_version)
+    px = new map<string,bufferptr>;
+
+  inode_t *pi = in->project_inode(px);
   pi->version = in->pre_dirty();
 
   Mutation *mut = new Mutation;
@@ -1691,6 +1690,16 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap,
 
     wrlock_force(&in->authlock, mut);
   }
+
+  // xattr
+  if (px) {
+    dout(7) << " xattrs v" << pi->xattr_version << " -> " << m->head.xattr_version << dendl;
+    pi->xattr_version = m->head.xattr_version;
+    bufferlist::iterator p = m->xattrbl.begin();
+    ::decode(*px, p);
+
+    wrlock_force(&in->xattrlock, mut);
+  }
   
   mut->auth_pin(in);
   mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, 0, follows);