All of lore.kernel.org
 help / color / mirror / Atom feed
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

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