summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-08-29 11:21:20 +0000
committermav <mav@FreeBSD.org>2015-08-29 11:21:20 +0000
commit8cde3bfeee04d11f30244c875082f0c8423cbcd8 (patch)
treeae3da0a451f4c41a8c341f1bc35e47f7fd58eb03
parent7103f3af38e72a781630567caadef9c461532a90 (diff)
downloadFreeBSD-src-8cde3bfeee04d11f30244c875082f0c8423cbcd8.zip
FreeBSD-src-8cde3bfeee04d11f30244c875082f0c8423cbcd8.tar.gz
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
-rw-r--r--sys/cam/ata/ata_xpt.c3
-rw-r--r--sys/cam/scsi/scsi_cd.c3
-rw-r--r--sys/cam/scsi/scsi_ch.c3
-rw-r--r--sys/cam/scsi/scsi_da.c3
-rw-r--r--sys/cam/scsi/scsi_pt.c3
-rw-r--r--sys/cam/scsi/scsi_sa.c3
-rw-r--r--sys/cam/scsi/scsi_xpt.c11
7 files changed, 18 insertions, 11 deletions
diff --git a/sys/cam/ata/ata_xpt.c b/sys/cam/ata/ata_xpt.c
index a442ec1..3429bb29a6 100644
--- a/sys/cam/ata/ata_xpt.c
+++ b/sys/cam/ata/ata_xpt.c
@@ -1090,7 +1090,8 @@ notsata:
periph_qual = SID_QUAL(inq_buf);
- if (periph_qual != SID_QUAL_LU_CONNECTED)
+ if (periph_qual != SID_QUAL_LU_CONNECTED &&
+ periph_qual != SID_QUAL_LU_OFFLINE)
break;
/*
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index f252b86..1dc5f80 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -389,7 +389,8 @@ cdasync(void *callback_arg, u_int32_t code,
if (cgd->protocol != PROTO_SCSI)
break;
-
+ if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED)
+ break;
if (SID_TYPE(&cgd->inq_data) != T_CDROM
&& SID_TYPE(&cgd->inq_data) != T_WORM)
break;
diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c
index b83bc53..38acb01 100644
--- a/sys/cam/scsi/scsi_ch.c
+++ b/sys/cam/scsi/scsi_ch.c
@@ -337,7 +337,8 @@ chasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)
if (cgd->protocol != PROTO_SCSI)
break;
-
+ if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED)
+ break;
if (SID_TYPE(&cgd->inq_data)!= T_CHANGER)
break;
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index 74dd3b9..3ebbb71 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -1663,7 +1663,8 @@ daasync(void *callback_arg, u_int32_t code,
if (cgd->protocol != PROTO_SCSI)
break;
-
+ if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED)
+ break;
if (SID_TYPE(&cgd->inq_data) != T_DIRECT
&& SID_TYPE(&cgd->inq_data) != T_RBC
&& SID_TYPE(&cgd->inq_data) != T_OPTICAL)
diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c
index f34748c..15240da 100644
--- a/sys/cam/scsi/scsi_pt.c
+++ b/sys/cam/scsi/scsi_pt.c
@@ -366,7 +366,8 @@ ptasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)
if (cgd->protocol != PROTO_SCSI)
break;
-
+ if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED)
+ break;
if (SID_TYPE(&cgd->inq_data) != T_PROCESSOR)
break;
diff --git a/sys/cam/scsi/scsi_sa.c b/sys/cam/scsi/scsi_sa.c
index 5826caa..6110b3d 100644
--- a/sys/cam/scsi/scsi_sa.c
+++ b/sys/cam/scsi/scsi_sa.c
@@ -2255,7 +2255,8 @@ saasync(void *callback_arg, u_int32_t code,
if (cgd->protocol != PROTO_SCSI)
break;
-
+ if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED)
+ break;
if (SID_TYPE(&cgd->inq_data) != T_SEQUENTIAL)
break;
diff --git a/sys/cam/scsi/scsi_xpt.c b/sys/cam/scsi/scsi_xpt.c
index 0f44cf5..7cffd67 100644
--- a/sys/cam/scsi/scsi_xpt.c
+++ b/sys/cam/scsi/scsi_xpt.c
@@ -1123,6 +1123,7 @@ probedone(struct cam_periph *periph, union ccb *done_ccb)
{
probe_softc *softc;
struct cam_path *path;
+ struct scsi_inquiry_data *inq_buf;
u_int32_t priority;
CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("probedone\n"));
@@ -1162,7 +1163,6 @@ out:
case PROBE_FULL_INQUIRY:
{
if (cam_ccb_status(done_ccb) == CAM_REQ_CMP) {
- struct scsi_inquiry_data *inq_buf;
u_int8_t periph_qual;
path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID;
@@ -1171,7 +1171,8 @@ out:
periph_qual = SID_QUAL(inq_buf);
- if (periph_qual == SID_QUAL_LU_CONNECTED) {
+ if (periph_qual == SID_QUAL_LU_CONNECTED ||
+ periph_qual == SID_QUAL_LU_OFFLINE) {
u_int8_t len;
/*
@@ -1347,10 +1348,10 @@ out:
probe_purge_old(path, lp, softc->flags);
lp = NULL;
}
+ inq_buf = &path->device->inq_data;
if (path->device->flags & CAM_DEV_INQUIRY_DATA_VALID &&
- SID_QUAL(&path->device->inq_data) == SID_QUAL_LU_CONNECTED) {
- struct scsi_inquiry_data *inq_buf;
- inq_buf = &path->device->inq_data;
+ (SID_QUAL(inq_buf) == SID_QUAL_LU_CONNECTED ||
+ SID_QUAL(inq_buf) == SID_QUAL_LU_OFFLINE)) {
if (INQ_DATA_TQ_ENABLED(inq_buf))
PROBE_SET_ACTION(softc, PROBE_MODE_SENSE);
else
OpenPOWER on IntegriCloud