Update of /cvsroot/ltp/ltp/testcases/kernel/fs/scsi/ltpscsi In directory sc8-pr-cvs1:/tmp/cvs-serv10257 Added Files: llseek.c llseek.h Makefile ltpfsscsi.sh scsimain.c sg_err.c sg_err.h sg_include.h Log Message: initial drop of scsi specific test using scsi_debug from the kernel to create vitual scsi devices --- NEW FILE: llseek.c --- /* * llseek.c -- stub calling the llseek system call * * Copyright (C) 1994 Remy Card. This file may be redistributed * under the terms of the GNU Public License. * * This file is borrowed from the util-linux-2.10q tarball's implementation * of fdisk. It allows seeks to 64 bit offsets, if supported. * Changed "ext2_" prefix to "llse". */ #include <sys/types.h> #include <errno.h> #include <unistd.h> #if defined(__GNUC__) || defined(HAS_LONG_LONG) typedef long long llse_loff_t; #else typedef long llse_loff_t; #endif extern llse_loff_t llse_llseek (unsigned int, llse_loff_t, unsigned int); #ifdef __linux__ #ifdef HAVE_LLSEEK #include <syscall.h> #else /* HAVE_LLSEEK */ #if defined(__alpha__) || defined(__ia64__) #define my_llseek lseek #else #include <linux/unistd.h> /* for __NR__llseek */ static int _llseek (unsigned int, unsigned long, unsigned long, llse_loff_t *, unsigned int); #ifdef __NR__llseek static _syscall5(int,_llseek,unsigned int,fd,unsigned long,offset_high, unsigned long, offset_low,llse_loff_t *,result, unsigned int, origin) #else /* no __NR__llseek on compilation machine - might give it explicitly */ static int _llseek (unsigned int fd, unsigned long oh, unsigned long ol, llse_loff_t *result, unsigned int origin) { errno = ENOSYS; return -1; } #endif static llse_loff_t my_llseek (unsigned int fd, llse_loff_t offset, unsigned int origin) { llse_loff_t result; int retval; retval = _llseek (fd, ((unsigned long long) offset) >> 32, ((unsigned long long) offset) & 0xffffffff, &result, origin); return (retval == -1 ? (llse_loff_t) retval : result); } #endif /* __alpha__ */ #endif /* HAVE_LLSEEK */ llse_loff_t llse_llseek (unsigned int fd, llse_loff_t offset, unsigned int origin) { llse_loff_t result; static int do_compat = 0; if (!do_compat) { result = my_llseek (fd, offset, origin); if (!(result == -1 && errno == ENOSYS)) return result; /* * Just in case this code runs on top of an old kernel * which does not support the llseek system call */ do_compat = 1; /* * Now try ordinary lseek. */ } if ((sizeof(off_t) >= sizeof(llse_loff_t)) || (offset < ((llse_loff_t) 1 << ((sizeof(off_t)*8) -1)))) return lseek(fd, (off_t) offset, origin); errno = EINVAL; return -1; } #else /* !linux */ llse_loff_t llse_llseek (unsigned int fd, llse_loff_t offset, unsigned int origin) { if ((sizeof(off_t) < sizeof(llse_loff_t)) && (offset >= ((llse_loff_t) 1 << ((sizeof(off_t)*8) -1)))) { errno = EINVAL; return -1; } return lseek (fd, (off_t) offset, origin); } #endif /* linux */ --- NEW FILE: llseek.h --- #if defined(__GNUC__) || defined(HAS_LONG_LONG) typedef long long llse_loff_t; #else typedef long llse_loff_t; #endif extern llse_loff_t llse_llseek(unsigned int fd, llse_loff_t offset, unsigned int origin); --- NEW FILE: Makefile --- SHELL = /bin/sh PREFIX=/usr/local INSTDIR=$(DESTDIR)/$(PREFIX)/bin MANDIR=$(DESTDIR)/$(PREFIX)/man CC = gcc LD = gcc EXECS = scsimain LARGE_FILE_FLAGS = -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 CFLAGS = -g -O2 -Wall -D_REENTRANT $(LARGE_FILE_FLAGS) # CFLAGS = -g -O2 -Wall -D_REENTRANT -DSG_KERNEL_INCLUDES $(LARGE_FILE_FLAGS) # CFLAGS = -g -O2 -Wall -pedantic -D_REENTRANT $(LARGE_FILE_FLAGS) LDFLAGS = all: $(EXECS) depend dep: for i in *.c; do $(CC) $(INCLUDES) $(CFLAGS) -M $$i; \ done > .depend clean: /bin/rm -f *.o $(EXECS) core .depend scsimain: scsimain.o sg_err.o llseek.o $(LD) -o $@ $(LDFLAGS) $^ -lpthread install: $(EXECS) install -d $(INSTDIR) for name in $^; \ do install -s -o root -g root -m 755 $$name $(INSTDIR); \ done install -d $(MANDIR)/$(MAN_PREF) for mp in $(MAN_PGS); \ do install -o root -g root -m 644 $$mp $(MANDIR)/$(MAN_PREF); \ gzip -9f $(MANDIR)/$(MAN_PREF)/$$mp; \ done uninstall: dists="$(EXECS)"; \ for name in $$dists; do \ rm -f $(INSTDIR)/$$name; \ done for mp in $(MAN_PGS); do \ rm -f $(MANDIR)/$(MAN_PREF)/$$mp.gz; \ done ifeq (.depend,$(wildcard .depend)) include .depend endif --- NEW FILE: ltpfsscsi.sh --- #!/bin/sh # This script should be run to execute the filesystem tests on SCSI vitual devices. # 10/21/03 mr...@us... Initial creation of testcases # # cd `dirname $0` export LTPROOT=${PWD} echo $LTPROOT | grep testscripts > /dev/null 2>&1 if [ $? -eq 0 ]; then cd .. export LTPROOT=${PWD} fi export TMPBASE="/tmp" usage() { cat <<-END >&2 usage: ${0##*/} [ -a part1 ] [ -b part2 ] [ -k Kernel Path - fully qualified kernel path ] defaults: There are no defaults, all items MUST be passed example: ${0##*/} -a sda -b sdb -k /usr/src/linux - These tests must be run after ssi_debug has been configured and built as a module so it can be loaded with the correct parameters. - These operations are destructive so do NOT point the tests to partitions where the data shouldn't be overwritten. Once these tests are started all data in the partitions you point to will be destroyed. END exit } while getopts :a:b:c:k: arg do case $arg in a) part1=$OPTARG;; b) part2=$OPTARG;; c) part3=$OPTARG;; k) kernpath=$OPTARG;; \?) echo "************** Help Info: ********************" usage;; esac done if [ ! -n "$part1" ]; then echo "Missing 1st partition. You must pass 2 partitions for testing" usage; exit fi if [ ! -n "$part2" ]; then echo "Missing 2nd partition. You must pass 2 partitions for testing" usage; exit fi if [ ! -n "$part3" ]; then echo "Missing 3rd partition. You must pass 3 partitions for testing" usage; exit fi if [ ! -n "$kernpath" ]; then echo "Missing kernel path. You must pass kernel path for testing" usage; exit fi export PATH="${PATH}:${LTPROOT}/testcases/bin" mkdir /test >/dev/null 2>&1 mkdir /test/growfiles >/dev/null 2>&1 mkdir /test/growfiles/scsi >/dev/null 2>&1 mkdir /test/growfiles/scsi/ext2 >/dev/null 2>&1 mkdir /test/growfiles/scsi/ext3 >/dev/null 2>&1 mkdir /test/growfiles/scsi/reiser >/dev/null 2>&1 mkfs -V -t ext2 /dev/$part1 <yesenter.txt mkfs -V -t ext3 /dev/$part2 <yesenter.txt mkreiserfs -f /dev/$part3 <yesenter.txt mount -v -t ext2 /dev/$part1 /test/growfiles/scsi/ext2 mount -v -t ext3 /dev/$part2 /test/growfiles/scsi/ext3 mount -v /dev/$part3 /test/growfiles/scsi/reiser cd $kernpath/drivers/scsi modprobe scsi_debug max_luns=2 num_tgts=7 add_host=10 cd ${LTPROOT} echo "************ Running tests " ${LTPROOT}/tools/rand_lines -g ${LTPROOT}/runtest/scsi.part1 > ${TMPBASE}/scsi.part1 ${LTPROOT}/pan/pan -e -S -a scsipart1 -n scsipart1 -l scsilogfile -f ${TMPBASE}/scsi.part1 & wait $! umount -v /dev/$part1 umount -v /dev/$part2 umount -v /dev/$part3 rmmod scsi_debug --- NEW FILE: scsimain.c --- /* Test code for D. Gilbert's extensions to the Linux OS SCSI generic ("sg") device driver. * Copyright (C) 1999 - 2002 D. Gilbert * 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 2, or (at your option) * any later version. This program scans the "sg" device space (ie actual + simulated SCSI generic devices). Options: -w open writable (new driver opens readable unless -i) -n numeric scan: scan /dev/sg0,1,2, .... -a alpha scan: scan /dev/sga,b,c, .... -i do SCSI inquiry on device (implies -w) -x extra information output By default this program will look for /dev/sg0 first (i.e. numeric scan) Note: This program is written to work under both the original and [...7220 lines suppressed...] if (rcoll.dio_incomplete) { int fd; char c; fprintf(stderr, ">> Direct IO requested but incomplete %d times\n", rcoll.dio_incomplete); if ((fd = open(proc_allow_dio, O_RDONLY)) >= 0) { if (1 == read(fd, &c, 1)) { if ('0' == c) fprintf(stderr, ">>> %s set to '0' but should be set " "to '1' for direct IO\n", proc_allow_dio); } close(fd); } } if (rcoll.sum_of_resids) fprintf(stderr, ">> Non-zero sum of residual counts=%d\n", rcoll.sum_of_resids); return res; } --- NEW FILE: sg_err.c --- #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sg_include.h" #include "sg_err.h" /* This file is a huge cut, paste and hack from linux/drivers/scsi/constant.c * which I guess was written by: * Copyright (C) 1993, 1994, 1995 Eric Youngdale * The rest of this is: * Copyright (C) 1999 - 2003 D. Gilbert * * 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 2, or (at your option) * any later version. * [...1161 lines suppressed...] void sg_get_command_name(unsigned char opcode, int buff_len, char * buff) { const char **table = commands[ group(opcode) ]; if ((NULL == buff) || (buff_len < 1)) return; switch ((unsigned long) table) { case RESERVED_GROUP: strncpy(buff, reserved, buff_len); break; case VENDOR_GROUP: strncpy(buff, vendor, buff_len); break; default: strncpy(buff, table[opcode & 0x1f], buff_len); break; } } --- NEW FILE: sg_err.h --- #ifndef SG_ERR_H #define SG_ERR_H /* Feel free to copy and modify this GPL-ed code into your applications. */ /* Version 0.89 (20030313) */ /* Some of the following error/status codes are exchanged between the various layers of the SCSI sub-system in Linux and should never reach the user. They are placed here for completeness. What appears here is copied from drivers/scsi/scsi.h which is not visible in the user space. */ #ifndef SCSI_CHECK_CONDITION /* Following are the "true" SCSI status codes. Linux has traditionally used a 1 bit right and masked version of these. So now CHECK_CONDITION and friends (in <scsi/scsi.h>) are deprecated. */ #define SCSI_CHECK_CONDITION 0x2 #define SCSI_CONDITION_MET 0x4 #define SCSI_BUSY 0x8 #define SCSI_IMMEDIATE 0x10 #define SCSI_IMMEDIATE_CONDITION_MET 0x14 #define SCSI_RESERVATION_CONFLICT 0x18 #define SCSI_COMMAND_TERMINATED 0x22 #define SCSI_TASK_SET_FULL 0x28 #define SCSI_ACA_ACTIVE 0x30 #define SCSI_TASK_ABORTED 0x40 #endif /* The following are 'host_status' codes */ #ifndef DID_OK #define DID_OK 0x00 #endif #ifndef DID_NO_CONNECT #define DID_NO_CONNECT 0x01 /* Unable to connect before timeout */ #define DID_BUS_BUSY 0x02 /* Bus remain busy until timeout */ #define DID_TIME_OUT 0x03 /* Timed out for some other reason */ #define DID_BAD_TARGET 0x04 /* Bad target (id?) */ #define DID_ABORT 0x05 /* Told to abort for some other reason */ #define DID_PARITY 0x06 /* Parity error (on SCSI bus) */ #define DID_ERROR 0x07 /* Internal error */ #define DID_RESET 0x08 /* Reset by somebody */ #define DID_BAD_INTR 0x09 /* Received an unexpected interrupt */ #define DID_PASSTHROUGH 0x0a /* Force command past mid-level */ #define DID_SOFT_ERROR 0x0b /* The low-level driver wants a retry */ #endif /* These defines are to isolate applictaions from kernel define changes */ #define SG_ERR_DID_OK DID_OK #define SG_ERR_DID_NO_CONNECT DID_NO_CONNECT #define SG_ERR_DID_BUS_BUSY DID_BUS_BUSY #define SG_ERR_DID_TIME_OUT DID_TIME_OUT #define SG_ERR_DID_BAD_TARGET DID_BAD_TARGET #define SG_ERR_DID_ABORT DID_ABORT #define SG_ERR_DID_PARITY DID_PARITY #define SG_ERR_DID_ERROR DID_ERROR #define SG_ERR_DID_RESET DID_RESET #define SG_ERR_DID_BAD_INTR DID_BAD_INTR #define SG_ERR_DID_PASSTHROUGH DID_PASSTHROUGH #define SG_ERR_DID_SOFT_ERROR DID_SOFT_ERROR /* The following are 'driver_status' codes */ #ifndef DRIVER_OK #define DRIVER_OK 0x00 #endif #ifndef DRIVER_BUSY #define DRIVER_BUSY 0x01 #define DRIVER_SOFT 0x02 #define DRIVER_MEDIA 0x03 #define DRIVER_ERROR 0x04 #define DRIVER_INVALID 0x05 #define DRIVER_TIMEOUT 0x06 #define DRIVER_HARD 0x07 #define DRIVER_SENSE 0x08 /* Sense_buffer has been set */ /* Following "suggests" are "or-ed" with one of previous 8 entries */ #define SUGGEST_RETRY 0x10 #define SUGGEST_ABORT 0x20 #define SUGGEST_REMAP 0x30 #define SUGGEST_DIE 0x40 #define SUGGEST_SENSE 0x80 #define SUGGEST_IS_OK 0xff #endif #ifndef DRIVER_MASK #define DRIVER_MASK 0x0f #endif #ifndef SUGGEST_MASK #define SUGGEST_MASK 0xf0 #endif /* These defines are to isolate applictaions from kernel define changes */ #define SG_ERR_DRIVER_OK DRIVER_OK #define SG_ERR_DRIVER_BUSY DRIVER_BUSY #define SG_ERR_DRIVER_SOFT DRIVER_SOFT #define SG_ERR_DRIVER_MEDIA DRIVER_MEDIA #define SG_ERR_DRIVER_ERROR DRIVER_ERROR #define SG_ERR_DRIVER_INVALID DRIVER_INVALID #define SG_ERR_DRIVER_TIMEOUT DRIVER_TIMEOUT #define SG_ERR_DRIVER_HARD DRIVER_HARD #define SG_ERR_DRIVER_SENSE DRIVER_SENSE #define SG_ERR_SUGGEST_RETRY SUGGEST_RETRY #define SG_ERR_SUGGEST_ABORT SUGGEST_ABORT #define SG_ERR_SUGGEST_REMAP SUGGEST_REMAP #define SG_ERR_SUGGEST_DIE SUGGEST_DIE #define SG_ERR_SUGGEST_SENSE SUGGEST_SENSE #define SG_ERR_SUGGEST_IS_OK SUGGEST_IS_OK #define SG_ERR_DRIVER_MASK DRIVER_MASK #define SG_ERR_SUGGEST_MASK SUGGEST_MASK /* The following "print" functions send ACSII to stdout */ extern void sg_print_command(const unsigned char * command); extern void sg_print_sense(const char * leadin, const unsigned char * sense_buffer, int sb_len); extern void sg_print_status(int masked_status); extern void sg_print_scsi_status(int scsi_status); extern void sg_print_host_status(int host_status); extern void sg_print_driver_status(int driver_status); /* sg_chk_n_print() returns 1 quietly if there are no errors/warnings else it prints to standard output and returns 0. */ extern int sg_chk_n_print(const char * leadin, int masked_status, int host_status, int driver_status, const unsigned char * sense_buffer, int sb_len); /* The following function declaration is for the sg version 3 driver. Only version 3 sg_err.c defines it. */ struct sg_io_hdr; extern int sg_chk_n_print3(const char * leadin, struct sg_io_hdr * hp); /* The following "category" function returns one of the following */ #define SG_ERR_CAT_CLEAN 0 /* No errors or other information */ #define SG_ERR_CAT_MEDIA_CHANGED 1 /* interpreted from sense buffer */ #define SG_ERR_CAT_RESET 2 /* interpreted from sense buffer */ #define SG_ERR_CAT_TIMEOUT 3 #define SG_ERR_CAT_RECOVERED 4 /* Successful command after recovered err */ #define SG_ERR_CAT_SENSE 98 /* Something else is in the sense buffer */ #define SG_ERR_CAT_OTHER 99 /* Some other error/warning has occurred */ extern int sg_err_category(int masked_status, int host_status, int driver_status, const unsigned char * sense_buffer, int sb_len); extern int sg_err_category_new(int scsi_status, int host_status, int driver_status, const unsigned char * sense_buffer, int sb_len); /* The following function declaration is for the sg version 3 driver. Only version 3 sg_err.c defines it. */ extern int sg_err_category3(struct sg_io_hdr * hp); /* Returns length of SCSI command given the opcode (first byte) */ extern int sg_get_command_size(unsigned char opcode); extern void sg_get_command_name(unsigned char opcode, int buff_len, char * buff); #endif --- NEW FILE: sg_include.h --- #ifdef SG_KERNEL_INCLUDES #include "/usr/src/linux/include/scsi/sg.h" #include "/usr/src/linux/include/scsi/scsi.h" #else #ifdef SG_TRICK_GNU_INCLUDES #include <linux/../scsi/sg.h> #include <linux/../scsi/scsi.h> #else #include <scsi/sg.h> #include <scsi/scsi.h> #endif #endif /* Getting the correct include files for the sg interface can be an ordeal. In a perfect world, one would just write: #include <scsi/sg.h> #include <scsi/scsi.h> This would include the files found in the /usr/include/scsi directory. Those files are maintained with the GNU library which may or may not agree with the kernel and version of sg driver that is running. Any many cases this will not matter. However in some it might, for example glibc 2.1's include files match the sg driver found in the lk 2.2 series. Hence if glibc 2.1 is used with lk 2.4 then the additional sg v3 interface will not be visible. If this is a problem then defining SG_KERNEL_INCLUDES will access the kernel supplied header files (assuming they are in the normal place). The GNU library maintainers and various kernel people don't like this approach (but it does work). The technique selected by defining SG_TRICK_GNU_INCLUDES worked (and was used) prior to glibc 2.2 . Prior to that version /usr/include/linux was a symbolic link to /usr/src/linux/include/linux . There are other approaches if this include "mixup" causes pain. These would involve include files being copied or symbolic links being introduced. Sorry about the inconvenience. Typically neither SG_KERNEL_INCLUDES nor SG_TRICK_GNU_INCLUDES is defined. dpg 20010415 */ |