Message ID | 157534127538.396264.18160137569276022475.stgit@magnolia (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | xfs_admin: unify online/offline fs label setting | expand |
On Mon, Dec 02, 2019 at 06:47:55PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@oracle.com> > > Connect xfs_admin -L to the xfs_io label command so that we can get and > set the label for a live filesystem. > > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> > --- > db/xfs_admin.sh | 42 ++++++++++++++++++++++++++++++++++++++++-- > man/man8/xfs_admin.8 | 4 +++- > 2 files changed, 43 insertions(+), 3 deletions(-) > Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> > > diff --git a/db/xfs_admin.sh b/db/xfs_admin.sh > index bd325da2..d18959bf 100755 > --- a/db/xfs_admin.sh > +++ b/db/xfs_admin.sh > @@ -7,8 +7,30 @@ > status=0 > DB_OPTS="" > REPAIR_OPTS="" > +IO_OPTS="" > USAGE="Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] device [logdev]" > > +# Try to find a loop device associated with a file. We only want to return > +# one loopdev (multiple loop devices can attach to a single file) so we grab > +# the last line and return it if it's actually a block device. > +try_find_loop_dev_for_file() { > + local x="$(losetup -O NAME -j "$1" 2> /dev/null | tail -n 1)" > + test -b "$x" && echo "$x" > +} > + > +# See if we can find a mount point for the argument. > +find_mntpt_for_arg() { > + local arg="$1" > + > + # See if we can map the arg to a loop device > + local loopdev="$(try_find_loop_dev_for_file "${arg}")" > + test -n "$loopdev" && arg="$loopdev" > + > + # If we find a mountpoint for the device, do a live query; > + # otherwise try reading the fs with xfs_db. > + findmnt -t xfs -f -n -o TARGET "${arg}" 2> /dev/null > +} > + > while getopts "efjlpuc:L:U:V" c > do > case $c in > @@ -16,8 +38,16 @@ do > e) DB_OPTS=$DB_OPTS" -c 'version extflg'";; > f) DB_OPTS=$DB_OPTS" -f";; > j) DB_OPTS=$DB_OPTS" -c 'version log2'";; > - l) DB_OPTS=$DB_OPTS" -r -c label";; > - L) DB_OPTS=$DB_OPTS" -c 'label "$OPTARG"'";; > + l) DB_OPTS=$DB_OPTS" -r -c label" > + IO_OPTS=$IO_OPTS" -r -c label" > + ;; > + L) DB_OPTS=$DB_OPTS" -c 'label "$OPTARG"'" > + if [ "$OPTARG" = "--" ]; then > + IO_OPTS=$IO_OPTS" -c 'label -c'" > + else > + IO_OPTS=$IO_OPTS" -c 'label -s "$OPTARG"'" > + fi > + ;; > p) DB_OPTS=$DB_OPTS" -c 'version projid32bit'";; > u) DB_OPTS=$DB_OPTS" -r -c uuid";; > U) DB_OPTS=$DB_OPTS" -c 'uuid "$OPTARG"'";; > @@ -41,6 +71,14 @@ case $# in > REPAIR_OPTS=$REPAIR_OPTS" -l '$2'" > fi > > + # Try making the changes online, if supported > + if [ -n "$IO_OPTS" ] && mntpt="$(find_mntpt_for_arg "$1")" > + then > + eval xfs_io -x -p xfs_admin $IO_OPTS "$mntpt" > + test "$?" -eq 0 && exit 0 > + fi > + > + # Otherwise try offline changing > if [ -n "$DB_OPTS" ] > then > eval xfs_db -x -p xfs_admin $DB_OPTS $1 > diff --git a/man/man8/xfs_admin.8 b/man/man8/xfs_admin.8 > index 8afc873f..220dd803 100644 > --- a/man/man8/xfs_admin.8 > +++ b/man/man8/xfs_admin.8 > @@ -26,7 +26,7 @@ uses the > .BR xfs_db (8) > command to modify various parameters of a filesystem. > .PP > -Devices that are mounted cannot be modified. > +Devices that are mounted cannot be modified, except as noted below. > Administrators must unmount filesystems before > .BR xfs_admin " or " xfs_db (8) > can convert parameters. > @@ -67,6 +67,7 @@ log buffers). > .TP > .B \-l > Print the current filesystem label. > +This command can be run if the filesystem is mounted. > .TP > .B \-p > Enable 32bit project identifier support (PROJID32BIT feature). > @@ -102,6 +103,7 @@ The filesystem label can be cleared using the special "\c > .B \-\-\c > " value for > .IR label . > +This command can be run if the filesystem is mounted. > .TP > .BI \-U " uuid" > Set the UUID of the filesystem to >
diff --git a/db/xfs_admin.sh b/db/xfs_admin.sh index bd325da2..d18959bf 100755 --- a/db/xfs_admin.sh +++ b/db/xfs_admin.sh @@ -7,8 +7,30 @@ status=0 DB_OPTS="" REPAIR_OPTS="" +IO_OPTS="" USAGE="Usage: xfs_admin [-efjlpuV] [-c 0|1] [-L label] [-U uuid] device [logdev]" +# Try to find a loop device associated with a file. We only want to return +# one loopdev (multiple loop devices can attach to a single file) so we grab +# the last line and return it if it's actually a block device. +try_find_loop_dev_for_file() { + local x="$(losetup -O NAME -j "$1" 2> /dev/null | tail -n 1)" + test -b "$x" && echo "$x" +} + +# See if we can find a mount point for the argument. +find_mntpt_for_arg() { + local arg="$1" + + # See if we can map the arg to a loop device + local loopdev="$(try_find_loop_dev_for_file "${arg}")" + test -n "$loopdev" && arg="$loopdev" + + # If we find a mountpoint for the device, do a live query; + # otherwise try reading the fs with xfs_db. + findmnt -t xfs -f -n -o TARGET "${arg}" 2> /dev/null +} + while getopts "efjlpuc:L:U:V" c do case $c in @@ -16,8 +38,16 @@ do e) DB_OPTS=$DB_OPTS" -c 'version extflg'";; f) DB_OPTS=$DB_OPTS" -f";; j) DB_OPTS=$DB_OPTS" -c 'version log2'";; - l) DB_OPTS=$DB_OPTS" -r -c label";; - L) DB_OPTS=$DB_OPTS" -c 'label "$OPTARG"'";; + l) DB_OPTS=$DB_OPTS" -r -c label" + IO_OPTS=$IO_OPTS" -r -c label" + ;; + L) DB_OPTS=$DB_OPTS" -c 'label "$OPTARG"'" + if [ "$OPTARG" = "--" ]; then + IO_OPTS=$IO_OPTS" -c 'label -c'" + else + IO_OPTS=$IO_OPTS" -c 'label -s "$OPTARG"'" + fi + ;; p) DB_OPTS=$DB_OPTS" -c 'version projid32bit'";; u) DB_OPTS=$DB_OPTS" -r -c uuid";; U) DB_OPTS=$DB_OPTS" -c 'uuid "$OPTARG"'";; @@ -41,6 +71,14 @@ case $# in REPAIR_OPTS=$REPAIR_OPTS" -l '$2'" fi + # Try making the changes online, if supported + if [ -n "$IO_OPTS" ] && mntpt="$(find_mntpt_for_arg "$1")" + then + eval xfs_io -x -p xfs_admin $IO_OPTS "$mntpt" + test "$?" -eq 0 && exit 0 + fi + + # Otherwise try offline changing if [ -n "$DB_OPTS" ] then eval xfs_db -x -p xfs_admin $DB_OPTS $1 diff --git a/man/man8/xfs_admin.8 b/man/man8/xfs_admin.8 index 8afc873f..220dd803 100644 --- a/man/man8/xfs_admin.8 +++ b/man/man8/xfs_admin.8 @@ -26,7 +26,7 @@ uses the .BR xfs_db (8) command to modify various parameters of a filesystem. .PP -Devices that are mounted cannot be modified. +Devices that are mounted cannot be modified, except as noted below. Administrators must unmount filesystems before .BR xfs_admin " or " xfs_db (8) can convert parameters. @@ -67,6 +67,7 @@ log buffers). .TP .B \-l Print the current filesystem label. +This command can be run if the filesystem is mounted. .TP .B \-p Enable 32bit project identifier support (PROJID32BIT feature). @@ -102,6 +103,7 @@ The filesystem label can be cleared using the special "\c .B \-\-\c " value for .IR label . +This command can be run if the filesystem is mounted. .TP .BI \-U " uuid" Set the UUID of the filesystem to