DF-4707 / fix.diff
--- a/sys/dev/raid/amr/amrvar.h +++ b/sys/dev/raid/amr/amrvar.h @@ -216,6 +216,7 @@ /* controller state */ int amr_state; + int amr_opencnt; /* open descriptors on amr_dev_t */ #define AMR_STATE_OPEN (1<<0) #define AMR_STATE_SUSPEND (1<<1) --- a/sys/dev/raid/amr/amr.c +++ b/sys/dev/raid/amr/amr.c @@ -428,6 +428,7 @@ amr_open(struct dev_open_args *ap) debug_called(1); sc->amr_state |= AMR_STATE_OPEN; + sc->amr_opencnt++; return(0); } @@ -443,6 +444,9 @@ amr_close(struct dev_close_args *ap) debug_called(1); + KKASSERT(sc->amr_opencnt > 0); + if (--sc->amr_opencnt == 0) sc->amr_state &= ~AMR_STATE_OPEN; return (0); } --- a/sys/dev/raid/amr/amr_pci.c +++ b/sys/dev/raid/amr/amr_pci.c @@ -362,7 +362,8 @@ amr_pci_detach(device_t dev) debug_called(1); - if (sc->amr_state & AMR_STATE_OPEN) + if ((sc->amr_state & AMR_STATE_OPEN) || sc->amr_opencnt > 0) return(EBUSY); |