]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
mkfs: check root inode location
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 27 Feb 2020 19:49:55 +0000 (14:49 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Thu, 27 Feb 2020 19:49:55 +0000 (14:49 -0500)
Make sure the root inode gets created where repair thinks it should be
created.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/libxfs_api_defs.h
mkfs/xfs_mkfs.c

index 9daf2635f368b79cdef11b9e35169613aeddfe4c..7c629c625f078b8805a2dd9bfbf3fa05a66bed0a 100644 (file)
@@ -98,6 +98,7 @@
 #define xfs_fs_geometry                        libxfs_fs_geometry
 #define xfs_highbit32                  libxfs_highbit32
 #define xfs_highbit64                  libxfs_highbit64
+#define xfs_ialloc_calc_rootino                libxfs_ialloc_calc_rootino
 #define xfs_idata_realloc              libxfs_idata_realloc
 #define xfs_idestroy_fork              libxfs_idestroy_fork
 #define xfs_iext_lookup_extent         libxfs_iext_lookup_extent
index 606f79dafc233730a5ca283374f5af3c5b965c03..cc71fd392519b737c8adf926c1315b6f59bead2d 100644 (file)
@@ -3549,6 +3549,38 @@ rewrite_secondary_superblocks(
        libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
 }
 
+static void
+check_root_ino(
+       struct xfs_mount        *mp)
+{
+       xfs_ino_t               ino;
+
+       if (XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino) != 0) {
+               fprintf(stderr,
+                       _("%s: root inode created in AG %u, not AG 0\n"),
+                       progname, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino));
+               exit(1);
+       }
+
+       /*
+        * The superblock points to the root directory inode, but xfs_repair
+        * expects to find the root inode in a very specific location computed
+        * from the filesystem geometry for an extra level of verification.
+        *
+        * Fail the format immediately if those assumptions ever break, because
+        * repair will toss the root directory.
+        */
+       ino = libxfs_ialloc_calc_rootino(mp, mp->m_sb.sb_unit);
+       if (mp->m_sb.sb_rootino != ino) {
+               fprintf(stderr,
+       _("%s: root inode (%llu) not allocated in expected location (%llu)\n"),
+                       progname,
+                       (unsigned long long)mp->m_sb.sb_rootino,
+                       (unsigned long long)ino);
+               exit(1);
+       }
+}
+
 int
 main(
        int                     argc,
@@ -3835,12 +3867,7 @@ main(
        /*
         * Protect ourselves against possible stupidity
         */
-       if (XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino) != 0) {
-               fprintf(stderr,
-                       _("%s: root inode created in AG %u, not AG 0\n"),
-                       progname, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino));
-               exit(1);
-       }
+       check_root_ino(mp);
 
        /*
         * Re-write multiple secondary superblocks with rootinode field set