From: Sage Weil Date: Thu, 5 Aug 2010 21:52:40 +0000 (-0700) Subject: mds: write flushsnap cap metadata into old_inode if appropriate X-Git-Tag: v0.22~308^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1fba876f4ff985ddb1dac7a046ace1ac76645cc4;p=ceph.git mds: write flushsnap cap metadata into old_inode if appropriate Don't have a test case for this yet, unfortunately, but it looks straightforward at least. :) --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index f4c3db354908..206c7bca4b31 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1543,22 +1543,18 @@ void CInode::purge_stale_snap_data(const set& snaps) } /* - * pick/create an old_inode that we can write into. + * pick/create an old_inode */ -/*map::iterator CInode::pick_dirty_old_inode(snapid_t last) +old_inode_t * CInode::pick_old_inode(snapid_t snap) { - dout(10) << "pick_dirty_old_inode last " << last << dendl; - SnapRealm *realm = find_snaprealm(); - dout(10) << " realm " << *realm << dendl; - const set& snaps = realm->get_snaps(); - dout(10) << " snaps " << snaps << dendl; - - //snapid_t snap = snaps.lower_bound(last); - - - + map::iterator p = old_inodes.lower_bound(snap); // p is first key >= to snap + if (p != old_inodes.end() && p->second.first <= snap) { + dout(10) << "pick_old_inode snap " << snap << " -> [" << p->second.first << "," << p->first << "]" << dendl; + return &p->second; + } + dout(10) << "pick_old_inode snap " << snap << " -> nothing" << dendl; + return NULL; } -*/ void CInode::open_snaprealm(bool nosplit) { diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 9a38ae055f97..202c8cf95ae8 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -228,9 +228,8 @@ public: return &inode; } - map::iterator pick_dirty_old_inode(snapid_t last); - old_inode_t& cow_old_inode(snapid_t follows, inode_t *pi); + old_inode_t *pick_old_inode(snapid_t last); void pre_cow_old_inode(); void purge_stale_snap_data(const set& snaps); diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 494cd2350461..7af1406d43bc 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1987,6 +1987,14 @@ void Locker::_do_snap_update(CInode *in, int dirty, snapid_t follows, MClientCap inode_t *pi = in->project_inode(px); pi->version = in->pre_dirty(); + if (in->is_multiversion()) { + old_inode_t *oi = in->pick_old_inode(snap); + if (oi) { + dout(10) << " writing into old inode" << dendl; + pi = &oi->inode; + } + } + _update_cap_fields(in, dirty, m, pi); // xattr