From 16777b7dee33893f4d724140044da1840ba848ea Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 27 Dec 2019 12:11:27 -0800 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/. Reviewed-by: Ryan Moeller Signed-off-by: Brian Behlendorf Closes #9773 --- .../functional/devices/devices_001_pos.ksh | 18 ++- .../functional/devices/devices_002_neg.ksh | 16 ++- .../functional/devices/devices_common.kshlib | 105 ++++++++---------- .../tests/functional/devices/setup.ksh | 2 +- 4 files changed, 68 insertions(+), 73 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 ac031ed6a5..2f2802bc65 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 ce25502b81..a768c4aa6b 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 2c7df8d058..fa7fdbecf5 100644 --- a/tests/zfs-tests/tests/functional/devices/devices_common.kshlib +++ b/tests/zfs-tests/tests/functional/devices/devices_common.kshlib @@ -36,89 +36,74 @@ # # $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 + typeset devstr=$3 case $filetype in - b) - if is_linux; then - 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 - return 0 - fi - - 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} - ;; - ufs) + b) + case $(uname) in + Linux) # - # Get the existing block device file in current system. - # And bring out the first one. + # stat(1) --format=FORMAT tokens + # %t - major device type in hex + # %T - minor device type in hex # - 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." - ;; - *) - log_unsupported "Unsupported fstype " \ - "for / ($devtype)," \ - "only ufs|zfs is supported." - ;; - esac - + major=$(stat --dereference --format="%t" "$devstr") + minor=$(stat --dereference --format="%T" "$devstr") + log_must mknod $filename b "0x${major}" "0x${minor}" + ;; + *) # # Get the device file information. i.e: - # $DEV_DSKDIR/c0t0d0s0: block special (28/768) + # $devstr: 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) + esac + ;; + c) + # + # 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}" + ;; + FreeBSD) # # Create device file '/dev/null' # - if is_linux; then - major=$(stat -c %t /dev/null) - minor=$(stat -c %T /dev/null) - log_must mknod $filename c $major $minor - else - log_must mknod $filename c $(getmajor mm) 2 - fi + major=13 + minor=2 + log_must mknod $filename b $major $minor ;; *) - log_fail "'$filetype' is wrong." + major=$(getmajor mm) + minor=2 + log_must mknod $filename b $major $minor ;; + esac + ;; + *) + log_fail "'$filetype' is wrong." + ;; esac return 0 @@ -129,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 fc5cec3063..ee6cf83acb 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