From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Eric Sandeen <sandeen@sandeen.net>
Cc: linux-xfs@vger.kernel.org, alex@zadara.com
Subject: Re: [PATCH 1/6] mkfs: check root inode location
Date: Thu, 30 Jan 2020 12:19:17 -0800 [thread overview]
Message-ID: <20200130201917.GD3447196@magnolia> (raw)
In-Reply-To: <226f970e-2368-9e68-cb1b-4de92414d043@sandeen.net>
On Thu, Jan 30, 2020 at 01:32:30PM -0600, Eric Sandeen wrote:
> On 1/23/20 6:17 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> >
> > 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.
Correct, because proto.c uses the regular inode allocation routines to
create the root inode, and mkfs doesn't have the ability to compute the
root inode and Make It So.
> I mostly find myself wondering what a user will do next if this check fails.
Complain. :)
To be fair, if there was a mismatch prior to this patch, the user would
end up with a filesystem that formats fine, mounts ok, and explodes in
xfs_repair. Better we fail early than have repair shred the filesystem
after they've loaded up their production data and deleted the backups.
--D
> Assuming we trust xfs_ialloc_calc_rootino though, this seems fine.
>
> Reviewed-by: Eric Sandeen <sandeen@redhat.com>
>
> -Eric
>
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> > 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
> >
next prev parent reply other threads:[~2020-01-30 20:19 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-24 0:17 [PATCH v3 0/6] xfs_repair: do not trash valid root dirs Darrick J. Wong
2020-01-24 0:17 ` [PATCH 1/6] mkfs: check root inode location Darrick J. Wong
2020-01-30 19:32 ` Eric Sandeen
2020-01-30 20:19 ` Darrick J. Wong [this message]
2020-01-30 20:34 ` Eric Sandeen
2020-01-24 0:17 ` [PATCH 2/6] xfs_repair: enforce that inode btree chunks can't point to AG headers Darrick J. Wong
2020-01-30 19:38 ` Eric Sandeen
2020-01-30 20:26 ` Darrick J. Wong
2020-01-30 20:46 ` Eric Sandeen
2020-01-24 0:17 ` [PATCH 3/6] xfs_repair: refactor fixed inode location checks Darrick J. Wong
2020-01-30 19:45 ` Eric Sandeen
2020-01-30 19:52 ` Eric Sandeen
2020-01-24 0:17 ` [PATCH 4/6] xfs_repair: use libxfs function to calculate root inode location Darrick J. Wong
2020-01-30 19:48 ` Eric Sandeen
2020-01-24 0:17 ` [PATCH 5/6] xfs_repair: check plausibility of root dir pointer before trashing it Darrick J. Wong
2020-01-30 20:18 ` Eric Sandeen
2020-01-30 20:34 ` Darrick J. Wong
2020-01-30 20:41 ` Eric Sandeen
2020-01-30 20:50 ` Darrick J. Wong
2020-01-24 0:18 ` [PATCH 6/6] xfs_repair: try to correct sb_unit value from secondaries Darrick J. Wong
-- strict thread matches above, loose matches on Subject: below --
2020-01-01 1:20 [PATCH v2 0/6] xfs_repair: do not trash valid root dirs Darrick J. Wong
2020-01-01 1:20 ` [PATCH 1/6] mkfs: check root inode location Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200130201917.GD3447196@magnolia \
--to=darrick.wong@oracle.com \
--cc=alex@zadara.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox