From ec04ad46eb65cdf605ad2498763aa1d71ac97c26 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Tue, 18 Mar 2025 09:01:49 +0000 Subject: [PATCH] Revert "mds/link: Create referent inode and store backtrace" This reverts commit fb3bf789f4d6cffa3ec316bcc72c2a23b8812e86. Signed-off-by: Venky Shankar (cherry picked from commit aa3d420760b17bdd9245672dccb5f9ae335bae86) --- src/mds/Locker.cc | 6 ++-- src/mds/Server.cc | 70 ++++++++--------------------------------- src/mds/Server.h | 4 +-- src/mds/StrayManager.cc | 4 +-- 4 files changed, 20 insertions(+), 64 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 7b67097ae66..706d240232f 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -425,7 +425,7 @@ bool Locker::acquire_locks(const MDRequestRef& mdr, if (mdr->lock_cache) { // debug ceph_assert(mdr->lock_cache->opcode == CEPH_MDS_OP_UNLINK); CDentry *dn = mdr->dn[0].back(); - ceph_assert(dn->get_projected_linkage()->is_remote() || dn->get_projected_linkage()->is_referent_remote()); + ceph_assert(dn->get_projected_linkage()->is_remote()); } if (object->is_ambiguous_auth()) { @@ -461,7 +461,7 @@ bool Locker::acquire_locks(const MDRequestRef& mdr, { // debug ceph_assert(mdr->lock_cache->opcode == CEPH_MDS_OP_UNLINK); CDentry *dn = mdr->dn[0].back(); - ceph_assert(dn->get_projected_linkage()->is_remote() || dn->get_projected_linkage()->is_referent_remote()); + ceph_assert(dn->get_projected_linkage()->is_remote()); } } @@ -4513,7 +4513,7 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr ceph_assert(dnl->get_inode() == in); mask = CEPH_LEASE_PRIMARY_LINK; } else { - if (dnl->is_remote() || dnl->is_referent_remote()) + if (dnl->is_remote()) ceph_assert(dnl->get_remote_ino() == in->ino()); else ceph_assert(!in); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 2e380c79751..103c3dd6839 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3544,7 +3544,7 @@ CDentry* Server::prepare_stray_dentry(const MDRequestRef& mdr, CInode *in) * create a new inode. set c/m/atime. hit dir pop. */ CInode* Server::prepare_new_inode(const MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode, - const file_layout_t *layout, bool referent_inode) + const file_layout_t *layout) { CInode *in = new CInode(mdcache); auto _inode = in->_get_inode(); @@ -3636,25 +3636,12 @@ CInode* Server::prepare_new_inode(const MDRequestRef& mdr, CDir *dir, inodeno_t _inode->mode |= S_ISGID; } } else { - if (!referent_inode) { - _inode->gid = mdr->client_request->get_owner_gid(); - ceph_assert(_inode->gid != (unsigned)-1); - } - } - - if (!referent_inode) { - _inode->uid = mdr->client_request->get_owner_uid(); - ceph_assert(_inode->uid != (unsigned)-1); + _inode->gid = mdr->client_request->get_owner_gid(); + ceph_assert(_inode->gid != (unsigned)-1); } - /* The referent inode is created on hardlink, so the client request wouldn't - * have uid, gid set. So don't use uid and gid from client if it's a referent - * inode. - */ - if (referent_inode) { - _inode->gid = 0; - _inode->uid = 0; - } + _inode->uid = mdr->client_request->get_owner_uid(); + ceph_assert(_inode->uid != (unsigned)-1); _inode->btime = _inode->ctime = _inode->mtime = _inode->atime = mdr->get_op_stamp(); @@ -7733,18 +7720,17 @@ void Server::handle_client_link(const MDRequestRef& mdr) class C_MDS_link_local_finish : public ServerLogContext { CDentry *dn; CInode *targeti; - CInode *referenti; version_t dnpv; version_t tipv; bool adjust_realm; public: - C_MDS_link_local_finish(Server *s, const MDRequestRef& r, CDentry *d, CInode *ti, CInode *ri, + C_MDS_link_local_finish(Server *s, const MDRequestRef& r, CDentry *d, CInode *ti, version_t dnpv_, version_t tipv_, bool ar) : - ServerLogContext(s, r), dn(d), targeti(ti), referenti(ri), + ServerLogContext(s, r), dn(d), targeti(ti), dnpv(dnpv_), tipv(tipv_), adjust_realm(ar) { } void finish(int r) override { ceph_assert(r == 0); - server->_link_local_finish(mdr, dn, targeti, referenti, dnpv, tipv, adjust_realm); + server->_link_local_finish(mdr, dn, targeti, dnpv, tipv, adjust_realm); } }; @@ -7768,24 +7754,6 @@ void Server::_link_local(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, pi.inode->change_attr++; pi.inode->version = tipv; - // create referent inode. Don't re-create on retry - CInode *newi = nullptr; - if (mds->mdsmap->allow_referent_inodes()) { - if (!mdr->alloc_ino && !mdr->used_prealloc_ino) - newi = prepare_new_inode(mdr, dn->get_dir(), inodeno_t(0), pi.inode->mode, nullptr, true); - else - newi = mdcache->get_inode(mdr->alloc_ino ? mdr->alloc_ino : mdr->used_prealloc_ino); - ceph_assert(newi); - - auto _inode = newi->_get_inode(); - _inode->version = dnpv; - _inode->update_backtrace(); - - /* NOTE: layout, rstat accounting and snapshot related inode updates are not - * required and hence not done for referent inodes. - */ - } - bool adjust_realm = false; if (!target_realm->get_subvolume_ino() && !targeti->is_projected_snaprealm_global()) { sr_t *newsnap = targeti->project_snaprealm(); @@ -7799,24 +7767,18 @@ void Server::_link_local(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, le->metablob.add_client_req(mdr->reqid, mdr->client_request->get_oldest_client_tid()); mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, dn->get_dir(), PREDIRTY_DIR, 1); // new dn mdcache->predirty_journal_parents(mdr, &le->metablob, targeti, 0, PREDIRTY_PRIMARY); // targeti - dout(20) << __func__ << " calling metablob add_remote_dentry with referent_ino= " << (newi ? newi->ino() : inodeno_t(0)) << dendl; - le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type(), newi ? newi->ino() : inodeno_t(0), newi); // new remote + // TODO: Pass referent inode upon creation. It's adding just remote dentry now + le->metablob.add_remote_dentry(dn, true, targeti->ino(), targeti->d_type(), 0, nullptr); // new remote mdcache->journal_dirty_inode(mdr.get(), &le->metablob, targeti); // do this after predirty_*, to avoid funky extra dnl arg - if (newi) { - // journal allocated referent inode and push the linkage with referent inode - journal_allocated_inos(mdr, &le->metablob); - dn->push_projected_linkage(newi, targeti->ino(), newi->ino()); - } else { - dn->push_projected_linkage(targeti->ino(), targeti->d_type()); - } + dn->push_projected_linkage(targeti->ino(), targeti->d_type()); journal_and_reply(mdr, targeti, dn, le, - new C_MDS_link_local_finish(this, mdr, dn, targeti, newi, dnpv, tipv, adjust_realm)); + new C_MDS_link_local_finish(this, mdr, dn, targeti, dnpv, tipv, adjust_realm)); } -void Server::_link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, CInode *referenti, +void Server::_link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, version_t dnpv, version_t tipv, bool adjust_realm) { dout(10) << "_link_local_finish " << *dn << " to " << *targeti << dendl; @@ -7827,12 +7789,6 @@ void Server::_link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *ta dn->link_remote(dnl, targeti); dn->mark_dirty(dnpv, mdr->ls); - if (referenti) { - // dirty referent inode - referenti->mark_dirty(mdr->ls); - referenti->mark_dirty_parent(mdr->ls, true); - } - // target inode mdr->apply(); diff --git a/src/mds/Server.h b/src/mds/Server.h index 075be73908a..87a2ac9bb05 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -222,7 +222,7 @@ public: bool _check_access(Session *session, CInode *in, unsigned mask, int caller_uid, int caller_gid, int setattr_uid, int setattr_gid); CDentry *prepare_stray_dentry(const MDRequestRef& mdr, CInode *in); CInode* prepare_new_inode(const MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode, - const file_layout_t *layout=nullptr, bool referent_inode=false); + const file_layout_t *layout=nullptr); void journal_allocated_inos(const MDRequestRef& mdr, EMetaBlob *blob); void apply_allocated_inos(const MDRequestRef& mdr, Session *session); @@ -294,7 +294,7 @@ public: // link void handle_client_link(const MDRequestRef& mdr); void _link_local(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, SnapRealm *target_realm); - void _link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, CInode *referenti, + void _link_local_finish(const MDRequestRef& mdr, CDentry *dn, CInode *targeti, version_t, version_t, bool); void _link_remote(const MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti); diff --git a/src/mds/StrayManager.cc b/src/mds/StrayManager.cc index 4cc64cffd22..48d4b1e5092 100644 --- a/src/mds/StrayManager.cc +++ b/src/mds/StrayManager.cc @@ -583,7 +583,7 @@ void StrayManager::eval_remote(CDentry *remote_dn) dout(10) << __func__ << " " << *remote_dn << dendl; CDentry::linkage_t *dnl = remote_dn->get_projected_linkage(); - ceph_assert(dnl->is_remote() || dnl->is_referent_remote()); + ceph_assert(dnl->is_remote()); CInode *in = dnl->get_inode(); if (!in) { @@ -614,7 +614,7 @@ class C_RetryEvalRemote : public StrayManagerContext { dn->get(CDentry::PIN_PTRWAITER); } void finish(int r) override { - if (dn->get_projected_linkage()->is_remote() || dn->get_projected_linkage()->is_referent_remote()) + if (dn->get_projected_linkage()->is_remote()) sm->eval_remote(dn); dn->put(CDentry::PIN_PTRWAITER); } -- 2.39.5