From owner-p4-projects@FreeBSD.ORG Wed Jun 24 10:52:20 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BAD471065672; Wed, 24 Jun 2009 10:52:19 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7AE111065670 for ; Wed, 24 Jun 2009 10:52:19 +0000 (UTC) (envelope-from zhaoshuai@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 67B9D8FC27 for ; Wed, 24 Jun 2009 10:52:19 +0000 (UTC) (envelope-from zhaoshuai@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5OAqJuU078362 for ; Wed, 24 Jun 2009 10:52:19 GMT (envelope-from zhaoshuai@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5OAqJGY078360 for perforce@freebsd.org; Wed, 24 Jun 2009 10:52:19 GMT (envelope-from zhaoshuai@FreeBSD.org) Date: Wed, 24 Jun 2009 10:52:19 GMT Message-Id: <200906241052.n5OAqJGY078360@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zhaoshuai@FreeBSD.org using -f From: Zhao Shuai To: Perforce Change Reviews Cc: Subject: PERFORCE change 165040 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Jun 2009 10:52:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=165040 Change 165040 by zhaoshuai@zhaoshuai on 2009/06/24 10:51:32 keep the order of fifo functions as its original version. Affected files ... .. //depot/projects/soc2009/fifo/sys/fs/fifofs/fifo_vnops.c#18 edit Differences ... ==== //depot/projects/soc2009/fifo/sys/fs/fifofs/fifo_vnops.c#18 (text+ko) ==== @@ -257,40 +257,6 @@ } /* - * Device close routine - */ -/* ARGSUSED */ -static int -fifo_close(ap) - struct vop_close_args /* { - struct vnode *a_vp; - int a_fflag; - struct ucred *a_cred; - struct thread *a_td; - } */ *ap; -{ - struct vnode *vp = ap->a_vp; - struct fifoinfo *fip = vp->v_fifoinfo; - - ASSERT_VOP_ELOCKED(vp, "fifo_close"); - if (ap->a_fflag & FREAD) { - fip->fi_readers--; - if (fip->fi_readers == 0) - pipe_close(fip->fi_rpipe); - } - if (ap->a_fflag & FWRITE) { - fip->fi_writers--; - if (fip->fi_writers == 0) - pipe_close(fip->fi_wpipe); - } - if (fip->fi_readers == 0 && fip->fi_writers == 0) { - vp->v_fifoinfo = NULL; - free(fip, M_VNODE); - } - return (0); -} - -/* * Now unused vnode ioctl routine. */ /* ARGSUSED */ @@ -326,8 +292,110 @@ return (EINVAL); } +static void +filt_fifodetach(struct knote *kn) +{ + struct pipe *pipe = (struct pipe *)kn->kn_hook; + + PIPE_LOCK(pipe); + knlist_remove(&pipe->pipe_sel.si_note, kn, 1); + PIPE_UNLOCK(pipe); +} + +static int +filt_fiforead(struct knote *kn, long hint) +{ + struct pipe *rpipe = (struct pipe *)kn->kn_hook; + struct pipe *wpipe = rpipe->pipe_peer; + int ret; + + PIPE_LOCK(rpipe); + kn->kn_data = rpipe->pipe_buffer.cnt; + if ((kn->kn_data == 0) && (rpipe->pipe_state & PIPE_DIRECTW)) + kn->kn_data = rpipe->pipe_map.cnt; + + if ((rpipe->pipe_state & PIPE_EOF) || + wpipe->pipe_present != PIPE_ACTIVE || + (wpipe->pipe_state & PIPE_EOF)) { + kn->kn_flags |= EV_EOF; + PIPE_UNLOCK(rpipe); + return (1); + } + ret = kn->kn_data > 0; + PIPE_UNLOCK(rpipe); + return ret; +} + +static int +filt_fifowrite(struct knote *kn, long hint) +{ + struct pipe *wpipe = (struct pipe *)kn->kn_hook; + + PIPE_LOCK(wpipe); + if (wpipe->pipe_present != PIPE_ACTIVE || + (wpipe->pipe_state & PIPE_EOF)) { + kn->kn_data = 0; + kn->kn_flags |= EV_EOF; + PIPE_UNLOCK(wpipe); + return (1); + } + kn->kn_data = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt; + if (wpipe->pipe_state & PIPE_DIRECTW) + kn->kn_data = 0; + + PIPE_UNLOCK(wpipe); + return (kn->kn_data >= PIPE_BUF); +} + +static void +filt_fifodetach_notsup(struct knote *kn) +{ + +} + +static int +filt_fifo_notsup(struct knote *kn, long hint) +{ + + return (0); +} + /* - * Print out internel contents of a fifo vnode + * Device close routine + */ +/* ARGSUSED */ +static int +fifo_close(ap) + struct vop_close_args /* { + struct vnode *a_vp; + int a_fflag; + struct ucred *a_cred; + struct thread *a_td; + } */ *ap; +{ + struct vnode *vp = ap->a_vp; + struct fifoinfo *fip = vp->v_fifoinfo; + + ASSERT_VOP_ELOCKED(vp, "fifo_close"); + if (ap->a_fflag & FREAD) { + fip->fi_readers--; + if (fip->fi_readers == 0) + pipe_close(fip->fi_rpipe); + } + if (ap->a_fflag & FWRITE) { + fip->fi_writers--; + if (fip->fi_writers == 0) + pipe_close(fip->fi_wpipe); + } + if (fip->fi_readers == 0 && fip->fi_writers == 0) { + vp->v_fifoinfo = NULL; + free(fip, M_VNODE); + } + return (0); +} + +/* + * Print out internal contents of a fifo vnode. */ int fifo_printinfo(struct vnode *vp) @@ -339,7 +407,7 @@ return (0); } printf(", fifo with %ld readers and %ld writers", - fip->fi_readers, fip->fi_writers); + fip->fi_readers, fip->fi_writers); return (0); } @@ -352,7 +420,7 @@ struct vnode *a_vp; } */ *ap; { - printf(" "); + printf(" "); fifo_printinfo(ap->a_vp); printf("\n"); return (0); @@ -393,10 +461,10 @@ fifo_advlock(ap) struct vop_advlock_args /* { struct vnode *a_vp; - caddr_t a_id; - int a_op; + caddr_t a_id; + int a_op; struct flock *a_fl; - int a_flags; + int a_flags; } */ *ap; { @@ -404,47 +472,6 @@ } static int -fifo_read_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, struct thread *td) -{ - - struct fifoinfo *fip = fp->f_data; - - /* The 4th argument of pipe_read is file flag */ - return (pipe_read(fip->fi_rpipe, uio, cred, fp->f_flag, td)); -} - -static int -fifo_write_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, struct thread *td) -{ - - struct fifoinfo *fip = fp->f_data; - - /* The 4th argument of pipe_write is file flag */ - return (pipe_write(fip->fi_wpipe, uio, cred, fp->f_flag, td)); -} - -static int -fifo_stat_f(struct file *fp, struct stat *sb, struct ucred *cred, struct thread *td) -{ - struct fifoinfo *fip = fp->f_data; - int error; - - error = pipe_stat(fip->fi_rpipe, sb, cred, td); - if (error) - return (error); - sb->st_uid = fp->f_cred->cr_uid; - sb->st_gid = fp->f_cred->cr_gid; - return (0); -} - -static int -fifo_truncate_f(struct file *fp, off_t length, struct ucred *cred, struct thread *td) -{ - - return (vnops.fo_truncate(fp, length, cred, td)); -} - -static int fifo_close_f(struct file *fp, struct thread *td) { @@ -463,10 +490,10 @@ */ static int fifo_ioctl_f(struct file *fp, u_long com, void *data, struct ucred *cred, - struct thread *td) + struct thread *td) { + int error = ENOTTY; struct fifoinfo *fip = fp->f_data; - int error = ENOTTY; switch (com) { case FIONBIO: @@ -552,86 +579,58 @@ return (0); } -static void -filt_fifodetach(struct knote *kn) +static int +fifo_poll_f(struct file *fp, int events, struct ucred *cred, struct thread *td) { - struct pipe *pipe = (struct pipe *)kn->kn_hook; + struct fifoinfo *fip = fp->f_data; + int levents, revents = 0; - PIPE_LOCK(pipe); - knlist_remove(&pipe->pipe_sel.si_note, kn, 1); - PIPE_UNLOCK(pipe); + levents = events & (POLLIN | POLLRDNORM); + if ((fp->f_flag & FREAD) && levents) + revents |= pipe_poll(fip->fi_rpipe, levents, cred, td); + levents = events & (POLLOUT | POLLWRNORM); + if ((fp->f_flag & FWRITE) && levents) + revents |= pipe_poll(fip->fi_wpipe, levents, cred, td); + return (revents); } static int -filt_fiforead(struct knote *kn, long hint) +fifo_read_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, struct thread *td) { - struct pipe *rpipe = (struct pipe *)kn->kn_hook; - struct pipe *wpipe = rpipe->pipe_peer; - int ret; - PIPE_LOCK(rpipe); - kn->kn_data = rpipe->pipe_buffer.cnt; - if ((kn->kn_data == 0) && (rpipe->pipe_state & PIPE_DIRECTW)) - kn->kn_data = rpipe->pipe_map.cnt; + struct fifoinfo *fip = fp->f_data; - if ((rpipe->pipe_state & PIPE_EOF) || - wpipe->pipe_present != PIPE_ACTIVE || - (wpipe->pipe_state & PIPE_EOF)) { - kn->kn_flags |= EV_EOF; - PIPE_UNLOCK(rpipe); - return (1); - } - ret = kn->kn_data > 0; - PIPE_UNLOCK(rpipe); - return ret; + /* The 4th argument of pipe_read is file flag */ + return (pipe_read(fip->fi_rpipe, uio, cred, fp->f_flag, td)); } static int -filt_fifowrite(struct knote *kn, long hint) +fifo_stat_f(struct file *fp, struct stat *sb, struct ucred *cred, struct thread *td) { - struct pipe *wpipe = (struct pipe *)kn->kn_hook; + struct fifoinfo *fip = fp->f_data; + int error; - PIPE_LOCK(wpipe); - if (wpipe->pipe_present != PIPE_ACTIVE || - (wpipe->pipe_state & PIPE_EOF)) { - kn->kn_data = 0; - kn->kn_flags |= EV_EOF; - PIPE_UNLOCK(wpipe); - return (1); - } - kn->kn_data = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt; - if (wpipe->pipe_state & PIPE_DIRECTW) - kn->kn_data = 0; - - PIPE_UNLOCK(wpipe); - return (kn->kn_data >= PIPE_BUF); + error = pipe_stat(fip->fi_rpipe, sb, cred, td); + if (error) + return (error); + sb->st_uid = fp->f_cred->cr_uid; + sb->st_gid = fp->f_cred->cr_gid; + return (0); } -static void -filt_fifodetach_notsup(struct knote *kn) +static int +fifo_truncate_f(struct file *fp, off_t length, struct ucred *cred, struct thread *td) { - + + return (vnops.fo_truncate(fp, length, cred, td)); } static int -filt_fifo_notsup(struct knote *kn, long hint) +fifo_write_f(struct file *fp, struct uio *uio, struct ucred *cred, int flags, struct thread *td) { - return (0); -} - -static int -fifo_poll_f(struct file *fp, int events, struct ucred *cred, struct thread *td) -{ struct fifoinfo *fip = fp->f_data; - int levents, revents = 0; - levents = events & (POLLIN | POLLRDNORM); - if ((fp->f_flag & FREAD) && levents) - revents |= pipe_poll(fip->fi_rpipe, levents, cred, td); - levents = events & (POLLOUT | POLLWRNORM); - if ((fp->f_flag & FWRITE) && levents) - revents |= pipe_poll(fip->fi_wpipe, levents, cred, td); - return (revents); + /* The 4th argument of pipe_write is file flag */ + return (pipe_write(fip->fi_wpipe, uio, cred, fp->f_flag, td)); } -