summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/uts/common/io/scsi/impl/scsi_resource.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/usr/src/uts/common/io/scsi/impl/scsi_resource.c b/usr/src/uts/common/io/scsi/impl/scsi_resource.c
index 9fcdb43f17..ab2c3c6816 100644
--- a/usr/src/uts/common/io/scsi/impl/scsi_resource.c
+++ b/usr/src/uts/common/io/scsi/impl/scsi_resource.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -160,10 +160,13 @@ scsi_init_cache_pkt(struct scsi_address *ap, struct scsi_pkt *in_pktp,
pktw->pcw_kmflags = 0;
in_pktp = &(pktw->pcw_pkt);
/*
- * target driver initializes pkt_comp, pkt_flags,
- * and pkt_time
+ * target drivers should initialize pkt_comp and
+ * pkt_time, but sometimes they don't so initialize
+ * them here to be safe.
*/
in_pktp->pkt_address = *ap;
+ in_pktp->pkt_flags = 0;
+ in_pktp->pkt_time = 0;
in_pktp->pkt_resid = 0;
in_pktp->pkt_state = 0;
in_pktp->pkt_statistics = 0;
@@ -173,14 +176,14 @@ scsi_init_cache_pkt(struct scsi_address *ap, struct scsi_pkt *in_pktp,
if ((tranp->tran_hba_flags & SCSI_HBA_TRAN_CDB) &&
(cmdlen > DEFAULT_CDBLEN)) {
pktw->pcw_kmflags |= NEED_EXT_CDB;
- in_pktp->pkt_cdbp = kmem_zalloc(cmdlen, kf);
+ in_pktp->pkt_cdbp = kmem_alloc(cmdlen, kf);
if (in_pktp->pkt_cdbp == NULL)
goto fail2;
}
in_pktp->pkt_tgtlen = pplen;
if (pplen > DEFAULT_PRIVLEN) {
pktw->pcw_kmflags |= NEED_EXT_TGT;
- in_pktp->pkt_private = kmem_zalloc(pplen, kf);
+ in_pktp->pkt_private = kmem_alloc(pplen, kf);
if (in_pktp->pkt_private == NULL)
goto fail3;
}
@@ -188,7 +191,7 @@ scsi_init_cache_pkt(struct scsi_address *ap, struct scsi_pkt *in_pktp,
if ((tranp->tran_hba_flags & SCSI_HBA_TRAN_SCB) &&
(statuslen > DEFAULT_SCBLEN)) {
pktw->pcw_kmflags |= NEED_EXT_SCB;
- in_pktp->pkt_scbp = kmem_zalloc(statuslen, kf);
+ in_pktp->pkt_scbp = kmem_alloc(statuslen, kf);
if (in_pktp->pkt_scbp == NULL)
goto fail4;
}
@@ -196,6 +199,12 @@ scsi_init_cache_pkt(struct scsi_address *ap, struct scsi_pkt *in_pktp,
func, NULL) == -1) {
goto fail5;
}
+ if (cmdlen)
+ bzero((void *)in_pktp->pkt_cdbp, cmdlen);
+ if (pplen)
+ bzero((void *)in_pktp->pkt_private, pplen);
+ if (statuslen)
+ bzero((void *)in_pktp->pkt_scbp, statuslen);
}
if (bp && bp->b_bcount) {
if ((*tranp->tran_setup_bp) (in_pktp, bp,