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