diff options
author | Warner Losh <imp@FreeBSD.org> | 2025-02-04 18:29:14 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2025-02-04 18:29:38 +0000 |
commit | f8ef49c324c936aecc9a7d112a45a2e0ad9a47c8 (patch) | |
tree | c159be822ba41092d30ea2e90444003225d1ff3e | |
parent | 43693fffc07e8df6509d2fdf6c897a7b2916965c (diff) |
cam/da: Document what an 'invalid pack' means.
An 'invalid pack' in the da driver means that the media for the drive is
temproarily missing, pending an action by a third party (eg robot arm or
human inserting a disk pack, etc) or has changed since we opened. We
invalidate a pack when the ASC/ASCQ tells us the media is missing (ASC
0x3a MEDIA MISSING), for 0x28/0 (NOT READY TO READY CHANGE, MEDIUM MAY
HAVE CHANGED) and for that brief period of time after a peripheral has
been invalidated before the disk is destroyed. When the pack is invalid,
we can't do READ/WRITE operations to the media, so we fail all
outstanding I/O and any new I/O that comes in when this happens. This
is cleared in daopen when we've repobed the device.
Sponsored by: Netflix
Reviewed by: mav
Differential Revision: https://reviews.freebsd.org/D48687
-rw-r--r-- | sys/cam/scsi/scsi_da.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index e8e13613413a..f2f3951ebe80 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -1899,7 +1899,15 @@ dastrategy(struct bio *bp) cam_periph_lock(periph); /* - * If the device has been made invalid, error out + * If the pack has been invalidated, fail all I/O. The medium is not + * suitable for normal I/O, because one or more is ture: + * - the medium is missing + * - its size is unknown + * - it differs from the medium present at daopen + * - we're tearing the cam periph device down + * Since we have the cam periph lock, we don't need to check it for + * the last condition since PACK_INVALID is set when we invalidate + * the device. */ if ((softc->flags & DA_FLAG_PACK_INVALID)) { cam_periph_unlock(periph); @@ -1946,6 +1954,10 @@ dadump(void *arg, void *virtual, off_t offset, size_t length) softc = (struct da_softc *)periph->softc; secsize = softc->params.secsize; + /* + * Can't dump to a disk that's not there or changed, for whatever + * reason. + */ if ((softc->flags & DA_FLAG_PACK_INVALID) != 0) return (ENXIO); |