summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-03-06 09:22:05 +0000
committerkib <kib@FreeBSD.org>2015-03-06 09:22:05 +0000
commit06a96cf2f5837dcb35818e51ab91d89ab882037c (patch)
treef2af2cfa515c93b00b88369146280cb86a4a0baf
parentdd89b387bb6d5c04214a20007e1f352d01a7f549 (diff)
downloadFreeBSD-src-06a96cf2f5837dcb35818e51ab91d89ab882037c.zip
FreeBSD-src-06a96cf2f5837dcb35818e51ab91d89ab882037c.tar.gz
MFC r279362:
The VNASSERT in vflush() FORCECLOSE case is trying to panic early to prevent errors from yanking devices out from under filesystems. Only care about special vnodes on devfs, special nodes on other kinds of filesystems do not have special properties.
-rw-r--r--sys/fs/devfs/devfs_vnops.c3
-rw-r--r--sys/kern/vfs_subr.c1
-rw-r--r--sys/sys/vnode.h1
3 files changed, 3 insertions, 2 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index d3ab235..134f8b0 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -63,7 +63,6 @@
#include <sys/vnode.h>
static struct vop_vector devfs_vnodeops;
-static struct vop_vector devfs_specops;
static struct fileops devfs_ops_f;
#include <fs/devfs/devfs.h>
@@ -1737,7 +1736,7 @@ static struct vop_vector devfs_vnodeops = {
.vop_vptocnp = devfs_vptocnp,
};
-static struct vop_vector devfs_specops = {
+struct vop_vector devfs_specops = {
.vop_default = &default_vnodeops,
.vop_access = devfs_access,
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index a2690c6..8fb7734 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2624,6 +2624,7 @@ loop:
*/
if (vp->v_usecount == 0 || (flags & FORCECLOSE)) {
VNASSERT(vp->v_usecount == 0 ||
+ vp->v_op != &devfs_specops ||
(vp->v_type != VCHR && vp->v_type != VBLK), vp,
("device VNODE %p is FORCECLOSED", vp));
vgonel(vp);
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 20bd0a1..71b129e 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -819,6 +819,7 @@ void vnode_destroy_vobject(struct vnode *vp);
extern struct vop_vector fifo_specops;
extern struct vop_vector dead_vnodeops;
extern struct vop_vector default_vnodeops;
+extern struct vop_vector devfs_specops;
#define VOP_PANIC ((void*)(uintptr_t)vop_panic)
#define VOP_NULL ((void*)(uintptr_t)vop_null)
OpenPOWER on IntegriCloud