From: Brian Foster <bfoster@redhat.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: sandeen@sandeen.net, linux-xfs@vger.kernel.org
Subject: Re: [PATCH 3/5] xfs_db: support the needsrepair feature flag in the version command
Date: Thu, 4 Feb 2021 12:54:12 -0500 [thread overview]
Message-ID: <20210204175412.GB3721376@bfoster> (raw)
In-Reply-To: <161238140924.1278306.7058193268638972167.stgit@magnolia>
On Wed, Feb 03, 2021 at 11:43:29AM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
>
> Teach the xfs_db version command about the 'needsrepair' flag, which can
> be used to force the system administrator to repair the filesystem with
> xfs_repair.
>
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
> db/check.c | 5 ++
> db/sb.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++--
> db/xfs_admin.sh | 25 +++++++-
> man/man8/xfs_admin.8 | 30 ++++++++++
> man/man8/xfs_db.8 | 8 +++
> 5 files changed, 213 insertions(+), 9 deletions(-)
>
>
...
> diff --git a/db/sb.c b/db/sb.c
> index f306e939..223b84fe 100644
> --- a/db/sb.c
> +++ b/db/sb.c
...
> @@ -720,8 +840,23 @@ version_f(
> return 0;
> }
>
> + if (xfs_sb_version_needsrepair(&mp->m_sb)) {
> + dbprintf(_("%s: filesystem needs xfs_repair\n"),
> + progname);
> + return 0;
> + }
> +
> /* Logic here derived from the IRIX xfs_chver(1M) script. */
> - if (!strcasecmp(argv[1], "extflg")) {
> + if (!strcasecmp(argv[1], "needsrepair")) {
> + if (!xfs_sb_version_hascrc(&mp->m_sb)) {
> + dbprintf(
> + _("needsrepair flag cannot be enabled on pre-V5 filesystems\n"));
> + exitcode = 2;
> + return 1;
> + }
I still don't understand why we need this magic error code logic, here
and in xfs_admin.sh. Can we not just have xfs_db succeed or fail
(printing why if necessary) as it does today, and then let xfs_admin run
repair if $status == 0 && NEEDSREPAIR?
Brian
> +
> + v5features.incompat |= XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR;
> + } else if (!strcasecmp(argv[1], "extflg")) {
> switch (XFS_SB_VERSION_NUM(&mp->m_sb)) {
> case XFS_SB_VERSION_1:
> version = 0x0004 | XFS_SB_VERSION_EXTFLGBIT;
> @@ -813,6 +948,11 @@ version_f(
> mp->m_sb.sb_versionnum = version;
> mp->m_sb.sb_features2 = features;
> }
> +
> + if (!upgrade_v5_features(mp, &v5features)) {
> + exitcode = 1;
> + return 1;
> + }
> }
>
> if (argc == 3) { /* VERSIONNUM + FEATURES2 */
> diff --git a/db/xfs_admin.sh b/db/xfs_admin.sh
> index 5c57b461..f465bd43 100755
> --- a/db/xfs_admin.sh
> +++ b/db/xfs_admin.sh
> @@ -6,10 +6,11 @@
>
> status=0
> DB_OPTS=""
> +DASH_O_DB_OPTS=""
> REPAIR_OPTS=""
> -USAGE="Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] device [logdev]"
> +USAGE="Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] [-O v5_feature] device [logdev]"
>
> -while getopts "efjlpuc:L:U:V" c
> +while getopts "efjlpuc:L:O:U:V" c
> do
> case $c in
> c) REPAIR_OPTS=$REPAIR_OPTS" -c lazycount="$OPTARG;;
> @@ -19,6 +20,13 @@ do
> l) DB_OPTS=$DB_OPTS" -r -c label";;
> L) DB_OPTS=$DB_OPTS" -c 'label "$OPTARG"'";;
> p) DB_OPTS=$DB_OPTS" -c 'version projid32bit'";;
> + O)
> + if [ -n "$DASH_O_DB_OPTS" ]; then
> + echo "-O can only be specified once." 1>&2
> + exit 1
> + fi
> + DASH_O_DB_OPTS=" -c 'version "$OPTARG"'"
> + ;;
> u) DB_OPTS=$DB_OPTS" -r -c uuid";;
> U) DB_OPTS=$DB_OPTS" -c 'uuid "$OPTARG"'";;
> V) xfs_db -p xfs_admin -V
> @@ -30,6 +38,13 @@ do
> ;;
> esac
> done
> +if [ -n "$DASH_O_DB_OPTS" ]; then
> + if [ -n "$DB_OPTS" ]; then
> + echo "-O can only be used by itself." 1>&2
> + exit 1
> + fi
> + DB_OPTS="$DASH_O_DB_OPTS"
> +fi
> set -- extra $@
> shift $OPTIND
> case $# in
> @@ -48,6 +63,12 @@ case $# in
> fi
> if [ $status -eq 1 ]; then
> echo "Conversion failed due to filesystem errors; run xfs_repair."
> + elif xfs_db -c 'version' "$1" | grep -q NEEDSREPAIR; then
> + # Upgrade required us to run repair, so force
> + # xfs_repair to run by adding a single space to
> + # REPAIR_OPTS.
> + echo "Running xfs_repair to complete the upgrade."
> + REPAIR_OPTS="$REPAIR_OPTS "
> fi
> if [ -n "$REPAIR_OPTS" ]
> then
> diff --git a/man/man8/xfs_admin.8 b/man/man8/xfs_admin.8
> index 8afc873f..d8a0125c 100644
> --- a/man/man8/xfs_admin.8
> +++ b/man/man8/xfs_admin.8
> @@ -6,6 +6,8 @@ xfs_admin \- change parameters of an XFS filesystem
> [
> .B \-eflpu
> ] [
> +.BI \-O " feature"
> +] [
> .BR "\-c 0" | 1
> ] [
> .B \-L
> @@ -103,6 +105,34 @@ The filesystem label can be cleared using the special "\c
> " value for
> .IR label .
> .TP
> +.BI \-O " feature"
> +Add a new feature to a V5 filesystem.
> +Only one filesystem feature can be specified per invocation of xfs_admin.
> +This option cannot be combined with any other
> +.B xfs_admin
> +option.
> +.IP
> +.B NOTE:
> +Administrators must ensure the filesystem is clean by running
> +.B xfs_repair -n
> +to inspect the filesystem before performing the upgrade.
> +If corruption is found, recovery procedures (e.g. reformat followed by
> +restoration from backup; or running
> +.B xfs_repair
> +without the
> +.BR -n )
> +must be followed to clean the filesystem.
> +.IP
> +Features are as follows:
> +.RS 0.7i
> +.TP
> +.B needsrepair
> +Flag the filesystem as needing repairs.
> +Until
> +.BR xfs_repair (8)
> +is run, the filesystem will not be mountable.
> +.RE
> +.TP
> .BI \-U " uuid"
> Set the UUID of the filesystem to
> .IR uuid .
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index ee57b03a..792d98c8 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -971,6 +971,11 @@ may toggle between
> and
> .B attr2
> at will (older kernels may not support the newer version).
> +The filesystem can be flagged as requiring a run through
> +.BR xfs_repair (8)
> +if the
> +.B needsrepair
> +option is specified and the filesystem is formatted with the V5 format.
> .IP
> If no argument is given, the current version and feature bits are printed.
> With one argument, this command will write the updated version number
> @@ -983,6 +988,9 @@ bits respectively, and their string equivalent reported
> (but no modifications are made).
> .IP
> If the feature upgrade succeeds, the program will return 0.
> +The upgrade process may set the NEEDSREPAIR feature in the superblock to
> +force the filesystem to be run through
> +.BR xfs_repair (8).
> If the requested upgrade has already been applied to the filesystem, the
> program will also return 0.
> If the upgrade fails due to corruption or IO errors, the program will return
>
next prev parent reply other threads:[~2021-02-04 17:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-03 19:43 [PATCHSET v3 0/5] xfs: add the ability to flag a fs for repair Darrick J. Wong
2021-02-03 19:43 ` [PATCH 1/5] xfs_admin: clean up string quoting Darrick J. Wong
2021-02-04 17:53 ` Brian Foster
2021-02-03 19:43 ` [PATCH 2/5] xfs_db: define some exit codes for fs feature upgrades Darrick J. Wong
2021-02-03 19:43 ` [PATCH 3/5] xfs_db: support the needsrepair feature flag in the version command Darrick J. Wong
2021-02-04 17:54 ` Brian Foster [this message]
2021-02-04 19:30 ` Darrick J. Wong
2021-02-03 19:43 ` [PATCH 4/5] xfs_repair: fix unmount error message to have a newline Darrick J. Wong
2021-02-03 19:43 ` [PATCH 5/5] xfs_repair: clear the needsrepair flag Darrick J. Wong
2021-02-04 17:55 ` Brian Foster
2021-02-04 19:13 ` 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=20210204175412.GB3721376@bfoster \
--to=bfoster@redhat.com \
--cc=djwong@kernel.org \
--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