]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: update client_need_snapflush when splitting snap inode
authorYan, Zheng <zyan@redhat.com>
Wed, 21 Jan 2015 07:34:24 +0000 (15:34 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 5 Feb 2015 14:40:39 +0000 (22:40 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc

index 4f66ba60f7c0b9d4ab4c149f3d56d6e7705951d1..38a89d37e2f1b2f16d09653a9cad9bd40bd60a59 100644 (file)
@@ -299,7 +299,17 @@ void CInode::remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t cli
   }
 }
 
-
+void CInode::split_need_snapflush(CInode *cowin, CInode *in)
+{
+  dout(10) << "split_need_snapflush [" << cowin->first << "," << cowin->last << "] for " << *cowin << dendl;
+  for (map<snapid_t, set<client_t> >::iterator p = client_need_snapflush.lower_bound(cowin->first);
+       p != client_need_snapflush.end() && p->first <= cowin->last;
+       ++p) {
+    assert(!p->second.empty());
+    cowin->auth_pin(this);
+    in->auth_unpin(this);
+  }
+}
 
 void CInode::mark_dirty_rstat()
 {
index bcb6da667c4790cf4ee7811965870a5f0964f0fe..f02ab6cb9309f37f68a40e387cb612e6cf0b6473 100644 (file)
@@ -431,6 +431,7 @@ public:
 
   void add_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
   void remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
+  void split_need_snapflush(CInode *cowin, CInode *in);
 
 protected:
 
index 67c8df7f9ca7bb77d4784916da0d7d4b55f1bce6..f271b586f2c420b9cb9a0aeb6cf68c60297ec1bb 100644 (file)
@@ -1510,6 +1510,12 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last)
   SnapRealm *realm = in->find_snaprealm();
   const set<snapid_t>& snaps = realm->get_snaps();
 
+  if (in->last != CEPH_NOSNAP) {
+    CInode *head_in = get_inode(in->ino());
+    assert(head_in);
+    head_in->split_need_snapflush(oldin, in);
+  }
+
   // clone caps?
   for (map<client_t,Capability*>::iterator p = in->client_caps.begin();
       p != in->client_caps.end();