From: Yan, Zheng Date: Sun, 15 Nov 2020 01:50:51 +0000 (+0800) Subject: mds: don't access mds->mdsmap without holding mds_lock X-Git-Tag: v16.1.0~436^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=23d79002c4276235ab74a8790d2db209d4f4a527;p=ceph.git mds: don't access mds->mdsmap without holding mds_lock Fixes: https://tracker.ceph.com/issues/47786 Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index f9552c10d5b0..da2aebf921e4 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -2164,37 +2164,41 @@ public: class C_IO_Dir_Commit_Ops : public Context { public: - C_IO_Dir_Commit_Ops(CDir *d, int pr, bufferlist &&bl, - vector &&r, vector &&s, + C_IO_Dir_Commit_Ops(CDir *d, int pr, + vector &&s, bufferlist &&bl, + vector &&r, mempool::mds_co::compact_set &&stale) : dir(d), op_prio(pr) { + metapool = dir->mdcache->mds->mdsmap->get_metadata_pool(); version = dir->get_version(); is_new = dir->is_new(); + to_set.swap(s); dfts.swap(bl); to_remove.swap(r); - to_set.swap(s); stale_items.swap(stale); } void finish(int r) override { - dir->_omap_commit_ops(r, op_prio, version, is_new, dfts, to_remove, to_set, - stale_items); + dir->_omap_commit_ops(r, op_prio, metapool, version, is_new, to_set, dfts, + to_remove, stale_items); } private: CDir *dir; - version_t version; int op_prio; + int64_t metapool; + version_t version; bool is_new; + vector to_set; bufferlist dfts; vector to_remove; - vector to_set; mempool::mds_co::compact_set stale_items; }; // This is not locked by mds_lock -void CDir::_omap_commit_ops(int r, int op_prio, version_t version, bool _new, bufferlist &dfts, - vector& to_remove, vector &to_set, +void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t version, bool _new, + vector &to_set, bufferlist &dfts, + vector& to_remove, mempool::mds_co::compact_set &stales) { dout(10) << __func__ << dendl; @@ -2210,7 +2214,7 @@ void CDir::_omap_commit_ops(int r, int op_prio, version_t version, bool _new, bu SnapContext snapc; object_t oid = get_ondisk_object(); - object_locator_t oloc(mdcache->mds->mdsmap->get_metadata_pool()); + object_locator_t oloc(metapool); map _set; set _rm; @@ -2414,9 +2418,8 @@ void CDir::_omap_commit(int op_prio) } } - auto c = new C_IO_Dir_Commit_Ops(this, op_prio, std::move(dfts), - std::move(to_remove), std::move(to_set), - std::move(stale_items)); + auto c = new C_IO_Dir_Commit_Ops(this, op_prio, std::move(to_set), std::move(dfts), + std::move(to_remove), std::move(stale_items)); stale_items.clear(); mdcache->mds->finisher->queue(c); } diff --git a/src/mds/CDir.h b/src/mds/CDir.h index ad56749bb269..df1cd30529a1 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -711,8 +711,9 @@ protected: // -- commit -- void _commit(version_t want, int op_prio); - void _omap_commit_ops(int r, int op_prio, version_t version, bool _new, bufferlist &bl, - vector &to_remove, vector &to_set, + void _omap_commit_ops(int r, int op_prio, int64_t metapool, version_t version, bool _new, + vector &to_set, bufferlist &dfts, + vector &to_remove, mempool::mds_co::compact_set &_stale); void _omap_commit(int op_prio); void _parse_dentry(CDentry *dn, dentry_commit_item &item,