svn commit: r186186 - in head/sys/cam: . scsi
Edward Tomasz Napierala
trasz at FreeBSD.org
Tue Dec 16 17:01:53 UTC 2008
Author: trasz
Date: Tue Dec 16 17:01:52 2008
New Revision: 186186
URL: http://svn.freebsd.org/changeset/base/186186
Log:
Fix locking in periph drivers - don't try to unlock periph
that was already deallocated.
Reviewed by: scottl
Approved by: rwatson (mentor)
Sponsored by: FreeBSD Foundation
Modified:
head/sys/cam/cam_periph.c
head/sys/cam/cam_xpt.c
head/sys/cam/scsi/scsi_da.c
Modified: head/sys/cam/cam_periph.c
==============================================================================
--- head/sys/cam/cam_periph.c Tue Dec 16 16:57:33 2008 (r186185)
+++ head/sys/cam/cam_periph.c Tue Dec 16 17:01:52 2008 (r186186)
@@ -311,8 +311,6 @@ cam_periph_hold(struct cam_periph *perip
struct mtx *mtx;
int error;
- mtx_assert(periph->sim->mtx, MA_OWNED);
-
/*
* Increment the reference count on the peripheral
* while we wait for our lock attempt to succeed
@@ -324,6 +322,8 @@ cam_periph_hold(struct cam_periph *perip
return (ENXIO);
mtx = periph->sim->mtx;
+ mtx_assert(mtx, MA_OWNED);
+
if (mtx == &Giant)
mtx = NULL;
Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c Tue Dec 16 16:57:33 2008 (r186185)
+++ head/sys/cam/cam_xpt.c Tue Dec 16 17:01:52 2008 (r186186)
@@ -1595,7 +1595,7 @@ xpt_remove_periph(struct cam_periph *per
{
struct cam_ed *device;
- mtx_assert(periph->sim->mtx, MA_OWNED);
+ cam_periph_lock(periph);
device = periph->path->device;
@@ -1615,6 +1615,7 @@ xpt_remove_periph(struct cam_periph *per
mtx_lock(&xsoftc.xpt_topo_lock);
xsoftc.xpt_generation++;
mtx_unlock(&xsoftc.xpt_topo_lock);
+ cam_periph_unlock(periph);
}
Modified: head/sys/cam/scsi/scsi_da.c
==============================================================================
--- head/sys/cam/scsi/scsi_da.c Tue Dec 16 16:57:33 2008 (r186185)
+++ head/sys/cam/scsi/scsi_da.c Tue Dec 16 17:01:52 2008 (r186186)
@@ -772,8 +772,8 @@ daclose(struct disk *dp)
softc->flags &= ~DA_FLAG_OPEN;
cam_periph_unhold(periph);
- cam_periph_release(periph);
cam_periph_unlock(periph);
+ cam_periph_release(periph);
return (0);
}
@@ -995,10 +995,8 @@ dacleanup(struct cam_periph *periph)
xpt_print(periph->path, "can't remove sysctl context\n");
}
- cam_periph_unlock(periph);
disk_destroy(softc->disk);
callout_drain(&softc->sendordered_c);
- cam_periph_lock(periph);
free(softc, M_DEVBUF);
}
More information about the svn-src-all
mailing list