public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Douglas Gilbert <dougg@torque.net>
To: Pat LaVarre <p.lavarre@ieee.org>
Cc: linux-scsi@vger.kernel.org
Subject: Re: SG_IO open flags are which
Date: Thu, 18 Dec 2003 13:41:07 +1000	[thread overview]
Message-ID: <3FE121D3.6050300@torque.net> (raw)
In-Reply-To: <1071506381.3389.22.camel@patibmrh9>

Pat LaVarre wrote:
> Doug G:
> 
> What open flags should apps use to talk SG_IO?
> 
> O_RDWR?  O_RDONLY?  O_NONBLOCK?  Other?  Combination?
> 
> Wrong info in Google includes:
> 
> 
>>List: linux-scsi
>>Date: 2003-12-03 0:17:56
>>Re: sg utils sg_io -i 0x24 -y "12 00:00:00 24 00"
>>...
>>
>>>>- O_RDWR
>>>>+ O_RDONLY|O_NONBLOCK
>>>
>>>... not from reading a document anywhere ...
>>
>>...
>>Possibly we recommend open O_NONBLOCK for SG_IO ...
>>Evidence in favour ... includes ...
>>From: linux-2.6.0-test11/Documentation/cdrom/cdrom-standard.tex
>>...
>>1997/12/28 ... propose ... $O_NONBLOCK$ to indicate
>>that the device is opened just for issuing $ioctl$
>>commands.
> 
> 
> Wrong guess, if we try 2.6.0-test11 with the three commands:
> 
> -i x24 -y "12 00:00:00 24 00" // standard Inquiry
> -y "1B 00:00:00 00 00" // Stop Unit
> -y "1B 00:00:00 01 00" // Start Unit
> 
> Either open O_NONBLOCK or open O_RDWR allows pass thru of standard
> Inquiry.  And open O_RDWR allows pass thru of Stop Unit.  But open
> O_NONBLOCK rejects pass thru of Stop Unit:
> 
> $ sudo plscsi /dev/sg0 -x "1B 00:00:00 00 00"
> ...
> $ grep -i 'Operation not permitted' /usr/include/asm/errno.h
> #define EPERM            1      /* Operation not permitted */
> $
> 
> Perhaps lk has no open that allows all of SG_IO without closing trays,
> spinning up discs, etc.?  If we do face that limit, then often we can
> settle for O_NONBLOCK to list device names (e.g. sg_scan) and O_RDWR
> otherwise (e.g. sg_dd).
> 
> Wish I knew where in the lk source we're choosing to have the privilege
> of the open vary the transparency of the pass thru.

Pat,
The implementation of open() is found in the driver that "owns"
the device name (e.g. /dev/hdc or /dev/st0m). The same is true
for ioctl() [and read()/write() for char devices].

Therefore the exact action of the O_NONBLOCK flag given to
an open() differs. Broadly speaking the interpretation is the
same: "let me in". For drivers that often encounter removable
media, a simple open() will fail if no media is present
(e.g. st yields EIO while sr/ide-cd yield ENOMEDIUM). In the
case of sg it won't wait for the O_EXCL lock to clear (rather
it yields EBUSY) and sidesteps error processing waits which is
arguably risky. For pass through purposes you should set O_NONBLOCK
as it can't hurt (e.g. sd ignores it and yields ENOMEDIUM if there
is no media (which looks wrong)).

Unix/Linux will only allow a non-root user to open() a file O_RDWR
that they have "rw" permissions for (so individual drivers have no
control over that). The "w" permissions is needed to call write()
but not to call ioctl(). Historically the sg driver output metadata
(including the SCSI command) with a write() and got the results with
a read(). That meant "rw" permissions and O_RDWR were needed. Then
the SG_IO ioctl came along in lk 2.4. The sg driver will only allow
the following SCSI commands through if the file was opened O_RDONLY:
   TEST_UNIT_READY
   REQUEST_SENSE
   INQUIRY
   READ_CAPACITY
   READ_BUFFER
   READ_6
   READ_10
   READ_12
   MODE_SENSE
   MODE_SENSE_10
   LOG_SENSE

Perhaps READ_16, SERVICE_IN and MAINTENANCE_IN should be added
to that list. The idea is to inhibit changing the state of
a device when it is opened O_RDONLY. START_STOP is definitely
_not_ on the list. The SG_IO ioctl() found in block/scsi_ioctl.c
does not have this restriction so you can issue any SCSI
commands when /dev/sda, for example, is opened O_RDONLY.

So first try and open() with the (O_NONBLOCK | O_RDWR) flags.
If that yields ENOMEDIUM look for the corresponding sg
device name. If the initial open() yields EROFS or EACESS then
try to open it (O_NONBLOCK | O_RDONLY). ...

Confused enough yet :-)

Doug Gilbert



  reply	other threads:[~2003-12-18  3:47 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-15 16:39 SG_IO open flags are which Pat LaVarre
2003-12-18  3:41 ` Douglas Gilbert [this message]
2003-12-18  9:47   ` Jens Axboe
  -- strict thread matches above, loose matches on Subject: below --
2004-04-06  0:49 Pat LaVarre
2004-05-20 15:16 Pat LaVarre

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=3FE121D3.6050300@torque.net \
    --to=dougg@torque.net \
    --cc=linux-scsi@vger.kernel.org \
    --cc=p.lavarre@ieee.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