aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/devfs
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2005-02-22 15:51:07 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2005-02-22 15:51:07 +0000
commitaa2f6ddc3f1fb3a7faefe48352cd270f94054d9b (patch)
tree81b88d00ce24060acf31a833eefcade4cbd42906 /sys/fs/devfs
parent8b25904e36186cac52c4fc18ec9bc3dd2855e770 (diff)
Notes
Diffstat (limited to 'sys/fs/devfs')
-rw-r--r--sys/fs/devfs/devfs.h1
-rw-r--r--sys/fs/devfs/devfs_vnops.c33
2 files changed, 18 insertions, 16 deletions
diff --git a/sys/fs/devfs/devfs.h b/sys/fs/devfs/devfs.h
index ba8bbf02a4be6..5a484c96c0741 100644
--- a/sys/fs/devfs/devfs.h
+++ b/sys/fs/devfs/devfs.h
@@ -154,6 +154,7 @@ struct devfs_dirent {
struct dirent *de_dirent;
TAILQ_ENTRY(devfs_dirent) de_list;
TAILQ_HEAD(, devfs_dirent) de_dlist;
+ LIST_ENTRY(devfs_dirent) de_alias;
struct devfs_dirent *de_dir;
int de_links;
mode_t de_mode;
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index e51ca4fd7db04..4adacb453d2c1 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -199,7 +199,7 @@ loop:
dev_lock();
dev_ref(dev);
vp->v_rdev = dev;
- SLIST_INSERT_HEAD(&dev->si_hlist, vp, v_specnext);
+ LIST_INSERT_HEAD(&dev->si_alist, de, de_alias);
dev->si_usecount += vp->v_usecount;
dev_unlock();
VI_UNLOCK(vp);
@@ -1041,19 +1041,23 @@ devfs_reclaim(ap)
{
struct vnode *vp = ap->a_vp;
struct devfs_dirent *de;
- int i;
+ struct cdev *dev;
de = vp->v_data;
if (de != NULL)
de->de_vnode = NULL;
vp->v_data = NULL;
- if (vp->v_rdev != NULL) {
- i = vcount(vp);
- if ((vp->v_rdev->si_flags & SI_CHEAPCLONE) && i == 0 &&
- (vp->v_rdev->si_flags & SI_NAMED))
- destroy_dev(vp->v_rdev);
- }
vnode_destroy_vobject(vp);
+
+ dev = vp->v_rdev;
+ vp->v_rdev = NULL;
+
+ dev_lock();
+ if (de != NULL)
+ LIST_REMOVE(de, de_alias);
+ dev->si_usecount -= vp->v_usecount;
+ dev_unlock();
+ dev_rel(dev);
return (0);
}
@@ -1101,13 +1105,10 @@ devfs_revoke(ap)
} */ *ap;
{
struct vnode *vp = ap->a_vp;
- struct vnode *vq;
- struct devfs_dirent *de;
struct cdev *dev;
+ struct devfs_dirent *de;
KASSERT((ap->a_flags & REVOKEALL) != 0, ("devfs_revoke !REVOKEALL"));
- de = vp->v_data;
- de->de_vnode = NULL;
/*
* If a vgone (or vclean) is already in progress,
@@ -1115,15 +1116,15 @@ devfs_revoke(ap)
*/
if (vx_wait(vp))
return (0);
-
+
dev = vp->v_rdev;
for (;;) {
dev_lock();
- vq = SLIST_FIRST(&dev->si_hlist);
+ de = LIST_FIRST(&dev->si_alist);
dev_unlock();
- if (vq == NULL)
+ if (de == NULL)
break;
- vgone(vq);
+ vgone(de->de_vnode);
}
return (0);
}