there's no apparent need to take a file descriptor table lock before we've done allocating pipe structures and buffers. ok?
Index: sys/kern/sys_pipe.c =================================================================== RCS file: /home/cvs/src/sys/kern/sys_pipe.c,v retrieving revision 1.61 diff -u -p -r1.61 sys_pipe.c --- sys/kern/sys_pipe.c 8 Jul 2011 19:00:09 -0000 1.61 +++ sys/kern/sys_pipe.c 11 Apr 2012 18:44:23 -0000 @@ -108,11 +108,9 @@ sys_pipe(struct proc *p, void *v, regist } */ *uap = v; struct filedesc *fdp = p->p_fd; struct file *rf, *wf; - struct pipe *rpipe, *wpipe; + struct pipe *rpipe = NULL, *wpipe = NULL; int fds[2], error; - fdplock(fdp); - rpipe = pool_get(&pipe_pool, PR_WAITOK); error = pipe_create(rpipe); if (error != 0) @@ -120,7 +118,9 @@ sys_pipe(struct proc *p, void *v, regist wpipe = pool_get(&pipe_pool, PR_WAITOK); error = pipe_create(wpipe); if (error != 0) - goto free2; + goto free1; + + fdplock(fdp); error = falloc(p, &rf, &fds[0]); if (error != 0) @@ -157,11 +157,12 @@ free3: closef(rf, p); rpipe = NULL; free2: - (void)pipeclose(wpipe); + fdpunlock(fdp); free1: + if (wpipe != NULL) + (void)pipeclose(wpipe); if (rpipe != NULL) (void)pipeclose(rpipe); - fdpunlock(fdp); return (error); }