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>
