Commit Graph

451 Commits

Author SHA1 Message Date
scottr c797d52571 SCSI_ASYNCREQ turns out to be redundant; we can simply free the scsipi_xfer
in scsipi_done() if the transfer is asynchronous.  This reduces the size
of the critical section in scsipi_execute_xs() somewhat (in fact,
back to its original size).
1998-09-18 05:53:07 +00:00
scottr 9cf43305cf Define a SCSIPI_XFER_ASYNC macro to test whether a request will be
completed asynchronously.  Eliminate SCSI_ASYNCREQ, which is actually
redundant information.
1998-09-18 05:45:03 +00:00
scottr 4963603d0f Found a race in scsipi_execute_xs(): if an asynchronous transfer completes
(probably due to an interrupt) between the time it is scheduled and the
time we get around to setting the SCSI_ASYNCREQ flag, we can lose the xs.

Fix this by checking to see if the transfer has already completed after
the scsi_cmd function returns SUCCESSFULLY_QUEUED, and just return to the
caller if so.
1998-09-16 05:35:50 +00:00
scottr f2c6836685 Fix a problem uncovered when we started to use the pool allocator to manage
scsipi_xfer structures.

When scsipi_execute_xs() calls the driver's scsi_cmd function, it assumes
that it can still dereference a pointer to the scsipi_xfer struct.  Since
scsipi_done() has already been called, which in turn has called
scsipi_free_xs(), the struct has already been returned the structure to
the pool!  In other words, xs->flags has been compromised, but we are still
testing it.

These changes resolve the problem by doing the following:

- In scsipi_execute_xs(), if the hardware driver's scsi_cmd function
  returns SUCCESSFULLY_QUEUED, set a new flag (SCSI_ASYNCREQ) in xs->flags.
  Since the request will be handled asynchronously, we will need the
  scsipi_xfer struct to be freed in scsipi_done().

  If the hardware driver's scsi_cmd function returns COMPLETE, we now
  simply return any actual errors, or 0 if none occurred.  (Previously,
  we may have returned EJUSTRETURN, of which the sole effect was to
  avoid freeing the scsipi_xfer struct in our caller.)

- In scsipi_done(), only free the scsipi_xfer struct for async requests.
  The contents of the struct will otherwise remain valid until the
  function that initiated the transfer frees it.

With this change, responsibility for freeing the struct now lies in two
places, depending on the type of the request:

- For synchronous requests, the routine calling scsipi_execute_xs()
  must clean up.

- For asynchronous requests, scsipi_done() cleans up (as it always has).

[Note:  this change also corrects a problem with sddump():  scsipi_done()
was attempting to return a static scsipi_xfer struct to the pool!  Since
dumps are performed synchronously, we now handle this correctly.]

This solution was provided by Jason Thorpe, after I got him to look at
some related (but insufficient) attempts of my own.
1998-09-14 05:49:21 +00:00
scottr 10640f1bfc Fix a problem uncovered when we started to use the pool allocator to manage
scsipi_xfer structures.

When scsipi_execute_xs() calls the driver's scsi_cmd function, it assumes
that it can still dereference a pointer to the scsipi_xfer struct.  Since
scsipi_done() has already been called, which in turn has called
scsipi_free_xs(), the struct has already been returned to the pool!  In
other words, xs->flags has been compromised, but we are still testing it.

These changes resolve the problem by doing the following:

- In scsipi_execute_xs(), if the lower-level driver's scsi_cmd function
  returns SUCCESSFULLY_QUEUED and SCSI_NOSLEEP is set in xs->flags, set a
  new flag (SCSI_ASYNCREQ).  This indicates that scsipi_done() should free
  the scsipi_xfer struct.

  If the lower-level driver's scsi_cmd function returns SUCCESSFULLY_QUEUED
  but SCSI_NOSLEEP is not set, we wait (via tsleep()) for the request to
  complete, then fall through to the COMPLETE case.

  If the lower-level driver's scsi_cmd function returns COMPLETE, we now
  simply return any actual errors, or 0 if none occurred.  (Previously,
  we may have returned EJUSTRETURN, of which the sole effect was to
  avoid freeing the scsipi_xfer struct in our caller.  No code seems
  to depend on this behavior, however.)

- In scsipi_done(), only free the scsipi_xfer struct for async requests.
  The contents of the struct will otherwise remain valid until the
  function that initiated the transfer frees it.

With this change, responsibility for freeing the struct now lies in two
places, depending on the type of the request:

- For synchronous requests, the routine calling scsipi_execute_xs()
  must clean up.

- For asynchronous requests, scsipi_done() cleans up (as it always has).

[Note:  this change also corrects a problem with sddump():  scsipi_done()
was attempting to return a static scsipi_xfer struct to the pool!  Since
dumps are performed synchronously, we now handle this correctly.]

This solution was provided by Jason Thorpe, after I got him to look at
some related (but insufficient) attempts of my own.
1998-09-14 05:49:20 +00:00
mjacob 03e28bdbaf keren/6128: add an entry for the TDC 4200. Full density code set isn't known. 1998-09-11 20:10:15 +00:00
mjacob 5c5c3f792f Reflect changes in quirk flags, and also now add case post retrieval
of Inquiry data during probe where SDEV_NOSYNC, SDEV_NOTAG and SDEV_NOWIDE
can be set (with quirk data overriding) per device probed.
1998-09-08 07:34:02 +00:00
mjacob 3805d4f082 Clarify quirk flags somwhat- split SDEV_NOSYNCWIDE into SDEV_NOSYNC and
SDEV_NOWIDE and add SDEV_NOTAG.
1998-09-08 07:32:42 +00:00
mjacob fd97cb265c typo for non-SCSIVERBOSE case 1998-09-02 02:18:48 +00:00
cgd d58173741d kill the last remnants of __BROKEN_INDIRECT_CONFIG. (only the pica port
used it, and it's non-working and apparently slated for replacement.)
1998-08-31 22:28:04 +00:00
explorer 5ae808b38d ss->special could be NULL, so sane would crash the kernel. 1998-08-19 08:40:31 +00:00
thorpej a2cad65f4e Only mark the disk dirty if we write. 1998-08-17 19:30:38 +00:00
mycroft 04f0dc658c Assign my copyrights to TNF. 1998-08-17 00:49:01 +00:00
mycroft 6dc903202f Assign my copyrights to TNF. 1998-08-15 10:10:47 +00:00
mycroft 6d3d8a1350 Make copyright notices with my name consistent. 1998-08-15 03:02:31 +00:00
thorpej 582d4a7856 Should not use SCSI_POLL if the system is not cold. 1998-08-15 01:32:55 +00:00
thorpej b3b533c44d Keep track if the disk has had done i/o, making it dirty. On last close,
or at shutdown, flush the cache if the disk is still dirty and it support
cache flushing.  Fixes PRs #5588 (Jim Bernard) and #5589 (Justin Gibbs).
1998-08-15 01:10:54 +00:00
thorpej d4a5a3d0ef Run the shutdown hook w/ SCSI_AUTOCONF. 1998-08-12 22:15:57 +00:00
scottr 396881cc5d Eliminate a potential (but not common) NULL dereference. 1998-08-11 05:47:43 +00:00
mjacob 345530343a Responding to an issue brought to my attention- when the device is
opened norewind and 2 filemarks are written at the end a phantom file
is left (just what I was afraid of, but I didn't think about it in
the last delta because somehow I had managed to convince myself that
this was a nonissue. It's not.).

So- in stdone clear ST_WRITTEN for regular reads. In st_close, preserve
the state of ST_WRITTEN, and if no error and 2FM@EOD for this device and
this is a no-rewind open, backspace one filemark. This should preserve
(for this mount session) FILE - FMK - FILE - FMK - FILE ... FILE FMK FMK EOD
sequencing.

This doesn't clean up the case of EOM appends- in this case you *will* still
get (after an MTEOM operation and a write of a file) a phantom empty file,
e.g. FILE - FMK FMK - FILE - FMK FMK EOD *unless* you follow the EOM operation
with an explicit backspace. The trouble is that this makes it difficult for
seamless interchange with other systems which don't necessarily follow.

The preferrable alternative would be to eliminate the 2FM@EOD except for
1/2" Reel tapes, but that has been pretty much nixed within developers.
1998-08-10 16:56:25 +00:00
drochner e2a2525203 fix incorrect length of LOCATE CDB (reported in PR kern/5306 by
Dave Huang <khym@bga.com>)
1998-08-06 10:20:38 +00:00
drochner 32fce55082 Improve generation of default disklabels:
-store printable product ID in cd's and sd's softc, use it as "typename"
-for this, add a "destination buffer length" argument to scsipi_strvis()
-return ATAPI device type for ATAPI devices
1998-08-05 16:29:04 +00:00
mjacob 6e34b79e01 Suggestion from Matthias Drochner: If at close you decide to write
filemark 'coz you opened write only and didn't do anything else,
call st_check_eod to possibly write TWO furshlugginer filemarks.

Also- return any errors from writing filemarks out of stclose.
1998-07-31 17:25:55 +00:00
mjacob b90b2a3798 Several more changes. First of all, move CTRL_MODE to have I/O behaviour
like a no-rewind device. Secondly figure out whether the initial TUR
for a CTRL_MODE open resulted in a tape being actually found (if so,
then do a mount session).

Move the 'sun compatibility' behaviour into stdone && stclose- don't
mark a tape as having been written in stopenm, fer gosh sakes.
1998-07-31 04:00:22 +00:00
thorpej 03ffe0a516 Use the pool allocator for scsipi_xfer structures. 1998-07-31 03:00:51 +00:00
thorpej 3cd681ef27 Typo. 1998-07-31 00:42:31 +00:00
thorpej 34529b444b From cd.c: call disk_unbusy() if we are unable to enqueue our command. 1998-07-30 23:57:07 +00:00
mjacob e404c0efec Some minor comment tweaking.
Also- to be fair and on review, kern/391 isn't really addressed by
the previous commits. In reviewing, I'm embarassed to find that this
talks about reading at EOT. I'm actually going to claim that this
is 'not a bug' or 'fixed already' in that at the end of media (at the
edge of recorded media), you may continuously open the tape (should
you choose to) issue a read, and zero bytes will transfer- this is a
sufficient EOF indicator.
1998-07-30 04:11:43 +00:00
mjacob c45a129a99 Clarify and name some of the 'open' modes. Clarify a few comments. Remove
a now unused variable. Also, remove the restriction against at density
code being greater than the max SCSI 2 density code: 0x80..0xff are the
Vendor Unique codes and most certainly should be allowed. The check for
invalid values should be less than 0 or greater than 255.

Oh- yeah, the previous commit addressed kern/391.
1998-07-30 03:17:22 +00:00
mjacob 7692effeed Make some changes wrt EOM behaviour. Distinguish EIO_PENDING from
EOM_PENDING. Set up a persistent EARLYWARNING behaviour flag. If
set, EOM behaviour forces a 'short read' to signal logical (as
opposed to physical) end of media. The user application may, of
course, do with this information what it will.

The EARLYWARNING behaviour may be enabled/disabled by a MTIOCTOP
operation. The default action is to not have EARLYWARNING enabled-
but this may be reversed by an option ST_ENABLE_EARLYWARN in
the kernel build.
1998-07-30 00:55:20 +00:00
mjacob 4205ca3d2a opt_scsiverbose.h now is opt_scsi.h and contains the defopted
SCSIVERBOSE and the new ST_ENABLE_EARLYWARN.
1998-07-30 00:49:19 +00:00
fvdl d40e353fa6 Add NOLUNS quirk for the UMAX Astra 1220 scanner. 1998-07-30 00:00:06 +00:00
drochner fb28f87855 Remove a check which restricted raw SCSI commands to the "minor 3"
("CTLMODE") subdevice. There are legitimate uses for raw commands with
normal tape handles too.
[I'm not sure if this is a final solution. Administrators might want
to set up a more finegrained policy. However, this should not be mixed
with the "set defaults" semantics of the "CTLMODE" subdevice; another
flag should be used instead (eg execute permission or a minor number bit).]
1998-07-19 18:43:20 +00:00
mjacob 66ea6cc018 Fix for kern/3835: add an sd sense handler. If we get a check condition/sense
data ASC/ASCQ of 0x04/0x01 (logical unit not ready, initialization in progress),
hang out for 5 seconds and return a RETRY THE OPERATION command. If we
get a check condition/sense data ASC/ASCQ of 0x04/0x02 (logical unit not
ready, initialization command required), send a polled/nosleep START UNIT
command and return a RETRY THE OPERATION command if that succeeds.

Don't send a START UNIT to a disk quirked as SDEV_NO_START. Don't send
a START UNIT to removable media. The reason for the latter is to not
just blindly spin up new (maybe changed) media.

I should note that I've successfully made this work with the ISP host
adapter so far. Other host adapters will need some work to be able
to manage or reasonably fail NOSLEEP/POLL commands while in this
state. Alternatively, the internal SCSI midlayer structure has got
to allow for more controlled error recovery (e.g., restart queues
controlled by the target driver).
1998-07-15 20:21:12 +00:00
mjacob bf29f419e7 part of fix for kern/3835: use of enumerated returns from target sense handlers 1998-07-15 20:13:30 +00:00
mjacob dba811205f 1) Part of fix for kern/3835: add in enumerated return values for target
drivers' sense handlers to return. Coincidentally one of them ends up
being ERESTARTSYS.

2) Add a SCSI_URGENT flag to xs structure- this allows host adapters that
do command tagging to do the right thing wrt a tag.
1998-07-15 20:11:34 +00:00
thorpej 943235ed66 Those tabs sure are excitable!! 1998-07-13 16:50:56 +00:00
hpeyerl 76735d1493 Add support for ATA CD changer devices like the NEC CDR-251.
Evidence of managerial coding removed by Victor T. Cleaner (thorpej)
1998-07-13 12:04:29 +00:00
mjacob 0978d23cc4 Clarify that Sense Key 1 is a "RECOVERED ERROR"- not just an error. 1998-07-11 00:52:09 +00:00
mjacob b5b5f16fba hmm, char sign extension bit me 1998-07-10 19:37:18 +00:00
jonathan d275e56dee * defopt COMPAT_{09,10,11,12,13} and COMPAT_NOMID.
TODO: revisit interaction between native compat and emul compat usage.
1998-07-05 08:49:30 +00:00
jonathan 011f2bda08 defopt NS, NSIP. 1998-07-05 06:49:00 +00:00
jonathan fe484937cf defopt LLC 1998-07-05 03:14:41 +00:00
jonathan 8db0fcdbf7 defopt CCITT. 1998-07-05 02:12:22 +00:00
jonathan 3751946b97 defopt INET, NETATALK. 1998-07-05 00:51:04 +00:00
mjacob e558885a0e Minor enhancements:
1) Quirk entries for Storage Tek 9490 (Timberline) and D3 (Redwood)
	drives.

	2) Modification to st_loadtape to do a REWIND to BOT if the
	action is a load and the tape doesn't support the LOAD command
	(9490, SD3, and IBM 3590).

	3) Cleaned up the 'undersized user record' error message to
	make a little more sense.

Various bug fixes:

kern/1275:	Now returns values in dsreg and erreg and sets resid
		(as best as it can for a 16 but integer). See also
		a recent change to mtio.h. We are declining to fix
		the portion of this bug about naming a more specific
		SCSI device. Since there is nothing programmatic
		you can do with that information, it is not useful
		to pass back at this time.

		A side effect of this change is that doing MTIOCGET
		also forces a mode sense (to get the current state
		of WRITE PROTECT).


kern/5647:	Now no longer logs to the console ILI or Filemark or (first)
		EOM (on write) errors (unless SCSIDEBUG is set).

kern/5525:	Substantially increased timeouts for a variety of
		operations, and split them into categories of
		I/O, Space, and Control operations (each have
		likely different inherent times). I/O is for
		reads/writes. Control is for mode sense/select.
		Space is for spacing the tape.

Until EOM handling is changed, though kern/391 is still not fixed. A side
effect of EOM handling is that you now always 'lose' (to the writing
application's view) the last write since EIO is what is returned on
EOM detection during writes. Hopefully the reader applications don't
get too bent out of shape by this.
1998-07-04 01:50:20 +00:00
mjacob f4918cb223 kern/5514: take the submitter's advice, at least partially. The time it
takes to do IELEM can be proportional to the number of elements, but is
also affected by wierd things like how readable the barcodes on the
media are. There are worst case scenarios I've seen where there are
white labels on the back of tapes with pencilled in labels which is
*just* close enough to being a bar code that an Exabyte 120 would
peer at them myopically and long enough for a *really* long time to
pass in inventorying the jukebox.

I've upped the limit to be proportional to 5 minutes per element. That
is long enough that someone I'm sure will complain about "you wait
to long and should time out" for broken h/w.

As is also noted in the PR, there are a lot of other issues here. It's
really also a question as to whether to update this driver or go
with CAM's driver. This one doesn't have switching between block
descriptors and not, doesn't support volume tag setting, and so on.
Time is limited. This PR should have been closed and fixed right away,
tho.
1998-07-03 19:11:25 +00:00
mjacob 3664a056b3 Align output for Tape specific bits and use new Sense Key defines (for clarity) 1998-07-01 17:18:45 +00:00
mjacob 6aa030f90b Use new Sense Key defines (for clarity) 1998-07-01 17:16:46 +00:00
mjacob a228166c1a oh, for goodness sake, define the bloody Sense Keys... 1998-07-01 17:04:31 +00:00