From owner-p4-projects@FreeBSD.ORG Sun May 31 13:20:19 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 913E71065674; Sun, 31 May 2009 13:20: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 4D6B3106564A for ; Sun, 31 May 2009 13:20: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 3A7B08FC0C for ; Sun, 31 May 2009 13:20: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 n4VDKJxN076068 for ; Sun, 31 May 2009 13:20:19 GMT (envelope-from zhaoshuai@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n4VDKJVU076066 for perforce@freebsd.org; Sun, 31 May 2009 13:20:19 GMT (envelope-from zhaoshuai@FreeBSD.org) Date: Sun, 31 May 2009 13:20:19 GMT Message-Id: <200905311320.n4VDKJVU076066@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 163165 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: Sun, 31 May 2009 13:20:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=163165 Change 163165 by zhaoshuai@zhaoshuai on 2009/05/31 13:20:06 new version of subr_pipe.c and sys_pipe.c, tested Affected files ... .. //depot/projects/soc2009/fifo/sys/conf/files#3 edit .. //depot/projects/soc2009/fifo/sys/kern/subr_pipe.c#2 edit .. //depot/projects/soc2009/fifo/sys/kern/sys_pipe.c#5 edit .. //depot/projects/soc2009/fifo/sys/sys/pipe.h#4 edit Differences ... ==== //depot/projects/soc2009/fifo/sys/conf/files#3 (text+ko) ==== @@ -1988,6 +1988,7 @@ kern/subr_msgbuf.c standard kern/subr_param.c standard kern/subr_pcpu.c standard +kern/subr_pipe.c standard kern/subr_power.c standard kern/subr_prf.c standard kern/subr_prof.c standard ==== //depot/projects/soc2009/fifo/sys/kern/subr_pipe.c#2 (text+ko) ==== @@ -175,7 +175,6 @@ &piperesizeallowed, 0, "Pipe resizing allowed"); static void pipeinit(void *dummy __unused); -static void pipeclose(struct pipe *cpipe); static void pipe_free_kmem(struct pipe *cpipe); static int pipe_create(struct pipe *pipe, int backing); static __inline int pipelock(struct pipe *cpipe, int catch); @@ -446,7 +445,6 @@ return (error); } -/* ARGSUSED */ int generic_pipe_read(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td) @@ -1261,7 +1259,7 @@ * We shouldn't need locks here as we're doing a read and this should * be a natural race. */ -static int +int generic_pipe_stat(struct file *fp, struct stat *ub, struct ucred *active_cred, struct thread *td) { @@ -1323,8 +1321,7 @@ * shutdown the pipe */ void -pipeclose(cpipe) - struct pipe *cpipe; +pipeclose(struct pipe *cpipe) { struct pipepair *pp; struct pipe *ppipe; @@ -1489,23 +1486,25 @@ } int -generic_pipe_create(struct pipepair **p_pp, struct thread *td) +generic_pipe_create(struct thread *td, struct pipe **p_rpipe, struct pipe **p_wpipe) { struct pipepair *pp; struct pipe *rpipe, *wpipe; + int error; pp = uma_zalloc(pipe_zone, M_WAITOK); - *p_pp = pp; rpipe = &pp->pp_rpipe; wpipe = &pp->pp_wpipe; + *p_rpipe = rpipe; + *p_wpipe = wpipe; knlist_init(&rpipe->pipe_sel.si_note, PIPE_MTX(rpipe), NULL, NULL, NULL); knlist_init(&wpipe->pipe_sel.si_note, PIPE_MTX(wpipe), NULL, NULL, NULL); - if (pipe_create(rpipe, 1) != 0 || - pipe_create(wpipe, 0) != 0) { + if ((error = pipe_create(rpipe, 1)) != 0 || + (error = pipe_create(wpipe, 0)) != 0) { pipeclose(rpipe); pipeclose(wpipe); return (error); ==== //depot/projects/soc2009/fifo/sys/kern/sys_pipe.c#5 (text+ko) ==== @@ -74,16 +74,16 @@ { struct filedesc *fdp = td->td_proc->p_fd; struct file *rf, *wf; - struct pipepair *pp; + struct pipe *rpipe, *wpipe; int fd, error; - if ((error = generic_pipe_create(&pp, td)) != 0) + if ((error = generic_pipe_create(td, &rpipe, &wpipe)) != 0) return (error); error = falloc(td, &rf, &fd); if (error) { - pipeclose(&pp->rpipe); - pipeclose(&pp->wpipe); + pipeclose(rpipe); + pipeclose(wpipe); return (error); } /* An extra reference on `rf' has been held for us by falloc(). */ @@ -95,17 +95,17 @@ * to avoid races against processes which manage to dup() the read * side while we are blocked trying to allocate the write side. */ - finit(rf, FREAD | FWRITE, DTYPE_PIPE, &pp->rpipe, &pipeops); + finit(rf, FREAD | FWRITE, DTYPE_PIPE, rpipe, &pipeops); error = falloc(td, &wf, &fd); if (error) { fdclose(fdp, rf, fildes[0], td); fdrop(rf, td); /* rpipe has been closed by fdrop(). */ - pipeclose(&pp->wpipe); + pipeclose(wpipe); return (error); } /* An extra reference on `wf' has been held for us by falloc(). */ - finit(wf, FREAD | FWRITE, DTYPE_PIPE, &pp->wpipe, &pipeops); + finit(wf, FREAD | FWRITE, DTYPE_PIPE, wpipe, &pipeops); fdrop(wf, td); fildes[1] = fd; fdrop(rf, td); @@ -175,6 +175,9 @@ return generic_pipe_stat(fp, ub, active_cred, td); } +/* + * TODO: implement generic_pipe_close() in subr_pipe.c + */ static int pipe_close(struct file *fp, struct thread *td) { ==== //depot/projects/soc2009/fifo/sys/sys/pipe.h#4 (text+ko) ==== @@ -139,13 +139,20 @@ #define PIPE_UNLOCK(pipe) mtx_unlock(PIPE_MTX(pipe)) #define PIPE_LOCK_ASSERT(pipe, type) mtx_assert(PIPE_MTX(pipe), (type)) -/* - * The following functions are used by FIFO, - * see fs/fifo_vnops.c - */ -struct pipepair *pipepair_create(void); -fo_rdwr_t pipe_read; -fo_rdwr_t pipe_write; -void pipeclose(struct pipe *); +void pipeclose(struct pipe *cpipe); +int generic_pipe_read(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td); +int generic_pipe_write(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td); +int generic_pipe_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td); +int generic_pipe_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred, + struct thread *td); +int generic_pipe_poll(struct file *fp, int events, struct ucred *active_cred, + struct thread *td); +int generic_pipe_stat(struct file *fp, struct stat *ub, struct ucred *active_cred, + struct thread *td); +int generic_pipe_kqfilter(struct file *fp, struct knote *kn); +int generic_pipe_create(struct thread *td, struct pipe **p_rpipe, struct pipe **p_wpipe); #endif /* !_SYS_PIPE_H_ */