From 32b089224e6b99be0639513dc0f67b63adc31f44 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 21 Jan 2015 15:34:24 +0800 Subject: [PATCH] mds: update client_need_snapflush when splitting snap inode Signed-off-by: Yan, Zheng --- src/mds/CInode.cc | 12 +++++++++++- src/mds/CInode.h | 1 + src/mds/MDCache.cc | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 4f66ba60f7c0b..38a89d37e2f1b 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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 >::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() { diff --git a/src/mds/CInode.h b/src/mds/CInode.h index bcb6da667c479..f02ab6cb9309f 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -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: diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 67c8df7f9ca7b..f271b586f2c42 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1510,6 +1510,12 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last) SnapRealm *realm = in->find_snaprealm(); const set& 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::iterator p = in->client_caps.begin(); p != in->client_caps.end(); -- 2.39.5