diff --git a/sys/dev/disk/vn/vn.c b/sys/dev/disk/vn/vn.c --- a/sys/dev/disk/vn/vn.c +++ b/sys/dev/disk/vn/vn.c @@ -135,6 +135,7 @@ }; static SLIST_HEAD(, vn_softc) vn_list; +static struct lwkt_token vn_list_token = LWKT_TOKEN_INITIALIZER(vn_list_token); /* sc_flags */ #define VNF_INITED 0x01 @@ -182,7 +183,9 @@ KKASSERT(disk_getopencount(&vn->sc_disk) == 0); disk_destroy(&vn->sc_disk); devfs_clone_bitmap_put(&DEVFS_CLONE_BITMAP(vn), dkunit(dev)); + lwkt_gettoken(&vn_list_token); SLIST_REMOVE(&vn_list, vn, vn_softc, sc_list); + lwkt_reltoken(&vn_list_token); kfree(vn, M_VN); } return (0); @@ -210,7 +213,9 @@ dev->si_drv1 = vn; vn->sc_dev = dev; + lwkt_gettoken(&vn_list_token); SLIST_INSERT_HEAD(&vn_list, vn, sc_list); + lwkt_reltoken(&vn_list_token); } static int @@ -764,6 +769,7 @@ else if (vnu->vnu_unit < 0) return (EINVAL); + lwkt_gettoken(&vn_list_token); SLIST_FOREACH(vn, &vn_list, sc_list) { if(vn->sc_unit != vnu->vnu_unit) @@ -904,7 +910,9 @@ disk_destroy(&vn->sc_disk); + lwkt_gettoken(&vn_list_token); SLIST_REMOVE_HEAD(&vn_list, sc_list); + lwkt_reltoken(&vn_list_token); if (vn->sc_flags & VNF_INITED) vnclear(vn);