2012-03-16 14:43:32 +04:00
/*
* Copyright ( c ) 2007 Vladimir Nadvornik < nadvornik @ suse . cz >
* Copyright ( c ) 2007 Dmitry V . Levin < ldv @ altlinux . org >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
2007-06-30 15:37:09 +04:00
# include "defs.h"
2014-02-26 03:04:55 +04:00
# ifdef HAVE_SCSI_SG_H
# include <sys / ioctl.h>
# include <scsi / sg.h>
2007-06-30 15:37:09 +04:00
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
# include "xlat / sg_io_dxfer_direction.h"
# ifdef HAVE_LINUX_BSG_H
# include <linux / bsg.h>
# include <sys / uio.h>
# include "xlat / bsg_protocol.h"
# include "xlat / bsg_subprotocol.h"
# endif
2007-06-30 15:37:09 +04:00
static void
2015-02-06 15:36:26 +03:00
print_sg_io_buffer ( struct tcb * tcp , unsigned long addr , const unsigned int len )
2007-06-30 15:37:09 +04:00
{
unsigned char * buf = NULL ;
2014-09-10 17:46:04 +04:00
unsigned int allocated , i ;
2007-06-30 15:37:09 +04:00
2015-02-06 15:36:26 +03:00
tprints ( " [ " ) ;
2007-06-30 15:37:09 +04:00
if ( len = = 0 )
2015-02-06 15:36:26 +03:00
goto out ;
2007-06-30 15:37:09 +04:00
allocated = ( len > max_strlen ) ? max_strlen : len ;
2014-09-10 17:46:04 +04:00
if ( ( buf = malloc ( allocated ) ) = = NULL | |
2015-03-21 21:50:53 +03:00
umoven ( tcp , addr , allocated , buf ) < 0 ) {
2015-02-06 15:36:26 +03:00
tprintf ( " %#lx " , addr ) ;
2015-02-06 15:36:26 +03:00
goto out ;
2007-06-30 15:37:09 +04:00
}
tprintf ( " %02x " , buf [ 0 ] ) ;
for ( i = 1 ; i < allocated ; + + i )
tprintf ( " , %02x " , buf [ i ] ) ;
if ( allocated ! = len )
2011-09-01 12:00:28 +04:00
tprints ( " , ... " ) ;
2015-02-06 15:36:26 +03:00
out :
free ( buf ) ;
tprints ( " ] " ) ;
2007-06-30 15:37:09 +04:00
}
static void
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
print_sg_io_v3_req ( struct tcb * tcp , long arg )
2007-06-30 15:37:09 +04:00
{
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
struct sg_io_hdr sg_io ;
if ( umove ( tcp , arg , & sg_io ) < 0 ) {
tprintf ( " , %#lx " , arg ) ;
return ;
}
tprints ( " , " ) ;
printxval ( sg_io_dxfer_direction , sg_io . dxfer_direction ,
2007-06-30 15:37:09 +04:00
" SG_DXFER_??? " ) ;
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
tprintf ( " , cmd[%u]= " , sg_io . cmd_len ) ;
print_sg_io_buffer ( tcp , ( unsigned long ) sg_io . cmdp , sg_io . cmd_len ) ;
tprintf ( " , mx_sb_len=%d " , sg_io . mx_sb_len ) ;
tprintf ( " , iovec_count=%d " , sg_io . iovec_count ) ;
tprintf ( " , dxfer_len=%u " , sg_io . dxfer_len ) ;
tprintf ( " , timeout=%u " , sg_io . timeout ) ;
tprintf ( " , flags=%#x " , sg_io . flags ) ;
if ( sg_io . dxfer_direction = = SG_DXFER_TO_DEV | |
sg_io . dxfer_direction = = SG_DXFER_TO_FROM_DEV ) {
tprintf ( " , data[%u]= " , sg_io . dxfer_len ) ;
if ( sg_io . iovec_count )
tprint_iov_upto ( tcp , sg_io . iovec_count ,
( unsigned long ) sg_io . dxferp , 1 ,
sg_io . dxfer_len ) ;
2015-02-06 15:36:26 +03:00
else
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
print_sg_io_buffer ( tcp , ( unsigned long ) sg_io . dxferp ,
sg_io . dxfer_len ) ;
2007-06-30 15:37:09 +04:00
}
}
static void
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
print_sg_io_v3_res ( struct tcb * tcp , long arg )
2007-06-30 15:37:09 +04:00
{
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
struct sg_io_hdr sg_io ;
if ( umove ( tcp , arg , & sg_io ) < 0 ) {
tprintf ( " , %#lx " , arg ) ;
return ;
}
2015-02-06 15:36:26 +03:00
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
if ( sg_io . dxfer_direction = = SG_DXFER_FROM_DEV | |
sg_io . dxfer_direction = = SG_DXFER_TO_FROM_DEV ) {
uint32_t din_len = sg_io . dxfer_len ;
if ( sg_io . resid > 0 )
din_len - = sg_io . resid ;
2015-02-06 15:36:26 +03:00
tprintf ( " , data[%u]= " , din_len ) ;
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
if ( sg_io . iovec_count )
tprint_iov_upto ( tcp , sg_io . iovec_count ,
( unsigned long ) sg_io . dxferp , 1 ,
2015-02-06 15:36:26 +03:00
din_len ) ;
else
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
print_sg_io_buffer ( tcp , ( unsigned long ) sg_io . dxferp ,
2015-02-06 15:36:26 +03:00
din_len ) ;
2007-06-30 15:37:09 +04:00
}
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
tprintf ( " , status=%02x " , sg_io . status ) ;
tprintf ( " , masked_status=%02x " , sg_io . masked_status ) ;
tprintf ( " , sb[%u]= " , sg_io . sb_len_wr ) ;
print_sg_io_buffer ( tcp , ( unsigned long ) sg_io . sbp , sg_io . sb_len_wr ) ;
tprintf ( " , host_status=%#x " , sg_io . host_status ) ;
tprintf ( " , driver_status=%#x " , sg_io . driver_status ) ;
tprintf ( " , resid=%d " , sg_io . resid ) ;
tprintf ( " , duration=%d " , sg_io . duration ) ;
tprintf ( " , info=%#x " , sg_io . info ) ;
}
# ifdef HAVE_LINUX_BSG_H
static void
print_sg_io_v4_req ( struct tcb * tcp , long arg )
{
struct sg_io_v4 sg_io ;
if ( umove ( tcp , arg , & sg_io ) < 0 ) {
tprintf ( " , %#lx " , arg ) ;
return ;
}
tprints ( " , " ) ;
printxval ( bsg_protocol , sg_io . protocol , " BSG_PROTOCOL_??? " ) ;
tprints ( " , " ) ;
printxval ( bsg_subprotocol , sg_io . subprotocol , " BSG_SUB_PROTOCOL_??? " ) ;
tprintf ( " , request[%u]= " , sg_io . request_len ) ;
print_sg_io_buffer ( tcp , sg_io . request , sg_io . request_len ) ;
2015-02-24 00:35:20 +03:00
tprintf ( " , request_tag=%llu " , ( unsigned long long ) sg_io . request_tag ) ;
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
tprintf ( " , request_attr=%u " , sg_io . request_attr ) ;
tprintf ( " , request_priority=%u " , sg_io . request_priority ) ;
tprintf ( " , request_extra=%u " , sg_io . request_extra ) ;
tprintf ( " , max_response_len=%u " , sg_io . max_response_len ) ;
tprintf ( " , dout_iovec_count=%u " , sg_io . dout_iovec_count ) ;
tprintf ( " , dout_xfer_len=%u " , sg_io . dout_xfer_len ) ;
tprintf ( " , din_iovec_count=%u " , sg_io . din_iovec_count ) ;
tprintf ( " , din_xfer_len=%u " , sg_io . din_xfer_len ) ;
tprintf ( " , timeout=%u " , sg_io . timeout ) ;
tprintf ( " , flags=%u " , sg_io . flags ) ;
2015-02-24 00:35:20 +03:00
tprintf ( " , usr_ptr=%llu " , ( unsigned long long ) sg_io . usr_ptr ) ;
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
tprintf ( " , spare_in=%u " , sg_io . spare_in ) ;
tprintf ( " , dout[%u]= " , sg_io . dout_xfer_len ) ;
if ( sg_io . dout_iovec_count )
tprint_iov_upto ( tcp , sg_io . dout_iovec_count , sg_io . dout_xferp ,
1 , sg_io . dout_xfer_len ) ;
else
print_sg_io_buffer ( tcp , sg_io . dout_xferp , sg_io . dout_xfer_len ) ;
}
static void
print_sg_io_v4_res ( struct tcb * tcp , long arg )
{
struct sg_io_v4 sg_io ;
uint32_t din_len ;
if ( umove ( tcp , arg , & sg_io ) < 0 ) {
tprintf ( " , %#lx " , arg ) ;
return ;
}
tprintf ( " , response[%u]= " , sg_io . response_len ) ;
print_sg_io_buffer ( tcp , sg_io . response , sg_io . response_len ) ;
din_len = sg_io . din_xfer_len ;
if ( sg_io . din_resid > 0 )
din_len - = sg_io . din_resid ;
tprintf ( " , din[%u]= " , din_len ) ;
if ( sg_io . din_iovec_count )
tprint_iov_upto ( tcp , sg_io . din_iovec_count , sg_io . din_xferp ,
1 , din_len ) ;
else
print_sg_io_buffer ( tcp , sg_io . din_xferp , din_len ) ;
tprintf ( " , driver_status=%u " , sg_io . driver_status ) ;
tprintf ( " , transport_status=%u " , sg_io . transport_status ) ;
tprintf ( " , device_status=%u " , sg_io . device_status ) ;
tprintf ( " , retry_delay=%u " , sg_io . retry_delay ) ;
tprintf ( " , info=%u " , sg_io . info ) ;
tprintf ( " , duration=%u " , sg_io . duration ) ;
tprintf ( " , response_len=%u " , sg_io . response_len ) ;
tprintf ( " , din_resid=%u " , sg_io . din_resid ) ;
tprintf ( " , dout_resid=%u " , sg_io . dout_resid ) ;
2015-02-24 00:35:20 +03:00
tprintf ( " , generated_tag=%llu " , ( unsigned long long ) sg_io . generated_tag ) ;
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
tprintf ( " , spare_out=%u " , sg_io . spare_out ) ;
}
# else /* !HAVE_LINUX_BSG_H */
static void
print_sg_io_v4_req ( struct tcb * tcp , long arg )
{
tprintf ( " , %#lx " , arg ) ;
}
static void
print_sg_io_v4_res ( struct tcb * tcp , long arg )
{
}
# endif
static void
print_sg_io_req ( struct tcb * tcp , uint32_t iid , long arg )
{
tprintf ( " {'%c' " , iid ) ;
switch ( iid ) {
case ' S ' :
print_sg_io_v3_req ( tcp , arg ) ;
break ;
case ' Q ' :
print_sg_io_v4_req ( tcp , arg ) ;
break ;
default :
tprints ( " , ... " ) ;
}
}
static void
print_sg_io_res ( struct tcb * tcp , uint32_t iid , long arg )
{
if ( ! syserror ( tcp ) ) {
switch ( iid ) {
case ' S ' :
print_sg_io_v3_res ( tcp , arg ) ;
break ;
case ' Q ' :
print_sg_io_v4_res ( tcp , arg ) ;
break ;
}
}
tprintf ( " } " ) ;
2007-06-30 15:37:09 +04:00
}
int
ioctl: assume that all ioctl commands have unsigned int type
In linux, ioctl command number has a 32-bit unsigned integer type:
fs/ioctl.c:SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
If the kernel completely ignores other bits on 64-bit architectures,
why should strace care?
Let's follow the kernel and treat it as unsigned int.
* defs.h (struct_ioctlent): Change "code" type to "unsigned int".
(ioctl_decode, ioctl_lookup, block_ioctl, loop_ioctl, mtd_ioctl,
ubi_ioctl, ptp_ioctl, scsi_ioctl, sock_ioctl, term_ioctl, rtc_ioctl,
v4l2_ioctl): Likewise.
* ioctl.c (ioctl_decode, ioctl_lookup, compare, ioctl_next_match):
Likewise.
* block.c (block_ioctl): Likewise.
* loop.c (loop_ioctl): Likewise.
* mtd.c (mtd_ioctl, ubi_ioctl): Likewise.
* ptp.c (ptp_ioctl): Likewise.
* scsi.c (scsi_ioctl): Likewise.
* sock.c (sock_ioctl): Likewise.
* term.c (term_ioctl): Likewise.
* time.c (rtc_ioctl): Likewise.
* v4l2.c (v4l2_ioctl): Likewise.
* ioctlsort.c (struct ioctlent, compare, main): Likewise.
2015-01-19 21:44:21 +03:00
scsi_ioctl ( struct tcb * tcp , const unsigned int code , long arg )
2007-06-30 15:37:09 +04:00
{
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
uint32_t iid ;
2007-06-30 15:37:09 +04:00
switch ( code ) {
case SG_IO :
if ( entering ( tcp ) ) {
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
tprints ( " , " ) ;
if ( umove ( tcp , arg , & iid ) < 0 )
tprintf ( " %#lx " , arg ) ;
2007-06-30 15:37:09 +04:00
else
scsi: add bsg support
The Linux kernel supports two different versions of the SG_IO API,
namely v3 and v4. This patch adds support for version 4 of this API.
At least the sg3_utils package supports version 4 of this API. Version
4 of this API is used if /dev/bsg/H:C:I:L is used as device name.
This patch has been tested by inspecting the output of the following
commands:
modprobe scsi_debug dev_size_mb=16 delay=0
dev=$(lsscsi | sed -n '/ scsi_debug /s,^[^/]*,,p')
./strace -eioctl -s256 sg_inq $dev
echo 'Test XDWRITEREAD(10)'
bsg=/dev/bsg/$(lsscsi | sed -n '/ scsi_debug /s,^\[\([^]]\+\)\].*,\1,p')
dd if=/dev/zero bs=512 count=1 |
./strace -eioctl -s256 sg_raw -s 512 -r 1024 $bsg 53 00 00 00 00 01 00 00 01 00
* configure.ac (AC_CHECK_HEADERS): Add linux/bsg.h.
* xlat/bsg_protocol.in: New file.
* xlat/bsg_subprotocol.in: Likewise.
* scsi.c: Include them and <linux/bsg.h>.
(print_sg_io_v3_req, print_sg_io_v3_res, print_sg_io_v4_req,
print_sg_io_v4_res): New functions.
(print_sg_io_req, print_sg_io_res): Use them.
(scsi_ioctl): Update callers.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
2015-02-06 15:37:03 +03:00
print_sg_io_req ( tcp , iid , arg ) ;
} else {
if ( umove ( tcp , arg , & iid ) > = 0 )
print_sg_io_res ( tcp , iid , arg ) ;
2007-06-30 15:37:09 +04:00
}
break ;
default :
if ( entering ( tcp ) )
tprintf ( " , %#lx " , arg ) ;
break ;
}
return 1 ;
}
2014-02-26 03:04:55 +04:00
# endif /* HAVE_SCSI_SG_H */