summaryrefslogtreecommitdiffstats
path: root/sys/fs/devfs
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2005-09-15 21:16:43 +0000
committerphk <phk@FreeBSD.org>2005-09-15 21:16:43 +0000
commit2d4ad1cc44e7178fad86cf57be93cd9e16167265 (patch)
tree8281ebc0b83078ce49ba4b8375b60f55d2d43e55 /sys/fs/devfs
parent6e520a23cd8143a93f5f424daf9620b3d54d1de2 (diff)
downloadFreeBSD-src-2d4ad1cc44e7178fad86cf57be93cd9e16167265.zip
FreeBSD-src-2d4ad1cc44e7178fad86cf57be93cd9e16167265.tar.gz
Don't attempt to recurse lockmgr, it doesn't like it.
Diffstat (limited to 'sys/fs/devfs')
-rw-r--r--sys/fs/devfs/devfs_devs.c2
-rw-r--r--sys/fs/devfs/devfs_vnops.c7
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;
OpenPOWER on IntegriCloud