#
350804 |
|
08-Aug-2019 |
mav |
MFC r326645 (by imp): Define xpt_path_inq.
This provides a nice wrarpper around the XPT_PATH_INQ ccb creation and calling.
|
#
332647 |
|
17-Apr-2018 |
ken |
MFC r332458: ------------------------------------------------------------------------ r332458 | ken | 2018-04-12 15:21:18 -0600 (Thu, 12 Apr 2018) | 34 lines
Handle Programmable Early Warning for control commands in sa(4).
When the tape position is inside the Early Warning area, the tape drive will return a sense key of NO SENSE, and an ASC/ASCQ of 0x00,0x02, which means: End-of-partition/medium detected". If this was in response to a control command like WRITE FILEMARKS, we correctly translate this as informational status and return 0 from saerror().
Programmable Early Warning should be handled the same way, but we weren't handling it that way. As a result, if a PEW status (sense key of NO SENSE, ASC/ASCQ of 0x00,0x07, "Programmable early warning detected") came back in response to a WRITE FILEMARKS, we returned an error.
The impact of this was that if an application was writing to a sa(4) device, and a PEW area was set (in the Device Configuration Extension subpage -- mode page 0x10, subpage 1), and a filemark needed to be written on close, we could wind up returning an error to the user on close because of a "failure" to write the filemarks.
It actually isn't a failure, but rather just a status report from the drive, and shouldn't be treated as a failure.
sys/cam/scsi/scsi_sa.c: For control commands in saerror(), treat asc/ascq 0x00,0x07 the same as 0x00,{0-5} -- not an error. Return 0, since the command actually did succeed.
Reported by: Dr. Andreas Haakh <andreas@haakh.de> Tested by: Dr. Andreas Haakh <andreas@haakh.de> Sponsored by: Spectra Logic ------------------------------------------------------------------------
|
#
327228 |
|
27-Dec-2017 |
mav |
MFC r326835: Reduce size of several on-stack string buffers.
Submitted by: Dmitry Luhtionov <dmitryluhtionov@gmail.com>
|
#
320405 |
|
27-Jun-2017 |
ken |
MFC r320123:
Fix a potential sleep while holding a mutex in the sa(4) driver.
If the user issues a MTIOCEXTGET ioctl, and the tape drive in question has a serial number that is longer than 80 characters, we malloc a buffer in saextget() to hold the output of cam_strvis().
Since a mutex is held in that codepath, doing a M_WAITOK malloc could lead to sleeping while holding a mutex. Change it to a M_NOWAIT malloc and bail out if we fail to allocate the memory. Devices with serial numbers longer than 80 bytes are very rare (I don't recall seeing one), so this should be a very unusual case to hit. But it is a bug that should be fixed.
sys/cam/scsi/scsi_sa.c: In saextget(), if we need to malloc a buffer to hold the output of cam_strvis(), don't wait for the memory. Fail and return an error if we can't allocate the memory immediately.
PR: kern/220094 Submitted by: Jia-Ju Bai <baijiaju1990@163.com> Sponsored by: Spectra Logic Approved by: re (gjb)
|
#
317963 |
|
08-May-2017 |
ken |
MFC r317848:
Add basic programmable early warning error injection to the sa(4) driver.
This will help application developers simulate end of tape conditions.
To inject an error in sa0:
sysctl kern.cam.sa.0.inject_eom=1
This will return the next read or write request queued with 0 bytes written. Any subsequent writes or reads will go along as usual.
This will also cause the early warning position flag to get set for the next position query. So, 'mt status' will show the BPEW (Beyond Programmable Early Warning) flag on the first query after an error injection. After that, the position flags will be as they are in the underlying tape drive.
Also, update the sa(4) man page to describe tape parameters, which can be set via 'mt param'.
sys/cam/scsi/scsi_sa.c: In saregister(), create the inject_eom sysctl variable.
In sastart(), check to see whether inject_eom is set. If so, return the read or write with 0 bytes written to indicate EOM. Set the set_pews_status flag so that we fake PEWS status in the next position call for reads, and the next 3 calls for writes. This allows the user to see the BPEW flag one time via 'mt status'.
In sagetpos(), check the set_pews_status flag and fake PEWS status and decrement the counter if it is set.
share/man/man4/sa.4: Document the inject_eom sysctl variable.
Document all of the parameters currently supported via 'mt param'.
usr.bin/mt/mt.1: Point the user to the sa(4) man page for more details on supported parameters.
Sponsored by: Spectra Logic
|
#
302408 |
|
07-Jul-2016 |
gjb |
Copy head@r302406 to stable/11 as part of the 11.0-RELEASE cycle. Prune svn:mergeinfo from the new branch, as nothing has been merged here.
Additional commits post-branch will follow.
Approved by: re (implicit) Sponsored by: The FreeBSD Foundation |
#
298810 |
|
29-Apr-2016 |
pfg |
sys/cam: spelling fixes in comments.
No functional change.
|
#
298431 |
|
21-Apr-2016 |
pfg |
sys: use our nitems() macro when param.h is available.
This should cover all the remaining cases in the kernel.
Discussed in: freebsd-current
|
#
295114 |
|
01-Feb-2016 |
araujo |
Clean up unused-but-set-variable spotted by gcc-4.9.
Reviewed by: mav Approved by: rodrigc (mentor) MFC after: 2 weeks Sponsored by: gandi.net Differential Revision: https://reviews.freebsd.org/D5109
|
#
293350 |
|
07-Jan-2016 |
kib |
Convert sys/cam to use make_dev_s().
Reviewed by: hps, jhb Sponsored by: The FreeBSD Foundation MFC after: 3 weeks Differential revision: https://reviews.freebsd.org/D4746
|
#
287289 |
|
29-Aug-2015 |
mav |
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.
MFC after: 1 month
|
#
279534 |
|
02-Mar-2015 |
ken |
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
|
#
279229 |
|
24-Feb-2015 |
ken |
Fix printf format warnings on sparc64 and mips.
Sponsored by: Spectra Logic MFC after: 1 month
|
#
279219 |
|
23-Feb-2015 |
ken |
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
|
#
273377 |
|
21-Oct-2014 |
hselasky |
Fix multiple incorrect SYSCTL arguments in the kernel:
- Wrong integer type was specified.
- Wrong or missing "access" specifier. The "access" specifier sometimes included the SYSCTL type, which it should not, except for procedural SYSCTL nodes.
- Logical OR where binary OR was expected.
- Properly assert the "access" argument passed to all SYSCTL macros, using the CTASSERT macro. This applies to both static- and dynamically created SYSCTLs.
- Properly assert the the data type for both static and dynamic SYSCTLs. In the case of static SYSCTLs we only assert that the data pointed to by the SYSCTL data pointer has the correct size, hence there is no easy way to assert types in the C language outside a C-function.
- Rewrote some code which doesn't pass a constant "access" specifier when creating dynamic SYSCTL nodes, which is now a requirement.
- Updated "EXAMPLES" section in SYSCTL manual page.
MFC after: 3 days Sponsored by: Mellanox Technologies
|
#
269353 |
|
31-Jul-2014 |
joerg |
Fix breakage introduced by r256843: removing the SA_CCB_WAITING bit left some of the decisions based on its counterpart, SA_CCB_BUFFER_IO being random. As a result, propagation of the residual information for the SPACE command was broken, so the number of filemarks encountered during a SPACE operation was miscalculated. Consequently, systems relying on properly tracked filemark counters (like Bacula) fell apart.
The change also removes a switch/case in sadone() which r256843 degraded to a single remaining case label.
PR: 192285 Approved by: ken MFC after: 2 weeks
|
#
267992 |
|
28-Jun-2014 |
hselasky |
Pull in r267961 and r267973 again. Fix for issues reported will follow.
|
#
267985 |
|
27-Jun-2014 |
gjb |
Revert r267961, r267973:
These changes prevent sysctl(8) from returning proper output, such as:
1) no output from sysctl(8) 2) erroneously returning ENOMEM with tools like truss(1) or uname(1) truss: can not get etype: Cannot allocate memory
|
#
267961 |
|
27-Jun-2014 |
hselasky |
Extend the meaning of the CTLFLAG_TUN flag to automatically check if there is an environment variable which shall initialize the SYSCTL during early boot. This works for all SYSCTL types both statically and dynamically created ones, except for the SYSCTL NODE type and SYSCTLs which belong to VNETs. A new flag, CTLFLAG_NOFETCH, has been added to be used in the case a tunable sysctl has a custom initialisation function allowing the sysctl to still be marked as a tunable. The kernel SYSCTL API is mostly the same, with a few exceptions for some special operations like iterating childrens of a static/extern SYSCTL node. This operation should probably be made into a factored out common macro, hence some device drivers use this. The reason for changing the SYSCTL API was the need for a SYSCTL parent OID pointer and not only the SYSCTL parent OID list pointer in order to quickly generate the sysctl path. The motivation behind this patch is to avoid parameter loading cludges inside the OFED driver subsystem. Instead of adding special code to the OFED driver subsystem to post-load tunables into dynamically created sysctls, we generalize this in the kernel.
Other changes: - Corrected a possibly incorrect sysctl name from "hw.cbb.intr_mask" to "hw.pcic.intr_mask". - Removed redundant TUNABLE statements throughout the kernel. - Some minor code rewrites in connection to removing not needed TUNABLE statements. - Added a missing SYSCTL_DECL(). - Wrapped two very long lines. - Avoid malloc()/free() inside sysctl string handling, in case it is called to initialize a sysctl from a tunable, hence malloc()/free() is not ready when sysctls from the sysctl dataset are registered. - Bumped FreeBSD version to indicate SYSCTL API change.
MFC after: 2 weeks Sponsored by: Mellanox Technologies
|
#
256843 |
|
21-Oct-2013 |
mav |
Merge CAM locking changes from the projects/camlock branch to radically reduce lock congestion and improve SMP scalability of the SCSI/ATA stack, preparing the ground for the coming next GEOM direct dispatch support.
Replace big per-SIM locks with bunch of smaller ones: - per-LUN locks to protect device and peripheral drivers state; - per-target locks to protect list of LUNs on target; - per-bus locks to protect reference counting; - per-send queue locks to protect queue of CCBs to be sent; - per-done queue locks to protect queue of completed CCBs; - remaining per-SIM locks now protect only HBA driver internals.
While holding LUN lock it is allowed (while not recommended for performance reasons) to take SIM lock. The opposite acquisition order is forbidden. All the other locks are leaf locks, that can be taken anywhere, but should not be cascaded. Many functions, such as: xpt_action(), xpt_done(), xpt_async(), xpt_create_path(), etc. are no longer require (but allow) SIM lock to be held.
To keep compatibility and solve cases where SIM lock can't be dropped, all xpt_async() calls in addition to xpt_done() calls are queued to completion threads for async processing in clean environment without SIM lock held.
Instead of single CAM SWI thread, used for commands completion processing before, use multiple (depending on number of CPUs) threads. Load balanced between them using "hash" of the device B:T:L address.
HBA drivers that can drop SIM lock during completion processing and have sufficient number of completion threads to efficiently scale to multiple CPUs can use new function xpt_done_direct() to avoid extra context switch. Make ahci(4) driver to use this mechanism depending on hardware setup.
Sponsored by: iXsystems, Inc. MFC after: 2 months
|
#
256552 |
|
15-Oct-2013 |
mav |
Unify periph invalidation and destruction reporting. Print message containing device model and serial number on invalidation.
Requested by: glebius MFC after: 1 week
|
#
254760 |
|
24-Aug-2013 |
ken |
Add support to physio(9) for devices that don't want I/O split and configure sa(4) to request no I/O splitting by default.
For tape devices, the user needs to be able to clearly understand what blocksize is actually being used when writing to a tape device. The previous behavior of physio(9) was that it would split up any I/O that was too large for the device, or too large to fit into MAXPHYS. This means that if, for instance, the user wrote a 1MB block to a tape device, and MAXPHYS was 128KB, the 1MB write would be split into 8 128K chunks. This would be done without informing the user.
This has suboptimal effects, especially when trying to communicate status to the user. In the event of an error writing to a tape (e.g. physical end of tape) in the middle of a 1MB block that has been split into 8 pieces, the user could have the first two 128K pieces written successfully, the third returned with an error, and the last 5 returned with 0 bytes written. If the user is using a standard write(2) system call, all he will see is the ENOSPC error. He won't have a clue how much actually got written. (With a writev(2) system call, he should be able to determine how much got written in addition to the error.)
The solution is to prevent physio(9) from splitting the I/O. The new cdev flag, SI_NOSPLIT, tells physio that the driver does not want I/O to be split beforehand.
Although the sa(4) driver now enables SI_NOSPLIT by default, that can be disabled by two loader tunables for now. It will not be configurable starting in FreeBSD 11.0. kern.cam.sa.allow_io_split allows the user to configure I/O splitting for all sa(4) driver instances. kern.cam.sa.%d.allow_io_split allows the user to configure I/O splitting for a specific sa(4) instance.
There are also now three sa(4) driver sysctl variables that let the users see some sa(4) driver values. kern.cam.sa.%d.allow_io_split shows whether I/O splitting is turned on. kern.cam.sa.%d.maxio shows the maximum I/O size allowed by kernel configuration parameters (e.g. MAXPHYS, DFLTPHYS) and the capabilities of the controller. kern.cam.sa.%d.cpi_maxio shows the maximum I/O size supported by the controller.
Note that a better long term solution would be to implement support for chaining buffers, so that that MAXPHYS is no longer a limiting factor for I/O size to tape and disk devices. At that point, the controller and the tape drive would become the limiting factors.
sys/conf.h: Add a new cdev flag, SI_NOSPLIT, that allows a driver to tell physio not to split up I/O.
sys/param.h: Bump __FreeBSD_version to 1000049 for the addition of the SI_NOSPLIT cdev flag.
kern_physio.c: If the SI_NOSPLIT flag is set on the cdev, return any I/O that is larger than si_iosize_max or MAXPHYS, has more than one segment, or would have to be split because of misalignment with EFBIG. (File too large).
In the event of an error, print a console message to give the user a clue about what happened.
scsi_sa.c: Set the SI_NOSPLIT cdev flag on the devices created for the sa(4) driver by default.
Add tunables to control whether we allow I/O splitting in physio(9).
Explain in the comments that allowing I/O splitting will be deprecated for the sa(4) driver in FreeBSD 11.0.
Add sysctl variables to display the maximum I/O size we can do (which could be further limited by read block limits) and the maximum I/O size that the controller can do.
Limit our maximum I/O size (recorded in the cdev's si_iosize_max) by MAXPHYS. This isn't strictly necessary, because physio(9) will limit it to MAXPHYS, but it will provide some clarity for the application.
Record the controller's maximum I/O size reported in the Path Inquiry CCB.
sa.4: Document the block size behavior, and explain that the option of allowing physio(9) to split the I/O will disappear in FreeBSD 11.0.
Sponsored by: Spectra Logic
|
#
254416 |
|
16-Aug-2013 |
ken |
Add unmapped I/O and larger I/O support to the sa(4) driver.
We now pay attention to the maxio field in the XPT_PATH_INQ CCB, and if it is set, propagate it up to physio via the si_iosize_max field in the cdev structure.
We also now pay attention to the PIM_UNMAPPED capability bit in the XPT_PATH_INQ CCB, and set the new SI_UNMAPPED cdev flag when the underlying SIM supports unmapped I/O.
scsi_sa.c: Add unmapped I/O support and propagate the SIM's maximum I/O size up.
Adjust scsi_tape_read_write() in the same way that scsi_read_write() was changed to support unmapped I/O. We overload the readop parameter with bits that tell us whether it's an unmapped I/O, and we need to set the CAM_DATA_BIO CCB flag. This change should be backwards compatible in source and binary forms.
MFC after: 1 week Sponsored by: Spectra Logic
|
#
250792 |
|
18-May-2013 |
smh |
Added output of device QUIRKS for CAM and AHCI devices during boot.
Reviewed by: mav Approved by: pjd (mentor) MFC after: 2 weeks
|
#
241404 |
|
10-Oct-2012 |
mav |
Remove 'periph == NULL' check from bunch of periph drivers. This condition can never be true as functions are called from single place and the checks just pollute the code and confuse Clang Static Analyzer.
|
#
236712 |
|
07-Jun-2012 |
mav |
To make CAM debugging easier, compile in some debug flags (CAM_DEBUG_INFO, CAM_DEBUG_CDB, CAM_DEBUG_PERIPH and CAM_DEBUG_PROBE) by default. List of these flags can be modified with CAM_DEBUG_COMPILE kernel option. CAMDEBUG kernel option still enables all possible debug, if not overriden.
Additional 50KB of kernel size is a good price for the ability to debug problems without rebuilding the kernel. In case where size is important, debugging can be compiled out by setting CAM_DEBUG_COMPILE option to 0.
|
#
229288 |
|
02-Jan-2012 |
mav |
Remove unneeded checks for CAM_DEV_QFRZN after cam_periph_runccb() call. cam_periph_runccb() since the beginning checks it and releases device queue. After r203108 it even clears CAM_DEV_QFRZN flag after that to avoid double release, so removed code is unreachable now.
MFC after: 1 month
|
#
228344 |
|
08-Dec-2011 |
eadler |
- Add support for Support SEAGATE DAT Scopion 130
PR: kern/141934 Submitted by: HASHI Hiroaki <hashiz@stenmark.meridiani.jp> Approved by: sbruno@ MFC after: 1 week
|
#
227293 |
|
07-Nov-2011 |
ed |
Mark MALLOC_DEFINEs static that have no corresponding MALLOC_DECLAREs.
This means that their use is restricted to a single C file.
|
#
225950 |
|
03-Oct-2011 |
ken |
Add descriptor sense support to CAM, and honor sense residuals properly in CAM.
Desriptor sense is a new sense data format that originated in SPC-3. Among other things, it allows for an 8-byte info field, which is necessary to pass back block numbers larger than 4 bytes.
This change adds a number of new functions to scsi_all.c (and therefore libcam) that abstract out most access to sense data.
This includes a bump of CAM_VERSION, because the CCB ABI has changed. Userland programs that use the CAM pass(4) driver will need to be recompiled.
camcontrol.c: Change uses of scsi_extract_sense() to use scsi_extract_sense_len().
Use scsi_get_sks() instead of accessing sense key specific data directly.
scsi_modes: Update the control mode page to the latest version (SPC-4).
scsi_cmds.c, scsi_target.c: Change references to struct scsi_sense_data to struct scsi_sense_data_fixed. This should be changed to allow the user to specify fixed or descriptor sense, and then use scsi_set_sense_data() to build the sense data.
ps3cdrom.c: Use scsi_set_sense_data() instead of setting sense data manually.
cam_periph.c: Use scsi_extract_sense_len() instead of using scsi_extract_sense() or accessing sense data directly.
cam_ccb.h: Bump the CAM_VERSION from 0x15 to 0x16. The change of struct scsi_sense_data from 32 to 252 bytes changes the size of struct ccb_scsiio, but not the size of union ccb. So the version must be bumped to prevent structure mis-matches.
scsi_all.h: Lots of updated SCSI sense data and other structures.
Add function prototypes for the new sense data functions.
Take out the inline implementation of scsi_extract_sense(). It is now too large to put in a header file.
Add macros to calculate whether fields are present and filled in fixed and descriptor sense data
scsi_all.c: In scsi_op_desc(), allow the user to pass in NULL inquiry data, and we'll assume a direct access device in that case.
Changed the SCSI RESERVED sense key name and description to COMPLETED, as it is now defined in the spec.
Change the error recovery action for a number of read errors to prevent lots of retries when the drive has said that the block isn't accessible. This speeds up reconstruction of the block by any RAID software running on top of the drive (e.g. ZFS).
In scsi_sense_desc(), allow for invalid sense key numbers. This allows calling this routine without checking the input values first.
Change scsi_error_action() to use scsi_extract_sense_len(), and handle things when invalid asc/ascq values are encountered.
Add a new routine, scsi_desc_iterate(), that will call the supplied function for every descriptor in descriptor format sense data.
Add scsi_set_sense_data(), and scsi_set_sense_data_va(), which build descriptor and fixed format sense data. They currently default to fixed format sense data.
Add a number of scsi_get_*() functions, which get different types of sense data fields from either fixed or descriptor format sense data, if the data is present.
Add a number of scsi_*_sbuf() functions, which print formatted versions of various sense data fields. These functions work for either fixed or descriptor sense.
Add a number of scsi_sense_*_sbuf() functions, which have a standard calling interface and print the indicated field. These functions take descriptors only.
Add scsi_sense_desc_sbuf(), which will print a formatted version of the given sense descriptor.
Pull out a majority of the scsi_sense_sbuf() function and put it into scsi_sense_only_sbuf(). This allows callers that don't use struct ccb_scsiio to easily utilize the printing routines. Revamp that function to handle descriptor sense and use the new sense fetching and printing routines.
Move scsi_extract_sense() into scsi_all.c, and implement it in terms of the new function, scsi_extract_sense_len(). The _len() version takes a length (which should be the sense length - residual) and can indicate which fields are present and valid in the sense data.
Add a couple of new scsi_get_*() routines to get the sense key, asc, and ascq only.
mly.c: Rename struct scsi_sense_data to struct scsi_sense_data_fixed.
sbp_targ.c: Use the new sense fetching routines to get sense data instead of accessing it directly.
sbp.c: Change the firewire/SCSI sense data transformation code to use struct scsi_sense_data_fixed instead of struct scsi_sense_data. This should be changed later to use scsi_set_sense_data().
ciss.c: Calculate the sense residual properly. Use scsi_get_sense_key() to fetch the sense key.
mps_sas.c, mpt_cam.c: Set the sense residual properly.
iir.c: Use scsi_set_sense_data() instead of building sense data by hand.
iscsi_subr.c: Use scsi_extract_sense_len() instead of grabbing sense data directly.
umass.c: Use scsi_set_sense_data() to build sense data.
Grab the sense key using scsi_get_sense_key().
Calculate the sense residual properly.
isp_freebsd.h: Use scsi_get_*() routines to grab asc, ascq, and sense key values.
Calculate and set the sense residual.
MFC after: 3 days Sponsored by: Spectra Logic Corporation
|
#
220644 |
|
14-Apr-2011 |
mav |
Make CAM report devices with ATA/SATA transport to devstat(9) as IDE.
|
#
218909 |
|
21-Feb-2011 |
brucec |
Fix typos - remove duplicate "the".
PR: bin/154928 Submitted by: Eitan Adler <lists at eitanadler.com> MFC after: 3 days
|
#
198382 |
|
23-Oct-2009 |
mav |
Replace most of priority numbers with defines. No logical changes.
|
#
195534 |
|
10-Jul-2009 |
scottl |
Separate the parallel scsi knowledge out of the core of the XPT, and modularize it so that new transports can be created.
Add a transport for SATA
Add a periph+protocol layer for ATA
Add a driver for AHCI-compliant hardware.
Add a maxio field to CAM so that drivers can advertise their max I/O capability. Modify various drivers so that they are insulated from the value of MAXPHYS.
The new ATA/SATA code supports AHCI-compliant hardware, and will override the classic ATA driver if it is loaded as a module at boot time or compiled into the kernel. The stack now support NCQ (tagged queueing) for increased performance on modern SATA drives. It also supports port multipliers.
ATA drives are accessed via 'ada' device nodes. ATAPI drives are accessed via 'cd' device nodes. They can all be enumerated and manipulated via camcontrol, just like SCSI drives. SCSI commands are not translated to their ATA equivalents; ATA native commands are used throughout the entire stack, including camcontrol. See the camcontrol manpage for further details. Testing this code may require that you update your fstab, and possibly modify your BIOS to enable AHCI functionality, if available.
This code is very experimental at the moment. The userland ABI/API has changed, so applications will need to be recompiled. It may change further in the near future. The 'ada' device name may also change as more infrastructure is completed in this project. The goal is to eventually put all CAM busses and devices until newbus, allowing for interesting topology and management options.
Few functional changes will be seen with existing SCSI/SAS/FC drivers, though the userland ABI has still changed. In the future, transports specific modules for SAS and FC may appear in order to better support the topologies and capabilities of these technologies.
The modularization of CAM and the addition of the ATA/SATA modules is meant to break CAM out of the mold of being specific to SCSI, letting it grow to be a framework for arbitrary transports and protocols. It also allows drivers to be written to support discrete hardware without jeopardizing the stability of non-related hardware. While only an AHCI driver is provided now, a Silicon Image driver is also in the works. Drivers for ICH1-4, ICH5-6, PIIX, classic IDE, and any other hardware is possible and encouraged. Help with new transports is also encouraged.
Submitted by: scottl, mav Approved by: re
|
#
191304 |
|
20-Apr-2009 |
ed |
Get rid of the device index number stored in the sa(4) unit number.
The device index number stored in the unit number of sa(4) devices is only used to print debug messages. Get rid of this index number and use devtoname() to just print the entire device name.
|
#
187028 |
|
10-Jan-2009 |
trasz |
Don't call destroy_dev(9) with a mutex held. While here, shuffle things around so the periph destructors look alike. Based on a patch by Jaakko Heinonen.
Submitted by: Jaakko Heinonen Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation
|
#
183397 |
|
27-Sep-2008 |
ed |
Replace all calls to minor() with dev2unit().
After I removed all the unit2minor()/minor2unit() calls from the kernel yesterday, I realised calling minor() everywhere is quite confusing. Character devices now only have the ability to store a unit number, not a minor number. Remove the confusion by using dev2unit() everywhere.
This commit could also be considered as a bug fix. A lot of drivers call minor(), while they should actually be calling dev2unit(). In -CURRENT this isn't a problem, but it turns out we never had any problem reports related to that issue in the past. I suspect not many people connect more than 256 pieces of the same hardware.
Reviewed by: kib
|
#
170830 |
|
16-Jun-2007 |
scottl |
Work around the other uses of M_WAITOK.
|
#
170829 |
|
16-Jun-2007 |
scottl |
Work around a malloc locking problem.
|
#
169605 |
|
16-May-2007 |
scottl |
Add a helper function for registering async callbacks. Besides eliminating a lot of duplicated code, this also fixes a locking edge case.
|
#
169562 |
|
14-May-2007 |
scottl |
Eliminate the use of M_TEMP.
|
#
168872 |
|
19-Apr-2007 |
scottl |
Avoid problems with make_dev.
|
#
168752 |
|
15-Apr-2007 |
scottl |
Remove Giant from CAM. Drivers (SIMs) now register a mutex that CAM will use to synchornize and protect all data objects that are used for that SIM. Drivers that are not yet MPSAFE register Giant and operate as usual. RIght now, no drivers are MPSAFE, though a few will be changed in the coming week as this work settles down.
The driver API has changed, so all CAM drivers will need to be recompiled. The userland API has not changed, so tools like camcontrol do not need to be recompiled.
|
#
164906 |
|
05-Dec-2006 |
mjacob |
Add an xpt_print function to reduce most of the xpt_print_path/printf pairs. Convert the core code to use it.
Reviewed by: scsi (various folks weighing in with good advice) MFC after: 2 weeks
|
#
154360 |
|
14-Jan-2006 |
mjacob |
Incorporate the O_NONBLOCK open semantics of Linux and Solaris. This allows an application to upon a tape (yea, even the non-control device) even if it cannot establish a mount session. If the open cannot establish a mount session and O_NONBLOCK was specified, the tape becomes 'open pending mount'. All I/O operations that would require access to a tape thereafter until a close attempt to initiate the mount session. If the mount session succeeds, the tape driver transitions to full open state, else returns an appropriate I/O error (ENXIO).
At the same time, add a change that remembers whether tape is being opened read-only. If so, disallow 'write' operations like writing filemarks that bypass the normal read-only filtering operations that happen in the write(2) syscall.
Reviewed by: ken, justin, grog MFC after: 2 weeks Suggested by: The Bacula Team
|
#
147723 |
|
01-Jul-2005 |
avatar |
- Providing fine-grained malloc statistic by replacing M_DEVBUF with module-specific malloc types. These should help us to pinpoint the possible memory leakage in the future. - Implementing xpt_alloc_ccb_nowait() and replacing all malloc/free based CCB memory management with xpt_alloc_ccb[_nowait]/xpt_free_ccb. Hopefully this would be helpful if someday we move the CCB allocator to use UMA instead of malloc().
Encouraged by: jeffr, rwatson Reviewed by: gibbs, scottl Approved by: re (scottl)
|
#
145050 |
|
14-Apr-2005 |
mjacob |
Make sure we look at the correct sub op codes when deciding whether it's an operation we can perform via the control device.
PR: kern/72010 MFC after: 1 week
|
#
144430 |
|
31-Mar-2005 |
sam |
avoid use after free
Submitted by: gibbs Reviewed by: mdodd Approved by: Coverity Prevent analysis tool
|
#
139743 |
|
05-Jan-2005 |
imp |
Start each of the license/copyright comments with /*-
|
#
130585 |
|
16-Jun-2004 |
phk |
Do the dreaded s/dev_t/struct cdev */ Bump __FreeBSD_version accordingly.
|
#
126080 |
|
21-Feb-2004 |
phk |
Device megapatch 4/6:
Introduce d_version field in struct cdevsw, this must always be initialized to D_VERSION.
Flip sense of D_NOGIANT flag to D_NEEDGIANT, this involves removing four D_NOGIANT flags and adding 145 D_NEEDGIANT flags.
|
#
126076 |
|
21-Feb-2004 |
phk |
Device megapatch 1/6:
Free approx 86 major numbers with a mostly automatically generated patch.
A number of strategic drivers have been left behind by caution, and a few because they still (ab)use their major number.
|
#
124645 |
|
17-Jan-2004 |
johan |
Fix type in comment, 's/writtent/written/'
PR: 56954 Submitted by: Dan Langille <dan@langille.org>
|
#
120019 |
|
13-Sep-2003 |
mjacob |
I forgot whom I got this from- only set single initiator buffered mode if we've recorded in our softc that we should set it.
|
#
116162 |
|
10-Jun-2003 |
obrien |
Use __FBSDID().
|
#
115660 |
|
01-Jun-2003 |
mjacob |
Check in some months long pending minor debug output changes.
Clarify that the implicit fallthrough was *not* intentional (thanks, Poul!) and reorganize the code so a correct fallthrough (with /* FALLTHROUGH */) occurs.
|
#
115608 |
|
01-Jun-2003 |
phk |
Remove unused variables. Remove break after return. Add XXX comment where intent is unclear.
Found by: FlexeLint
|
#
114216 |
|
29-Apr-2003 |
kan |
Deprecate machine/limits.h in favor of new sys/limits.h. Change all in-tree consumers to include <sys/limits.h>
Discussed on: standards@ Partially submitted by: Craig Rodrigues <rodrigc@attbi.com>
|
#
112946 |
|
01-Apr-2003 |
phk |
Use bioq_flush() to drain a bio queue with a specific error code. Retain the mistake of not updating the devstat API for now.
Spell bioq_disksort() consistently with the remaining bioq_*().
#include <geom/geom_disk.h> where this is more appropriate.
|
#
112260 |
|
15-Mar-2003 |
phk |
Call devstat_start_transaction_bio() instead of devstat_start_transaction()
|
#
112006 |
|
08-Mar-2003 |
phk |
Allocate the devstat structure with devstat_new_entry().
|
#
111815 |
|
03-Mar-2003 |
phk |
Gigacommit to improve device-driver source compatibility between branches:
Initialize struct cdevsw using C99 sparse initializtion and remove all initializations to default values.
This patch is automatically generated and has been tested by compiling LINT with all the fields in struct cdevsw in reverse order on alpha, sparc64 and i386.
Approved by: re(scottl)
|
#
111119 |
|
19-Feb-2003 |
imp |
Back out M_* changes, per decision of the TRB.
Approved by: trb
|
#
110517 |
|
07-Feb-2003 |
phk |
Rename bio_linkage to the more obvious bio_parent. Add bio_t0 timestamp, and include <sys/time.h> where needed
|
#
109623 |
|
21-Jan-2003 |
alfred |
Remove M_TRYWAIT/M_WAITOK/M_WAIT. Callers should use 0. Merge M_NOWAIT/M_DONTWAIT into a single flag M_NOWAIT.
|
#
107943 |
|
16-Dec-2002 |
trhodes |
The HP DAT 40 tape drive should be able to handle variable block sizes. But for some reason the block size is different when a different type of tape is placed in the drive. This commit fixes that.
PR: 46209 Submitted by: Alex Wang <alex@alexwang.com> Approved by: mjacob
|
#
106890 |
|
14-Nov-2002 |
imp |
Panic message should end with \n.
Reviewed by: ken a while ago.
|
#
101940 |
|
15-Aug-2002 |
njl |
Remove usage of cam_extend.c, replace with dev->si_drv1
PR: kern/39809 Approved by: gibbs
|
#
98449 |
|
19-Jun-2002 |
robert |
Correct spelling of 'supplied'.
PR: misc/39528
|
#
83473 |
|
14-Sep-2001 |
mjacob |
The code that sees a drive (at mount time) not in buffered mode and attempts to set buffered mode was printing out "unable to set buffered mode" no matter what. Oops.
Spotted by: Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de> MFC after: 3 weeks
|
#
83366 |
|
12-Sep-2001 |
julian |
KSE Milestone 2 Note ALL MODULES MUST BE RECOMPILED make the kernel aware that there are smaller units of scheduling than the process. (but only allow one thread per process at this time). This is functionally equivalent to teh previousl -current except that there is a thread associated with each process.
Sorry john! (your next MFC will be a doosie!)
Reviewed by: peter@freebsd.org, dillon@freebsd.org
X-MFC after: ha ha ha ha
|
#
82592 |
|
30-Aug-2001 |
mjacob |
Take CAM_REQUEUE_REQ out of the class of things we were trying to honor retry count on.
MFC after: 4 weeks
|
#
82575 |
|
30-Aug-2001 |
mjacob |
Clear SA_FLAG_ERR_PENDING for MTREW, MTERASE and MTRETENS ioctl cases. Clear residual counts after a successful samount (the user doesn't care that we got an N-kbyte residual on our test read).
Change a lot of error handling code.
1. If we end up in saerror, check more carefully about the kind of error. If it is a CAM_SCSI_STATUS_ERROR and it is a read/write command, we'll be handling this in saerror. If it isn't a read/write command, check to see whether this is just an EOM/EOP check condition- if it is, just set residual and return normally. A residual and then a NO SENSE check condiftion with the ASC of 0 and ASCQ of between 1 and 4 are normal 'signifying' events, not errors per se, and we shouldn't give the command to cam_periph_error to do something relatively unpredictable with.
2. If we get a Bus Reset, had a BDR sent, or get the cam status of CAM_REQUEUE_REQ, check the retry count on the command. The default error handler, cam_periph_error, doesn't honor retry count in these cases. This may change in the future, but for now, make sure we set EIO and return without calling cam_periph_error if the retry count for the command with an error is zero.
3. Clean up the pending error case goop and handle cases more sensibly.
The rules are:
If command was a Write:
If we got a SSD_KEY_VOLUME_OVERFLOW, the resid is propagated and we set ENOSPC as the error.
Else if we got an EOM condition- just mark EOM pending.
And set a residual of zero. For the longest time I was just propagating residual from the sense data- but my tape comparison tests were always failing because all drives I tested with actually *do* write the data anyway- the EOM (early warning) condition occurred *prior* to all of the data going out to media- that is, it was still buffered by the drive. This case is described in SCSI-2, 10.2.14, paragraph #d for the meaning of 'information field'. A better fix for this would be to issue a WFM command of zero to cause the drive to flush any buffered data, but this would require a fairly extensive rewrite.
Else if the command was a READ:
If we got a SSD_KEY_BLANK_CHECK- If we have a One Filemark EOT model- mark EOM as pending, otherwise set EIO as the erorr. Else if we found a Filemark- If we're in Fixed Block mode- mark EOF pending.
If we had an ILI (Incorrect Length Indicator)- If the residual is less than zero, whine about tape record being too big for user's buffer, otherwise if we were in Fixed Block mode, mark EIO as pending.
All 'pending' conditions mean that the command in question completes without error indication. It had succeeded, but a signifying event occurred during its execution which will apply to the *next* command that would be exexcuted. Except for the one EOM case above, we always propagate residual.
Now, way back in sastart- if we notice any of the PENDING bits set, we don't run the command we've just pulled off the wait queue. Instead, we then figure out it's disposition based upon a previous command's association with a signifying event.
If SA_FLAG_EOM_PENDING is set, we don't set an error. We just complete the command with residual set to the request count (not data moved, but no error). We continue on.
If SA_FLAG_EOF_PENDING- if we have this, it's only because we're in Fixed Block mode- in which case we traverse all waiting buffers (which we can get in fixed block mode because physio has split things up) and mark them all as no error, but no data moved and complete them.
If SA_FLAG_EIO_PENDING, just mark the buffer with an EIO error and complete it.
Then we clear all of the pending state bits- we're done.
MFC after: 4 weeks
|
#
80575 |
|
29-Jul-2001 |
mjacob |
backout last commit- inadvertant
|
#
80574 |
|
29-Jul-2001 |
mjacob |
scsi_targetio.h
|
#
79177 |
|
04-Jul-2001 |
mjacob |
Check the void * argument in the AC_FOUND_DEV case against NULL. Whether correctly or not, this sometimes is propagated up via XPT.
|
#
79100 |
|
02-Jul-2001 |
mjacob |
A slightly more complete change to timeouts:
1. Add SA_IO_TIMEOUT as an option (4 minutes default) to cover reads, writes, wfm, test unit ready.
2. Add internal SCSIOP_TIMEOUT (e.g., for mode sense) at 1 minute. This should not require an option, but is cleaner to parameterize.
MFC after: 1 week
|
#
79094 |
|
02-Jul-2001 |
lars |
Reviewed by: Matthew Jacob Changed the timeout to wait for writing of filemarks to complete from 1 minute to 3 minutes. This should probably be enhanced to be a sysctl variable.
|
#
77810 |
|
06-Jun-2001 |
non |
Sorry, an "ARCHIVE Python 06408" does not need SA_QUIRK_NOCOMP.
|
#
77581 |
|
01-Jun-2001 |
non |
Add a quirk entry for ARCHIVE Python 06408.
Approved by: mjacob
|
#
76362 |
|
08-May-2001 |
phk |
Exploit recent improvements in the disk minilayer to simplify error handling a bit.
Dogmatic lingupurists can celebrate that a number of gotos got removed.
Reviewed by: mjacob, ken
|
#
76322 |
|
06-May-2001 |
phk |
Actually biofinish(struct bio *, struct devstat *, int error) is more general than the bioerror().
Most of this patch is generated by scripts.
|
#
75840 |
|
22-Apr-2001 |
joerg |
Fix the `tape drive spinning indefinately upon mt stat' problem.
With the recent changes in the CAM error handling, some problems in the error handling of sa(4) have been uncovered. Basically, a number of conditions that are not actually errors have been mistreated as genuine errors. In particular:
. Trying to read in variable length mode with a mismatched blocksize between the on-tape (virtual) blocks and the read(2) supplied buffer size, causing an ILI SCSI condition, have caused an attempt to retry the supposedly `errored' transfer, causing the tape to be read continuously until it eventually hit EOM. Since by default any simple mt(1) operation does an initial test read, an `mt stat' was sufficient to trigger this bug.
Note that it's Justin's opinion that treating a NO SENSE as an EIO is another bug in CAM. I feel not authorized to fix cam_periph.c without another confirmation that i'm on the right track, however.
. Hitting a filemark caused the read(2) syscall to return EIO, instead of returning a `short read'. Note that the current fix only solves this problem in variable length mode. Fixed length mode uses a different code path, and since i didn't grok all the intentions behind that handling, i did not touch it (IOW: it's still broken, and you get an EIO upon hitting a filemark).
The solution is to keep track of those conditions inside saerror(), and upon completion to not call cam_periph_error() in that case. We need to make sure that the device gets unfrozen if needed though (in case of actual errors, cam_periph_error() does this on our behalf).
Not objected by: mjacob (who currently doesn't have the time to review the patch)
|
#
74840 |
|
27-Mar-2001 |
ken |
Rewrite of the CAM error recovery code.
Some of the major changes include:
- The SCSI error handling portion of cam_periph_error() has been broken out into a number of subfunctions to better modularize the code that handles the hierarchy of SCSI errors. As a result, the code is now much easier to read.
- String handling and error printing has been significantly revamped. We now use sbufs to do string formatting instead of using printfs (for the kernel) and snprintf/strncat (for userland) as before.
There is a new catchall error printing routine, cam_error_print() and its string-based counterpart, cam_error_string() that allow the kernel and userland applications to pass in a CCB and have errors printed out properly, whether or not they're SCSI errors. Among other things, this helped eliminate a fair amount of duplicate code in camcontrol.
We now print out more information than before, including the CAM status and SCSI status and the error recovery action taken to remedy the problem.
- sbufs are now available in userland, via libsbuf. This change was necessary since most of the error printing code is shared between libcam and the kernel.
- A new transfer settings interface is included in this checkin. This code is #ifdef'ed out, and is primarily intended to aid discussion with HBA driver authors on the final form the interface should take. There is example code in the ahc(4) driver that implements the HBA driver side of the new interface. The new transfer settings code won't be enabled until we're ready to switch all HBA drivers over to the new interface.
src/Makefile.inc1, lib/Makefile: Add libsbuf. It must be built before libcam, since libcam uses sbuf routines.
libcam/Makefile: libcam now depends on libsbuf.
libsbuf/Makefile: Add a makefile for libsbuf. This pulls in the sbuf sources from sys/kern.
bsd.libnames.mk: Add LIBSBUF.
camcontrol/Makefile: Add -lsbuf. Since camcontrol is statically linked, we can't depend on the dynamic linker to pull in libsbuf.
camcontrol.c: Use cam_error_print() instead of checking for CAM_SCSI_STATUS_ERROR on every failed CCB.
sbuf.9: Change the prototypes for sbuf_cat() and sbuf_cpy() so that the source string is now a const char *. This is more in line wth the standard system string functions, and helps eliminate warnings when dealing with a const source buffer.
Fix a typo.
cam.c: Add description strings for the various CAM error status values, as well as routines to look up those strings.
Add new cam_error_string() and cam_error_print() routines for userland and the kernel.
cam.h: Add a new CAM flag, CAM_RETRY_SELTO.
Add enumerated types for the various options available with cam_error_print() and cam_error_string().
cam_ccb.h: Add new transfer negotiation structures/types.
Change inq_len in the ccb_getdev structure to be "reserved". This field has never been filled in, and will be removed when we next bump the CAM version.
cam_debug.h: Fix typo.
cam_periph.c: Modularize cam_periph_error(). The SCSI error handling part of cam_periph_error() is now in camperiphscsistatuserror() and camperiphscsisenseerror().
In cam_periph_lock(), increase the reference count on the periph while we wait for our lock attempt to succeed so that the periph won't go away while we're sleeping.
cam_xpt.c: Add new transfer negotiation code. (ifdefed out)
Add a new function, xpt_path_string(). This is a string/sbuf analog to xpt_print_path().
scsi_all.c: Revamp string handing and error printing code. We now use sbufs for much of the string formatting code. More of that code is shared between userland the kernel.
scsi_all.h: Get rid of SS_TURSTART, it wasn't terribly useful in the first place.
Add a new error action, SS_REQSENSE. (Send a request sense and then retry the command.) This is useful when the controller hasn't performed autosense for some reason.
Change the default actions around a bit.
scsi_cd.c, scsi_da.c, scsi_pt.c, scsi_ses.c: SF_RETRY_SELTO -> CAM_RETRY_SELTO. Selection timeouts shouldn't be covered by a sense flag.
scsi_pass.[ch]: SF_RETRY_SELTO -> CAM_RETRY_SELTO.
Get rid of the last vestiges of a read/write interface.
libkern/bsearch.c, sys/libkern.h, conf/files: Add bsearch.c, which is needed for some of the new table lookup routines.
aic7xxx_freebsd.c: Define AHC_NEW_TRAN_SETTINGS if CAM_NEW_TRAN_CODE is defined.
sbuf.h, subr_sbuf.c: Add the appropriate #ifdefs so sbufs can compile and run in userland.
Change sbuf_printf() to use vsnprintf() instead of kvprintf(), which is only available in the kernel.
Change the source string for sbuf_cpy() and sbuf_cat() to be a const char *.
Add __BEGIN_DECLS and __END_DECLS around function prototypes since they're now exported to userland.
kdump/mkioctls: Include stdio.h before cam.h since cam.h now includes a function with a FILE * argument.
Submitted by: gibbs (mostly) Reviewed by: jdp, marcel (libsbuf makefile changes) Reviewed by: des (sbuf changes) Reviewed by: ken
|
#
74810 |
|
26-Mar-2001 |
phk |
Send the remains (such as I have located) of "block major numbers" to the bit-bucket.
|
#
72804 |
|
21-Feb-2001 |
mjacob |
Use the correct device names (now that we have devfs to embarrass us). PR: 25254
|
#
72119 |
|
07-Feb-2001 |
peter |
Change the peripheral driver list from a linker set to module driven driver registration. This should allow things like da, sa, cd etc to be in seperate KLD's to the cam core and make them preloadable.
|
#
71268 |
|
19-Jan-2001 |
mjacob |
Make some attempt to accomodate kern/24221- propate residual to mt_resid even if it might overflow.
If we do a read or set of hardware or logical block position, we also clear Tape Frozen status.
|
#
71087 |
|
15-Jan-2001 |
mjacob |
Use the residual from a spacing operation to try and figure out where we *really* are.
It should be noted that there is a degenerate case where soft tape location will be lost (not causing a frozen state- but causing the loss of reporting fileno/blockno)- that's where you backspace over a filemark- you stop backspacing as soon as you cross the filemark, but you have no idea what the record number now is because you have no idea how many records you are into the file you just backed into. Such is life.
While I'm at it, also pick up residuals from writing filemarks.
PR: 24222
|
#
71082 |
|
15-Jan-2001 |
mjacob |
Fix PR 24220 by using the periph private field0 for a CCB for not only CCB type but also extra flags- one of which can be "position updated".
In other changes: Add in a SA_QUIRK_NO_CPAGE quirk so that it's possible to avoid using a (broken) device's implementation of he DEVICE COMPRESSION page.
Also do a couple of printout cleanups.
As per some discussion on FreeBSD-scsi, skip doing tape flushing if we're reading tape logical block location (MTIOCRDSPOS).
|
#
68500 |
|
08-Nov-2000 |
mjacob |
Add special quirk for this ancient Viper drive. This is all creeping driver bloat -I really *have* to do a quirk table that can be loaded by the loader.
Submitted by: Hellmuth Michaelis <hm@kts.org>
|
#
68114 |
|
31-Oct-2000 |
mjacob |
scsi_sa.h
|
#
67723 |
|
27-Oct-2000 |
mjacob |
Add usage of M_ZERO to malloc calls where the result was just bzeroed.
PR: 22186 Submitted (partially) by: josh@zipperup.org
|
#
66678 |
|
05-Oct-2000 |
mjacob |
Grab the ccb *after* writing filemarks.
PR: 21723 Submitted by: razuwaev@relex.ru
|
#
66677 |
|
05-Oct-2000 |
mjacob |
Don't do destroy_dev on devices which were just aliases.
|
#
65861 |
|
14-Sep-2000 |
mjacob |
With the help of 'Eric Christeson <echriste@ssesco.com>', determined that QIC 525 really should be 512 byte fixed blocksize.
|
#
65838 |
|
14-Sep-2000 |
mjacob |
Follow the hints from PHK's new messages- only make_dev for a device once. Alias names use the make_dev_alias function.
|
#
65061 |
|
24-Aug-2000 |
peter |
Quick fix. <sys/conf.h> now depends on <sys/time.h>, which is not present when libcam is building this in userland.
|
#
60235 |
|
09-May-2000 |
mjacob |
Some prettifying for the quirk comments.
Add a SA_QUIRK_NO_MODESEL type and use it for the OnStream real SCSI device (not the broken one). This one is still broken in that it can't be set to the same fixed block size it reports [ unflattering comments about this company elided ].
If we're unable to set buffered mode on, complain, but drive on. It's not a fatal error to not be in buffered mode.
|
#
60041 |
|
05-May-2000 |
phk |
Separate the struct bio related stuff out of <sys/buf.h> into <sys/bio.h>.
<sys/bio.h> is now a prerequisite for <sys/buf.h> but it shall not be made a nested include according to bdes teachings on the subject of nested includes.
Diskdrivers and similar stuff below specfs::strategy() should no longer need to include <sys/buf.> unless they need caching of data.
Still a few bogus uses of struct buf to track down.
Repocopy by: peter
|
#
59365 |
|
18-Apr-2000 |
phk |
Don't include <sys/buf.h> twice.
|
#
59249 |
|
15-Apr-2000 |
phk |
Complete the bio/buf divorce for all code below devfs::strategy
Exceptions: Vinum untouched. This means that it cannot be compiled. Greg Lehey is on the case.
CCD not converted yet, casts to struct buf (still safe)
atapi-cd casts to struct buf to examine B_PHYS
|
#
58934 |
|
02-Apr-2000 |
phk |
Move B_ERROR flag to b_ioflags and call it BIO_ERROR.
(Much of this done by script)
Move B_ORDERED flag to b_ioflags and call it BIO_ORDERED.
Move b_pblkno and b_iodone_chain to struct bio while we transition, they will be obsoleted once bio structs chain/stack.
Add bio_queue field for struct bio aware disksort.
Address a lot of stylistic issues brought up by bde.
|
#
58345 |
|
20-Mar-2000 |
phk |
Remove B_READ, B_WRITE and B_FREEBUF and replace them with a new field in struct buf: b_iocmd. The b_iocmd is enforced to have exactly one bit set.
B_WRITE was bogusly defined as zero giving rise to obvious coding mistakes.
Also eliminate the redundant struct buf flag B_CALL, it can just as efficiently be done by comparing b_iodone to NULL.
Should you get a panic or drop into the debugger, complaining about "b_iocmd", don't continue. It is likely to write on your disk where it should have been reading.
This change is a step in the direction towards a stackable BIO capability.
A lot of this patch were machine generated (Thanks to style(9) compliance!)
Vinum users: Greg has not had time to test this yet, be careful.
|
#
58251 |
|
18-Mar-2000 |
mjacob |
Per Justin's request- remove his name from Copyright.
|
#
56981 |
|
03-Feb-2000 |
mjacob |
Add a quirk type (and one for ARCHIVE Python's) that disables the dummy read at sa_mount that attempts to latch up density. This breaks on at least one drive and sends it into the weeds.
Approved: jkh
|
#
56148 |
|
17-Jan-2000 |
mjacob |
Do the minor changes needed because of change to ccb_getdev structure. JKH Trading Stamps applied.
Reviewed by: gibbs@freebsd.org, ken@freebsd.org
|
#
55205 |
|
29-Dec-1999 |
peter |
Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" is an application space macro and the applications are supposed to be free to use it as they please (but cannot). This is consistant with the other BSD's who made this change quite some time ago. More commits to come.
|
#
54279 |
|
08-Dec-1999 |
ken |
Revamp the devstat priority system. All disks now have the same priority. The same goes for CD drivers and tape drivers. In systems with mixed IDE and SCSI, devices in the same priority class will be sorted in attach order.
Also, the 'CCD' priority is now the 'ARRAY' priority, and a number of drivers have been modified to use that priority.
This includes the necessary changes to all drivers, except the ATA drivers. Soren will modify those separately.
This does not include and does not require any change in the devstat version number, since no known userland applications use the priority enumerations.
Reviewed by: msmith, sos, phk, jlemon, mjacob, bde
|
#
54105 |
|
03-Dec-1999 |
mjacob |
Add back in a prefatory TUR when the tape is *not* mounted. This seems to help with some older tape drives.
|
#
54099 |
|
03-Dec-1999 |
mjacob |
Correct some botched timeout defines. Allocate only 8KB for the test read in samount. Make things a lot quieter in samount (and other places). Fix ridiculous and not so ridiculous bugs in compression related code in both sagetparams and sasetparams.
|
#
53522 |
|
21-Nov-1999 |
mjacob |
Don't clear the SA_FLAG_TAPE_LOCKED prior to calling saprevent when we're doing an OFFLINE ioctl- saprevent won't unlock the door, which then causes the unload to fail on some units.
If we've already unloaded the tape, don't try and rewind and unload in saclose. This is a slightly riskier change because we're now going to depend on SA_FLAG_TAPE_MOUNTED to say whether we've really unloaded the tape. This involved changing the setting in sadone for tape errors to SA_FLAG_TAPE_FROZEN (which is more accurate anyway-if you get an EIO you've probably lost tape position anyway) where it used to just clear the mounted flag.
|
#
53283 |
|
17-Nov-1999 |
mjacob |
Fix a couple of boo-boos in the last delta.
|
#
53259 |
|
17-Nov-1999 |
mjacob |
Fix for 11815 (at mount time do a throwaway read of the front of the tape to force the drive to do a media access so it knows what media may be inserted).
Also Ken's make_dev patches- relatively untested.
|
#
51875 |
|
02-Oct-1999 |
mjacob |
Another 1FM@EOD quirk (from mike@sentex.net for a Seagate STT20000), and add a config option that allows one to default to 1FM@EOD for tapes otherwise unquirked or unknown as to which to prefer. Note that tcopy will be broken for these tapes until tcopy is fixed.
|
#
51836 |
|
01-Oct-1999 |
phk |
Introduce the disk mini-layer and devstat_end_transaction_buf() in cam/scsi.
Somewhat reviewed by: ken
|
#
51744 |
|
28-Sep-1999 |
mjacob |
Ooops- forgot to commit this. PR: 14009 Submitted by: jreynold@primenet.com
|
#
51658 |
|
25-Sep-1999 |
phk |
Remove five now unused fields from struct cdevsw. They should never have been there in the first place. A GENERIC kernel shrinks almost 1k.
Add a slightly different safetybelt under nostop for tty drivers.
Add some missing FreeBSD tags
|
#
51092 |
|
08-Sep-1999 |
phk |
Don't register a block major for tapes.
Reviewed by: mjacob
|
#
50477 |
|
27-Aug-1999 |
peter |
$Id$ -> $FreeBSD$
|
#
48520 |
|
03-Jul-1999 |
peter |
A minor tweak to shut up gcc (on the Alpha) for two (false) warnings.
How it can think that something that is initialized at declaration can be used while uninitialized is beyond me.
|
#
48192 |
|
24-Jun-1999 |
mjacob |
Quirk Tandberg 4100 like Tandberg 4200. PR: 11675 Reviewed by: msmith@FreeBSD.ORG Submitted by: blank@uni-trier.de
|
#
47640 |
|
31-May-1999 |
phk |
Simplify cdevsw registration.
The cdevsw_add() function now finds the major number(s) in the struct cdevsw passed to it. cdevsw_add_generic() is no longer needed, cdevsw_add() does the same thing.
cdevsw_add() will print an message if the d_maj field looks bogus.
Remove nblkdev and nchrdev variables. Most places they were used bogusly. Instead check a dev_t for validity by seeing if devsw() or bdevsw() returns NULL.
Move bdevsw() and devsw() functions to kern/kern_conf.c
Bump __FreeBSD_version to 400006
This commit removes: 72 bogus makedev() calls 26 bogus SYSINIT functions
if_xe.c bogusly accessed cdevsw[], author/maintainer please fix.
I4b and vinum not changed. Patches emailed to authors. LINT probably broken until they catch up.
|
#
47625 |
|
30-May-1999 |
phk |
This commit should be a extensive NO-OP:
Reformat and initialize correctly all "struct cdevsw".
Initialize the d_maj and d_bmaj fields.
The d_reset field was not removed, although it is never used.
I used a program to do most of this, so all the files now use the same consistent format. Please keep it that way.
Vinum and i4b not modified, patches emailed to respective authors.
|
#
47519 |
|
25-May-1999 |
mjacob |
Add TDC 3800 to quirk list for fixed mode device. PR:11866 Submitted by: Helge Oldach hmo@sep.hamburg.com
|
#
47413 |
|
22-May-1999 |
gibbs |
Add a default async handler funstion to cam_periph.c to remove duplicated code in all initiator type peripheral drivers.
scsi_target.c: Release ATIO structures that wind up in the 'unkown command queue' for consumption by our userland counterpart, back to the controller when the exception for that command is cleared.
|
#
46962 |
|
11-May-1999 |
mjacob |
Add a SA_FLAG_COMP_SUPP flag (to quirk compression as SUPPORTED). Add a SA_FLAG_TAPE_FROZEN for (see below). Add a queue_count field to softc.
Add HP T20* Travan-5 like tape device as a FIXED/512 type device. Works for me. Add TANDBERG SLR5 as a variable SA_QUIRK_1FM device. Change VIPER 2525 to 1024 byte blocksize. It's possible other drives should change too, but see below..
Change argument to sagetparams to be pointer to a sa_comp_t union- this can be either a DATA COMPRESSION or a DEVICE CONFIGURATION page. In general compression now tries to use the DATA COMPRESSION page and if that fails tries the DEVICE CONFIGURATION page.
Change close routine to not rewind tape if there's a failure in either writing filemarks or in backing over one of two filemarks for a 2FM at EOT tape- instead mark the tape as 'frozen' and print a message saying that either an OFFLINE or REWIND or an MTEOM command is needed to clear this state (all bring certainty back to tape position). Fix sastrategy to not allow I/O to a frozen tape.
Add MTIOCGETEOTMODEL/MTIOCSETEOTMODEL ioctls that get and set the EOT model for a tape drive (you can now dynamically change whether it's a 2 FM @ EOT or 1FM at EOT tape device). This ought to give folks something to handle the QIC drives we don't know about. Correctly propagate record of compression algorithm back. Clear FROZEN flag for EOM, REWIND and OFFLINE (and RETENSION and ERASE) cases.
Fix an egregious bug in sadone that had left the device queue frozen for deferred (for fixed mode case) errors.
Add comment in samount about how useless the test unit ready is for invalidating a mount (this has to be fixed later).
Fix residual calculation (per Eivind) in saerror so that negative values for tape records being too large for the supplied buffer get caught. Do some other saerrro cleanup.
Per Ken && Justin, add my name to copyright comment.
|
#
46747 |
|
08-May-1999 |
ken |
Add a facility in the CAM error handling code to retry selection timeouts. If the client requests that the error recovery code retry a selection timeout, it will be retried after half a second. The delay is to give the device time to recover.
For most of these drivers, I only added selection timeout retries where they were also retrying unit attention type errors. The sa(4) driver calls saerror() in a number of places, but most of them don't request retrying unit attentions.
Also, bump the default minimum CD changer timeout from 2 to 5 seconds and the maximum timeout from 10 to 15 seconds. Some Pioneer changers seem to have trouble with the shorter timeout.
Reviewed by: gibbs
|
#
46625 |
|
07-May-1999 |
phk |
Introduce two functions: physread() and physwrite() and use these directly in *devsw[] rather than the 46 local copies of the same functions.
(grog will do the same for vinum when he has time)
|
#
45752 |
|
17-Apr-1999 |
mjacob |
Make WangTek 51000 a fixed block device. PR: kern/11194 Obtained from:naddy@mips.rhein-neckar.de
|
#
44354 |
|
28-Feb-1999 |
mjacob |
+Match against T4000* for HP QIC quirks (not T4000S* where it doesn't then catch a T4000s) + Set *some* kind of error at EOM if we're in fixed mode and have pending errs. Do not clear the ERR_PENDING bit if more buffers are queued. + Release the start_ccb in this case also, else we hang forever on rewinding. + Any kind of error for load to BOT in samount should then cause an attempt to use REWIND to come back to BOT. Do the initial load command quietly. + In samount, if we succeed, set the relative position markers.
|
#
43819 |
|
09-Feb-1999 |
ken |
Add a prioritization field to the devstat_add_entry() call so that peripheral drivers can determine where in the devstat(9) list they are inserted.
This requires recompilation of libdevstat, systat, vmstat, rpc.rstatd, and any ports that depend on the devstat code, since the size of the devstat structure has changed. The devstat version number has been incremented as well to reflect the change.
This sorts devices in the devstat list in "more interesting" to "less interesting" order. So, for instance, da devices are now more important than floppy drives, and so will appear before floppy drives in the default output from systat, iostat, vmstat, etc.
The order of devices is, for now, kept in a central table in devicestat.h. If individual drivers were able to make a meaningful decision on what priority they should be at attach time, we could consider splitting the priority information out into the various drivers. For now, though, they have no way of knowing that, so it's easier to put them in an easy to find table.
Also, move the checkversion() call in vmstat(8) to a more logical place.
Thanks to Bruce and David O'Brien for suggestions, for reviewing this, and for putting up with the long time it has taken me to commit it. Bruce did object somewhat to the central priority table (he would rather the priorities be distributed in each driver), so his objection is duly noted here.
Reviewed by: bde, obrien
|
#
43651 |
|
05-Feb-1999 |
mjacob |
quiet the alpha compiler
|
#
43636 |
|
05-Feb-1999 |
mjacob |
Extend unit numbers to a full 10 bits (split into sections of the minor). Establish and use a control mode open. Control mode opens may open the device without locking, but are prohibited from all but some ioctls. MTIOCGET always works. MTIOCERRSTAT works, but the clearing of latched error status is contingent upon whether another application has the device open, in which case an interruptible perip acquire is done. MTSETBSIZ, MTSETDNSTY and MTCOMP also require a periph aquire.
Relative fileno and blkno are tracked. Note that just about any error will make these undefined, and if you space to EOD or use hardware block positioning, these are also lost until the next UNLOAD or REWIND.
Driver state is also tracked and recorded in the unit softc to be passed back in mt_dsreg for a MTIOCGET call. Thanks to Dan Strick for suggesting this.
Reintroduce 2 filemarks at EOD for all but QIC devices. I really think it's wrong, but there is a lot of 3rd party software that depends upon this (not the least of which is tcopy). Introduce a SA_QUIRK_1FM to ensure that some devices can be marked as only being able to do 1 FM at EOD.
At samount time force a load to BOT if we aren't mounted. If the LOAD command fails, use the REWIND command (e.g., for the IBM 3590 which for some gawdawful reason doesn't support the LOAD (to BOT) command).
Also at samount time, if you don't know fixed or variable, try to *set* to one of the known fixed (or variable, for special case) density codes. We only have to do this once per boot, so it's not that painful. This is another way to try and figure out the wierd QIC devices without having to quirk everything in the universe.
A substantial amount of cleanup as to what operations can and what operations cannot be retried. Don't retry space operations if they fail- it'll just lead to lossage.
Not yet done is invalidating mounts correctly after errors. ENOTIME.
|
#
42735 |
|
16-Jan-1999 |
mjacob |
Sascha Blank <blank@uni-trier.de> convinced me I was an idiot about testing SA_QUIRK_2FM in samount. Fixed.
Removed the NORRLS quirk (to save quirk space) and left the behaviour of being quiet about failed reserve/release (failed due Illegal Request) the same.
Added a SF_QUIET_IR for prevent/allow for the same purposes.
|
#
42716 |
|
16-Jan-1999 |
mjacob |
More bandaids. One important one from Sascha Blank (<blank@fox.uni-trier.de>) about quirks being set as arithmetic values, not as bitfields. Add HP, Kennedy and M4 1/2" reel quirk entries.
Do a lot of gratuitous source changing.
Audit all functions that build ccbs for the tape driver and decide whether each one can be retried or not.
Still to do is some more state management post errors.
|
#
42563 |
|
12-Jan-1999 |
mjacob |
Clean up and fix quirk table (was missing necessary wildcards) and add a couple from the old driver. Change format of quirk table to have a preferred block size for devices that need to be QUIRK_FIXED- this is loaded into the last_media_blocksize tag at saregister time and will be used in the first samount case.
Change sasetparams to take a sense_flags argument so that probe time testing can be quieter (e.g. with SF_NO_PRINT).
Fix a couple of silly bugs in the fixed/variable determination in samount- one was where there was a check against 'guessing' AND the density code being default density- *SMACK* - you're only guessing if you find the media code to be *other* than default density. Second bug was a test against current blocksize being zero- should be a test against whether current blocksize is not equal to the last blocksize if you had wanted to be fixed (suppose you came up in fixed, but not the preferred size?). And if you don't know what the fixed size should be, select 512 as the starting point, not BLKDEV_IOSIZE (reality wins). Finally, in doing the test set to variable mode, make sasetparams non-chatty.
|
#
42533 |
|
11-Jan-1999 |
mjacob |
Make HP T4000S quirk to FIXED mode
|
#
42130 |
|
28-Dec-1998 |
mjacob |
Force ARCHIVE Vipers to be FIXED
|
#
42009 |
|
22-Dec-1998 |
mjacob |
Add a quirk NORRLS (no reserve/release) which can (and will) get set for the devices that don't actually support reserve/release (so we don't keep trying it).
Add softc storage and manage storing last I/O and CTL commands that had errors (for correlative purposes).
In saclose clear the 'MOUNTED' bit if we either rewind or unload (yes, this shouldn't be necessary since the next open should catch whether a tape change occurred, but I'm having some questions about that actually working so this is safer for the moment). Oh, forgot to mention in previous commit messages that some of the failures particularly at close time cause the tape to be ejected (for the sake of safety)- all this prior to redoing the state machine (which is in progress) which will try and handle this better.
Complete the addition of the setmark support (from Martin.Birgmeier@aon.at).
|
#
41948 |
|
19-Dec-1998 |
mjacob |
1) Fix some serious bugs (1 botch on my part which caused a filemark to be written even it the tape was opened readonly- 2 botches in deferred error handling for FIXED LENGTH mode which caused panic && hand resp.). Fixed a memory leak in sa_mount. 2) Fixed an annoying bug when turning of compression to actually reflect this for future status calls. 3) Implement the MTIOCERRSTAT call where latched control and I/O residuals and sense data are returned to the application asking for them.
|
#
41918 |
|
18-Dec-1998 |
mjacob |
Add in block position/block locate functions.
|
#
41906 |
|
17-Dec-1998 |
mjacob |
Several changes having to do blocksize- mostly to force variable as the default. Attempt to determine (at mount time if not done so already) via density code whether a device should default to fixed mode or not. Attempts to set to variable that fail will cause fixed to be selected.
Similarly, the '2 filemarks at EOM' quirk is now determined (or attempted to be determined) via density code. Some as yet not entirely tested code for coping with 2FM@EOD position is now also in place.
|
#
41674 |
|
11-Dec-1998 |
mjacob |
Some fixes to handle fixed mode and variable mode more sensibly- and also incorporate some notion of which revision the device is. If it's < SCSI2, for example, READ BLOCK LIMITS is not a MANDATORY command.
At any rate, the initial state is to try and read block limits to get a notion of the smallest and largest record size as well as the granularity. However, this doesn't mean that the device should actually *in* fixed block mode should the max && min be equal... *That* choice is (for now) determined by whether the device comes up with a blocksize of nonzero. If so, then it's a fixed block preferred device, otherwise not (this will change again soon).
When actually doing I/O, and you're in fixed length mode, the block count is *not* the byte count divided by the minimum block size- it's the byte count divided by the current blocksize (or use shift/mask shortcuts if that worked out...).
Then when you *change* the blocksize via an ioctl, make sure this actually propagates to the stored notion of blocksize (and update the shift/mask shortcuts).
Misc Other: When doing a mode select, only use the SCSI_SAME_DENSITY (0x7f) code if the device is >= SCSI2- otherwise just use the saved density code.
Recover from the ripple of ILLEGAL REQUEST not being 'retried' in that RESERVE/RELEASE is not a mandatory command for < SCSI2 (so ignore it if it fails).
|
#
41351 |
|
26-Nov-1998 |
joerg |
...nor does this old TDC3620 like to be asked for compression.
But well, now it's running again!
|
#
41297 |
|
22-Nov-1998 |
ken |
Fix a few problems that Bruce noticed about a month ago, and fix oup one other problem.
- Hold onto splsoftcam() in the peripheral driver open routines until we have locked the periph. This eliminates a race condition.
- Disallow opening the pass driver when securelevel > 1.
- If a user tries to open the pass driver with O_NONBLOCK set, return EINVAL instead of ENODEV. (noticed by gibbs)
|
#
40603 |
|
22-Oct-1998 |
ken |
Fix a problem with the way we handled device invalidation when attaching to a device failed.
In theory, the same steps that happen when we get an AC_LOST_DEVICE async notification should have been taken when a driver fails to attach. In practice, that wasn't the case.
This only affected the da, cd and ch drivers, but the fix affects all peripheral drivers.
There were several possible problems: - In the da driver, we didn't remove the peripheral's softc from the da driver's linked list of softcs. Once the peripheral and softc got removed, we'd get a kernel panic the next time the timeout routine called dasendorderedtag(). - In the da, cd and possibly ch drivers, we didn't remove the peripheral's devstat structure from the devstat queue. Once the peripheral and softc were removed, this could cause a panic if anyone tried to access device statistics. (one component of the linked list wouldn't exist anymore) - In the cd driver, we didn't take the peripheral off the changer run queue if it was scheduled to run. In practice, it's highly unlikely, and maybe impossible that the peripheral would have been on the changer run queue at that stage of the probe process.
The fix is: - Add a new peripheral callback function (the "oninvalidate" function) that is called the first time cam_periph_invalidate() is called for a peripheral.
- Create new foooninvalidate() routines for each peripheral driver. This routine is always called at splsoftcam(), and contains all the stuff that used to be in the AC_LOST_DEVICE case of the async callback handler.
- Move the devstat cleanup call to the destructor/cleanup routines, since some of the drivers do I/O in their close routines.
- Make sure that when we're flushing the buffer queue, we traverse it at splbio().
- Add a check for the invalid flag in the pt driver's open routine.
Reviewed by: gibbs
|
#
40398 |
|
15-Oct-1998 |
ken |
Clean up some unused variables.
Reviewed by: ken Submitted by: phk
|
#
39884 |
|
02-Oct-1998 |
ken |
Patches from DES to create three new kernel config options to control timeouts in the SA driver (timeouts for space, rewind and erase). Folks can lengthen the timeouts if their hardware is especially slow, or shorten them if they want to be notified of errors a little sooner.
Also, get rid of two OD driver options. The od driver has been made obsolete by the da driver.
Reviewed by: ken, gibbs Submitted by: Dag-Erling Coidan Smørgrav <des@FreeBSD.ORG>
|
#
39213 |
|
15-Sep-1998 |
gibbs |
SCSI Peripheral drivers for CAM:
da - Direct Access Devices (disks, optical devices, SS disks) cd - CDROM (or devices that can act like them, WORM, CD-RW, etc) ch - Medium Changer devices. sa - Sequential Access Devices (tape drives) pass - Application pass-thru driver targ - Target Mode "Processor Target" Emulator pt - Processor Target Devices (scanners, cpus, etc.)
Submitted by: The CAM Team
|