Skip to content

Commit

Permalink
ZTS: devices_001_pos and devices_002_neg
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #9773
  • Loading branch information
behlendorf authored Dec 27, 2019
1 parent d5c97f3 commit 590ff61
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 181 deletions.
18 changes: 12 additions & 6 deletions tests/zfs-tests/tests/functional/devices/devices_001_pos.ksh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
#

Expand All @@ -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."
16 changes: 10 additions & 6 deletions tests/zfs-tests/tests/functional/devices/devices_002_neg.ksh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
#

Expand All @@ -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."
214 changes: 46 additions & 168 deletions tests/zfs-tests/tests/functional/devices/devices_common.kshlib
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand All @@ -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
}
2 changes: 1 addition & 1 deletion tests/zfs-tests/tests/functional/devices/setup.ksh
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@
. $STF_SUITE/include/libtest.shlib

DISK=${DISKS%% *}
default_setup $DISK
default_volume_setup $DISK

0 comments on commit 590ff61

Please sign in to comment.