From: Johannes Thumshirn Date: Thu, 6 Jul 2017 12:09:21 +0000 (+0200) Subject: sg: add regression test for patch scsi: sg: fix SG_DXFER_FROM_DEV transfers X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3374f31d1d80122c9b6d82ea2af3e67f4864bf53;p=users%2Fsagi%2Fblktests.git sg: add regression test for patch scsi: sg: fix SG_DXFER_FROM_DEV transfers Add a regression test for the patch titled "scsi: sg: fix SG_DXFER_FROM_DEV transfers" which reassembles the syscalls done by Nero Burning ROM to discover CD and DVD burners. Signed-off-by: Johannes Thumshirn [Omar: rename _get_sg_from_blockdev to _get_test_dev_sg and fix sg/001] Signed-off-by: Omar Sandoval --- diff --git a/common/sg b/common/sg index c306af5..d9fcc0e 100644 --- a/common/sg +++ b/common/sg @@ -29,6 +29,6 @@ _test_dev_is_scsi() { return 0 } -_get_sg_from_blockdev() { - echo /sys/block/"$1"/device/scsi_generic/sg+([0-9]) +_get_test_dev_sg() { + echo "${TEST_DEV_SYSFS}"/device/scsi_generic/sg* | grep -Eo "sg[0-9]+" } diff --git a/src/.gitignore b/src/.gitignore index 722c137..0fca08a 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1 +1,2 @@ /sg/syzkaller1 +/sg/dxfer-from-dev diff --git a/src/Makefile b/src/Makefile index 0e8d746..e6dc0a1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,4 @@ -TARGETS := sg/syzkaller1 +TARGETS := sg/dxfer-from-dev sg/syzkaller1 CFLAGS := -O2 diff --git a/src/sg/dxfer-from-dev.c b/src/sg/dxfer-from-dev.c new file mode 100644 index 0000000..ca52f30 --- /dev/null +++ b/src/sg/dxfer-from-dev.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +int main(int argc, char **argv) +{ + int fd; + int rc; + int rsz = 131072; + int tout = 10800000; + char buf[42] = { 0 }; + + if (argc != 2) { + printf("usage: %s /dev/sgX\n", argv[0]); + return 1; + } + + fd = open(argv[1], O_RDWR); + if (fd < 0) { + perror("open"); + return 1; + } + + rc = ioctl(fd, SG_SET_RESERVED_SIZE, &rsz); + if (rc < 0) { + perror("ioctl SG_SET_RESERVED_SIZE"); + goto out_close; + } + + rc = ioctl(fd, SG_SET_TIMEOUT, &tout); + if (rc < 0) { + perror("ioctl SG_SET_TIMEOUT"); + goto out_close; + } + + buf[4] = 'H'; + rc = write(fd, &buf, sizeof(buf)); + if (rc < 0) { + perror("write"); + if (errno == EINVAL) + printf("FAIL\n"); + goto out_close; + } + + printf("PASS\n"); + +out_close: + close(fd); +} diff --git a/tests/sg/001 b/tests/sg/001 index b5a14ac..a1dbd0c 100755 --- a/tests/sg/001 +++ b/tests/sg/001 @@ -30,7 +30,7 @@ requires() { test_device() { echo "Running ${TEST_NAME}" - SG_DEV="/dev/$(_get_sg_from_blockdev "$SCSI_DEBUG_NAME")" + SG_DEV="/dev/$(_get_test_dev_sg)" cd "$TMPDIR" || return 1 timeout -s INT 10s "$SRCDIR/sg/syzkaller1" "$SG_DEV" diff --git a/tests/sg/002 b/tests/sg/002 new file mode 100755 index 0000000..42470a6 --- /dev/null +++ b/tests/sg/002 @@ -0,0 +1,34 @@ +#!/bin/bash +# +# Regression test for patch "scsi: sg: fix SG_DXFER_FROM_DEV transfers" +# +# Copyright (C) 2017 Johannes Thumshirn +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +DESCRIPTION="perfom a SG_DXFER_FROM_DEV from the /dev/sg read-write interface" +QUICK=1 + +requires() { + _have_src_program sg/dxfer-from-dev +} + +test_device() { + echo "Running ${TEST_NAME}" + + SG_DEV="/dev/$(_get_test_dev_sg)" + "$SRCDIR"/sg/dxfer-from-dev "$SG_DEV" + + echo "Test complete" +} diff --git a/tests/sg/002.out b/tests/sg/002.out new file mode 100644 index 0000000..77b4bc1 --- /dev/null +++ b/tests/sg/002.out @@ -0,0 +1,3 @@ +Running sg/002 +PASS +Test complete