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 _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"