On 1/23/20 6:17 PM, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Make sure the root inode gets created where repair thinks it should be > created. Actual mkfs-time location calculation is still completely separate from the code in xfs_ialloc_calc_rootino though, right? Maybe there's nothing to do about that. I mostly find myself wondering what a user will do next if this check fails. Assuming we trust xfs_ialloc_calc_rootino though, this seems fine. Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> -Eric > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > libxfs/libxfs_api_defs.h | 1 + > mkfs/xfs_mkfs.c | 39 +++++++++++++++++++++++++++++++++------ > 2 files changed, 34 insertions(+), 6 deletions(-) > > > diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h > index cc7304ad..9ede0125 100644 > --- a/libxfs/libxfs_api_defs.h > +++ b/libxfs/libxfs_api_defs.h > @@ -172,6 +172,7 @@ > > #define xfs_ag_init_headers libxfs_ag_init_headers > #define xfs_buf_delwri_submit libxfs_buf_delwri_submit > +#define xfs_ialloc_calc_rootino libxfs_ialloc_calc_rootino > > #define xfs_refcountbt_calc_reserves libxfs_refcountbt_calc_reserves > #define xfs_finobt_calc_reserves libxfs_finobt_calc_reserves > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 784fe6a9..91a25bf5 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -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 >