summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/vfs_vnops.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 7cc09cc..c9d30e9 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -806,12 +806,20 @@ vn_ioctl(fp, com, data, active_cred, td)
case VCHR:
case VBLK:
if (com == FIODTYPE) {
- if (vp->v_rdev == NULL)
- return (EOPNOTSUPP);
+ dev_lock();
if (vp->v_type != VCHR && vp->v_type != VBLK)
- return (ENOTTY);
- *(int *)data = devsw(vp->v_rdev)->d_flags & D_TYPEMASK;
- return (0);
+ error = ENOTTY;
+ else if (vp->v_rdev == NULL)
+ error = ENXIO;
+ else if (vp->v_rdev->si_devsw == NULL)
+ error = ENXIO;
+ else {
+ error = 0;
+ *(int *)data =
+ vp->v_rdev->si_devsw->d_flags & D_TYPEMASK;
+ }
+ dev_unlock();
+ return (error);
}
error = VOP_IOCTL(vp, com, data, fp->f_flag, active_cred, td);
if (error == ENOIOCTL) {
OpenPOWER on IntegriCloud