--- linux/fs/pipe.c 2018/04/24 18:02:43 1.1.1.3 +++ linux/fs/pipe.c 2018/04/24 18:03:41 1.1.1.4 @@ -7,25 +7,26 @@ #include #include #include +#include #include -#include /* for get_free_page */ #include #include -int read_pipe(struct m_inode * inode, char * buf, int count) +int pipe_read(struct inode * inode, struct file * filp, char * buf, int count) { int chars, size, read = 0; - while (count>0) { - while (!(size=PIPE_SIZE(*inode))) { + if (!(filp->f_flags & O_NONBLOCK)) + while (!PIPE_SIZE(*inode)) { wake_up(& PIPE_WRITE_WAIT(*inode)); if (inode->i_count != 2) /* are there any writers? */ - return read; + return 0; if (current->signal & ~current->blocked) - return read?read:-ERESTARTSYS; + return -ERESTARTSYS; interruptible_sleep_on(& PIPE_READ_WAIT(*inode)); } + while (count>0 && (size = PIPE_SIZE(*inode))) { chars = PAGE_SIZE-PIPE_TAIL(*inode); if (chars > count) chars = count; @@ -43,7 +44,7 @@ int read_pipe(struct m_inode * inode, ch return read; } -int write_pipe(struct m_inode * inode, char * buf, int count) +int pipe_write(struct inode * inode, struct file * filp, char * buf, int count) { int chars, size, written = 0; @@ -52,9 +53,11 @@ int write_pipe(struct m_inode * inode, c wake_up(& PIPE_READ_WAIT(*inode)); if (inode->i_count != 2) { /* no readers */ current->signal |= (1<<(SIGPIPE-1)); - return written?written:-1; + return written?written:-EINTR; } - sleep_on(& PIPE_WRITE_WAIT(*inode)); + if (current->signal & ~current->blocked) + return written?written:-EINTR; + interruptible_sleep_on(&PIPE_WRITE_WAIT(*inode)); } chars = PAGE_SIZE-PIPE_HEAD(*inode); if (chars > count) @@ -75,7 +78,7 @@ int write_pipe(struct m_inode * inode, c int sys_pipe(unsigned long * fildes) { - struct m_inode * inode; + struct inode * inode; struct file * f[2]; int fd[2]; int i,j; @@ -115,7 +118,7 @@ int sys_pipe(unsigned long * fildes) return 0; } -int pipe_ioctl(struct m_inode *pino, int cmd, int arg) +int pipe_ioctl(struct inode *pino, int cmd, int arg) { switch (cmd) { case FIONREAD: