Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/devfs/devfs_vnops.c
| Show First 20 Lines • Show All 79 Lines • ▼ Show 20 Lines | |||||
| #include <vm/vm.h> | #include <vm/vm.h> | ||||
| #include <vm/vm_extern.h> | #include <vm/vm_extern.h> | ||||
| #include <vm/vm_object.h> | #include <vm/vm_object.h> | ||||
| static MALLOC_DEFINE(M_CDEVPDATA, "DEVFSP", "Metainfo for cdev-fp data"); | static MALLOC_DEFINE(M_CDEVPDATA, "DEVFSP", "Metainfo for cdev-fp data"); | ||||
| struct mtx devfs_de_interlock; | struct mtx devfs_de_interlock; | ||||
| MTX_SYSINIT(devfs_de_interlock, &devfs_de_interlock, "devfs interlock", MTX_DEF); | MTX_SYSINIT(devfs_de_interlock, &devfs_de_interlock, "devfs interlock", MTX_DEF); | ||||
| struct sx clone_drain_lock; | |||||
| SX_SYSINIT(clone_drain_lock, &clone_drain_lock, "clone events drain lock"); | |||||
| struct mtx cdevpriv_mtx; | struct mtx cdevpriv_mtx; | ||||
| MTX_SYSINIT(cdevpriv_mtx, &cdevpriv_mtx, "cdevpriv lock", MTX_DEF); | MTX_SYSINIT(cdevpriv_mtx, &cdevpriv_mtx, "cdevpriv lock", MTX_DEF); | ||||
| SYSCTL_DECL(_vfs_devfs); | SYSCTL_DECL(_vfs_devfs); | ||||
| static int devfs_dotimes; | static int devfs_dotimes; | ||||
| SYSCTL_INT(_vfs_devfs, OID_AUTO, dotimes, CTLFLAG_RW, | SYSCTL_INT(_vfs_devfs, OID_AUTO, dotimes, CTLFLAG_RW, | ||||
| &devfs_dotimes, 0, "Update timestamps on DEVFS with default precision"); | &devfs_dotimes, 0, "Update timestamps on DEVFS with default precision"); | ||||
| ▲ Show 20 Lines • Show All 999 Lines • ▼ Show 20 Lines | while (de == NULL) { /* While(...) so we can use break */ | ||||
| */ | */ | ||||
| pname = devfs_fqpn(specname, dmp, dd, cnp); | pname = devfs_fqpn(specname, dmp, dd, cnp); | ||||
| if (pname == NULL) | if (pname == NULL) | ||||
| break; | break; | ||||
| cdev = NULL; | cdev = NULL; | ||||
| DEVFS_DMP_HOLD(dmp); | DEVFS_DMP_HOLD(dmp); | ||||
| sx_xunlock(&dmp->dm_lock); | sx_xunlock(&dmp->dm_lock); | ||||
| sx_slock(&clone_drain_lock); | |||||
| EVENTHANDLER_INVOKE(dev_clone, | EVENTHANDLER_INVOKE(dev_clone, | ||||
| td->td_ucred, pname, strlen(pname), &cdev); | td->td_ucred, pname, strlen(pname), &cdev); | ||||
| sx_sunlock(&clone_drain_lock); | |||||
| if (cdev == NULL) | if (cdev == NULL) | ||||
| sx_xlock(&dmp->dm_lock); | sx_xlock(&dmp->dm_lock); | ||||
| else if (devfs_populate_vp(dvp) != 0) { | else if (devfs_populate_vp(dvp) != 0) { | ||||
| *dm_unlock = 0; | *dm_unlock = 0; | ||||
| sx_xlock(&dmp->dm_lock); | sx_xlock(&dmp->dm_lock); | ||||
| if (DEVFS_DMP_DROP(dmp)) { | if (DEVFS_DMP_DROP(dmp)) { | ||||
| sx_xunlock(&dmp->dm_lock); | sx_xunlock(&dmp->dm_lock); | ||||
| ▲ Show 20 Lines • Show All 1,000 Lines • Show Last 20 Lines | |||||