From: Yan, Zheng Date: Mon, 6 Jun 2016 08:41:49 +0000 (+0800) Subject: client: skip executing async invalidates while umounting X-Git-Tag: v11.0.0~257^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=24749bfe0648eb019f6c1d886df21a453a72f43f;p=ceph.git client: skip executing async invalidates while umounting Fixes: http://tracker.ceph.com/issues/16137 Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 31cc936bce8..9d6d5b85b54 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3500,31 +3500,29 @@ void Client::wake_inode_waiters(MetaSession *s) class C_Client_CacheInvalidate : public Context { private: Client *client; - InodeRef inode; + vinodeno_t ino; int64_t offset, length; public: C_Client_CacheInvalidate(Client *c, Inode *in, int64_t off, int64_t len) : - client(c), inode(in), offset(off), length(len) { + client(c), offset(off), length(len) { + if (client->use_faked_inos()) + ino = vinodeno_t(in->faked_ino, CEPH_NOSNAP); + else + ino = in->vino(); } void finish(int r) { // _async_invalidate takes the lock when it needs to, call this back from outside of lock. assert(!client->client_lock.is_locked_by_me()); - client->_async_invalidate(inode, offset, length); + client->_async_invalidate(ino, offset, length); } }; -void Client::_async_invalidate(InodeRef& in, int64_t off, int64_t len) +void Client::_async_invalidate(vinodeno_t ino, int64_t off, int64_t len) { - ldout(cct, 10) << "_async_invalidate " << off << "~" << len << dendl; - if (use_faked_inos()) - ino_invalidate_cb(callback_handle, vinodeno_t(in->faked_ino, CEPH_NOSNAP), off, len); - else - ino_invalidate_cb(callback_handle, in->vino(), off, len); - - client_lock.Lock(); - in.reset(); // put inode inside client_lock - client_lock.Unlock(); - ldout(cct, 10) << "_async_invalidate " << off << "~" << len << " done" << dendl; + if (unmounting) + return; + ldout(cct, 10) << "_async_invalidate " << ino << " " << off << "~" << len << dendl; + ino_invalidate_cb(callback_handle, ino, off, len); } void Client::_schedule_invalidate_callback(Inode *in, int64_t off, int64_t len) { @@ -4697,6 +4695,8 @@ public: void Client::_async_dentry_invalidate(vinodeno_t dirino, vinodeno_t ino, string& name) { + if (unmounting) + return; ldout(cct, 10) << "_async_dentry_invalidate '" << name << "' ino " << ino << " in dir " << dirino << dendl; dentry_invalidate_cb(callback_handle, dirino, ino, name); diff --git a/src/client/Client.h b/src/client/Client.h index 03b7f7a478c..e84de5f822d 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -628,7 +628,7 @@ protected: void _schedule_invalidate_callback(Inode *in, int64_t off, int64_t len); void _invalidate_inode_cache(Inode *in); void _invalidate_inode_cache(Inode *in, int64_t off, int64_t len); - void _async_invalidate(InodeRef& in, int64_t off, int64_t len); + void _async_invalidate(vinodeno_t ino, int64_t off, int64_t len); bool _release(Inode *in); /**