From 43b862169e96c712ab2aee63b060df7c6773d274 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 26 Jan 2009 20:21:17 -0800 Subject: [PATCH] mds: include xattr updates in cap messages; accept xattr cap updates --- src/mds/CInode.cc | 12 ++++++++---- src/mds/Locker.cc | 29 +++++++++++++++++++---------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 4922e81f2ba53..8b16a9e380931 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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 *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; + } } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 477d8a5fb631f..df12c91315ff3 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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 *px = 0; + if ((dirty & CEPH_CAP_XATTR_EXCL) && + m->xattrbl.length() && + m->head.xattr_version > in->get_projected_inode()->xattr_version) + px = new map; + + 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); -- 2.39.5