From: Venky Shankar Date: Tue, 18 Mar 2025 08:58:23 +0000 (+0000) Subject: Revert "mds/unlink: Remove referent inode on unlink" X-Git-Tag: testing/wip-vshankar-testing-20260223.155722^2~24 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=90944ada54aa37d44997f8c9a28ab597152397e5;p=ceph-ci.git Revert "mds/unlink: Remove referent inode on unlink" This reverts commit bcf2e7d9a0f9ef9b20de85b95c23a9cbe57525ab. Signed-off-by: Venky Shankar --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index f5bca43c1c9..7fe7c99c016 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -8614,11 +8614,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; @@ -8731,9 +8726,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(); @@ -8749,12 +8742,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 @@ -8786,33 +8775,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); @@ -8857,14 +8824,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