From: Douglas Gilbert <dougg@torque.net>
To: "Cameron, Steve" <Steve.Cameron@hp.com>
Cc: linux-scsi@vger.kernel.org
Subject: Re: SG_IO weirdness
Date: Mon, 05 Feb 2007 14:17:35 -0500 [thread overview]
Message-ID: <45C782CF.9030207@torque.net> (raw)
In-Reply-To: <558F4D473FD7FE419B019232BF2D37B40B22F2@G3W0634.americas.hpqcorp.net>
Cameron, Steve wrote:
> I noticed that when I do two SG_IO ioctls to a target
> device (say, tape drive, disk drive, whatever) in which
> the first request is well formed (e.g. an inquiry) and the
> second one has a malformed CDB, such that it gets check condition
> with sense key == 5 (ILLEGAL REQUEST), the data buffer returned for
> the second malformed SG_IO request is filled out with the same
> data as was returned for the first successful command (e.g. the
> same inquiry data again.) I'm using separate data buffers for
> the two commands, and memsetting them to zero before calling
> ioctl(). I don't think this data is coming from the device,
> as it happens with every device I've tried.
>
> Is that normal? Seems like for a malformed request, the
> data buffer should not be transferred at all, much less
> transferred with contents of a prior request's data buffer.
>
> Kernel is 2.6.18 from kernel.org.
Steve,
Even though the SCSI status is CHECK CONDITION, the data-in
buffer may still be transferred. One obvious example
is a READ command when the sense key is RECOVERED ERROR.
The sg driver and I suspect the block layer SG_IO do
not check the SCSI status to determine whether or not
to transfer the data-in buffer (or where it would have
been DMA-ed to if the command worked) back to user space.
If it was _direct_ IO then the block layer SG_IO and the
sg driver would have no control over the data-in transfer
(apart from setting it up).
Both the sg driver and the block layer SG_IO could check
the resid field which a LLD should set after a DMA
(especially inbound). However LLDs are not compelled to
set resid properly.
So a few questions:
- block layer SG_IO, the sg driver or both?
- indirect IO (i.e. O_DIRECT not set)?
- did the offending process have superuser permissions?
- did the resid field indicate a short data-in transfer?
> The two requests were done from the same process, I haven't
> tried two separate processes to see if one process could
> by this method access another process's data. I did try
> using two devices, so the first well formed command went
> to one device, and the 2nd, malformed command went to another
> device. In that case, I didn't get the same buffer back again,
> but garbage. (some recognizeable strings, "en_US" was in there...)
>
> Is this a problem, or is this a matter of "just don't do that."?
As long as the SCSI status and sense buffer are conveyed
back properly _and_ this is only observed when the
process has superuser permissions, then I wouldn't
regard it as serious. Others may disagree.
Doug Gilbert
next prev parent reply other threads:[~2007-02-05 19:17 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-05 17:59 SG_IO weirdness Cameron, Steve
2007-02-05 19:17 ` Douglas Gilbert [this message]
2007-02-05 20:29 ` Cameron, Steve
2007-02-05 21:19 ` Douglas Gilbert
2007-02-05 22:53 ` Cameron, Steve
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=45C782CF.9030207@torque.net \
--to=dougg@torque.net \
--cc=Steve.Cameron@hp.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox