From: Venky Shankar Date: Tue, 18 Mar 2025 08:58:07 +0000 (+0000) Subject: Revert "multi-mds/unlink: Remove referent inode on unlink" X-Git-Tag: testing/wip-vshankar-testing-20260223.155722^2~26 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8ba167fca25dccfdaff31f8cd3609d46da5a6033;p=ceph-ci.git Revert "multi-mds/unlink: Remove referent inode on unlink" This reverts commit f94c8327facbb313a720f2fcfb013a4f9b00a8e5. Signed-off-by: Venky Shankar --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 56753726c1c..90eb99dc123 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -7883,7 +7883,7 @@ void Server::handle_client_link(const MDRequestRef& mdr) if (targeti->is_auth()) _link_local(mdr, destdn, targeti, target_realm); else - _link_remote(mdr, true, destdn, targeti, nullptr); + _link_remote(mdr, true, destdn, targeti); mds->balancer->maybe_fragment(dir, false); } @@ -8022,26 +8022,24 @@ class C_MDS_link_remote_finish : public ServerLogContext { CDentry *dn; CInode *targeti; CInode *referenti; - CDentry *straydn; version_t dpv; public: - C_MDS_link_remote_finish(Server *s, const MDRequestRef& r, bool i, CDentry *d, CInode *ti, CInode *ri, CDentry *sd) : - ServerLogContext(s, r), inc(i), dn(d), targeti(ti), referenti(ri), straydn(sd), + C_MDS_link_remote_finish(Server *s, const MDRequestRef& r, bool i, CDentry *d, CInode *ti, CInode *ri) : + ServerLogContext(s, r), inc(i), dn(d), targeti(ti), referenti(ri), dpv(d->get_projected_version()) {} void finish(int r) override { ceph_assert(r == 0); - server->_link_remote_finish(mdr, inc, dn, targeti, referenti, straydn, dpv); + server->_link_remote_finish(mdr, inc, dn, targeti, referenti, dpv); } }; -void Server::_link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti, CDentry *straydn) +void Server::_link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti) { dout(10) << "_link_remote " << (inc ? "link ":"unlink ") << *dn << " to " << *targeti << dendl; CInode *newi = nullptr; - CDentry::linkage_t *dnl = dn->get_projected_linkage(); // create referent inode. Don't re-create on retry if (mds->mdsmap->allow_referent_inodes() && inc) { @@ -8132,49 +8130,20 @@ void Server::_link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode dn->push_projected_linkage(targeti->ino(), targeti->d_type()); } } else { - if (dnl->is_referent_remote()) { - ceph_assert(straydn); - CInode *ref_in = dnl->get_referent_inode(); - ceph_assert(ref_in->is_auth()); - - straydn->push_projected_linkage(ref_in); - dn->pre_dirty(); // the unlinked dentry - - // referent remote link - to purge the referent inode created - auto pri = ref_in->project_inode(mdr); - { - std::string t; - dn->make_path_string(t, true); - pri.inode->stray_prior_path = std::move(t); - } - pri.inode->version = ref_in->pre_dirty(); - // Purge enqueue requires inode to be primary and nlink to be 0 - pri.inode->nlink = 0; - ref_in->state_set(CInode::STATE_ORPHAN); - mdcache->predirty_journal_parents(mdr, &le->metablob, ref_in, straydn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1); - pri.inode->update_backtrace(); - le->metablob.add_primary_dentry(straydn, ref_in, true, true); - - mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, -1); - mdcache->journal_cow_dentry(mdr.get(), &le->metablob, dn); - le->metablob.add_null_dentry(dn, true); - dn->push_projected_linkage(); - } else { - dn->pre_dirty(); - mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, -1); - mdcache->journal_cow_dentry(mdr.get(), &le->metablob, dn); - le->metablob.add_null_dentry(dn, true); - dn->push_projected_linkage(); - } + dn->pre_dirty(); + mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, -1); + mdcache->journal_cow_dentry(mdr.get(), &le->metablob, dn); + le->metablob.add_null_dentry(dn, true); + dn->push_projected_linkage(); } journal_and_reply(mdr, (inc ? targeti : nullptr), dn, le, - new C_MDS_link_remote_finish(this, mdr, inc, dn, targeti, newi, straydn)); + new C_MDS_link_remote_finish(this, mdr, inc, dn, targeti, newi)); } void Server::_link_remote_finish(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti, CInode *referenti, - CDentry *straydn, version_t dpv) + version_t dpv) { dout(10) << "_link_remote_finish " << (inc ? "link ":"unlink ") @@ -8202,13 +8171,6 @@ void Server::_link_remote_finish(const MDRequestRef& mdr, bool inc, dn->get_dir()->unlink_inode(dn); dn->pop_projected_linkage(); dn->mark_dirty(dn->get_projected_version(), mdr->ls); // dirty old dentry - - // relink as stray? - if (straydn) { - dout(20) << __func__ << " referent - straydn is " << *straydn << dendl; - straydn->pop_projected_linkage(); - mdcache->touch_dentry_bottom(straydn); - } } mdr->apply(); @@ -8229,12 +8191,6 @@ void Server::_link_remote_finish(const MDRequestRef& mdr, bool inc, if (!inc) // removing a new dn? dn->get_dir()->try_remove_unlinked_dn(dn); - - if (straydn && !straydn->get_projected_linkage()->is_null()) { - // Tip off the MDCache that this dentry is a stray that - // might be elegible for purge. - mdcache->notify_stray(straydn); - } } @@ -8749,8 +8705,8 @@ void Server::handle_client_unlink(const MDRequestRef& mdr) mds->locker->create_lock_cache(mdr, diri); // ok! - if ((dnl->is_remote() || dnl->is_referent_remote()) && !dnl->get_inode()->is_auth()) - _link_remote(mdr, false, dn, dnl->get_inode(), straydn); + if (dnl->is_remote() && !dnl->get_inode()->is_auth()) + _link_remote(mdr, false, dn, dnl->get_inode()); else _unlink_local(mdr, dn, straydn); } diff --git a/src/mds/Server.h b/src/mds/Server.h index de76f1fb3ad..03ae777e7e4 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -305,9 +305,9 @@ public: void _link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, CInode *referenti, version_t, version_t, bool); - void _link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti, CDentry *straydn); + void _link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti); void _link_remote_finish(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti, - CInode *referenti, CDentry *sd, version_t); + CInode *referenti, version_t); void handle_peer_link_prep(const MDRequestRef& mdr); void _logged_peer_link(const MDRequestRef& mdr, CInode *targeti, bool adjust_realm);