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]+"
}
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <scsi/sg.h>
+
+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);
+}
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"
--- /dev/null
+#!/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 <http://www.gnu.org/licenses/>.
+
+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"
+}