From d5ea873fcbf00b841f0511a26fb341364a5c6425 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Tue, 8 Jun 2010 20:03:39 +0000 Subject: [PATCH] xfstests: resolve symlinked devices to real paths If you try running xfstests on lvm volumes which are symlinks, it'll fail to run several tests because our _require_scratch framework ultimately uses lstat not stat, and does not think the lvm device (which is usually a symlink to a dm-X device) is a block device. Sigh. Last try at this - just resolve any symlinked devicenames into their realpath(3) in common.config. This actually seems to work. Signed-off-by: Eric Sandeen Reviewed-by: Rich Johnston Signed-off-by: Rich Johnston --- common.config | 9 +++++++++ src/realpath.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/realpath.c diff --git a/common.config b/common.config index 57f505de..585b1505 100644 --- a/common.config +++ b/common.config @@ -220,6 +220,15 @@ else known_hosts fi +# Scripts just don't deal well with symlinked devices +if [ -L $TEST_DEV ]; then + TEST_DEV=`src/realpath $TEST_DEV` +fi + +if [ -L $SCRATCH_DEV ]; then + SCRATCH_DEV=`src/realpath $SCRATCH_DEV` +fi + echo $TEST_DEV | grep -q ":" > /dev/null 2>&1 if [ ! -b "$TEST_DEV" -a "$?" != "0" ]; then echo "common.config: Error: \$TEST_DEV ($TEST_DEV) is not a block device or a NFS filesystem" diff --git a/src/realpath.c b/src/realpath.c new file mode 100644 index 00000000..997b1aa9 --- /dev/null +++ b/src/realpath.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +/* + * Simple wrapper around realpath(3) to get absolute path + * to a device name; many xfstests scripts don't cope well + * with symlinked devices due to differences in /proc/mounts, + * /etc/mtab, mount output, etc. + */ + +int main(int argc, char *argv[]) +{ + char path[PATH_MAX]; + char resolved_path[PATH_MAX]; + + if (argc != 2) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + strncpy(path, argv[1], PATH_MAX-1); + + if (!realpath(path, resolved_path)) { + perror("Failed to resolve path for %s"); + return 1; + } + + printf("%s\n", resolved_path); + return 0; +} -- 2.30.2