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 <ryan@ixsystems.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #9773
This commit is contained in:
parent
da6a7f0239
commit
16777b7dee
|
@ -42,7 +42,7 @@
|
||||||
# 1. Create pool and file system.
|
# 1. Create pool and file system.
|
||||||
# 2. Set devices=on on this file system.
|
# 2. Set devices=on on this file system.
|
||||||
# 3. Separately create block device file and character file.
|
# 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.
|
# 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
|
log_must zfs set devices=on $TESTPOOL/$TESTFS
|
||||||
|
|
||||||
#
|
#
|
||||||
# Separately create block device file and character device file, then try to
|
# Create block device file backed by a ZFS volume.
|
||||||
# open them and make sure it succeed.
|
# Verify it can be opened, written, and read.
|
||||||
#
|
#
|
||||||
create_dev_file b $TESTDIR/$TESTFILE1
|
create_dev_file b $TESTDIR/$TESTFILE1 $ZVOL_DEVDIR/$TESTPOOL/$TESTVOL
|
||||||
log_must dd if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out count=1
|
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
|
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."
|
log_pass "Setting devices=on on file system and testing it pass."
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
# 1. Create pool and file system.
|
# 1. Create pool and file system.
|
||||||
# 2. Set devices=off on this file system.
|
# 2. Set devices=off on this file system.
|
||||||
# 3. Separately create block device file and character file.
|
# 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.
|
# 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
|
log_must zfs set devices=off $TESTPOOL/$TESTFS
|
||||||
|
|
||||||
#
|
#
|
||||||
# Separately create block device file and character device file, then try to
|
# Create block device file backed by a ZFS volume.
|
||||||
# open them and make sure it failed.
|
# Verify it cannot be opened, written, and read.
|
||||||
#
|
#
|
||||||
create_dev_file b $TESTDIR/$TESTFILE1
|
create_dev_file b $TESTDIR/$TESTFILE1 $ZVOL_DEVDIR/$TESTPOOL/$TESTVOL
|
||||||
log_mustnot dd if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out count=1
|
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
|
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."
|
log_pass "Setting devices=off on file system and testing it pass."
|
||||||
|
|
|
@ -36,85 +36,70 @@
|
||||||
#
|
#
|
||||||
# $1 device file type
|
# $1 device file type
|
||||||
# $2 file name
|
# $2 file name
|
||||||
|
# $3 device path (used for 'b' device type)
|
||||||
#
|
#
|
||||||
function create_dev_file
|
function create_dev_file
|
||||||
{
|
{
|
||||||
typeset filetype=$1
|
typeset filetype=$1
|
||||||
typeset filename=$2
|
typeset filename=$2
|
||||||
|
typeset devstr=$3
|
||||||
|
|
||||||
case $filetype in
|
case $filetype in
|
||||||
b)
|
b)
|
||||||
if is_linux; then
|
case $(uname) in
|
||||||
major=$(awk '/[hsv]d/ { print $1; exit }' \
|
Linux)
|
||||||
/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)
|
|
||||||
#
|
#
|
||||||
# Get the existing block device file in current system.
|
# stat(1) --format=FORMAT tokens
|
||||||
# And bring out the first one.
|
# %t - major device type in hex
|
||||||
|
# %T - minor device type in hex
|
||||||
#
|
#
|
||||||
devstr=$(df-lhF ufs | \
|
major=$(stat --dereference --format="%t" "$devstr")
|
||||||
grep "^${DEV_DSKDIR}" | \
|
minor=$(stat --dereference --format="%T" "$devstr")
|
||||||
awk '{print $1}')
|
log_must mknod $filename b "0x${major}" "0x${minor}"
|
||||||
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
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Get the device file information. i.e:
|
# Get the device file information. i.e:
|
||||||
# $DEV_DSKDIR/c0t0d0s0: block special (28/768)
|
# $devstr: block special (28/768)
|
||||||
#
|
#
|
||||||
devstr=$(file $devstr)
|
devstr=$(file $devstr)
|
||||||
|
|
||||||
#
|
|
||||||
# Bring out major and minor number.
|
|
||||||
#
|
|
||||||
major=${devstr##*\(}
|
major=${devstr##*\(}
|
||||||
major=${major%%/*}
|
major=${major%%/*}
|
||||||
minor=${devstr##*/}
|
minor=${devstr##*/}
|
||||||
minor=${minor%\)}
|
minor=${minor%\)}
|
||||||
|
|
||||||
log_must mknod $filename b $major $minor
|
log_must mknod $filename b $major $minor
|
||||||
;;
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
c)
|
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'
|
# Create device file '/dev/null'
|
||||||
#
|
#
|
||||||
if is_linux; then
|
major=13
|
||||||
major=$(stat -c %t /dev/null)
|
minor=2
|
||||||
minor=$(stat -c %T /dev/null)
|
log_must mknod $filename b $major $minor
|
||||||
log_must mknod $filename c $major $minor
|
;;
|
||||||
else
|
*)
|
||||||
log_must mknod $filename c $(getmajor mm) 2
|
major=$(getmajor mm)
|
||||||
fi
|
minor=2
|
||||||
|
log_must mknod $filename b $major $minor
|
||||||
|
;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
log_fail "'$filetype' is wrong."
|
log_fail "'$filetype' is wrong."
|
||||||
|
@ -129,6 +114,6 @@ function cleanup
|
||||||
log_must zfs set devices=on $TESTPOOL/$TESTFS
|
log_must zfs set devices=on $TESTPOOL/$TESTFS
|
||||||
log_must rm -f $TESTDIR/$TESTFILE1
|
log_must rm -f $TESTDIR/$TESTFILE1
|
||||||
log_must rm -f $TESTDIR/$TESTFILE2
|
log_must rm -f $TESTDIR/$TESTFILE2
|
||||||
log_must rm -f $TESTDIR/$TESTFILE1.out
|
log_must rm -f $TESTDIR/$TESTFILE1.out1
|
||||||
log_must rm -f $TESTDIR/$TESTFILE2.out
|
log_must rm -f $TESTDIR/$TESTFILE1.out2
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,4 +32,4 @@
|
||||||
. $STF_SUITE/include/libtest.shlib
|
. $STF_SUITE/include/libtest.shlib
|
||||||
|
|
||||||
DISK=${DISKS%% *}
|
DISK=${DISKS%% *}
|
||||||
default_setup $DISK
|
default_volume_setup $DISK
|
||||||
|
|
Loading…
Reference in New Issue