From bbfd17f7e8ab03daa669455f00b7384b82b2691a Mon Sep 17 00:00:00 2001 From: kib Date: Wed, 4 Jul 2007 06:56:58 +0000 Subject: Since cdev mutex is after system map mutex in global lock order, free() shall not be called while holding cdev mutex. devfs_inos unrhdr has cdev as mutex, thus creating this LOR situation. Postpone calling free() in kern/subr_unit.c:alloc_unr() and nested functions until the unrhdr mutex is dropped. Save the freed items on the ppfree list instead, and provide the clean_unrhdrl() and clean_unrhdr() functions to clean the list. Call clean_unrhdrl() after devfs_create() calls immediately before dropping cdev mutex. devfs_create() is the only user of the alloc_unrl() in the tree. Reviewed by: phk Tested by: Peter Holm LOR: 80 Approved by: re (kensmith) --- sys/kern/kern_conf.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sys/kern/kern_conf.c') diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 20d3bc3..751f524 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -617,6 +617,7 @@ make_dev_credv(int flags, struct cdevsw *devsw, int minornr, dev->si_mode = mode; devfs_create(dev); + clean_unrhdrl(devfs_inos); dev_unlock(); return (dev); } @@ -703,6 +704,7 @@ make_dev_alias(struct cdev *pdev, const char *fmt, ...) va_end(ap); devfs_create(dev); + clean_unrhdrl(devfs_inos); dev_unlock(); dev_depends(pdev, dev); return (dev); -- cgit v1.1