]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: write flushsnap cap metadata into old_inode if appropriate
authorSage Weil <sage@newdream.net>
Thu, 5 Aug 2010 21:52:40 +0000 (14:52 -0700)
committerSage Weil <sage@newdream.net>
Thu, 5 Aug 2010 21:52:40 +0000 (14:52 -0700)
Don't have a test case for this yet, unfortunately, but it looks
straightforward at least. :)

src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc

index f4c3db354908994b2dc1e4ab8e9254f12cf4e8dd..206c7bca4b310643b32ca3984a0cd29f872c05d8 100644 (file)
@@ -1543,22 +1543,18 @@ void CInode::purge_stale_snap_data(const set<snapid_t>& snaps)
 }
 
 /*
- * pick/create an old_inode that we can write into.
+ * pick/create an old_inode
  */
-/*map<snapid_t,old_inode_t>::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<snapid_t>& snaps = realm->get_snaps();
-  dout(10) << " snaps " << snaps << dendl;
-  
-  //snapid_t snap = snaps.lower_bound(last);
-
-
-  
+  map<snapid_t, old_inode_t>::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)
 {
index 9a38ae055f9764762a7d87480a1de57c6b2cf9bc..202c8cf95ae86f92ebb97f2a6331e82ef914d398 100644 (file)
@@ -228,9 +228,8 @@ public:
       return &inode;
   }
 
-  map<snapid_t,old_inode_t>::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<snapid_t>& snaps);
 
index 494cd23504617b6365cd7db75d43d628bcfbd38b..7af1406d43bc50ebd24ad0199397fe09710d3a6b 100644 (file)
@@ -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