--- linux/fs/pipe.c 2018/04/24 18:00:53 1.1.1.2 +++ linux/fs/pipe.c 2018/04/24 18:02:43 1.1.1.3 @@ -5,10 +5,13 @@ */ #include +#include +#include #include #include /* for get_free_page */ #include +#include int read_pipe(struct m_inode * inode, char * buf, int count) { @@ -16,10 +19,12 @@ int read_pipe(struct m_inode * inode, ch while (count>0) { while (!(size=PIPE_SIZE(*inode))) { - wake_up(&inode->i_wait); + wake_up(& PIPE_WRITE_WAIT(*inode)); if (inode->i_count != 2) /* are there any writers? */ return read; - sleep_on(&inode->i_wait); + if (current->signal & ~current->blocked) + return read?read:-ERESTARTSYS; + interruptible_sleep_on(& PIPE_READ_WAIT(*inode)); } chars = PAGE_SIZE-PIPE_TAIL(*inode); if (chars > count) @@ -34,7 +39,7 @@ int read_pipe(struct m_inode * inode, ch while (chars-->0) put_fs_byte(((char *)inode->i_size)[size++],buf++); } - wake_up(&inode->i_wait); + wake_up(& PIPE_WRITE_WAIT(*inode)); return read; } @@ -44,12 +49,12 @@ int write_pipe(struct m_inode * inode, c while (count>0) { while (!(size=(PAGE_SIZE-1)-PIPE_SIZE(*inode))) { - wake_up(&inode->i_wait); + wake_up(& PIPE_READ_WAIT(*inode)); if (inode->i_count != 2) { /* no readers */ current->signal |= (1<<(SIGPIPE-1)); return written?written:-1; } - sleep_on(&inode->i_wait); + sleep_on(& PIPE_WRITE_WAIT(*inode)); } chars = PAGE_SIZE-PIPE_HEAD(*inode); if (chars > count) @@ -64,7 +69,7 @@ int write_pipe(struct m_inode * inode, c while (chars-->0) ((char *)inode->i_size)[size++]=get_fs_byte(buf++); } - wake_up(&inode->i_wait); + wake_up(& PIPE_READ_WAIT(*inode)); return written; } @@ -109,3 +114,15 @@ int sys_pipe(unsigned long * fildes) put_fs_long(fd[1],1+fildes); return 0; } + +int pipe_ioctl(struct m_inode *pino, int cmd, int arg) +{ + switch (cmd) { + case FIONREAD: + verify_area((void *) arg,4); + put_fs_long(PIPE_SIZE(*pino),(unsigned long *) arg); + return 0; + default: + return -EINVAL; + } +}