summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2016-06-15 15:55:14 +0000
committerkib <kib@FreeBSD.org>2016-06-15 15:55:14 +0000
commitf3b36332afdb9ce0aef57a80298f0dc6cac7db77 (patch)
treea2fe728d99b829f7142da778b3c856b5e98b1314
parentf2a1935bcbe42a8350a8564d494274d3efe1f917 (diff)
downloadFreeBSD-src-f3b36332afdb9ce0aef57a80298f0dc6cac7db77.zip
FreeBSD-src-f3b36332afdb9ce0aef57a80298f0dc6cac7db77.tar.gz
Another follow-up to r291460. Only access vp->v_rdev for VCHR vnodes
in devfs_reclaim(). Reported and tested by: pho Sponsored by: The FreeBSD Foundation Approved by: re (gjb) MFC after: 1 week
-rw-r--r--sys/fs/devfs/devfs_vnops.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index f8efd10..7cc0f9e 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -1360,10 +1360,10 @@ devfs_readlink(struct vop_readlink_args *ap)
static int
devfs_reclaim(struct vop_reclaim_args *ap)
{
- struct vnode *vp = ap->a_vp;
+ struct vnode *vp;
struct devfs_dirent *de;
- struct cdev *dev;
+ vp = ap->a_vp;
mtx_lock(&devfs_de_interlock);
de = vp->v_data;
if (de != NULL) {
@@ -1371,24 +1371,31 @@ devfs_reclaim(struct vop_reclaim_args *ap)
vp->v_data = NULL;
}
mtx_unlock(&devfs_de_interlock);
-
vnode_destroy_vobject(vp);
+ return (0);
+}
+
+static int
+devfs_reclaim_vchr(struct vop_reclaim_args *ap)
+{
+ struct vnode *vp;
+ struct cdev *dev;
+
+ vp = ap->a_vp;
+ MPASS(vp->v_type == VCHR);
+
+ devfs_reclaim(ap);
VI_LOCK(vp);
dev_lock();
dev = vp->v_rdev;
vp->v_rdev = NULL;
-
- if (dev == NULL) {
- dev_unlock();
- VI_UNLOCK(vp);
- return (0);
- }
-
- dev->si_usecount -= vp->v_usecount;
+ if (dev != NULL)
+ dev->si_usecount -= vp->v_usecount;
dev_unlock();
VI_UNLOCK(vp);
- dev_rel(dev);
+ if (dev != NULL)
+ dev_rel(dev);
return (0);
}
@@ -1898,7 +1905,7 @@ static struct vop_vector devfs_specops = {
.vop_readdir = VOP_PANIC,
.vop_readlink = VOP_PANIC,
.vop_reallocblks = VOP_PANIC,
- .vop_reclaim = devfs_reclaim,
+ .vop_reclaim = devfs_reclaim_vchr,
.vop_remove = devfs_remove,
.vop_rename = VOP_PANIC,
.vop_revoke = devfs_revoke,
OpenPOWER on IntegriCloud