On Thu, 21 Apr 2011 21:22:12 +0200 Frank Michel <michelfranck@xxxxxxx> wrote: > This a timeout problem : > - Editing the "tgt-1.0.15/usr/bs_sg.c" > - Setting the "#define BS_SG_TIMEOUT" from 2000 to (30 * 1000) cleared > the problem > > As advertised in a previous patch which didn't make its way to the > 1.0.15 release, this timeout should be adapted to the type of > peripheral which is matching the generic sg device. For example, it > should be longer for a tape reader. > > Is there a chance that the timeout patch be merged in the next or so release ? I forgot to apply the patch. I don't like it much since it's a workaround. But I applied it for now. = From: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> Subject: [PATCH] use longer timeout for sg This adds a workaround to use longer timeout for sg. We should use appropriate timeout for each device type. Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> Tested-by: Mark Harvey <markh794@xxxxxxxxx> --- usr/bs_sg.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 44 insertions(+), 3 deletions(-) diff --git a/usr/bs_sg.c b/usr/bs_sg.c index 01c998a..c4c9ca0 100644 --- a/usr/bs_sg.c +++ b/usr/bs_sg.c @@ -46,7 +46,8 @@ #include "tgtadm_error.h" #define BS_SG_RESVD_SZ (512 * 1024) -#define BS_SG_TIMEOUT 2000 + +static unsigned int sg_timeout = 30 * 1000; /* 30 seconds */ static int graceful_read(int fd, void *p_read, int to_read) { @@ -149,7 +150,7 @@ static int bs_bsg_cmd_submit(struct scsi_cmd *cmd) /* SCSI: (auto)sense data */ io_hdr.response = (unsigned long)cmd->sense_buffer; /* Using the same 2000 millisecond timeout.. */ - io_hdr.timeout = BS_SG_TIMEOUT; + io_hdr.timeout = sg_timeout; /* [i->o] unused internally */ io_hdr.usr_ptr = (unsigned long)cmd; dprintf("[%d] Set io_hdr->usr_ptr from cmd: %p\n", getpid(), cmd); @@ -168,6 +169,29 @@ static int bs_bsg_cmd_submit(struct scsi_cmd *cmd) return 0; } +static void bs_sg_cmd_setup(struct sg_io_hdr *hdr, + unsigned char *cmd, int cmd_len, + void *data, int data_len, int direction, + void *sense, int sense_len, + int timeout) +{ + memset(hdr, 0, sizeof(*hdr)); + hdr->interface_id = 'S'; + hdr->cmdp = cmd; + hdr->cmd_len = cmd_len; + + hdr->dxfer_direction = direction; + hdr->dxfer_len = data_len; + hdr->dxferp = data; + + hdr->mx_sb_len = sense_len; + hdr->sbp = sense; + hdr->timeout = timeout; + hdr->pack_id = -1; + hdr->usr_ptr = NULL; + hdr->flags = 0; +} + static int bs_sg_cmd_submit(struct scsi_cmd *cmd) { struct scsi_lu *dev = cmd->dev; @@ -191,7 +215,7 @@ static int bs_sg_cmd_submit(struct scsi_cmd *cmd) } io_hdr.mx_sb_len = sizeof(cmd->sense_buffer); io_hdr.sbp = cmd->sense_buffer; - io_hdr.timeout = BS_SG_TIMEOUT; + io_hdr.timeout = sg_timeout; io_hdr.pack_id = -1; io_hdr.usr_ptr = cmd; io_hdr.flags |= SG_FLAG_DIRECT_IO; @@ -344,6 +368,9 @@ static int init_bsg_device(int fd) static int init_sg_device(int fd) { int t, err; + struct sg_io_hdr hdr; + unsigned char cmd[6]; + unsigned char resp[36]; err = ioctl(fd, SG_GET_VERSION_NUM, &t); if ((err < 0) || (t < 30000)) { @@ -358,6 +385,20 @@ static int init_sg_device(int fd) return -1; } + memset(&cmd, 0, sizeof(cmd)); + memset(&resp, 0, sizeof(resp)); + + cmd[0] = INQUIRY; + cmd[4] = sizeof(resp); + + bs_sg_cmd_setup(&hdr, cmd, sizeof(cmd), resp, sizeof(resp), + SG_DXFER_FROM_DEV, NULL, 0, 30000); + + err = ioctl(fd, SG_IO, &hdr); + + if (!err && (resp[0] & 0x1f) == TYPE_TAPE) + sg_timeout = 14000 * 1000; + return 0; } -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html