From cdfb704d48db636d38e1d450fc142c930cd8f193 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 26 Dec 2019 22:31:28 +0000 Subject: [PATCH] ZTS: devices_001_pos and devices_002_neg Update the devices_001_pos and devices_002_neg test cases such that the special block device file created is backed by a ZFS volume. Specifying a specific device allows the major and minor numbers to be easily determined. Furthermore, this avoids the potentially dangerous behavior of opening the first block device we happen to find under /dev/. Signed-off-by: Brian Behlendorf --- .../functional/devices/devices_001_pos.ksh | 18 +- .../functional/devices/devices_002_neg.ksh | 16 +- .../functional/devices/devices_common.kshlib | 214 ++++-------------- .../tests/functional/devices/setup.ksh | 2 +- 4 files changed, 69 insertions(+), 181 deletions(-) diff --git a/tests/zfs-tests/tests/functional/devices/devices_001_pos.ksh b/tests/zfs-tests/tests/functional/devices/devices_001_pos.ksh index ac031ed6a52f..2f2802bc65a3 100755 --- a/tests/zfs-tests/tests/functional/devices/devices_001_pos.ksh +++ b/tests/zfs-tests/tests/functional/devices/devices_001_pos.ksh @@ -42,7 +42,7 @@ # 1. Create pool and file system. # 2. Set devices=on on this file system. # 3. Separately create block device file and character file. -# 4. Separately read from those two device files. +# 4. Separately read and write from those two device files. # 5. Check the return value, and make sure it succeeds. # @@ -55,12 +55,18 @@ log_onexit cleanup log_must zfs set devices=on $TESTPOOL/$TESTFS # -# Separately create block device file and character device file, then try to -# open them and make sure it succeed. +# Create block device file backed by a ZFS volume. +# Verify it can be opened, written, and read. # -create_dev_file b $TESTDIR/$TESTFILE1 -log_must dd if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out count=1 +create_dev_file b $TESTDIR/$TESTFILE1 $ZVOL_DEVDIR/$TESTPOOL/$TESTVOL +log_must dd if=/dev/urandom of=$TESTDIR/$TESTFILE1.out1 count=1 bs=128k +log_must dd if=$TESTDIR/$TESTFILE1.out1 of=$TESTDIR/$TESTFILE1 count=1 bs=128k +log_must dd if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out2 count=1 bs=128k +log_must cmp $TESTDIR/$TESTFILE1.out1 $TESTDIR/$TESTFILE1.out2 + +# Create character device file backed by /dev/null +# Verify it can be opened and written. create_dev_file c $TESTDIR/$TESTFILE2 -log_must dd if=$TESTDIR/$TESTFILE2 of=$TESTDIR/$TESTFILE2.out count=1 +log_must dd if=/dev/urandom of=$TESTDIR/$TESTFILE2 count=1 bs=128k log_pass "Setting devices=on on file system and testing it pass." diff --git a/tests/zfs-tests/tests/functional/devices/devices_002_neg.ksh b/tests/zfs-tests/tests/functional/devices/devices_002_neg.ksh index ce25502b818b..a768c4aa6b34 100755 --- a/tests/zfs-tests/tests/functional/devices/devices_002_neg.ksh +++ b/tests/zfs-tests/tests/functional/devices/devices_002_neg.ksh @@ -42,7 +42,7 @@ # 1. Create pool and file system. # 2. Set devices=off on this file system. # 3. Separately create block device file and character file. -# 4. Separately read from those two device files. +# 4. Separately read and write from those two device files. # 5. Check the return value, and make sure it failed. # @@ -55,12 +55,16 @@ log_onexit cleanup log_must zfs set devices=off $TESTPOOL/$TESTFS # -# Separately create block device file and character device file, then try to -# open them and make sure it failed. +# Create block device file backed by a ZFS volume. +# Verify it cannot be opened, written, and read. # -create_dev_file b $TESTDIR/$TESTFILE1 -log_mustnot dd if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out count=1 +create_dev_file b $TESTDIR/$TESTFILE1 $ZVOL_DEVDIR/$TESTPOOL/$TESTVOL +log_mustnot dd if=/dev/urandom of=$TESTDIR/$TESTFILE1 count=1 bs=128k +log_mustnot dd if=$TESTDIR/$TESTFILE1 of=/dev/null count=1 bs=128k + +# Create character device file backed by /dev/null +# Verify it cannot be opened and written. create_dev_file c $TESTDIR/$TESTFILE2 -log_mustnot dd if=$TESTDIR/$TESTFILE2 of=$TESTDIR/$TESTFILE2.out count=1 +log_mustnot dd if=/dev/urandom of=$TESTDIR/$TESTFILE2 count=1 bs=128k log_pass "Setting devices=off on file system and testing it pass." diff --git a/tests/zfs-tests/tests/functional/devices/devices_common.kshlib b/tests/zfs-tests/tests/functional/devices/devices_common.kshlib index 2fa1dcff8230..fa7fdbecf5fd 100644 --- a/tests/zfs-tests/tests/functional/devices/devices_common.kshlib +++ b/tests/zfs-tests/tests/functional/devices/devices_common.kshlib @@ -36,192 +36,70 @@ # # $1 device file type # $2 file name +# $3 device path (used for 'b' device type) # function create_dev_file { typeset filetype=$1 typeset filename=$2 - - case $(uname) in - FreeBSD) - create_dev_file_freebsd "$filetype" "$filename" - ;; - Linux) - create_dev_file_linux "$filetype" "$filename" - ;; - *) - create_dev_file_illumos "$filetype" "$filename" - ;; - esac - - return 0 -} - -function create_dev_file_freebsd -{ - typeset filetype=$1 - typeset filename=$2 + typeset devstr=$3 case $filetype in b) - devtype=$(df -T / | grep -v "Type" | awk '{print $2}') - case $devtype in - zfs) - rootpool=$(df / | grep -v "Filesystem" | \ - awk '{print $2}') - rootpool=${rootpool#\(} - rootpool=${rootpool%%/*} - - devstr=$(get_disklist $rootpool) - devstr=$(echo "$devstr" | \ - awk '{print $1}') - [[ -z $devstr ]] && \ - log_fail "Can not get block device file." - devstr=/dev/${devstr} - ;; - ufs) - # - # Get the existing block device file in current system. - # And bring out the first one. - # - devstr=$(df -t ufs | \ - grep "^/dev/" | \ - head -n 1 | \ - awk '{print $1}') - devstr=$(echo "$devstr" | \ - awk '{print $1}') - [[ -z $devstr ]] && \ - log_fail "Can not get block device file." + case $(uname) in + Linux) + # + # stat(1) --format=FORMAT tokens + # %t - major device type in hex + # %T - minor device type in hex + # + major=$(stat --dereference --format="%t" "$devstr") + minor=$(stat --dereference --format="%T" "$devstr") + log_must mknod $filename b "0x${major}" "0x${minor}" ;; *) - log_unsupported "Unsupported fstype " \ - "for / ($devtype)," \ - "only ufs|zfs is supported." + # + # Get the device file information. i.e: + # $devstr: block special (28/768) + # + devstr=$(file $devstr) + major=${devstr##*\(} + major=${major%%/*} + minor=${devstr##*/} + minor=${minor%\)} + log_must mknod $filename b $major $minor ;; esac - - # - # Get the device file information. i.e: - # /dev/c0t0d0s0: block special (28/768) - # - devstr=$(file $devstr) - - # - # Bring out major and minor number. - # - major=${devstr##*\(} - major=${major%%/*} - minor=${devstr##*/} - minor=${minor%\)} - - log_must mknod $filename b $major $minor ;; c) # - # Create device file '/dev/null' - # - log_must mknod $filename c 13 2 - ;; - *) - log_fail "'$filetype' is wrong." - ;; - esac - - return 0 -} - -function create_dev_file_illumos -{ - typeset filetype=$1 - typeset filename=$2 - - case $filetype in - b) - devtype=$(df -n / | awk '{print $3}') - case $devtype in - zfs) - rootpool=$(df / | \ - awk '{print $2}') - rootpool=${rootpool#\(} - rootpool=${rootpool%%/*} - - devstr=$(get_disklist $rootpool) - devstr=$(echo "$devstr" | \ - awk '{print $1}') - [[ -z $devstr ]] && \ - log_fail "Can not get block device file." - devstr=$DEV_DSKDIR/${devstr} + # Create device file '/dev/null', $devstr is unused. + # + case $(uname) in + Linux) + # + # stat(1) --format=FORMAT tokens + # %t - major device type in hex + # %T - minor device type in hex + # + major=$(stat --format="%t" /dev/null) + minor=$(stat --format="%T" /dev/null) + log_must mknod $filename c "0x${major}" "0x${minor}" ;; - ufs) - # - # Get the existing block device file in current system. - # And bring out the first one. - # - devstr=$(df-lhF ufs | \ - grep "^${DEV_DSKDIR}" | \ - awk '{print $1}') - devstr=$(echo "$devstr" | \ - awk '{print $1}') - [[ -z $devstr ]] && \ - log_fail "Can not get block device file." + FreeBSD) + # + # Create device file '/dev/null' + # + major=13 + minor=2 + log_must mknod $filename b $major $minor ;; *) - log_unsupported "Unsupported fstype " \ - "for / ($devtype)," \ - "only ufs|zfs is supported." + major=$(getmajor mm) + minor=2 + log_must mknod $filename b $major $minor ;; esac - - # - # Get the device file information. i.e: - # $DEV_DSKDIR/c0t0d0s0: block special (28/768) - # - devstr=$(file $devstr) - - # - # Bring out major and minor number. - # - major=${devstr##*\(} - major=${major%%/*} - minor=${devstr##*/} - minor=${minor%\)} - - log_must mknod $filename b $major $minor - ;; - c) - # - # Create device file '/dev/null' - # - log_must mknod $filename c $(getmajor mm) 2 - ;; - *) - log_fail "'$filetype' is wrong." - ;; - esac - - return 0 -} - -function create_dev_file_linux -{ - typeset filetype=$1 - typeset filename=$2 - - case $filetype in - b) - major=$(awk '/[hsv]d/ { print $1; exit }' \ - /proc/partitions) - minor=$(awk '/[hsv]d/ { print $2; exit }' \ - /proc/partitions) - log_must mknod $filename b $major $minor - ;; - c) - # - # Create device file '/dev/null' - # - major=$(stat -c %t /dev/null) - minor=$(stat -c %T /dev/null) - log_must mknod $filename c $major $minor ;; *) log_fail "'$filetype' is wrong." @@ -236,6 +114,6 @@ function cleanup log_must zfs set devices=on $TESTPOOL/$TESTFS log_must rm -f $TESTDIR/$TESTFILE1 log_must rm -f $TESTDIR/$TESTFILE2 - log_must rm -f $TESTDIR/$TESTFILE1.out - log_must rm -f $TESTDIR/$TESTFILE2.out + log_must rm -f $TESTDIR/$TESTFILE1.out1 + log_must rm -f $TESTDIR/$TESTFILE1.out2 } diff --git a/tests/zfs-tests/tests/functional/devices/setup.ksh b/tests/zfs-tests/tests/functional/devices/setup.ksh index fc5cec3063a6..ee6cf83acb9e 100755 --- a/tests/zfs-tests/tests/functional/devices/setup.ksh +++ b/tests/zfs-tests/tests/functional/devices/setup.ksh @@ -32,4 +32,4 @@ . $STF_SUITE/include/libtest.shlib DISK=${DISKS%% *} -default_setup $DISK +default_volume_setup $DISK