From ec9b5fc78bb46ee05b673cf5b6a5adb200021264 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Tue, 18 Mar 2025 08:58:23 +0000 Subject: [PATCH] Revert "mds/unlink: Remove referent inode on unlink" This reverts commit bcf2e7d9a0f9ef9b20de85b95c23a9cbe57525ab. Signed-off-by: Venky Shankar (cherry picked from commit 3f94e34424cc295a91d48273da7cd60163f59158) --- src/mds/Server.cc | 58 ++++++++--------------------------------------- 1 file changed, 10 insertions(+), 48 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 35b0ea27001..f45e86307fd 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -8459,11 +8459,6 @@ void Server::handle_client_unlink(const MDRequestRef& mdr) if (!straydn) return; dout(10) << " straydn is " << *straydn << dendl; - } else if (dnl->is_referent_remote()) { - straydn = prepare_stray_dentry(mdr, dnl->get_referent_inode()); - if (!straydn) - return; - dout(10) << __func__ << " referent straydn is " << *straydn << dendl; } else if (mdr->straydn) { mdr->unpin(mdr->straydn); mdr->straydn = NULL; @@ -8576,9 +8571,7 @@ void Server::_unlink_local(const MDRequestRef& mdr, CDentry *dn, CDentry *strayd CDentry::linkage_t *dnl = dn->get_projected_linkage(); CInode *in = dnl->get_inode(); - CInode *ref_in = dnl->get_referent_inode(); - if (dnl->is_referent_remote()) - ceph_assert(ref_in->is_auth()); + // ok, let's do it. mdr->ls = mdlog->get_current_segment(); @@ -8594,12 +8587,8 @@ void Server::_unlink_local(const MDRequestRef& mdr, CDentry *dn, CDentry *strayd } if (straydn) { - ceph_assert(dnl->is_primary() || dnl->is_referent_remote()); - if (dnl->is_primary()) - straydn->push_projected_linkage(in); - else if (dnl->is_referent_remote()) { - straydn->push_projected_linkage(ref_in); - } + ceph_assert(dnl->is_primary()); + straydn->push_projected_linkage(in); } // the unlinked dentry @@ -8631,33 +8620,11 @@ void Server::_unlink_local(const MDRequestRef& mdr, CDentry *dn, CDentry *strayd // will manually pop projected inode // primary link. add stray dentry. - if (dnl->is_primary()) { - mdcache->predirty_journal_parents(mdr, &le->metablob, in, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, -1); - mdcache->predirty_journal_parents(mdr, &le->metablob, in, straydn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1); + mdcache->predirty_journal_parents(mdr, &le->metablob, in, dn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, -1); + mdcache->predirty_journal_parents(mdr, &le->metablob, in, straydn->get_dir(), PREDIRTY_PRIMARY|PREDIRTY_DIR, 1); - pi.inode->update_backtrace(); - le->metablob.add_primary_dentry(straydn, in, true, true); - } else if (dnl->is_referent_remote()) { - // 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 - // link count is never > 1 for referent inode, just set it to 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, in, dn->get_dir(), PREDIRTY_DIR, -1); - mdcache->predirty_journal_parents(mdr, &le->metablob, in, 0, PREDIRTY_PRIMARY); - mdcache->journal_dirty_inode(mdr.get(), &le->metablob, in); - } + pi.inode->update_backtrace(); + le->metablob.add_primary_dentry(straydn, in, true, true); } else { // remote link. update remote inode. mdcache->predirty_journal_parents(mdr, &le->metablob, in, dn->get_dir(), PREDIRTY_DIR, -1); @@ -8702,14 +8669,9 @@ void Server::_unlink_local_finish(const MDRequestRef& mdr, if (straydn) { // if there is newly created snaprealm, need to split old snaprealm's // inodes_with_caps. So pop snaprealm before linkage changes. - if (dn->get_linkage()->is_primary()) { - strayin = dn->get_linkage()->get_inode(); - hadrealm = strayin->snaprealm ? true : false; - strayin->early_pop_projected_snaprealm(); - } else if (dn->get_linkage()->is_referent_remote()) { - // No snapshots on referent inodes - Ignore snaprealm related stuff for referent inodes - strayin = dn->get_linkage()->get_referent_inode(); - } + strayin = dn->get_linkage()->get_inode(); + hadrealm = strayin->snaprealm ? true : false; + strayin->early_pop_projected_snaprealm(); } // unlink main dentry -- 2.39.5