]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: fix crash in reset_rt_metadir_inodes
authorDarrick J. Wong <djwong@kernel.org>
Fri, 21 Mar 2025 16:31:46 +0000 (09:31 -0700)
committerAndrey Albershteyn <aalbersh@kernel.org>
Mon, 31 Mar 2025 09:45:45 +0000 (11:45 +0200)
I observed that xfs_repair -n segfaults during xfs/812 after corrupting
the /rtgroups metadir inode because mp->m_rtdirip isn't loaded.  Fix the
crash and print a warning about the missing inode.

Cc: linux-xfs@vger.kernel.org # v6.13.0
Fixes: 7c541c90fd77a2 ("xfs_repair: support realtime groups")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
repair/phase6.c

index 2d526dda484293db6753c359d157db6e86b9506e..c16164c171d07d67fbe084056e09f7b0fb3c2ac5 100644 (file)
@@ -3397,15 +3397,21 @@ reset_rt_metadir_inodes(
                unload_rtgroup_inodes(mp);
 
        if (mp->m_sb.sb_rgcount > 0) {
-               if (!no_modify) {
+               if (no_modify) {
+                       if (!mp->m_rtdirip)
+                               do_warn(_("would recreate realtime metadir\n"));
+               } else {
                        error = -libxfs_rtginode_mkdir_parent(mp);
                        if (error)
                                do_error(_("failed to create realtime metadir (%d)\n"),
                                        error);
                }
-               mark_ino_inuse(mp, mp->m_rtdirip->i_ino, S_IFDIR,
-                               mp->m_metadirip->i_ino);
-               mark_ino_metadata(mp, mp->m_rtdirip->i_ino);
+
+               if (mp->m_rtdirip) {
+                       mark_ino_inuse(mp, mp->m_rtdirip->i_ino, S_IFDIR,
+                                       mp->m_metadirip->i_ino);
+                       mark_ino_metadata(mp, mp->m_rtdirip->i_ino);
+               }
        }
 
        /*