Date: Fri, 1 Jun 2012 22:11:35 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 212127 for review Message-ID: <201206012211.q51MBZDB011407@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@212127?ac=10 Change 212127 by brooks@brooks_ecr_current on 2012/06/01 22:10:33 Push the attach routine in the right direction. I think it is at least no longer a panic(9) implemenation. Lock around the ERASE ioctl. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/dev/isf/isf.c#5 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/isf/isf.h#5 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/isf/isf_nexus.c#4 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/dev/isf/isf.c#5 (text+ko) ==== @@ -302,6 +302,7 @@ uint16_t w, status; off_t off; + ISF_LOCK(sc); for (off = blk_off; off < blk_off + size; off += 2) { w = bus_read_2(sc->isf_res, off); if (w == 0xFFFF) @@ -321,6 +322,7 @@ isf_write_cmd(sc, off, ISF_CMD_RA); } + ISF_UNLOCK(sc); } /* @@ -384,8 +386,12 @@ ISF_LOCK(sc); do { bp = bioq_first(&sc->isf_bioq); - if (bp == NULL) - ISF_SLEEP(sc); + if (bp == NULL) { + if (sc->isf_doomed) + kproc_exit(0); + else + ISF_SLEEP(sc, sc); + } } while (bp == NULL); bioq_remove(&sc->isf_bioq, bp); @@ -472,6 +478,7 @@ { struct disk *disk; + sc->isf_doomed = 0; kproc_create(&isf_task, sc, &sc->isf_proc, 0, 0, "isf"); disk = disk_alloc(); @@ -502,6 +509,10 @@ ISF_LOCK_ASSERT(sc); KASSERT(sc->isf_disk != NULL, ("%s: isf_disk NULL", __func__)); + sc->isf_doomed = 0; + ISF_WAKEUP(sc); + ISF_SLEEP(sc, sc->isf_proc); + /* * XXXRW: Is it OK to call disk_destroy() under the mutex, or should * we be deferring that to the calling context once it is released? @@ -539,6 +550,7 @@ isf_read_reg(sc, ISF_REG_ID)); return (ENXIO); } + isf_write_cmd(sc, 0, ISF_CMD_RA); bioq_init(&sc->isf_bioq); ISF_LOCK_INIT(sc); @@ -558,10 +570,11 @@ * * XXXRW: Is the locking here right? */ + ISF_LOCK(sc); isf_disk_remove(sc); - ISF_UNLOCK(sc); bioq_flush(&sc->isf_bioq, NULL, ENXIO); KASSERT(bioq_first(&sc->isf_bioq) == NULL, ("%s: non-empty bioq", __func__)); + ISF_UNLOCK(sc); ISF_LOCK_DESTROY(sc); } ==== //depot/projects/ctsrd/beribsd/src/sys/dev/isf/isf.h#5 (text+ko) ==== @@ -60,6 +60,7 @@ struct mtx isf_lock; struct disk *isf_disk; struct proc *isf_proc; + int isf_doomed; /* * Fields relating to in-progress and pending I/O, if any. @@ -73,7 +74,7 @@ #define ISF_LOCK_DESTROY(sc) mtx_destroy(&(sc)->isf_lock) #define ISF_LOCK_INIT(sc) mtx_init(&(sc)->isf_lock, "isf", NULL, \ MTX_DEF) -#define ISF_SLEEP(sc) mtx_sleep((sc), &(sc)->isf_lock, PRIBIO, \ +#define ISF_SLEEP(sc, wait) mtx_sleep((wait), &(sc)->isf_lock, PRIBIO, \ "isf", 0) #define ISF_UNLOCK(sc) mtx_unlock(&(sc)->isf_lock) #define ISF_WAKEUP(sc) wakeup((sc)) ==== //depot/projects/ctsrd/beribsd/src/sys/dev/isf/isf_nexus.c#4 (text+ko) ====
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206012211.q51MBZDB011407>