summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/cam/ctl/ctl.c21
-rw-r--r--sys/cam/ctl/ctl_error.c12
-rw-r--r--sys/cam/ctl/ctl_private.h2
3 files changed, 21 insertions, 14 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c
index 9cb5199..1335ca9 100644
--- a/sys/cam/ctl/ctl.c
+++ b/sys/cam/ctl/ctl.c
@@ -332,7 +332,7 @@ const static struct ctl_logical_block_provisioning_page lbp_page_changeable = {{
/*page_code*/SMS_INFO_EXCEPTIONS_PAGE | SMPH_SPF,
/*subpage_code*/0x02,
/*page_length*/{CTL_LBPM_LEN >> 8, CTL_LBPM_LEN},
- /*flags*/0,
+ /*flags*/SLBPP_SITUA,
/*reserved*/{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
/*descr*/{}},
{{/*flags*/0,
@@ -6066,11 +6066,7 @@ do_next_page:
* the mode page header, or if they didn't specify enough data in
* the CDB to avoid truncating this page, kick out the request.
*/
- if ((page_len != (page_index->page_len - page_len_offset -
- page_len_size))
- || (*len_left < page_index->page_len)) {
-
-
+ if (page_len != page_index->page_len - page_len_offset - page_len_size) {
ctl_set_invalid_field(ctsio,
/*sks_valid*/ 1,
/*command*/ 0,
@@ -6081,6 +6077,12 @@ do_next_page:
ctl_done((union ctl_io *)ctsio);
return (CTL_RETVAL_COMPLETE);
}
+ if (*len_left < page_index->page_len) {
+ free(ctsio->kern_data_ptr, M_CTL);
+ ctl_set_param_len_error(ctsio);
+ ctl_done((union ctl_io *)ctsio);
+ return (CTL_RETVAL_COMPLETE);
+ }
/*
* Run through the mode page, checking to make sure that the bits
@@ -9317,13 +9319,6 @@ ctl_request_sense(struct ctl_scsiio *ctsio)
ua_type = ctl_build_ua(lun, initidx, sense_ptr, sense_format);
if (ua_type != CTL_UA_NONE)
have_error = 1;
- if (ua_type == CTL_UA_LUN_CHANGE) {
- mtx_unlock(&lun->lun_lock);
- mtx_lock(&softc->ctl_lock);
- ctl_clr_ua_allluns(softc, initidx, ua_type);
- mtx_unlock(&softc->ctl_lock);
- mtx_lock(&lun->lun_lock);
- }
}
if (have_error == 0) {
/*
diff --git a/sys/cam/ctl/ctl_error.c b/sys/cam/ctl/ctl_error.c
index 4f839db..4e75a5c 100644
--- a/sys/cam/ctl/ctl_error.c
+++ b/sys/cam/ctl/ctl_error.c
@@ -515,6 +515,7 @@ ctl_build_ua(struct ctl_lun *lun, uint32_t initidx,
uint32_t p, i;
mtx_assert(&lun->lun_lock, MA_OWNED);
+ mtx_assert(&lun->ctl_softc->ctl_lock, MA_NOTOWNED);
p = initidx / CTL_MAX_INIT_PER_PORT;
if ((ua = lun->pending_ua[p]) == NULL) {
mtx_unlock(&lun->lun_lock);
@@ -547,6 +548,17 @@ ctl_build_ua(struct ctl_lun *lun, uint32_t initidx,
/* We're reporting this UA, so clear it */
ua[i] &= ~ua_to_clear;
+ if (ua_to_build == CTL_UA_LUN_CHANGE) {
+ mtx_unlock(&lun->lun_lock);
+ mtx_lock(&lun->ctl_softc->ctl_lock);
+ ctl_clr_ua_allluns(lun->ctl_softc, initidx, ua_to_build);
+ mtx_unlock(&lun->ctl_softc->ctl_lock);
+ mtx_lock(&lun->lun_lock);
+ } else if (ua_to_build == CTL_UA_THIN_PROV_THRES &&
+ (lun->MODE_LBP.main.flags & SLBPP_SITUA) != 0) {
+ ctl_clr_ua_all(lun, -1, ua_to_build);
+ }
+
return (ua_to_build);
}
diff --git a/sys/cam/ctl/ctl_private.h b/sys/cam/ctl/ctl_private.h
index 6b5f04e..b8ad726 100644
--- a/sys/cam/ctl/ctl_private.h
+++ b/sys/cam/ctl/ctl_private.h
@@ -290,7 +290,7 @@ static const struct ctl_page_index page_index_template[] = {
CTL_PAGE_FLAG_ALL, NULL, ctl_ie_page_handler},
{SMS_INFO_EXCEPTIONS_PAGE | SMPH_SPF, 0x02,
sizeof(struct ctl_logical_block_provisioning_page), NULL,
- CTL_PAGE_FLAG_DIRECT, NULL, NULL},
+ CTL_PAGE_FLAG_DIRECT, NULL, ctl_default_page_handler},
{SMS_CDDVD_CAPS_PAGE, 0,
sizeof(struct scsi_cddvd_capabilities_page), NULL,
CTL_PAGE_FLAG_CDROM, NULL, NULL},
OpenPOWER on IntegriCloud