+ assert(0 <= major(dev) && major(dev) < nchrdev);
+
+ lck_mtx_lock_spin(&devsw_lock_list_mtx);
+
+ TAILQ_FOREACH(tmplock, &devsw_locks, dl_list)
+ {
+ if (tmplock->dl_dev == dev && tmplock->dl_mode == mode) {
+ break;
+ }
+ }
+
+ if (tmplock == NULL) {
+ panic("Trying to unlock, and couldn't find lock.");
+ }
+
+ if (tmplock->dl_thread != current_thread()) {
+ panic("Trying to unlock, but I don't hold the lock.");
+ }
+
+ wakeup(tmplock);
+ TAILQ_REMOVE(&devsw_locks, tmplock, dl_list);
+
+ lck_mtx_unlock(&devsw_lock_list_mtx);
+
+ FREE(tmplock, M_TEMP);
+}
+
+void
+devsw_init()
+{
+ devsw_lock_grp = lck_grp_alloc_init("devsw", NULL);
+ assert(devsw_lock_grp != NULL);
+
+ lck_mtx_init(&devsw_lock_list_mtx, devsw_lock_grp, NULL);
+ TAILQ_INIT(&devsw_locks);
+}