diff mbox series

[22/36] xfs_info: use findmnt to handle mounted block devices

Message ID 155259756550.31886.4299958077869009509.stgit@magnolia (mailing list archive)
State Superseded
Headers show
Series xfsprogs-5.0: fix various problems | expand

Commit Message

Darrick J. Wong March 14, 2019, 9:06 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

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.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 debian/control       |    2 +-
 spaceman/xfs_info.sh |   14 +++++++++++---
 2 files changed, 12 insertions(+), 4 deletions(-)

Comments

Eric Sandeen March 26, 2019, 5:28 p.m. UTC | #1
On 3/14/19 4:06 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> 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.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  debian/control       |    2 +-
>  spaceman/xfs_info.sh |   14 +++++++++++---
>  2 files changed, 12 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/debian/control b/debian/control
> index f4f807b0..0b3205f5 100644
> --- a/debian/control
> +++ b/debian/control
> @@ -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)
> diff --git a/spaceman/xfs_info.sh b/spaceman/xfs_info.sh
> index ecf17f61..70978164 100755
> --- a/spaceman/xfs_info.sh
> +++ b/spaceman/xfs_info.sh
> @@ -24,11 +24,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="$(losetup -n -O NAME -j "${arg}" 2> /dev/null)"

hm, -n has existed since 2013...

commit 9f56106df6b49864ba604f6824f9fad5aeabd17a
Author: Karel Zak <kzak@redhat.com>
Date:   Mon May 13 12:00:24 2013 +0200

    losetup: add --raw and --noheadings
    
    Signed-off-by: Karel Zak <kzak@redhat.com>

and -O since 2012:

commit 896352d3906c19e8519670f1a511afb01083ed5e
Author: Ondrej Oprala <ooprala@redhat.com>
Date:   Mon Nov 12 13:08:00 2012 +0100

    losetup: add --list and --output option

So, granted, that is a /long time/.  And yet, somehow, my RHEL7 box does not
have -n....

# losetup -j fsfile | awk -F: '{print $1}'
/dev/loop0

perhaps, for older compatibility?

(and do we need to handle association w/ more than 1 loop dev? urk...)


> +		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
>  		;;
>
Darrick J. Wong April 18, 2019, 7:12 p.m. UTC | #2
On Tue, Mar 26, 2019 at 12:28:43PM -0500, Eric Sandeen wrote:
> On 3/14/19 4:06 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > 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.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  debian/control       |    2 +-
> >  spaceman/xfs_info.sh |   14 +++++++++++---
> >  2 files changed, 12 insertions(+), 4 deletions(-)
> > 
> > 
> > diff --git a/debian/control b/debian/control
> > index f4f807b0..0b3205f5 100644
> > --- a/debian/control
> > +++ b/debian/control
> > @@ -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)
> > diff --git a/spaceman/xfs_info.sh b/spaceman/xfs_info.sh
> > index ecf17f61..70978164 100755
> > --- a/spaceman/xfs_info.sh
> > +++ b/spaceman/xfs_info.sh
> > @@ -24,11 +24,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="$(losetup -n -O NAME -j "${arg}" 2> /dev/null)"
> 
> hm, -n has existed since 2013...
> 
> commit 9f56106df6b49864ba604f6824f9fad5aeabd17a
> Author: Karel Zak <kzak@redhat.com>
> Date:   Mon May 13 12:00:24 2013 +0200
> 
>     losetup: add --raw and --noheadings
>     
>     Signed-off-by: Karel Zak <kzak@redhat.com>
> 
> and -O since 2012:
> 
> commit 896352d3906c19e8519670f1a511afb01083ed5e
> Author: Ondrej Oprala <ooprala@redhat.com>
> Date:   Mon Nov 12 13:08:00 2012 +0100
> 
>     losetup: add --list and --output option
> 
> So, granted, that is a /long time/.  And yet, somehow, my RHEL7 box does not
> have -n....
> 
> # losetup -j fsfile | awk -F: '{print $1}'
> /dev/loop0
> 
> perhaps, for older compatibility?
> 
> (and do we need to handle association w/ more than 1 loop dev? urk...)

Ok, I'll fix it to avoid losetup -n and only return the last one it
finds.

--D

> 
> 
> > +		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
> >  		;;
> >
diff mbox series

Patch

diff --git a/debian/control b/debian/control
index f4f807b0..0b3205f5 100644
--- a/debian/control
+++ b/debian/control
@@ -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)
diff --git a/spaceman/xfs_info.sh b/spaceman/xfs_info.sh
index ecf17f61..70978164 100755
--- a/spaceman/xfs_info.sh
+++ b/spaceman/xfs_info.sh
@@ -24,11 +24,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="$(losetup -n -O NAME -j "${arg}" 2> /dev/null)"
+		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
 		;;