summaryrefslogtreecommitdiffstats
path: root/sys/fs/devfs/devfs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/devfs/devfs_vnops.c')
-rw-r--r--sys/fs/devfs/devfs_vnops.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index cb8caff..e3c717e 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -106,7 +106,6 @@ loop:
}
vp->v_data = de;
de->de_vnode = vp;
- vhold(vp);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
*vpp = vp;
return (0);
@@ -148,7 +147,7 @@ devfs_getattr(ap)
dev_t dev;
de = vp->v_data;
- if (vp->v_type == VDIR)
+ if (vp->v_type == VDIR)
de = de->de_dir;
bzero((caddr_t) vap, sizeof(*vap));
vattr_null(vap);
@@ -245,7 +244,7 @@ devfs_lookupx(ap)
vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, p);
return (error);
}
- if ((flags & LOCKPARENT) && (flags & ISLASTCN))
+ if ((flags & LOCKPARENT) && (flags & ISLASTCN))
error = vn_lock(dvp, LK_EXCLUSIVE, p);
if (error)
vput(*vpp);
@@ -296,13 +295,13 @@ devfs_lookupx(ap)
printf("Finished specname: %d \"%s\"\n", i, specname + i);
#endif
cdev = NODEV;
- EVENTHANDLER_INVOKE(dev_clone, specname + i,
+ EVENTHANDLER_INVOKE(dev_clone, specname + i,
strlen(specname + i), &cdev);
#if 0
printf("cloned %s -> %p %s\n", specname + i, cdev,
cdev == NODEV ? "NODEV" : cdev->si_name);
#endif
- if (cdev == NODEV)
+ if (cdev == NODEV)
goto notfound;
devfs_populate(dmp);
@@ -431,7 +430,7 @@ devfs_readdir(ap)
dd = TAILQ_FIRST(&de->de_dlist);
off = 0;
while (dd != NULL) {
- if (dd->de_dirent->d_type == DT_DIR)
+ if (dd->de_dirent->d_type == DT_DIR)
de = dd->de_dir;
else
de = dd;
@@ -476,14 +475,24 @@ devfs_reclaim(ap)
{
struct vnode *vp = ap->a_vp;
struct devfs_dirent *de;
+ int i;
de = vp->v_data;
+ if (de != NULL)
+ de->de_vnode = NULL;
if (de != NULL && de->de_flags & DE_ORPHAN) {
- if (de->de_symlink)
+ if (de->de_symlink)
FREE(de->de_symlink, M_DEVFS);
- FREE(de, M_DEVFS);
+ FREE(de, M_DEVFS);
}
vp->v_data = NULL;
+ if (vp->v_rdev != NODEV && vp->v_rdev != NULL) {
+ i = vcount(vp);
+ if ((vp->v_rdev->si_flags & SI_CHEAPCLONE) && i == 0) {
+ destroy_dev(vp->v_rdev);
+ printf("Reclaim <%s> %d %d Killed\n", vp->v_rdev->si_name, vp->v_rdev->si_flags, i);
+ }
+ }
return (0);
}
@@ -508,7 +517,6 @@ devfs_remove(ap)
if (dep != NULL)
*dep = DE_DELETED;
de->de_flags |= DE_ORPHAN;
- vdrop(de->de_vnode);
lockmgr(&dmp->dm_lock, LK_RELEASE, 0, curproc);
return (0);
}
@@ -529,8 +537,6 @@ devfs_revoke(ap)
struct devfs_dirent *de;
de = vp->v_data;
- if (!(de->de_flags & DE_ORPHAN))
- vdrop(de->de_vnode);
de->de_vnode = NULL;
vop_revoke(ap);
return (0);
@@ -565,7 +571,7 @@ devfs_setattr(ap)
}
de = ap->a_vp->v_data;
- if (ap->a_vp->v_type == VDIR)
+ if (ap->a_vp->v_type == VDIR)
de = de->de_dir;
error = c = 0;
OpenPOWER on IntegriCloud