Skip site navigation (1)Skip section navigation (2)
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>