From: Yan, Zheng Date: Sun, 13 Apr 2014 07:45:33 +0000 (+0800) Subject: mds: do file recover after authpin inode X-Git-Tag: v0.80-rc1~39^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bd8aa6f46e770b47a3967d56ca1ef02768d90ecc;p=ceph.git mds: do file recover after authpin inode MDCache::do_file_recover may call Locker::evel_gather, which may change filelock to stable state. So we should authpin the inode (for unstable lock state) first. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 70223a9039ff..932a585a84a2 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3559,11 +3559,12 @@ bool Locker::simple_sync(SimpleLock *lock, bool *need_issue) } } + bool need_recover = false; if (lock->get_type() == CEPH_LOCK_IFILE) { assert(in); if (in->state_test(CInode::STATE_NEEDSRECOVER)) { mds->mdcache->queue_file_recover(in); - mds->mdcache->do_file_recover(); + need_recover = true; gather++; } } @@ -3577,6 +3578,8 @@ bool Locker::simple_sync(SimpleLock *lock, bool *need_issue) if (gather) { lock->get_parent()->auth_pin(lock); + if (need_recover) + mds->mdcache->do_file_recover(); return false; } } @@ -3697,11 +3700,12 @@ void Locker::simple_lock(SimpleLock *lock, bool *need_issue) } } + bool need_recover = false; if (lock->get_type() == CEPH_LOCK_IFILE) { assert(in); if(in->state_test(CInode::STATE_NEEDSRECOVER)) { mds->mdcache->queue_file_recover(in); - mds->mdcache->do_file_recover(); + need_recover = true; gather++; } } @@ -3732,6 +3736,8 @@ void Locker::simple_lock(SimpleLock *lock, bool *need_issue) if (gather) { lock->get_parent()->auth_pin(lock); + if (need_recover) + mds->mdcache->do_file_recover(); } else { lock->set_state(LOCK_LOCK); lock->finish_waiters(ScatterLock::WAIT_XLOCK|ScatterLock::WAIT_WR|ScatterLock::WAIT_STABLE); @@ -4391,15 +4397,18 @@ void Locker::scatter_mix(ScatterLock *lock, bool *need_issue) issue_caps(in); gather++; } + bool need_recover = false; if (in->state_test(CInode::STATE_NEEDSRECOVER)) { mds->mdcache->queue_file_recover(in); - mds->mdcache->do_file_recover(); + need_recover = true; gather++; } - if (gather) + if (gather) { lock->get_parent()->auth_pin(lock); - else { + if (need_recover) + mds->mdcache->do_file_recover(); + } else { in->start_scatter(lock); lock->set_state(LOCK_MIX); lock->clear_scatter_wanted(); @@ -4463,14 +4472,17 @@ void Locker::file_excl(ScatterLock *lock, bool *need_issue) issue_caps(in); gather++; } + bool need_recover = false; if (in->state_test(CInode::STATE_NEEDSRECOVER)) { mds->mdcache->queue_file_recover(in); - mds->mdcache->do_file_recover(); + need_recover = true; gather++; } if (gather) { lock->get_parent()->auth_pin(lock); + if (need_recover) + mds->mdcache->do_file_recover(); } else { lock->set_state(LOCK_EXCL); if (need_issue)