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.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 46d7942..f24e12e 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -1276,11 +1276,19 @@ devfs_revoke(struct vop_revoke_args *ap)
static int
devfs_rioctl(struct vop_ioctl_args *ap)
{
- int error;
+ struct vnode *vp;
struct devfs_mount *dmp;
+ int error;
- dmp = VFSTODEVFS(ap->a_vp->v_mount);
+ vp = ap->a_vp;
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ if (vp->v_iflag & VI_DOOMED) {
+ VOP_UNLOCK(vp, 0);
+ return (EBADF);
+ }
+ dmp = VFSTODEVFS(vp->v_mount);
sx_xlock(&dmp->dm_lock);
+ VOP_UNLOCK(vp, 0);
DEVFS_DMP_HOLD(dmp);
devfs_populate(dmp);
if (DEVFS_DMP_DROP(dmp)) {
OpenPOWER on IntegriCloud