Date: Mon, 6 May 2013 13:55:20 -0400 From: John Baldwin <jhb@freebsd.org> To: Bruce Evans <brde@optusnet.com.au> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org Subject: Re: svn commit: r250220 - head/sys/kern Message-ID: <201305061355.20826.jhb@freebsd.org> In-Reply-To: <20130504184721.E619@etaplex.bde.org> References: <201305031908.r43J8xnI094418@svn.freebsd.org> <20130504184721.E619@etaplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Saturday, May 04, 2013 4:47:43 am Bruce Evans wrote: > > Log: > > Fix FIONREAD on regular files. The computed result was being ignored and > > it was being passed down to VOP_IOCTL() where it promptly resulted in > > ENOTTY due to a missing else for the past 8 years. While here, use a > > shared vnode lock while fetching the current file's size. > > In another thread I complained to kib about using the bad style of not > returning as soon as possible, but instead sometimes returning and sometimes > falling through a complicated if-else ladder to get to the return at the > end. What about this: static int vn_ioctl(fp, com, data, active_cred, td) struct file *fp; u_long com; void *data; struct ucred *active_cred; struct thread *td; { struct vnode *vp = fp->f_vnode; struct vattr vattr; switch (vp->v_type) { case VREG: case VDIR: switch (com) { case FIONREAD: vn_lock(vp, LK_SHARED | LK_RETRY); error = VOP_GETATTR(vp, &vattr, active_cred); VOP_UNLOCK(vp, 0); if (!error) *(int *)data = vattr.va_size - fp->f_offset; return (error); case FIONBIO: case FIOASYNC: return (0); /* XXX */ default: return (VOP_IOCTL(vp, com, data, fp->f_flag, active_cred, td)); } default: return (ENOTTY); } } (The 'XXX' comment could perhaps be expanded to something along the lines of 'Allow fcntl() to toggle FNONBLOCK and FASYNC.') -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201305061355.20826.jhb>