From: Dave Chinner <david@fromorbit.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 00/42] mkfs: factor the crap out of the code
Date: Wed, 30 Aug 2017 11:57:25 +1000 [thread overview]
Message-ID: <20170830015725.GH10621@dastard> (raw)
In-Reply-To: <20170830012330.GG4757@magnolia>
On Tue, Aug 29, 2017 at 06:23:30PM -0700, Darrick J. Wong wrote:
> On Wed, Aug 30, 2017 at 09:50:10AM +1000, Dave Chinner wrote:
> > Everyone who tries to modify mkfs quickly learns that it is a pile
> > of spaghetti, the only difference in opinion is whether it is a
> > steaming, cold or rotten pile. This patchset attempts to untangle
> > the ball of pasta and turn it into a set of clear, obvious
> > operations that lead to a filesystem being formatted correctly.
> >
> > The patch series is really in three parts, splitting the code up
> > into roughly three modules. The first part introduces a mkfs
> > parameters structure and factors the on-disk formatting code to use
> > only information in that structure. The second part introduces a
> > command line input structure and factors the input parsing to use
> > it. This requires a bunch of temporary code to keep the rest of
> > the code working. The third part is factoring the input validation
> > and geometry calculation code to use the input structure and put
> > the output into the mkfs parameter structure and to remove all the
> > temporary support code.
> >
> > The result is three modules - input parsing, validation+calculations
> > and formatting - with well defined data flow between them. This also
> > paves the way to supporting config files to set defaults via a
> > separate (new) module. The overall data flow now looks like this:
> >
> > Build defaults --\
> > ---> mkfs_default_params -> CLI -> mkfs_params
> > config file -----/
> >
> > It is not worth spending a lot of time reviewing the temporary code
> > that is added - it gets removed before the end of the series. No
> > attempt has been made to ensure that mkfs works 100% correctly after
> > each patch is applied - the only guarantee is that it will build
> > cleanly. It /should/ work if a bisect lands in the middle of the
> > series, but trying to exhaustively test each patch is OK would take
> > more effort than it is worth. As such, testing has only been
> > performed on the whole series.
> >
> > The new output from mkfs to indicate where it has sourced the
> > defaults from causes xfstests to have conniptions. This requires
> > some updates to the mkfs output filters that are already in place
> > but it is a fairly trivial update. Test xfs/191 has a couple of new
> > failures, but that is because the new code now correctly parses
> > things like agsize so that block and sector size based
> > specifications work with default mkfs values. This will require test
> > updates.
> >
> > Future work will be to split the xfs_mkfs.c file into a file per
> > module (i.e. seperate files for CLI parsing, mkfs formating,
> > validation+calculation and, finally, one for config file support),
> > but otherwise the majority of the factoring work is now complete.
> >
> > Comments, flames, etc all welcome.
>
> A couple of questions right off the bat--
>
> I've noticed that max_trans_res in mkfs.xfs constructs a fake xfs_mount
> so that it can use libxfs_log_calc_minimum_size to calculate the minimum
> log size. We've had at least a couple of mkfs bug reports where mkfs
> fails to model enough of the proposed filesystem to calculate the
> correct transaction reservation sizes and therefore the minimum log
> size. I've not looked into all 42 patches, but is there a way to
> eliminate the duplicate xfs_mount constructions (there's another one
> around line 2690 in xfs_mkfs.c) because I keep screwing them up? :)
First of all, that's not a problem I'm trying to solve in this
patchset. What I'm trying to do is make it clear what order the
operations are done in mkfs so that we can quickly and clearly
analyse whether such things are possible.
So, if you look at the final code in main(), we now have:
/*
* Set up the basic superblock parameters now so that we can use
* the geometry information we've already validated in libxfs
* provided functions to determine on-disk format information.
*/
initialise_mount(&cfg, mp, sbp);
/*
* With the mount set up, we can finally calculate the log size
* constraints and do default size calculations and final validation
*/
calculate_log_size(&cfg, &cli, mp);
if (!quiet || dry_run) {
print_mkfs_cfg(&cfg, dfile, logfile, rtfile);
if (dry_run)
exit(0);
}
/*
* Finish setting up the superblock state ready for formatting.
*/
setup_superblock(&cfg, mp, sbp);
and the max_trans_res() call is inside calculate_log_size(). IOWs,
the superblock setup is split around parts of calculating the log
size as it was before the factoring, but the log size calculations
are no longer split into two parts around initialising the
superblock.
IOWs, it is clear now is that the only thing that actually
changes between the mount/sb being initialised and the final setup
is a couple of log parameters. Hence there's no real reason why we
can't set all of the superblock up in initialise_mount(), clean up
max_trans_res() to use the mkfs provided mount/sb and then update
the superblock log fields in finish_sb_setup() (aka
setup_superblock())....
So, yeah, it's now clear that this can be done and it's relatively
easy to do. It most certainly wasn't easily to see or do before the
factoring; this is a clear demonstration of why I've wanted mkfs to
be factored for years....
> Second: is it possible to refactor the geometry printing code in mkfs
> and xfs_info to use the same function? They're awfully similar, but not
> /quite/ the same.
Sure, as long as it's the growfs output that changes. But, again,
that's outside the scope of this patchset....
> (Ofc I can already see the objections -- "some script could be parsing
> the output and will break!" <cough>xfstests<cough>...)
mkfs, yes. growfs, not so much. :P
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2017-08-30 1:57 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-29 23:50 [PATCH 00/42] mkfs: factor the crap out of the code Dave Chinner
2017-08-29 23:50 ` [PATCH 01/42] mkfs: can't specify sector size of internal log Dave Chinner
2017-08-29 23:50 ` [PATCH 02/42] mkfs: make subopt table const Dave Chinner
2017-08-29 23:50 ` [PATCH 03/42] mkfs: introduce a structure to hold CLI options Dave Chinner
2017-08-29 23:50 ` [PATCH 04/42] mkfs: add generic subopt parsing table Dave Chinner
2017-08-29 23:50 ` [PATCH 05/42] mkfs: factor block subopts parser Dave Chinner
2017-08-29 23:50 ` [PATCH 06/42] mkfs: factor data " Dave Chinner
2017-08-29 23:50 ` [PATCH 07/42] mkfs: factor inode " Dave Chinner
2017-08-29 23:50 ` [PATCH 08/42] mkfs: factor log " Dave Chinner
2017-08-29 23:50 ` [PATCH 09/42] mkfs: factor meta " Dave Chinner
2017-08-29 23:50 ` [PATCH 10/42] mkfs: factor naming " Dave Chinner
2017-08-29 23:50 ` [PATCH 11/42] mkfs: factor rt " Dave Chinner
2017-08-29 23:50 ` [PATCH 12/42] mkfs: factor sector " Dave Chinner
2017-08-29 23:50 ` [PATCH 13/42] mkfs: Introduce mkfs configuration structure Dave Chinner
2017-08-29 23:50 ` [PATCH 14/42] mkfs: factor printing of mkfs config Dave Chinner
2017-08-29 23:50 ` [PATCH 15/42] mkfs: factor in memory superblock setup Dave Chinner
2017-08-29 23:50 ` [PATCH 16/42] mkfs: factor out device preparation Dave Chinner
2017-08-29 23:50 ` [PATCH 17/42] mkfs: factor writing AG headers Dave Chinner
2017-08-29 23:50 ` [PATCH 18/42] mkfs: factor secondary superblock updates Dave Chinner
2017-08-29 23:50 ` [PATCH 19/42] mkfs: introduce default configuration structure Dave Chinner
2017-08-29 23:50 ` [PATCH 20/42] mkfs: rename top level CLI parameters Dave Chinner
2017-08-29 23:50 ` [PATCH 21/42] mkfs: factor sectorsize validation Dave Chinner
2017-08-29 23:50 ` [PATCH 22/42] mkfs: factor blocksize validation Dave Chinner
2017-08-29 23:50 ` [PATCH 23/42] mkfs: factor log sector size validation Dave Chinner
2017-08-29 23:50 ` [PATCH 24/42] mkfs: factor superblock feature validation Dave Chinner
2017-08-29 23:50 ` [PATCH 25/42] mkfs: factor directory blocksize validation Dave Chinner
2017-08-29 23:50 ` [PATCH 26/42] mkfs: factor inode size validation Dave Chinner
2017-08-29 23:50 ` [PATCH 27/42] mkfs: factor out device size calculations Dave Chinner
2017-08-29 23:50 ` [PATCH 28/42] mkfs: fix hidden parameter in DTOBT() Dave Chinner
2017-08-29 23:50 ` [PATCH 29/42] mkfs: factor rtdev extent size validation Dave Chinner
2017-08-29 23:50 ` [PATCH 30/42] mkfs: rework stripe calculations Dave Chinner
2017-08-29 23:50 ` [PATCH 31/42] mkfs: factor device opening Dave Chinner
2017-08-29 23:50 ` [PATCH 32/42] mkfs: factor data device validation Dave Chinner
2017-08-29 23:50 ` [PATCH 33/42] mkfs: factor log " Dave Chinner
2017-08-29 23:50 ` [PATCH 34/42] mkfs: factor rt " Dave Chinner
2017-08-29 23:50 ` [PATCH 35/42] mkfs: factor AG geometry calculations Dave Chinner
2017-08-29 23:50 ` [PATCH 36/42] mkfs: factor AG alignment Dave Chinner
2017-08-30 23:44 ` Dave Chinner
2017-08-29 23:50 ` [PATCH 37/42] mkfs: rework imaxpct calculation Dave Chinner
2017-08-29 23:50 ` [PATCH 38/42] mkfs: factor initial mount setup Dave Chinner
2017-08-29 23:50 ` [PATCH 39/42] mkfs: factor log size calculations Dave Chinner
2017-09-05 5:23 ` Dave Chinner
2017-08-29 23:50 ` [PATCH 40/42] mkfs: cleanup redundant temporary code Dave Chinner
2017-08-29 23:50 ` [PATCH 41/42] mkfs: move error functions Dave Chinner
2017-08-29 23:50 ` [PATCH 42/42] mkfs: tidy up definitions Dave Chinner
2017-08-30 1:23 ` [PATCH 00/42] mkfs: factor the crap out of the code Darrick J. Wong
2017-08-30 1:57 ` Dave Chinner [this message]
2017-08-30 4:16 ` Luis R. Rodriguez
2017-08-30 5:44 ` Dave Chinner
2017-08-30 22:10 ` Luis R. Rodriguez
2017-08-30 23:22 ` Dave Chinner
2017-08-31 0:05 ` Luis R. Rodriguez
2017-08-31 16:23 ` Jan Tulak
2017-08-30 7:44 ` Martin Steigerwald
2017-09-04 12:31 ` Chandan Rajendra
2017-09-04 15:34 ` Eric Sandeen
2017-09-04 22:40 ` Dave Chinner
2017-09-07 10:31 ` Chandan Rajendra
2017-09-07 23:38 ` Dave Chinner
2017-09-09 10:24 ` Chandan Rajendra
2017-09-15 9:42 ` Jan Tulak
2017-09-16 11:29 ` Dave Chinner
2017-10-24 3:00 ` Eric Sandeen
2017-10-25 0:59 ` Dave Chinner
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=20170830015725.GH10621@dastard \
--to=david@fromorbit.com \
--cc=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).