svn commit: r250220 - head/sys/kern
John Baldwin
jhb at freebsd.org
Mon May 6 17:55:24 UTC 2013
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
More information about the svn-src-head
mailing list