Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ZTS: devices_001_pos and devices_002_neg #9773

Merged
merged 1 commit into from
Dec 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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