From: sajibreadd Date: Thu, 24 Apr 2025 13:23:40 +0000 (+0200) Subject: mds: identify damaged hard links during scrub X-Git-Tag: testing/wip-jcollin-testing-20260217.025616-squid^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9c1b4fe3cebeaad3cfd71d0234ffa9fe5edec606;p=ceph-ci.git mds: identify damaged hard links during scrub For a remote link, try to open the dentry (this part of code is copied from the mds path_traversal) which internally pushes the dir_frag in the damage list if applicable. Fixes: https://tracker.ceph.com/issues/69345 Signed-off-by: Md Mahamudur Rahaman Sajib (cherry picked from commit a83787b5a85bb30a087cbe9843cfe35018f6c94d) Conflicts: src/mds/ScrubStack.cc --- diff --git a/src/mds/ScrubStack.cc b/src/mds/ScrubStack.cc index 63f18adf7a3..28e5c1dc869 100644 --- a/src/mds/ScrubStack.cc +++ b/src/mds/ScrubStack.cc @@ -414,6 +414,19 @@ void ScrubStack::scrub_dir_inode_final(CInode *in) return; } +void ScrubStack::identify_remote_link_damage(CDentry *dn) { + + CDentry::linkage_t *dnl = dn->get_linkage(); + CInode *remote_inode = mdcache->get_inode(dnl->get_remote_ino()); + if (!remote_inode) { + if (mdcache->mds->damage_table.is_remote_damaged(dnl->get_remote_ino())) { + dout(4) << "scrub: remote dentry points to damaged ino " << *dn << dendl; + return; + } + mdcache->open_remote_dentry(dn, true, new C_MDSInternalNoop()); + } +} + void ScrubStack::scrub_dirfrag(CDir *dir, bool *done) { ceph_assert(dir != NULL); @@ -457,7 +470,7 @@ void ScrubStack::scrub_dirfrag(CDir *dir, bool *done) if (dnl->is_primary()) { _enqueue(dnl->get_inode(), header, false); } else if (dnl->is_remote()) { - // TODO: check remote linkage + identify_remote_link_damage(dn); } } } diff --git a/src/mds/ScrubStack.h b/src/mds/ScrubStack.h index a2ed3d5a89a..eb47b9309b4 100644 --- a/src/mds/ScrubStack.h +++ b/src/mds/ScrubStack.h @@ -188,6 +188,12 @@ private: */ void scrub_file_inode(CInode *in); + /** + * Scrub a file inode. + * @param dn The remote dentry to identify + */ + void identify_remote_link_damage(CDentry *dn); + /** * Callback from completion of CInode::validate_disk_state * @param in The inode we were validating