diff options
author | phk <phk@FreeBSD.org> | 2005-09-15 21:16:43 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2005-09-15 21:16:43 +0000 |
commit | 2d4ad1cc44e7178fad86cf57be93cd9e16167265 (patch) | |
tree | 8281ebc0b83078ce49ba4b8375b60f55d2d43e55 /sys/fs | |
parent | 6e520a23cd8143a93f5f424daf9620b3d54d1de2 (diff) | |
download | FreeBSD-src-2d4ad1cc44e7178fad86cf57be93cd9e16167265.zip FreeBSD-src-2d4ad1cc44e7178fad86cf57be93cd9e16167265.tar.gz |
Don't attempt to recurse lockmgr, it doesn't like it.
Diffstat (limited to 'sys/fs')
-rw-r--r-- | sys/fs/devfs/devfs_devs.c | 2 | ||||
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 7 |
2 files changed, 6 insertions, 3 deletions
diff --git a/sys/fs/devfs/devfs_devs.c b/sys/fs/devfs/devfs_devs.c index 5bb45fb..77a5140 100644 --- a/sys/fs/devfs/devfs_devs.c +++ b/sys/fs/devfs/devfs_devs.c @@ -292,7 +292,6 @@ devfs_populate(struct devfs_mount *dm) if (dm->dm_generation == devfs_generation) return; - lockmgr(&dm->dm_lock, LK_UPGRADE, 0, curthread); if (devfs_noverflow && dm->dm_overflow == NULL) { i = devfs_noverflow * sizeof (struct devfs_dirent *); MALLOC(dm->dm_overflow, struct devfs_dirent **, i, @@ -370,7 +369,6 @@ devfs_populate(struct devfs_mount *dm) TAILQ_INSERT_TAIL(&dd->de_dlist, de, de_list); } } - lockmgr(&dm->dm_lock, LK_DOWNGRADE, 0, curthread); } /* diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index b9540b1..6cf2f49 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -520,7 +520,9 @@ devfs_lookupx(struct vop_lookup_args *ap) return (error); } + lockmgr(&dmp->dm_lock, LK_UPGRADE, 0, curthread); devfs_populate(dmp); + lockmgr(&dmp->dm_lock, LK_DOWNGRADE, 0, curthread); dd = dvp->v_data; TAILQ_FOREACH(de, &dd->de_dlist, de_list) { if (cnp->cn_namelen != de->de_dirent->d_namlen) @@ -550,7 +552,9 @@ devfs_lookupx(struct vop_lookup_args *ap) if (cdev == NULL) goto notfound; + lockmgr(&dmp->dm_lock, LK_UPGRADE, 0, curthread); devfs_populate(dmp); + lockmgr(&dmp->dm_lock, LK_DOWNGRADE, 0, curthread); dde = devfs_itode(dmp, cdev->si_inode); dev_rel(cdev); @@ -841,8 +845,9 @@ devfs_readdir(struct vop_readdir_args *ap) return (EINVAL); dmp = VFSTODEVFS(ap->a_vp->v_mount); - lockmgr(&dmp->dm_lock, LK_SHARED, 0, curthread); + lockmgr(&dmp->dm_lock, LK_EXCLUSIVE, 0, curthread); devfs_populate(dmp); + lockmgr(&dmp->dm_lock, LK_DOWNGRADE, 0, curthread); error = 0; de = ap->a_vp->v_data; off = 0; |