Before using this patch, you'll need to apply kib@'s destroy_dev_sched() patch which can be found at: http://people.freebsd.org/~kib/misc/destroy_dev_sched.6.patch --- cam/scsi/scsi_target.c.orig Wed May 2 11:42:46 2007 +++ cam/scsi/scsi_target.c Wed May 2 11:43:11 2007 @@ -210,7 +210,7 @@ targclose(struct cdev *dev, int flag, in softc = (struct targ_softc *)dev->si_drv1; if ((softc->periph == NULL) || (softc->state & TARG_STATE_LUN_ENABLED) == 0) { - destroy_dev(dev); + destroy_dev_sched(dev); FREE(softc, M_TARG); return (0); } @@ -229,7 +229,7 @@ targclose(struct cdev *dev, int flag, in cam_periph_invalidate(softc->periph); softc->periph = NULL; } - destroy_dev(dev); + destroy_dev_sched(dev); FREE(softc, M_TARG); } cam_periph_unlock(periph); --- netsmb/smb_dev.c.orig Thu Apr 12 10:27:19 2007 +++ netsmb/smb_dev.c Mon May 7 22:15:49 2007 @@ -175,7 +175,7 @@ nsmb_dev_close(struct cdev *dev, int fla */ dev->si_drv1 = NULL; free(sdp, M_NSMBDEV); - destroy_dev(dev); + destroy_dev_sched(dev); splx(s); return 0; } @@ -349,6 +349,8 @@ nsmb_dev_load(module_t mod, int cmd, voi if (error) break; EVENTHANDLER_DEREGISTER(dev_clone, nsmb_dev_tag); + destroy_dev_sched_drain(&nsmb_cdevsw); + drain_dev_clone_events(); printf("netsmb_dev: unloaded\n"); break; default: --- dev/snp/snp.c.orig Sun May 6 09:04:58 2007 +++ dev/snp/snp.c Mon May 7 22:15:21 2007 @@ -466,7 +466,7 @@ snpclose(struct cdev *dev, int flags, in free(snp->snp_buf, M_SNP); snp->snp_flags &= ~SNOOP_OPEN; dev->si_drv1 = NULL; - destroy_dev(dev); + destroy_dev_sched(dev); return (snp_detach(snp)); } @@ -641,6 +641,8 @@ snp_modevent(module_t mod, int type, voi return (EBUSY); EVENTHANDLER_DEREGISTER(dev_clone, eh_tag); clone_cleanup(&snpclones); + destroy_dev_sched_drain(&snp_cdevsw); + drain_dev_clone_events(); ldisc_deregister(snooplinedisc); break; default: