DragonFlyBSD Kernel Audit
DF-1701 / fix.diff
← back to finding ↓ download raw
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);