]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_info: use findmnt to handle mounted block devices
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)
committerEric Sandeen <sandeen@redhat.com>
Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)
Use findmnt to determine if the passed-in argument is associated with a
mount point, and if so, use spaceman to query the mounted filesystem.
If the user passed in a file, try to find out if it's a loop mounted
live filesystem and if so query the live filesystem.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
debian/control
spaceman/xfs_info.sh

index f4f807b0d043744005237c9d7e559ff661fb38ca..0b3205f549dce5b3ecdeabb5372868bf23116be3 100644 (file)
@@ -8,7 +8,7 @@ Standards-Version: 4.0.0
 Homepage: https://xfs.wiki.kernel.org/
 
 Package: xfsprogs
-Depends: ${shlibs:Depends}, ${misc:Depends}, python3:any
+Depends: ${shlibs:Depends}, ${misc:Depends}, python3:any, util-linux
 Provides: fsck-backend
 Suggests: xfsdump, acl, attr, quota
 Breaks: xfsdump (<< 3.0.0)
index ecf17f6143d0b31df071b33ace15fd594c061d9b..1bf6d2c30e1854adbd87fac8fa0733dc046324c1 100755 (executable)
@@ -7,6 +7,14 @@
 OPTS=""
 USAGE="Usage: xfs_info [-V] [-t mtab] [mountpoint|device|file]"
 
+# 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"
+}
+
 while getopts "t:V" c
 do
        case $c in
@@ -24,11 +32,19 @@ set -- extra "$@"
 shift $OPTIND
 case $# in
        1)
-               if [ -b "$1" ] || [ -f "$1" ]; then
-                       xfs_db -p xfs_info -c "info" $OPTS "$1"
+               arg="$1"
+
+               # See if we can map the arg to a loop device
+               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.
+               if mountpt="$(findmnt -f -n -o TARGET "${arg}" 2> /dev/null)"; then
+                       xfs_spaceman -p xfs_info -c "info" $OPTS "${mountpt}"
                        status=$?
                else
-                       xfs_spaceman -p xfs_info -c "info" $OPTS "$1"
+                       xfs_db -p xfs_info -c "info" $OPTS "${arg}"
                        status=$?
                fi
                ;;