summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-11-17 09:09:55 +0000
committerphk <phk@FreeBSD.org>2004-11-17 09:09:55 +0000
commitd6a49a1565bec352a92f40326206665b53769de2 (patch)
tree3e96ca6c2f3203ce32ec61d3746561cf0c4bd761 /sys/kern/vfs_vnops.c
parent313ccfcf9e23e29fc79adcefe9b9e1b52f7643ff (diff)
downloadFreeBSD-src-d6a49a1565bec352a92f40326206665b53769de2.zip
FreeBSD-src-d6a49a1565bec352a92f40326206665b53769de2.tar.gz
Push Giant down through ioctl.
Don't grab Giant in the upper syscall/wrapper code NET_LOCK_GIANT in the socket code (sockets/fifos). mtx_lock(&Giant) in the vnode code. mtx_lock(&Giant) in the opencrypto code. (This may actually not be needed, but better safe than sorry). Devfs grabs Giant if the driver is marked as needing Giant.
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r--sys/kern/vfs_vnops.c70
1 files changed, 9 insertions, 61 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index cd5e669..c69558c 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -759,82 +759,30 @@ vn_ioctl(fp, com, data, active_cred, td)
struct thread *td;
{
struct vnode *vp = fp->f_vnode;
- struct vnode *vpold;
struct vattr vattr;
int error;
- GIANT_REQUIRED;
-
+ mtx_lock(&Giant);
+ error = ENOTTY;
switch (vp->v_type) {
-
case VREG:
case VDIR:
if (com == FIONREAD) {
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
error = VOP_GETATTR(vp, &vattr, active_cred, td);
VOP_UNLOCK(vp, 0, td);
- if (error)
- return (error);
- *(int *)data = vattr.va_size - fp->f_offset;
- return (0);
+ if (!error)
+ *(int *)data = vattr.va_size - fp->f_offset;
}
if (com == FIONBIO || com == FIOASYNC) /* XXX */
- return (0); /* XXX */
- /* FALLTHROUGH */
+ error = 0;
+ break;
default:
-#if 0
- return (ENOTTY);
-#endif
- case VFIFO:
- case VCHR:
- case VBLK:
- if (com == FIODTYPE) {
- dev_lock();
- if (vp->v_type != VCHR && vp->v_type != VBLK)
- 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) {
-#ifdef DIAGNOSTIC
- kdb_enter("ENOIOCTL leaked through");
-#endif
- error = ENOTTY;
- }
- if (error == 0 && com == TIOCSCTTY) {
-
- /* Do nothing if reassigning same control tty */
- sx_slock(&proctree_lock);
- if (td->td_proc->p_session->s_ttyvp == vp) {
- sx_sunlock(&proctree_lock);
- return (0);
- }
-
- vpold = td->td_proc->p_session->s_ttyvp;
- VREF(vp);
- SESS_LOCK(td->td_proc->p_session);
- td->td_proc->p_session->s_ttyvp = vp;
- SESS_UNLOCK(td->td_proc->p_session);
-
- sx_sunlock(&proctree_lock);
-
- /* Get rid of reference to old control tty */
- if (vpold)
- vrele(vpold);
- }
- return (error);
+ break;
}
+ mtx_unlock(&Giant);
+ return (error);
}
/*
OpenPOWER on IntegriCloud