All of lore.kernel.org
 help / color / mirror / Atom feed
* extracting infos from struct scsi_cmnd
@ 2004-11-27 12:42 Tommaso Moroni
  2004-11-27 15:48 ` Jens Axboe
  0 siblings, 1 reply; 6+ messages in thread
From: Tommaso Moroni @ 2004-11-27 12:42 UTC (permalink / raw)
  To: linux-scsi

Hi!

I'm writing a module for the 2.6.9 kernel which tracks accesses on a usb-storage device;
in particular I'm interested in extracting from a struct scsi_cmnd the data read/written 
and the associated sector. 


The code I'vr written till now looks like the following:


struct scsi_cmnd * cmd;
[...]
if (cmd->use_sg == 0)
{
	buf = cmd->buffer;
	buflen = cmd->bufflen;
	sector = cmd->request->sector;
} else {
	struct scatterlist * sl = (struct scatterlist *) cmd->buffer;
	for (i = 0; i < cmd->use_sg; i++)
	{
		buf = page_address(sl[i].page) + sl[i].offset;
                buflen = sl[i].length;
		/* sector? */
	}
}


Is it correct?
Where can I find the sector involved in the operation if the scatter-gather is used?


Thank you in advance
-- 
Tommaso Moroni <tommaso.m@tiscalinet.it>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: extracting infos from struct scsi_cmnd
  2004-11-27 12:42 extracting infos from struct scsi_cmnd Tommaso Moroni
@ 2004-11-27 15:48 ` Jens Axboe
  2004-11-28  2:02   ` extracting resid " Douglas Gilbert
  0 siblings, 1 reply; 6+ messages in thread
From: Jens Axboe @ 2004-11-27 15:48 UTC (permalink / raw)
  To: linux-scsi, tommaso.m

On Sat, Nov 27 2004, Tommaso Moroni wrote:
> Hi!
> 
> I'm writing a module for the 2.6.9 kernel which tracks accesses on a
> usb-storage device; in particular I'm interested in extracting from a
> struct scsi_cmnd the data read/written and the associated sector. 
> 
> 
> The code I'vr written till now looks like the following:
> 
> 
> struct scsi_cmnd * cmd;
> [...]
> if (cmd->use_sg == 0)
> {
> 	buf = cmd->buffer;
> 	buflen = cmd->bufflen;
> 	sector = cmd->request->sector;

->request_bufflen and ->request_buffer.

> } else {
> 	struct scatterlist * sl = (struct scatterlist *) cmd->buffer;
> 	for (i = 0; i < cmd->use_sg; i++)
> 	{
> 		buf = page_address(sl[i].page) + sl[i].offset;
>                 buflen = sl[i].length;
> 		/* sector? */
> 	}
> }

This only works on non-highmem pages, you should use kmap/kmap_atomic
instead.

> Is it correct?
> Where can I find the sector involved in the operation if the
> scatter-gather is used?

It's ->request->sector as well. The total length is just the sum of the
sg elements.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 6+ messages in thread

* extracting resid from struct scsi_cmnd
  2004-11-27 15:48 ` Jens Axboe
@ 2004-11-28  2:02   ` Douglas Gilbert
  2004-11-28  9:12     ` Jens Axboe
  0 siblings, 1 reply; 6+ messages in thread
From: Douglas Gilbert @ 2004-11-28  2:02 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-scsi

Jens,
While on the subject of extracting info from struct scsi_cmnd
I have noticed that scsi_cmnd::resid doesn't make it into
sg_io_hdr::resid in the block layer SG_IO implementation.
"rq->data_len" is put there instead and it invariably has a
value of 0.

"struct request" does not have a 'resid' field which is defined
as the number of bytes requested to be transferred less the actual
number transferred.

Doug Gilbert

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: extracting resid from struct scsi_cmnd
  2004-11-28  2:02   ` extracting resid " Douglas Gilbert
@ 2004-11-28  9:12     ` Jens Axboe
  2004-11-28 13:01       ` [PATCH] " Douglas Gilbert
  0 siblings, 1 reply; 6+ messages in thread
From: Jens Axboe @ 2004-11-28  9:12 UTC (permalink / raw)
  To: Douglas Gilbert; +Cc: linux-scsi

On Sun, Nov 28 2004, Douglas Gilbert wrote:
> Jens,
> While on the subject of extracting info from struct scsi_cmnd
> I have noticed that scsi_cmnd::resid doesn't make it into
> sg_io_hdr::resid in the block layer SG_IO implementation.
> "rq->data_len" is put there instead and it invariably has a
> value of 0.
> 
> "struct request" does not have a 'resid' field which is defined
> as the number of bytes requested to be transferred less the actual
> number transferred.

->data_len is that value, after execution of the request. If rq->data_len
== 0 for a SCSI request that with residual bytes, then that's a bug.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] extracting resid from struct scsi_cmnd
  2004-11-28  9:12     ` Jens Axboe
@ 2004-11-28 13:01       ` Douglas Gilbert
  2004-11-28 14:59         ` Jens Axboe
  0 siblings, 1 reply; 6+ messages in thread
From: Douglas Gilbert @ 2004-11-28 13:01 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-scsi

[-- Attachment #1: Type: text/plain, Size: 2264 bytes --]

Jens Axboe wrote:
> On Sun, Nov 28 2004, Douglas Gilbert wrote:
> 
>>Jens,
>>While on the subject of extracting info from struct scsi_cmnd
>>I have noticed that scsi_cmnd::resid doesn't make it into
>>sg_io_hdr::resid in the block layer SG_IO implementation.
>>"rq->data_len" is put there instead and it invariably has a
>>value of 0.
>>
>>"struct request" does not have a 'resid' field which is defined
>>as the number of bytes requested to be transferred less the actual
>>number transferred.
> 
> 
> ->data_len is that value, after execution of the request. If rq->data_len
> == 0 for a SCSI request that with residual bytes, then that's a bug.

Jens,
Ok, it looks like a bug then. Here is an example with the
scsi_debug version I just sent to this list and a recent sg3_utils
(e.g. v1.11 beta at the top of http://www.torque.net/sg ).
That scsi_debug version sets resid and sg3_utils reports resid != 0
when the verbose flag is given.

Here is what I am seeing:

# sg_inq -v /dev/sg0
      inquiry cdb: 12 00 00 00 24 00
...
   Product identification: scsi_debug
   Product revision level: 0004
      inquiry cdb: 12 01 00 00 fc 00
      inquiry: resid=124
      inquiry cdb: 12 01 80 00 fc 00
      inquiry: resid=124
   Unit serial number: 2000

# sg_inq -v /dev/sda
      inquiry cdb: 12 00 00 00 24 00
...
   Product identification: scsi_debug
   Product revision level: 0004
      inquiry cdb: 12 01 00 00 fc 00
      inquiry cdb: 12 01 80 00 fc 00
   Unit serial number: 2000

So the sg driver indicates that of the 252 bytes
requested (for VPD pages 0x0 and 0x80) only 128 bytes
were returned [and 128 bytes is an over-allowance by
scsi_debug for those pages]. The sd driver remains silent
implying resid is 0 .

rq->data_len is only written in one place in the scsi mid level
(in scsi_io_completion() inside scsi_lib.c). The attached
patch places cmd->resid into rq->data_len (rather than decrementing
it by cmd->bufflen) and fixes the problem shown above. I then
built a file system on the scsi_debug virtual disk and copied
files to and from it and there were no ill effects.

Changelog:
    - during successful command completion place resid from SCSI
      LLDs into request::data_len so that block SG_IO ioctl reports
      resid

Doug Gilbert




[-- Attachment #2: scsi_lib2610rc2resid.diff --]
[-- Type: text/x-patch, Size: 294 bytes --]

--- linux/drivers/scsi/scsi_lib.c	2004-11-15 20:53:03.000000000 +1000
+++ linux/drivers/scsi/scsi_lib.c2610rc2resid	2004-11-28 22:12:22.070160152 +1000
@@ -728,7 +728,7 @@
 				req->sense_len = len;
 			}
 		} else
-			req->data_len -= cmd->bufflen;
+			req->data_len = cmd->resid;
 	}
 
 	/*


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] extracting resid from struct scsi_cmnd
  2004-11-28 13:01       ` [PATCH] " Douglas Gilbert
@ 2004-11-28 14:59         ` Jens Axboe
  0 siblings, 0 replies; 6+ messages in thread
From: Jens Axboe @ 2004-11-28 14:59 UTC (permalink / raw)
  To: Douglas Gilbert; +Cc: linux-scsi

On Sun, Nov 28 2004, Douglas Gilbert wrote:
> Jens Axboe wrote:
> >On Sun, Nov 28 2004, Douglas Gilbert wrote:
> >
> >>Jens,
> >>While on the subject of extracting info from struct scsi_cmnd
> >>I have noticed that scsi_cmnd::resid doesn't make it into
> >>sg_io_hdr::resid in the block layer SG_IO implementation.
> >>"rq->data_len" is put there instead and it invariably has a
> >>value of 0.
> >>
> >>"struct request" does not have a 'resid' field which is defined
> >>as the number of bytes requested to be transferred less the actual
> >>number transferred.
> >
> >
> >->data_len is that value, after execution of the request. If rq->data_len
> >== 0 for a SCSI request that with residual bytes, then that's a bug.
> 
> Jens,
> Ok, it looks like a bug then. Here is an example with the
> scsi_debug version I just sent to this list and a recent sg3_utils
> (e.g. v1.11 beta at the top of http://www.torque.net/sg ).
> That scsi_debug version sets resid and sg3_utils reports resid != 0
> when the verbose flag is given.
> 
> Here is what I am seeing:
> 
> # sg_inq -v /dev/sg0
>      inquiry cdb: 12 00 00 00 24 00
> ...
>   Product identification: scsi_debug
>   Product revision level: 0004
>      inquiry cdb: 12 01 00 00 fc 00
>      inquiry: resid=124
>      inquiry cdb: 12 01 80 00 fc 00
>      inquiry: resid=124
>   Unit serial number: 2000
> 
> # sg_inq -v /dev/sda
>      inquiry cdb: 12 00 00 00 24 00
> ...
>   Product identification: scsi_debug
>   Product revision level: 0004
>      inquiry cdb: 12 01 00 00 fc 00
>      inquiry cdb: 12 01 80 00 fc 00
>   Unit serial number: 2000
> 
> So the sg driver indicates that of the 252 bytes
> requested (for VPD pages 0x0 and 0x80) only 128 bytes
> were returned [and 128 bytes is an over-allowance by
> scsi_debug for those pages]. The sd driver remains silent
> implying resid is 0 .
> 
> rq->data_len is only written in one place in the scsi mid level
> (in scsi_io_completion() inside scsi_lib.c). The attached
> patch places cmd->resid into rq->data_len (rather than decrementing
> it by cmd->bufflen) and fixes the problem shown above. I then
> built a file system on the scsi_debug virtual disk and copied
> files to and from it and there were no ill effects.
> 
> Changelog:
>    - during successful command completion place resid from SCSI
>      LLDs into request::data_len so that block SG_IO ioctl reports
>      resid
> 
> Doug Gilbert
> 
> 
> 

> --- linux/drivers/scsi/scsi_lib.c	2004-11-15 20:53:03.000000000 +1000
> +++ linux/drivers/scsi/scsi_lib.c2610rc2resid	2004-11-28 22:12:22.070160152 +1000
> @@ -728,7 +728,7 @@
>  				req->sense_len = len;
>  			}
>  		} else
> -			req->data_len -= cmd->bufflen;
> +			req->data_len = cmd->resid;
>  	}
>  
>  	/*
> 

Patch looks correct, thanks Doug.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2004-11-28 14:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-27 12:42 extracting infos from struct scsi_cmnd Tommaso Moroni
2004-11-27 15:48 ` Jens Axboe
2004-11-28  2:02   ` extracting resid " Douglas Gilbert
2004-11-28  9:12     ` Jens Axboe
2004-11-28 13:01       ` [PATCH] " Douglas Gilbert
2004-11-28 14:59         ` Jens Axboe

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.