summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2017-03-29 15:40:45 +0000
committermav <mav@FreeBSD.org>2017-03-29 15:40:45 +0000
commit117e948538efaf610e8329f34db6cbf8656f1dda (patch)
tree70cab2b76199aa7478e5b24c0eab3feb22371286 /sys/dev/isp
parent1267d6589093679b8bce3e0cdb274b697b80e938 (diff)
downloadFreeBSD-src-117e948538efaf610e8329f34db6cbf8656f1dda.zip
FreeBSD-src-117e948538efaf610e8329f34db6cbf8656f1dda.tar.gz
MFC r315303: Fix panic when SIM dereferenced before allocation.
Diffstat (limited to 'sys/dev/isp')
-rw-r--r--sys/dev/isp/isp_freebsd.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index 6bb0b0f..7c01ea0 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -362,39 +362,40 @@ isp_detach(ispsoftc_t *isp)
static void
isp_freeze_loopdown(ispsoftc_t *isp, int chan)
{
- if (IS_FC(isp)) {
- struct isp_fc *fc = ISP_FC_PC(isp, chan);
- if (fc->simqfrozen == 0) {
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d Freeze simq (loopdown)", chan);
- fc->simqfrozen = SIMQFRZ_LOOPDOWN;
- xpt_hold_boot();
- xpt_freeze_simq(fc->sim, 1);
- } else {
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d Mark simq frozen (loopdown)", chan);
- fc->simqfrozen |= SIMQFRZ_LOOPDOWN;
- }
+ struct isp_fc *fc = ISP_FC_PC(isp, chan);
+
+ if (fc->sim == NULL)
+ return;
+ if (fc->simqfrozen == 0) {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Chan %d Freeze simq (loopdown)", chan);
+ fc->simqfrozen = SIMQFRZ_LOOPDOWN;
+ xpt_hold_boot();
+ xpt_freeze_simq(fc->sim, 1);
+ } else {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Chan %d Mark simq frozen (loopdown)", chan);
+ fc->simqfrozen |= SIMQFRZ_LOOPDOWN;
}
}
static void
isp_unfreeze_loopdown(ispsoftc_t *isp, int chan)
{
- if (IS_FC(isp)) {
- struct isp_fc *fc = ISP_FC_PC(isp, chan);
- int wasfrozen = fc->simqfrozen & SIMQFRZ_LOOPDOWN;
- fc->simqfrozen &= ~SIMQFRZ_LOOPDOWN;
- if (wasfrozen && fc->simqfrozen == 0) {
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d Release simq", chan);
- xpt_release_simq(fc->sim, 1);
- xpt_release_boot();
- }
+ struct isp_fc *fc = ISP_FC_PC(isp, chan);
+
+ if (fc->sim == NULL)
+ return;
+ int wasfrozen = fc->simqfrozen & SIMQFRZ_LOOPDOWN;
+ fc->simqfrozen &= ~SIMQFRZ_LOOPDOWN;
+ if (wasfrozen && fc->simqfrozen == 0) {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Chan %d Release simq", chan);
+ xpt_release_simq(fc->sim, 1);
+ xpt_release_boot();
}
}
-
static int
ispioctl(struct cdev *dev, u_long c, caddr_t addr, int flags, struct thread *td)
{
OpenPOWER on IntegriCloud