* 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.