summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2016-05-10 16:20:36 +0000
committermav <mav@FreeBSD.org>2016-05-10 16:20:36 +0000
commit939929ecf0260d3e70e0d36388d27dd61403d2bc (patch)
tree4f4f0a5aec66cef6d4fe46e8f1c726c764249058 /sys/cam
parent762cf5f8fccfc6f39ea9f637a22b6cbf4ce83ef2 (diff)
downloadFreeBSD-src-939929ecf0260d3e70e0d36388d27dd61403d2bc.zip
FreeBSD-src-939929ecf0260d3e70e0d36388d27dd61403d2bc.tar.gz
Allow sleepable allocations in enclosure daemon threads.
There were at least two places where M_NOWAIT was used without NULL check. This change should fix NULL-dereference panic there and possibly improve operation in other ways under memory pressure. MFC after: 2 weeks
Diffstat (limited to 'sys/cam')
-rw-r--r--sys/cam/scsi/scsi_enc_safte.c7
-rw-r--r--sys/cam/scsi/scsi_enc_ses.c41
2 files changed, 15 insertions, 33 deletions
diff --git a/sys/cam/scsi/scsi_enc_safte.c b/sys/cam/scsi/scsi_enc_safte.c
index 89f70a5..4e615f4 100644
--- a/sys/cam/scsi/scsi_enc_safte.c
+++ b/sys/cam/scsi/scsi_enc_safte.c
@@ -291,11 +291,8 @@ safte_process_config(enc_softc_t *enc, struct enc_fsm_state *state,
cfg->DoorLock + cfg->Ntherm + cfg->Nspkrs + cfg->Ntstats + 1;
ENC_FREE_AND_NULL(enc->enc_cache.elm_map);
enc->enc_cache.elm_map =
- ENC_MALLOCZ(enc->enc_cache.nelms * sizeof(enc_element_t));
- if (enc->enc_cache.elm_map == NULL) {
- enc->enc_cache.nelms = 0;
- return (ENOMEM);
- }
+ malloc(enc->enc_cache.nelms * sizeof(enc_element_t),
+ M_SCSIENC, M_WAITOK|M_ZERO);
r = 0;
/*
diff --git a/sys/cam/scsi/scsi_enc_ses.c b/sys/cam/scsi/scsi_enc_ses.c
index f2593d2..dfb232a 100644
--- a/sys/cam/scsi/scsi_enc_ses.c
+++ b/sys/cam/scsi/scsi_enc_ses.c
@@ -715,13 +715,15 @@ ses_cache_clone(enc_softc_t *enc, enc_cache_t *src, enc_cache_t *dst)
* The element map is independent even though it starts out
* pointing to the same constant page data.
*/
- dst->elm_map = ENC_MALLOCZ(dst->nelms * sizeof(enc_element_t));
+ dst->elm_map = malloc(dst->nelms * sizeof(enc_element_t),
+ M_SCSIENC, M_WAITOK);
memcpy(dst->elm_map, src->elm_map, dst->nelms * sizeof(enc_element_t));
for (dst_elm = dst->elm_map, src_elm = src->elm_map,
last_elm = &src->elm_map[src->nelms];
src_elm != last_elm; src_elm++, dst_elm++) {
- dst_elm->elm_private = ENC_MALLOCZ(sizeof(ses_element_t));
+ dst_elm->elm_private = malloc(sizeof(ses_element_t),
+ M_SCSIENC, M_WAITOK);
memcpy(dst_elm->elm_private, src_elm->elm_private,
sizeof(ses_element_t));
}
@@ -1066,11 +1068,7 @@ ses_set_physpath(enc_softc_t *enc, enc_element_t *elm,
cdai.ccb_h.func_code = XPT_DEV_ADVINFO;
cdai.buftype = CDAI_TYPE_SCSI_DEVID;
cdai.bufsiz = CAM_SCSI_DEVID_MAXLEN;
- cdai.buf = devid = ENC_MALLOCZ(cdai.bufsiz);
- if (devid == NULL) {
- ret = ENOMEM;
- goto out;
- }
+ cdai.buf = devid = malloc(cdai.bufsiz, M_SCSIENC, M_WAITOK|M_ZERO);
cam_periph_lock(enc->periph);
xpt_action((union ccb *)&cdai);
if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0)
@@ -1370,12 +1368,8 @@ ses_process_config(enc_softc_t *enc, struct enc_fsm_state *state,
* Now waltz through all the subenclosures summing the number of
* types available in each.
*/
- subencs = ENC_MALLOCZ(ses_cfg_page_get_num_subenc(cfg_page)
- * sizeof(*subencs));
- if (subencs == NULL) {
- err = ENOMEM;
- goto out;
- }
+ subencs = malloc(ses_cfg_page_get_num_subenc(cfg_page)
+ * sizeof(*subencs), M_SCSIENC, M_WAITOK|M_ZERO);
/*
* Sub-enclosure data is const after construction (i.e. when
* accessed via our cache object.
@@ -1413,11 +1407,8 @@ ses_process_config(enc_softc_t *enc, struct enc_fsm_state *state,
}
/* Process the type headers. */
- ses_types = ENC_MALLOCZ(ntype * sizeof(*ses_types));
- if (ses_types == NULL) {
- err = ENOMEM;
- goto out;
- }
+ ses_types = malloc(ntype * sizeof(*ses_types),
+ M_SCSIENC, M_WAITOK|M_ZERO);
/*
* Type data is const after construction (i.e. when accessed via
* our cache object.
@@ -1454,11 +1445,8 @@ ses_process_config(enc_softc_t *enc, struct enc_fsm_state *state,
}
/* Create the object map. */
- enc_cache->elm_map = ENC_MALLOCZ(nelm * sizeof(enc_element_t));
- if (enc_cache->elm_map == NULL) {
- err = ENOMEM;
- goto out;
- }
+ enc_cache->elm_map = malloc(nelm * sizeof(enc_element_t),
+ M_SCSIENC, M_WAITOK|M_ZERO);
enc_cache->nelms = nelm;
ses_iter_init(enc, enc_cache, &iter);
@@ -1472,11 +1460,8 @@ ses_process_config(enc_softc_t *enc, struct enc_fsm_state *state,
element->subenclosure = thdr->etype_subenc;
element->enctype = thdr->etype_elm_type;
element->overall_status_elem = iter.type_element_index == 0;
- element->elm_private = ENC_MALLOCZ(sizeof(ses_element_t));
- if (element->elm_private == NULL) {
- err = ENOMEM;
- goto out;
- }
+ element->elm_private = malloc(sizeof(ses_element_t),
+ M_SCSIENC, M_WAITOK|M_ZERO);
ENC_DLOG(enc, "%s: creating elmpriv %d(%d,%d) subenc %d "
"type 0x%x\n", __func__, iter.global_element_index,
iter.type_index, iter.type_element_index,
OpenPOWER on IntegriCloud