879 Commits

Author SHA1 Message Date
mav
89e8995fe2 MFC r287724: Check for obsolete NUL bin in CSCD descriptor. 2015-10-05 09:08:06 +00:00
mav
3b0ffe961d MFC r287718: Decode WRITE ATOMIC(16) command. 2015-10-05 09:05:23 +00:00
mav
3de479a07f MFC r257831 (by smh):
Corrected definition for old_rate to match d_rotation_rate
2015-10-05 07:21:26 +00:00
mav
7d80829511 MFC r277101 (by imp):
Explain a bit of tricky code dealing with trims and how it prevents
starvation. These side effects aren't obvious without extremely
careful study, and are important to do just so.
2015-10-05 07:07:37 +00:00
mav
47dc3fe588 MFC r270225 (by jhb): Unexpand TAILQ_FOREACH(). 2015-10-05 06:56:22 +00:00
mav
9b99abcebd MFC r269709 (by imp): is_full_id is set to 0 and then not used. remove it. 2015-10-05 06:55:26 +00:00
markj
8b8e712dff MFC r287806:
Preserve the device queue status before retrying a sense request in
chdone().
2015-09-30 03:33:28 +00:00
mav
004f6fe71e MFC r287819: Make CAM log errors that make it wait.
Waiting can take minutes, and it would be good for user to know what is
going on.
2015-09-29 05:23:26 +00:00
mav
71c5cd08a3 MFC r287289: Attach pass driver to LUNs is OFFLINE state.
Previously such LUNs were silently ignored.  But while they indeed unable
to process most of SCSI commands, some, like RTPG, they still can.
2015-09-28 12:30:22 +00:00
mav
523b7f48b9 MFC r287866: Fix fixed sense writing when passed more data then it can fit. 2015-09-23 05:14:48 +00:00
ken
0e7643b351 MFC, r286965:
------------------------------------------------------------------------
  r286965 | ken | 2015-08-20 10:07:51 -0600 (Thu, 20 Aug 2015) | 297 lines

  Revamp camcontrol(8) fwdownload support and add the opcodes subcommand.

  The significant changes and bugs fixed here are:

  1. Fixed a bug in the progress display code:

     When the user's filename is too big, or his terminal width is too
     small, the progress code could wind up using a negative number for
     the length of the "stars" that it uses to indicate progress.

     This negative value was assigned to an unsigned variable, resulting
     in a very large positive value.

     The result is that we wound up writing garbage from memory to the
     user's terminal.

     With an 80 column terminal, a file name length of more than 35
     characters would generate this problem.

     To address this, we now set a minimum progress bar length, and
     truncate the user's file name as needed.

     This has been tested with large filenames and small terminals, and
     at least produces reasonable results.  If the terminal is too
     narrow, the progress display takes up an additional line with each
     update, but this is more user friendly than writing garbage to the
     tty.

  2. SATA drives connected via a SATA controller didn't have SCSI Inquiry
     data populated in struct cam_device.  This meant that the code in
     fw_get_vendor() in fwdownload.c would try to match a zero-length
     vendor ID, and so return the first entry in the vendor table.  (Which
     used to be HITACHI.)  Fixed by grabbing identify data, passing the
     identify buffer into fw_get_vendor(), and matching against the model
     name.

  3. SATA drives connected via a SAS controller do have Inquiry data
     populated.  The table included a couple of entries -- "ATA ST" and
     "ATA HDS", intended to handle Seagate and Hitachi SATA drives attached
     via a SAS controller.  SCSI to ATA translation layers use a vendor
     ID of "ATA" (which is standard), and then the model name from the ATA
     identify data as the SCSI product name when they are returning data on
     SATA disks.  The cam_strmatch code will match the first part of the
     string (because the length it is given is the length of the vendor,
     "ATA"), and return 0 (i.e. a match).  So all SATA drives attached to
     a SAS controller would be programmed using the Seagate method
     (WRITE BUFFER mode 7) of SCSI firmware downloading.

  4. Issue #2 above covered up a bug in fw_download_img() -- if the
     maximum packet size in the vendor table was 0, it tried to default
     to a packet size of 32K.  But then it didn't actually succeed in
     doing that, because it set the packet size to the value that was
     in the vendor table (0).  Now that we actually have ATA attached
     drives fall use the VENDOR_ATA case, we need a reasonable default
     packet size.  So this is fixed to properly set the default packet size.

  5. Add support for downloading firmware to IBM LTO drives, and add a
     firmware file validation method to make sure that the firmware
     file matches the drive type.  IBM tape drives include a Load ID and
     RU name in their vendor-specific VPD page 0x3.  Those should match
     the IDs in the header of the firmware file to insure that the
     proper firmware file is loaded.

  6. This also adds a new -q option to the camcontrol fwdownload
     subcommand to suppress informational output.  When -q is used in
     combination with -y, the firmware upgrade will happen without
     prompting and without output except if an error condition occurs.

  7. Re-add support for printing out SCSI inquiry information when
     asking the user to confirm that they want to download firmware, and
     add printing of ATA Identify data if it is a SATA disk.  This was
     removed in r237281 when support for flashing ATA disks was added.

  8. Add a new camcontrol(8) "opcodes" subcommand, and use the
     underlying code to get recommended timeout values for drive
     firmware downloads.

     Many SCSI devices support the REPORT SUPPORTED OPERATION CODES
     command, and some support the optional timeout descriptor that
     specifies nominal and recommended timeouts for the commands
     supported by the device.

     The new camcontrol opcodes subcommand allows displaying all
     opcodes supported by a drive, information about which fields
     in a SCSI CDB are actually used by a given SCSI device, and the
     nominal and recommended timeout values for each command.

     Since firmware downloads can take a long time in some devices, and
     the time varies greatly between different types of devices, take
     advantage of the infrastructure used by the camcontrol opcodes
     subcommand to determine the best timeout to use for the WRITE
     BUFFER command in SCSI device firmware downloads.

     If the device recommends a timeout, it is likely to be more
     accurate than the default 50 second timeout used by the firmware
     download code.  If the user specifies a timeout, it will override
     the default or device recommended timeout.  If the device doesn't
     support timeout descriptors, we fall back to the default.

  9. Instead of downloading firmware to SATA drives behind a SAS controller
     using WRITE BUFFER, use the SCSI ATA PASS-THROUGH command to compose
     an ATA DOWNLOAD MICROCODE command and it to the drive.  The previous
     version of this code attempted to send a SCSI WRITE BUFFER command to
     SATA drives behind a SAS controller.  Although that is part of the
     SAT-3 spec, it doesn't work with the parameters used with LSI
     controllers at least.

  10.Add a new mechanism for making common ATA passthrough and
     ATA-behind-SCSI passthrough commands.

     The existing camcontrol(8) ATA command mechanism checks the device
     type on every command executed.  That works fine for individual
     commands, but is cumbersome for things like a firmware download
     that send a number of commands.

     The fwdownload code detects the device type up front, and then
     sends the appropriate commands.

  11.In simulation mode (-s), if the user specifies the -v flag, print out
     the SCSI CDB or ATA registers that would be sent to the drive.  This will
     aid in debugging any firmware download issues.

  sbin/camcontrol/fwdownload.c:
  	Add a device type to the fw_vendor structure, so that we can
  	specify different download methods for different devices from the
  	same vendor.  In this case, IBM hard drives (from when they
  	still made hard drives) and tape drives.

  	Add a tur_status field to the fw_vendor structure so that we can
  	specify whether the drive to be upgraded should be ready, not
  	ready, or whether it doesn't matter.  Add the corresponding
  	capability in fw_download_img().

  	Add comments describing each of the vendor table fields.

  	Add HGST and SmrtStor to the supported SCSI vendors list.

  	In fw_get_vendor(), look at ATA identify data if we have a SATA
  	device to try to identify what the drive vendor is.

  	Add IBM firmware file validation.  This gets VPD page 0x3, and
  	compares the Load ID and RU name in the page to the values
  	included in the header.  The validation code will refuse to load
  	a firmware file if the values don't match.  This does allow the
  	user to attempt a downgrade; whether or not it succeeds will
  	likely depend on the drive settings.

  	Add a -q option, and disable all informative output
  	(progress bars, etc.) when this is enabled.

  	Re-add the inquiry in the confirmation dialog so the user has
  	a better idea of which device he is talking to.  Add support for
  	displaying ATA identify data.

  	Don't automatically disable confirmation in simulation (-s) mode.
  	This allows the user to see the inquiry or identify data in the
  	dialog, and see exactly what they would see when the command
  	actually runs.  Also, in simulation mode, if the user specifies
  	the -v flag, print out the SCSI CDB or ATA registers that would
  	be sent to the drive.  This will aid in debugging any firmware
  	download issues.

  	Add a timeout field and timeout type to the firmware download
  	vendor table.  This allows specifying a default timeout and allows
  	specifying whether we should attempt to probe for a recommended
  	timeout from the drive.

  	Add a new fuction, fw_get_timeout(), that will determine
  	which timeout to use for the WRITE BUFFER command.  If the
  	user specifies a timeout, we always use that.  Otherwise,
  	we will use the drive recommended timeout, if available,
  	and fall back to the default when a drive recommended
  	timeout isn't available.

  	When we prompt the user, tell him what timeout we're going
  	to use, and the source of the timeout.

  	Revamp the way SATA devices are handled.

  	In fwdownload(), use the new get_device_type() function to
  	determine what kind of device we're talking to.

  	Allow firmware downloads to any SATA device, but restrict
  	SCSI downloads to known devices.  (The latter is not a
  	change in behavior.)

  	Break out the "ready" check from fw_download_img() into a
  	new subfunction, fw_check_device_ready().  This sends the
  	appropriate command to the device in question -- a TEST
  	UNIT READY or an IDENTIFY.  The IDENTIFY for SATA devices
   	a SAT layer is done using the SCSI ATA PASS-THROUGH
  	command.

  	Use the new build_ata_cmd() function to build either a SCSI or
  	ATA I/O CCB to issue the DOWNLOAD MICROCODE command to SATA
  	devices.  build_ata_cmd() figures looks at the devtype argument
  	and fills in the correct CCB type and CDB or ATA registers.

  	Revamp the vendor table to remove the previous
  	vendor-specific ATA entries and use a generic ATA vendor
  	placeholder.  We currently use the same method for all ATA
  	drives, although we may have to add vendor-specific
  	behavior once we test this with more drives.

  sbin/camcontrol/progress.c:
  	In progress_draw(), make barlength a signed value so that
  	we can easily detect a negative value.

  	If barlength (the length of the progress bar) would wind up
  	negative due to a small TTY width or a large filename,
  	set the bar length to the new minimum (10 stars) and
  	truncate the user's filename.  We will truncate it down to
  	0 characters if necessary.

  	Calculate a new prefix_len variable (user's filename length)
  	and use it as the precision when printing the filename.

  sbin/camcontrol/camcontrol.c:
  	Implement a new camcontrol(8) subcommand, "opcodes".  The
  	opcodes subcommand allows displaying the entire list of
  	SCSI commands supported by a device, or details on an
  	individual command.  In either case, it can display
  	nominal and recommended timeout values.

  	Add the scsiopcodes() function, which calls the new
  	scsigetopcodes() function to fetch opcode data from a
  	drive.

  	Add two new functions, scsiprintoneopcode() and
  	scsiprintopcodes(), which print information about one
  	opcode or all opcodes, respectively.

  	Remove the get_disk_type() function.  It is no longer used.

  	Add a new function, dev_has_vpd_page(), that fetches the
  	supported INQUIRY VPD list from a device and tells the
  	caller whether the requested VPD page is available.

  	Add a new function, get_device_type(), that returns a more
  	precise device type than the old get_disk_type() function.
  	The get_disk_type() function only distinguished between
  	SCSI and ATA devices, and SATA devices behind a SCSI to ATA
  	translation layer were considered to be "SCSI".

  	get_device_type() offers a third type, CC_DT_ATA_BEHIND_SCSI.
  	We need to know this to know whether to attempt to send ATA
  	passthrough commands.  If the device has the ATA
  	Information VPD page (0x89), then it is an ATA device
  	behind a SCSI to ATA translation layer.

  	Remove the type argument from the fwdownload() subcommand.

  	Add a new function, build_ata_cmd(), that will take one set
  	of common arguments and build either a SCSI or ATA I/O CCB,
  	depending on the device type passed in.

  sbin/camcontrol/camcontrol.h:
  	Add a prototype for scsigetopcodes().

  	Add a new enumeration, camcontrol_devtype.

  	Add prototypes for dev_has_vpd_page(), get_device_type()
  	and build_ata_cmd().

  	Remove the type argument from the fwdownload() subcommand.

  sbin/camcontrol/camcontrol.8
  	Explain that the fwdownload subcommand will use the drive
  	recommended timeout if available, and that the user can
  	override the timeout.

  	Document the new opcodes subcommand.

  	Explain that we will attempt to download firmware to any
  	SATA device.

  	Document supported SCSI vendors, and models tested if known.

  	Explain the commands used to download firmware for the
  	three different drive and controller combinations.

  	Document that the -v flag in simulation mode for the fwdownload
  	subcommand will print out the SCSI CDBs or ATA registers that would
  	be used.

  sys/cam/scsi/scsi_all.h:
  	Add new bit definitions for the one opcode descriptor for
  	the REPORT SUPPORTED OPCODES command.

  	Add a function prototype for scsi_report_supported_opcodes().

  sys/cam/scsi/scsi_all.c:
  	Add a new CDB building function, scsi_report_supported_opcodes().

Sponsored by:	Spectra Logic
2015-08-27 13:17:05 +00:00
ken
1d2632e58b MFC, r284192:
------------------------------------------------------------------------
  r284192 | ken | 2015-06-09 15:39:38 -0600 (Tue, 09 Jun 2015) | 102 lines

  Add support for reading MAM attributes to camcontrol(8) and libcam(3).

  MAM is Medium Auxiliary Memory and is most commonly found as flash
  chips on tapes.

  This includes support for reading attributes and decoding most
  known attributes, but does not yet include support for writing
  attributes or reporting attributes in XML format.

  libsbuf/Makefile:
  	Add subr_prf.c for the new sbuf_hexdump() function.  This
  	function is essentially the same function.

  libsbuf/Symbol.map:
  	Add a new shared library minor version, and include the
  	sbuf_hexdump() function.

  libsbuf/Version.def:
  	Add version 1.4 of the libsbuf library.

  libutil/hexdump.3:
  	Document sbuf_hexdump() alongside hexdump(3), since it is
  	essentially the same function.

  camcontrol/Makefile:
  	Add attrib.c.

  camcontrol/attrib.c:
  	Implementation of READ ATTRIBUTE support for camcontrol(8).

  camcontrol/camcontrol.8:
  	Document the new 'camcontrol attrib' subcommand.

  camcontrol/camcontrol.c:
  	Add the new 'camcontrol attrib' subcommand.

  camcontrol/camcontrol.h:
  	Add a function prototype for scsiattrib().

  share/man/man9/sbuf.9:
  	Document the existence of sbuf_hexdump() and point users to
  	the hexdump(3) man page for more details.

  sys/cam/scsi/scsi_all.c:
  	Add a table of known attributes, text descriptions and
  	handler functions.

  	Add a new scsi_attrib_sbuf() function along with a number
  	of other related functions that help decode attributes.

  	scsi_attrib_ascii_sbuf() decodes ASCII format attributes.

  	scsi_attrib_int_sbuf() decodes binary format attributes, and
  	will pass them off to scsi_attrib_hexdump_sbuf() if they're
  	bigger than 8 bytes.

  	scsi_attrib_vendser_sbuf() decodes the vendor and drive
  	serial number attribute.

  	scsi_attrib_volcoh_sbuf() decodes the Volume Coherency
  	Information attribute that LTFS writes out.

  sys/cam/scsi/scsi_all.h:
  	Add a number of attribute-related structure definitions and
  	other defines.

  	Add function prototypes for all of the functions added in
  	scsi_all.c.

  sys/kern/subr_prf.c:
  	Add a new function, sbuf_hexdump().  This is the same as
  	the existing hexdump(9) function, except that it puts the
  	result in an sbuf.

  	This also changes subr_prf.c so that it can be compiled in
  	userland for includsion in libsbuf.

  	We should work to change this so that the kernel hexdump
  	implementation is a wrapper around sbuf_hexdump() with a
  	statically allocated sbuf with a drain.  That will require
  	a drain function that goes to the kernel printf() buffer
  	that can take a non-NUL terminated string as input.
  	That is because an sbuf isn't NUL-terminated until it is
  	finished, and we don't want to finish it while we're still
  	using it.

  	We should also work to consolidate the userland hexdump and
  	kernel hexdump implemenatations, which are currently
  	separate.  This would also mean making applications that
  	currently link in libutil link in libsbuf.

  sys/sys/sbuf.h:
  	Add the prototype for sbuf_hexdump(), and add another copy
  	of the hexdump flag values if they aren't already defined.

  	Ideally the flags should be defined in one place but the
  	implemenation makes it difficult to do properly.  (See
  	above.)

  Sponsored by:	Spectra Logic Corporation

------------------------------------------------------------------------
2015-06-16 02:31:11 +00:00
hselasky
103346b78d MFC r279726:
Add DA_Q_NO_RC16 quirk for USB mass storage device.

PR:		194062
2015-05-21 07:41:03 +00:00
delphij
cb8b5d5c89 MFC r281840:
Extend DA_Q_NO_RC16 to MXUB3* devices.

PR:		kern/198647
2015-05-08 22:22:51 +00:00
hselasky
dff292d25f MFC r280597:
Add DA_Q_NO_RC16 quirk for USB mass storage device.

PR:		198647
2015-05-05 20:04:01 +00:00
pfg
6fb31bb00a MFC r281795:
scsi_parse_transportid_rdma(): fix mismatch in memory access size.

Independently found by Coverity and gcc49.

CID:		1230006
Reviewed by:	ken
2015-04-25 00:58:19 +00:00
mav
49119503d2 MFC r280172: Improve ATA and SCSI versions printing.
There is no "SCSI-6" and "ATA-9", but there is "SPC-4" and "ACS-2".
2015-03-31 07:26:39 +00:00
ken
13b9654564 MFC sa(4) and mt(1) improvements.
This includes these changes: 279219, 279229, 279261, 279534, 279570,
280230, 280231.

In addition, bump __FreeBSD_version for the addition of the new
mtio(4) / sa(4) ioctls.

Thanks to Dan Langille, Harald Schmalzbauer and Rudolf Cejka for spending
a significant amount of time and effort testing these changes.

  ------------------------------------------------------------------------
  r279219 | ken | 2015-02-23 14:59:30 -0700 (Mon, 23 Feb 2015) | 282 lines

  Significant upgrades to sa(4) and mt(1).

  The primary focus of these changes is to modernize FreeBSD's
  tape infrastructure so that we can take advantage of some of the
  features of modern tape drives and allow support for LTFS.

  Significant changes and new features include:

   o sa(4) driver status and parameter information is now exported via an
     XML structure.  This will allow for changes and improvements later
     on that will not break userland applications.  The old MTIOCGET
     status ioctl remains, so applications using the existing interface
     will not break.

   o 'mt status' now reports drive-reported tape position information
     as well as the previously available calculated tape position
     information.  These numbers will be different at times, because
     the drive-reported block numbers are relative to BOP (Beginning
     of Partition), but the block numbers calculated previously via
     sa(4) (and still provided) are relative to the last filemark.
     Both numbers are now provided.  'mt status' now also shows the
     drive INQUIRY information, serial number and any position flags
     (BOP, EOT, etc.) provided with the tape position information.
     'mt status -v' adds information on the maximum possible I/O size,
     and the underlying values used to calculate it.

   o The extra sa(4) /dev entries (/dev/saN.[0-3]) have been removed.

     The extra devices were originally added as place holders for
     density-specific device nodes.  Some OSes (NetBSD, NetApp's OnTap
     and Solaris) have had device nodes that, when you write to them,
     will automatically select a given density for particular tape drives.

     This is a convenient way of switching densities, but it was never
     implemented in FreeBSD.  Only the device nodes were there, and that
     sometimes confused users.

     For modern tape devices, the density is generally not selectable
     (e.g. with LTO) or defaults to the highest availble density when
     the tape is rewritten from BOT (e.g. TS11X0).  So, for most users,
     density selection won't be necessary.  If they do need to select
     the density, it is easy enough to use 'mt density' to change it.

   o Protection information is now supported.  This is either a
     Reed-Solomon CRC or CRC32 that is included at the end of each block
     read and written.  On write, the tape drive verifies the CRC, and
     on read, the tape drive provides a CRC for the userland application
     to verify.

   o New, extensible tape driver parameter get/set interface.

   o Density reporting information.  For drives that support it,
     'mt getdensity' will show detailed information on what formats the
     tape drive supports, and what formats the tape drive supports.

   o Some mt(1) functionality moved into a new mt(3) library so that
     external applications can reuse the code.

   o The new mt(3) library includes helper routines to aid in parsing
     the XML output of the sa(4) driver, and build a tree of driver
     metadata.

   o Support for the MTLOAD (load a tape in the drive) and MTWEOFI
     (write filemark immediate) ioctls needed by IBM's LTFS
     implementation.

   o Improve device departure behavior for the sa(4) driver.  The previous
     implementation led to hangs when the device was open.

   o This has been tested on the following types of drives:
  	IBM TS1150
  	IBM TS1140
  	IBM LTO-6
  	IBM LTO-5
  	HP LTO-2
  	Seagate DDS-4
  	Quantum DLT-4000
  	Exabyte 8505
  	Sony DDS-2

  contrib/groff/tmac/doc-syms,
  share/mk/bsd.libnames.mk,
  lib/Makefile,
  	Add libmt.

  lib/libmt/Makefile,
  lib/libmt/mt.3,
  lib/libmt/mtlib.c,
  lib/libmt/mtlib.h,
  	New mt(3) library that contains functions moved from mt(1) and
  	new functions needed to interact with the updated sa(4) driver.

  	This includes XML parser helper functions that application writers
  	can use when writing code to query tape parameters.

  rescue/rescue/Makefile:
  	Add -lmt to CRUNCH_LIBS.

  src/share/man/man4/mtio.4
  	Clarify this man page a bit, and since it contains what is
  	essentially the mtio.h header file, add new ioctls and structure
  	definitions from mtio.h.

  src/share/man/man4/sa.4
  	Update BUGS and maintainer section.

  sys/cam/scsi/scsi_all.c,
  sys/cam/scsi/scsi_all.h:
  	Add SCSI SECURITY PROTOCOL IN/OUT CDB definitions and CDB building
  	functions.

  sys/cam/scsi/scsi_sa.c
  sys/cam/scsi/scsi_sa.h
  	Many tape driver changes, largely outlined above.

  	Increase the sa(4) driver read/write timeout from 4 to 32
  	minutes.  This is based on the recommended values for IBM LTO
  	5/6 drives.  This may also avoid timeouts for other tape
  	hardware that can take a long time to do retries and error
  	recovery.  Longer term, a better way to handle this is to ask
  	the drive for recommended timeout values using the REPORT
  	SUPPORTED OPCODES command.  Modern IBM and Oracle tape drives
  	at least support that command, and it would allow for more
  	accurate timeout values.

  	Add XML status generation.  This is done with a series of
  	macros to eliminate as much duplicate code as possible.  The
  	new XML-based status values are reported through the new
  	MTIOCEXTGET ioctl.

  	Add XML driver parameter reporting, using the new MTIOCPARAMGET
  	ioctl.

  	Add a new driver parameter setting interface, using the new
  	MTIOCPARAMSET and MTIOCSETLIST ioctls.

  	Add a new MTIOCRBLIM ioctl to get block limits information.

  	Add CCB/CDB building routines scsi_locate_16, scsi_locate_10,
  	and scsi_read_position_10().

  	scsi_locate_10 implements the LOCATE command, as does the
  	existing scsi_set_position() command.  It just supports
  	additional arguments and features.  If/when we figure out a
  	good way to provide backward compatibility for older
  	applications using the old function API, we can just revamp
  	scsi_set_position().  The same goes for
  	scsi_read_position_10() and the existing scsi_read_position()
  	function.

  	Revamp sasetpos() to take the new mtlocate structure as an
  	argument.  It now will use either scsi_locate_10() or
  	scsi_locate_16(), depending upon the arguments the user
  	supplies.  As before, once we change position we don't have a
  	clear idea of what the current logical position of the tape
  	drive is.

  	For tape drives that support long form position data, we
  	read the current position and store that for later reporting
  	after changing the position.  This should help applications
  	like Bacula speed tape access under FreeBSD once they are
  	modified to support the new ioctls.

  	Add a new quirk, SA_QUIRK_NO_LONG_POS, that is set for all
  	drives that report SCSI-2 or older, as well as drives that
  	report an Illegal Request type error for READ POSITION with
  	the long format.  So we should automatically detect drives
  	that don't support the long form and stop asking for it after
  	an initial try.

  	Add a partition number to the sa(4) softc.

  	Improve device departure handling. The previous implementation
  	led to hangs when the device was open.

  	If an application had the sa(4) driver open, and attempted to
  	close it after it went away, the cam_periph_release() call in
  	saclose() would cause the periph to get destroyed because that
  	was the last reference to it.  Because destroy_dev() was
  	called from the sa(4) driver's cleanup routine (sacleanup()),
  	and would block waiting for the close to happen, a deadlock
  	would result.

  	So instead of calling destroy_dev() from the cleanup routine,
  	call destroy_dev_sched_cb() from saoninvalidate() and wait for
  	the callback.

  	Acquire a reference for devfs in saregister(), and release it
  	in the new sadevgonecb() routine when all devfs devices for
  	the particular sa(4) driver instance are gone.

  	Add a new function, sasetupdev(), to centralize setting
  	per-instance devfs device parameters instead of repeating the
  	code in saregister().

  	Add an open count to the softc, so we know how many
  	peripheral driver references are a result of open
         	sessions.

  	Add the D_TRACKCLOSE flag to the cdevsw flags so
  	that we get a 1:1 mapping of open to close calls
  	instead of a N:1 mapping.

  	This should be a no-op for everything except the
  	control device, since we don't allow more than one
  	open on non-control devices.

  	However, since we do allow multiple opens on the
  	control device, the combination of the open count
  	and the D_TRACKCLOSE flag should result in an
  	accurate peripheral driver reference count, and an
  	accurate open count.

  	The accurate open count allows us to release all
  	peripheral driver references that are the result
  	of open contexts once we get the callback from devfs.

  sys/sys/mtio.h:
  	Add a number of new mt(4) ioctls and the requisite data
  	structures.  None of the existing interfaces been removed
  	or changed.

  	This includes definitions for the following new ioctls:

  	MTIOCRBLIM      /* get block limits */
  	MTIOCEXTLOCATE	/* seek to position */
  	MTIOCEXTGET     /* get tape status */
  	MTIOCPARAMGET	/* get tape params */
  	MTIOCPARAMSET	/* set tape params */
  	MTIOCSETLIST	/* set N params */

  usr.bin/mt/Makefile:
  	mt(1) now depends on libmt, libsbuf and libbsdxml.

  usr.bin/mt/mt.1:
  	Document new mt(1) features and subcommands.

  usr.bin/mt/mt.c:
  	Implement support for mt(1) subcommands that need to
  	use getopt(3) for their arguments.

  	Implement a new 'mt status' command to replace the old
  	'mt status' command.  The old status command has been
  	renamed 'ostatus'.

  	The new status function uses the MTIOCEXTGET ioctl, and
  	therefore parses the XML data to determine drive status.
  	The -x argument to 'mt status' allows the user to dump out
  	the raw XML reported by the kernel.

  	The new status display is mostly the same as the old status
  	display, except that it doesn't print the redundant density
  	mode information, and it does print the current partition
  	number and position flags.

  	Add a new command, 'mt locate', that will supersede the
  	old 'mt setspos' and 'mt sethpos' commands.  'mt locate'
  	implements all of the functionality of the MTIOCEXTLOCATE
  	ioctl, and allows the user to change the logical position
  	of the tape drive in a number of ways.  (Partition,
  	block number, file number, set mark number, end of data.)
  	The immediate bit and the explicit address bits are
  	implemented, but not documented in the man page.

  	Add a new 'mt weofi' command to use the new MTWEOFI ioctl.
  	This allows the user to ask the drive to write a filemark
  	without waiting around for the operation to complete.

  	Add a new 'mt getdensity' command that gets the XML-based
  	tape drive density report from the sa(4) driver and displays
  	it.  This uses the SCSI REPORT DENSITY SUPPORT command
  	to get comprehensive information from the tape drive about
  	what formats it is able to read and write.

  	Add a new 'mt protect' command that allows getting and setting
  	tape drive protection information.  The protection information
  	is a CRC tacked on to the end of every read/write from and to
  	the tape drive.

  Sponsored by:	Spectra Logic
  MFC after:	1 month

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r279229 | ken | 2015-02-23 22:43:16 -0700 (Mon, 23 Feb 2015) | 5 lines

  Fix printf format warnings on sparc64 and mips.

  Sponsored by:	Spectra Logic
  MFC after:	1 month

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r279261 | ken | 2015-02-24 21:30:23 -0700 (Tue, 24 Feb 2015) | 23 lines

  Fix several problems found by Coverity.

  lib/libmt/mtlib.c:
  	In mt_start_element(), make sure we don't overflow the
  	cur_sb array.  CID 1271325

  usr.bin/mt/mt.c:
  	In main(), bzero the mt_com structure so that we aren't
  	using any uninitialized stack variables.  CID 1271319

  	In mt_param(), only allow one -s and one -p argument.  This
  	will prevent a memory leak caused by overwriting the
  	param_name and/or param_value variables.  CID 1271320 and
  	CID 1271322

  	To make things simpler in mt_param(), make sure there
  	there is only one exit path for the function.  Make sure
  	the arguments are explicitly freed.

  Sponsored by:	Spectra Logic
  Pointed out by:	emaste
  MFC after:	1 month

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r279534 | ken | 2015-03-02 11:09:49 -0700 (Mon, 02 Mar 2015) | 18 lines

  Change the sa(4) driver to check for long position support on
  SCSI-2 devices.

  Some older tape devices claim to be SCSI-2, but actually do support
  long position information.  (Long position information includes
  the current file mark.)  For example, the COMPAQ SuperDLT1.

  So we now only disable the check on SCSI-1 and older devices.

  sys/cam/scsi/scsi_sa.c:
  	In saregister(), only disable fetching long position
  	information on SCSI-1 and older drives.  Update the
  	comment to explain why.

  Confirmed by:	dvl
  Sponsored by:	Spectra Logic
  MFC after:	3 weeks

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r279570 | ken | 2015-03-03 15:49:07 -0700 (Tue, 03 Mar 2015) | 21 lines

  Add density code for DAT-72, and notes on DAT-160.

  As it turns out, the density code for DAT-160 (0x48) is the same
  as for SDLT220.  Since the SDLT values are already in the table,
  we will leave them in place.

  Thanks to Harald Schmalzbauer for confirming the DAT-72 density code.

  lib/libmt/mtlib.c:
  	Add DAT-72 density code, and commented out DAT-160 density
  	code.  Explain why DAT-160 is commented out.  Add notes
  	explaining where the bpi values for these formats came from.

  usr.bin/mt/mt.1:
  	Add DAT-72 density code, and add a note explaining that
  	the SDLTTapeI(110) density code (0x48) is the same as
  	DAT-160.

  Sponsored by:	Spectra Logic
  MFC after:	3 weeks

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r280230 | ken | 2015-03-18 14:52:34 -0600 (Wed, 18 Mar 2015) | 25 lines

  Fix a couple of problems in the sa(4) media type reports.

  The only drives I have discovered so far that support medium type
  reports are newer HP LTO (LTO-5 and LTO-6) drives.  IBM drives
  only support the density reports.

  sys/cam/scsi/scsi_sa.h:
  	The number of possible density codes in the medium type
  	report is 9, not 8.  This caused problems parsing all of
  	the medium type report after this point in the structure.

  usr.bin/mt/mt.c:
  	Run the density codes returned in the medium type report
  	through denstostring(), just like the primary and secondary
  	density codes in the density report.  This will print the
  	density code in hex, and give a text description if it
  	is available.

  Thanks to Rudolf Cejka for doing extensive testing with HP LTO drives
  and Bacula and discovering these problems.

  Tested by:	Rudolf Cejka <cejkar at fit.vutbr.cz>
  Sponsored by:	Spectra Logic
  MFC after:	4 days

  ------------------------------------------------------------------------
  ------------------------------------------------------------------------
  r280231 | ken | 2015-03-18 14:54:54 -0600 (Wed, 18 Mar 2015) | 16 lines

  Improve the mt(1) rblim display.

  The granularity reported by READ BLOCK LIMITS is an exponent, not a
  byte value.  So a granularity of 0 means 2^0, or 1 byte.  A
  granularity of 1 means 2^1, or 2 bytes.

  Print out the individual block limits on separate lines to improve
  readability and avoid exceeding 80 columns.

  usr.bin/mt/mt.c:
  	Fix and improve the 'mt rblim' output.  Add a MT_PLURAL()
  	macro so we can print "byte" or "bytes" as appropriate.

  Sponsored by:	Spectra Logic
  MFC after:	4 days

  ------------------------------------------------------------------------

Sponsored by:	Spectra Logic
2015-03-24 14:36:10 +00:00
ken
a5cd9b061e MFC r278964:
The __FreeBSD_version was changed to 1001510 to be appropriate for
stable/10.

I will followup with a commit to mpr(4) and mps(4) in head to reflect
the stable/10 __FreeBSD_version and merge the change back to stable/10.

  ------------------------------------------------------------------------
  r278964 | ken | 2015-02-18 11:30:19 -0700 (Wed, 18 Feb 2015) | 46 lines

  Make sure that the flags for the XPT_DEV_ADVINFO CCB are initialized
  properly.

  If there is garbage in the flags field, it can sometimes include a
  set CDAI_FLAG_STORE flag, which may cause either an error or
  perhaps result in overwriting the field that was intended to be
  read.

  sys/cam/cam_ccb.h:
  	Add a new flag to the XPT_DEV_ADVINFO CCB, CDAI_FLAG_NONE,
  	that callers can use to set the flags field when no store
  	is desired.

  sys/cam/scsi/scsi_enc_ses.c:
  	In ses_setphyspath_callback(), explicitly set the
  	XPT_DEV_ADVINFO flags to CDAI_FLAG_NONE when fetching the
  	physical path information.  Instead of ORing in the
  	CDAI_FLAG_STORE flag when storing the physical path, set
  	the flags field to CDAI_FLAG_STORE.

  sys/cam/scsi/scsi_sa.c:
  	Set the XPT_DEV_ADVINFO flags field to CDAI_FLAG_NONE when
  	fetching extended inquiry information.

  sys/cam/scsi/scsi_da.c:
  	When storing extended READ CAPACITY information, set the
  	XPT_DEV_ADVINFO flags field to CDAI_FLAG_STORE instead of
  	ORing it into a field that isn't initialized.

  sys/dev/mpr/mpr_sas.c,
  sys/dev/mps/mps_sas.c:
  	When fetching extended READ CAPACITY information, set the
  	XPT_DEV_ADVINFO flags field to CDAI_FLAG_NONE instead of
  	setting it to 0.

  sbin/camcontrol/camcontrol.c:
  	When fetching a device ID, set the XPT_DEV_ADVINFO flags
  	field to CDAI_FLAG_NONE instead of 0.

  sys/sys/param.h:
  	Bump __FreeBSD_version to 1100061 for the new XPT_DEV_ADVINFO
  	CCB flag, CDAI_FLAG_NONE.

  Sponsored by:	Spectra Logic
2015-02-26 20:46:16 +00:00
mav
0bda5f012c MFC r278584: Add support for General Statistics and Performance log page.
CTL already collects most of statistics reported there, so why not.
2015-02-25 09:21:04 +00:00
ken
c0ca6257a6 MFC 278228:
The __FreeBSD_version has been changed to 1001508 for the addition of the
CDAI_TYPE_EXT_INQ request type.

  ------------------------------------------------------------------------
  r278228 | ken | 2015-02-04 17:12:21 -0700 (Wed, 04 Feb 2015) | 32 lines

  Add support for probing the SCSI VPD Extended Inquiry page (0x86).

  This VPD page is effectively an extension of the standard Inquiry
  data page, and includes lots of additional bits.

  This commit includes support for probing the page in the SCSI probe code,
  and an additional request type for the XPT_DEV_ADVINFO CCB.  CTL already
  supports the Extended Inquiry page.

  Support for querying this page in the sa(4) driver will come later.

  sys/cam/scsi/scsi_xpt.c:
  	Probe the Extended Inquiry page, if the device supports it, and
  	return it in response to a XPT_DEV_ADVINFO CCB if it is requested.

  sys/cam/scsi/cam_ccb.h:
  	Define a new advanced information CCB data type, CDAI_TYPE_EXT_INQ.

  sys/cam/cam_xpt.c:
  	Free the extended inquiry data in a device when the device goes
  	away.

  sys/cam/cam_xpt_internal.h:
  	Add an extended inquiry data pointer and length to struct cam_ed.

  sys/sys/param.h
  	Bump __FreeBSD_version for the addition of the new
  	CDAI_TYPE_EXT_INQ advanced information type.

  Sponsored by:	Spectra Logic
  MFC after:	1 week

  ------------------------------------------------------------------------

Sponsored by:	Spectra Logic
2015-02-18 23:08:13 +00:00
mav
a131bc6ccd MFC r277917 (by ken), r278598:
Improve SCSI Extended Inquiry VPD page (0x86) support.

sys/cam/scsi/scsi_all.h:
        In struct scsi_extended_inquiry_data:
        - Increase the length field to 2 bytes, as it is 2 bytes in SPC-4.
        - Add bit definitions for the various Activiate Microcode actions.
        - Add the Sequential Access Logical Block Protection support bit,
          since we need that in the sa(4) driver.  (For modifications
          that will come later.)
        - Add definitions for the various Multi I_T Nexus Microcode
          Download modes.

sys/cam/ctl/ctl.c:
        As of SPC-4, a single report of "REPORTED LUNS DATA HAS CHANGED"
        is to be given per I_T nexus.  Once it is reported, the unit
        attention condition should be cleared for all LUNS attached to
        an I_T nexus.

        Previously that only happened when a REPORT LUNS command was
        processed.

        This behavior may be different (according to SAM-5) when the
        UA_INTLCK_CTRL bits are non-zero in the control mode page but
        CTL does not currently support that.

        So, in view of the spec, whenever we report a LUN inventory
        change unit attention, clear it on all LUNs for that
        particular I_T nexus.

        Add a new function, ctl_clear_ua() that will clear a unit
        attention on all LUNs for the given I_T nexus.

        One field in the extended inquiry data that we could potentially
        report at some point is the maximum supported sense data length.
        To do that, we would the SIM to report (via path inquiry
        perhaps) how much sense data it is able to send.

        Add comments to explain some of the bits that are set in the
        Extended Inquiry VPD page.

        Add a few comments to make it more clear which functions handle
        various VPD pages.
2015-02-15 08:52:09 +00:00
mav
4bebe71c84 MFC r278111: Retry indefinitely on SCSI BUSY status from VMware disks and CDs.
VMware returns BUSY status when storage has transient connectivity issues.
It is often better to wait and let VM admin fix the problem then crash.
2015-02-09 09:10:46 +00:00
ken
d2ea45e16c MFC r276835:
r276835 | ken | 2015-01-08 09:58:40 -0700 (Thu, 08 Jan 2015) | 91 lines

  Improve camcontrol(8) handling of drive defect data.

  This includes a new summary mode (-s) for camcontrol defects that
  quickly tells the user the most important thing: how many defects
  are in the requested list.  The actual location of the defects is
  less important.

  Modern drives frequently have more than the 8191 defects that can
  be reported by the READ DEFECT DATA (10) command.  If they don't
  have that many grown defects, they certainly have more than 8191
  defects in the primary (i.e. factory) defect list.

  The READ DEFECT DATA (12) command allows for longer parameter
  lists, as well as indexing into the list of defects, and so allows
  reporting many more defects.

  This has been tested with HGST drives and Seagate drives, but
  does not fully work with Seagate drives.  Once I have a Seagate
  spec I may be able to determine whether it is possible to make it
  work with Seagate drives.

  scsi_da.h:	Add a definition for the new long block defect
  		format.

  		Add bit and mask definitions for the new extended
  		physical sector and bytes from index defect
  		formats.

  		Add a prototype for the new scsi_read_defects() CDB
  		building function.

  scsi_da.c:	Add a new scsi_read_defects() CDB building function.
  		camcontrol(8) was previously composing CDBs manually.
  		This is long overdue.

  camcontrol.c:	Revamp the camcontrol defects subcommand.  We now
  		go through multiple stages in trying to get defect
  		data off the drive while avoiding various drive
  		firmware quirks.

  		We start off by requesting the defect header with
  		the 10 byte command.  If we're in summary mode (-s)
  		and the drive reports fewer defects than can be
  		represented in the 10 byte header, we're done.
  		Otherwise, we know that we need to issue the
  		12 byte command if the drive reports the maximum
  		number of defects.

  		If we're in summary mode, we're done if we get a
  		good response back when asking for the 12 byte header.

  		If the user has asked for the full list, then we
  		use the address descriptor index field in the 12
  		byte CDB to step through the list in 64K chunks.
  		64K is small enough to work with most any ancient
  		or modern SCSI controller.

  		Add support for printing the new long block defect
  		format, as well as the extended physical sector and
  		bytes from index formats.  I don't have any drives
  		that support the new formats.

  		Add a hexadecimal output format that can be turned
  		on with -X.

  		Add a quiet mode (-q) that can be turned on with
  		the summary mode (-s) to just print out a number.

  		Revamp the error detection and recovery code for
  		the defects command to work with HGST drives.

  		Call the new scsi_read_defects() CDB building
  		function instead of rolling the CDB ourselves.

  		Pay attention to the residual from the defect list
  		request when printing it out, so we don't run off
  		the end of the list.

  		Use the new scsi_nv library routines to convert
  		from strings to numbers and back.

  camcontrol.8:	Document the new defect formats (longblock, extbfi,
  		extphys) and command line options (-q, -s, -S and
  		-X) for the defects subcommand.

  		Explain a little more about what drives generally
  		do and don't support.

Sponsored by:	Spectra Logic
2015-02-03 22:18:48 +00:00
ken
100a976c46 MFC 276831:
r276831 | ken | 2015-01-08 09:27:56 -0700 (Thu, 08 Jan 2015) | 30 lines

  Fix a bug in the CAM SCSI probe code that caused changes in inquiry
  data to go undetected.

  The probe code does an MD5 checksum of the inquiry data (and page
  0x80 serial number if available) before doing a reprobe of an
  existing device, and then compares a checksum after the probe to
  see whether the device has changed.

  This check was broken in January, 2000 by change 56146 when the extended
  inquiry probe code was added.

  In the extended inquiry probe case, it was calculating the checksum
  a second time.  The second time it included the updated inquiry
  data from the short inquiry probe (first 36 bytes).  So it wouldn't
  catch cases where the vendor, product, revision, etc. changed.

  This change will have the effect that when a device's inquiry data is
  updated and a rescan is issued, it will disappear and then reappear.
  This is the appropriate action, because if the inquiry data or serial
  number changes, it is either a different device or the device
  configuration may have changed significantly.  (e.g. with updated
  firmware.)

  scsi_xpt.c:	Don't calculate the initial MD5 checksum on
  		standard inquiry data and the page 0x80 serial
  		number if we have already calculated it.

Sponsored by:	Spectra Logic
2015-02-03 21:54:59 +00:00
mav
900f0a33cf MFC r277758: Fix several potential overflows in UNMAP code. 2015-02-02 12:09:42 +00:00
hselasky
b34c77d403 MFC r276825 and r277372:
Allow a block size of zero to mean 512 bytes, which is the most common
block size for USB disks. This fixes support for "Action Cam SJ4000".
2015-01-20 05:00:38 +00:00
mav
4ff47ae9ab MFC r275474: Add GET LBA STATUS command support to CTL.
It is implemented for LUNs backed by ZVOLs in "dev" mode and files.
GEOM has no such API, so for LUNs backed by raw devices all LBAs will
be reported as mapped/unknown.

Sponsored by:   iXsystems, Inc.
2014-12-18 08:38:07 +00:00
mav
dff991dbdf MFC r274411: Improve CAM's reaction on asymmetric access errors. 2014-12-12 07:41:08 +00:00
mav
d424575bb7 MFC r274756:
Remove residual xpt_release_device() call left after r272406 cleanup.

Excessive release here could trigger use-after-free condition and kernel
panic on LUN 0 disconnect.
2014-11-28 09:23:15 +00:00
mav
6414b04c27 MFC r274154, r274163:
Add to CTL support for logical block provisioning threshold notifications.

For ZVOL-backed LUNs this allows to inform initiators if storage's used or
available spaces get above/below the configured thresholds.

Sponsored by:	iXsystems, Inc.
2014-11-20 01:55:12 +00:00
mav
3f382b8a2d MFC r274477: Fix check for vendor-specific peripheral qualifier.
Submitted by:	anton.rang@isilon.com
2014-11-20 01:50:46 +00:00
gnn
52c05ed231 MFC: 273279
Add new quirks for the latest Samsung SSD, model 850.

Submitted by:	sbruno
2014-11-08 00:47:16 +00:00
mav
edabf036a2 MFC r273809:
Implement better handling for ENOSPC error for both CTL and CAM.

This makes VMWare VAAI Thin Provisioning Stun primitive activate, pausing
the virtual machine, when backing storage (ZFS pool) is getting overflowed.
2014-11-03 03:45:41 +00:00
mav
db924e4c03 MFC r273075: Remove couple Copan's vendor-specific mode pages.
Those pages are highly system-/hardware-specific, the code is incomplete,
and so they hardly can be useful for anybody else.
2014-11-02 17:28:44 +00:00
mav
9ac81dc0af MFC r273073: Some groundwork for later Informational Exceptions support.
This includes support for:
 - Read-Write Error Recovery mode page;
 - Informational Exceptions Control mode page;
 - Logical Block Provisioning mode page;
 - LOG SENSE command.

No real Informational Exceptions features yet. This is only a placeholder.
2014-11-02 17:28:08 +00:00
mav
13d0c695a0 MFC r272409:
Use REPORT LUNS command for SPC-2 devices with LUN 0 disconnected.

SPC-2 tells REPORT LUNS shall be supported by devices supporting LUNs other
then LUN 0.  If we see LUN 0 disconnected, guess there may be others, and
so REPORT LUNS shall be supported.
2014-11-02 17:26:13 +00:00
mav
5c2f41bdb0 MFC r272406:
Make disconnected LUN 0 don't remain in half-configured state if there are
no LUNs on SPC-3 target after we tried REPORT LUNS.
2014-11-02 17:25:03 +00:00
mav
3f2b3e757a MFC r272401, r272402: Rework the logic of sequential SCSI LUN scanner.
Previous logic was not differentiating disconnected LUNs and absent targets.
That made it to stop scan if LUN 0 was not found for any reason.  That made
problematic, for example, using iSCSI targets declaring SPC-2 compliance and
having no LUN 0 configured.

The new logic continues sequential LUN scan if:
 -- we have more configured LUNs that need recheck;
 -- this LUN is connected and its SCSI version allows more LUNs;
 -- this LUN is disconnected, its SCSI version allows more LUNs and we
    guess they may be connected (we haven't scanned first 8 LUNs yet or
    kern.cam.cam_srch_hi sysctl is set to scan more).
2014-11-02 17:23:44 +00:00
hselasky
1f41d295fb MFC r263710, r273377, r273378, r273423 and r273455:
- De-vnet hash sizes and hash masks.
- Fix multiple issues related to arguments passed to SYSCTL macros.

Sponsored by:	Mellanox Technologies
2014-10-27 14:38:00 +00:00
mav
173113fe4e MFC r273072: Add LBPERE mode bit definition. 2014-10-20 08:09:36 +00:00
mav
7cb7c8f153 MFC r273038: Add support for READ DEFECT DATA (10/12) commands.
SPC-4 r2 allows to return empty defect list if the list is not supported.
We don't reallu support defect data lists, but this suppresses some errors.
2014-10-20 08:07:29 +00:00
mav
29253fce18 MFC r272734:
Add support for WRITE ATOMIC (16) command and report SBC-4 compliance.

Atomic writes are only supported for ZVOLs in "dev" mode.  In other cases
atomicity can not be guarantied and so the command is blocked.
2014-10-20 07:33:41 +00:00
mav
7da2f7e9ed MFC r269472: Do not retry on set of non-transient XCOPY errors. 2014-10-06 15:24:04 +00:00
mav
fd1b7bf16c MFC r269469: Do not retry token errors.
They are not going to disappear by themselves.
2014-10-06 15:23:12 +00:00
mav
b913091bf1 MFC r271845:
Allow more commands to pass persistent reservation according to SPC-4 r37.
2014-10-06 13:22:05 +00:00
mav
48c3bee1ac MFC r271839:
Add support for "no Data-Out Buffer" (NDOB) flag of WRITE SAME (16) command.
2014-10-06 13:21:13 +00:00
mav
e2b4e0c243 MFC r271443: Add support for Extended INQUIRY Data (0x86) VPD page. 2014-10-06 12:49:07 +00:00
mav
994e3ee5d0 MFC r271313: Oops, missed piece of r271311. 2014-10-06 12:48:10 +00:00
mav
9cd8f95281 MFC r271700: Fix typo in defined ROD types in r269497.
Approved by:	re (gjb)
2014-09-20 13:46:16 +00:00