--- linux/fs/inode.c 2018/04/24 18:12:11 1.1.1.11 +++ linux/fs/inode.c 2018/04/24 18:14:06 1.1.1.12 @@ -117,8 +117,8 @@ void iput(struct inode * inode) return; } if (inode->i_pipe) { - wake_up(&inode->i_wait); - wake_up(&inode->i_wait2); + wake_up(&PIPE_READ_WAIT(*inode)); + wake_up(&PIPE_WRITE_WAIT(*inode)); } repeat: if (inode->i_count>1) { @@ -126,8 +126,9 @@ repeat: return; } if (inode->i_pipe) { - free_page(inode->i_size); - inode->i_size = 0; + unsigned long page = (unsigned long) PIPE_BASE(*inode); + PIPE_BASE(*inode) = NULL; + free_page(page); } if (!inode->i_dev) { inode->i_count--; @@ -188,11 +189,12 @@ struct inode * get_pipe_inode(void) if (!(inode = get_empty_inode())) return NULL; - if (!(inode->i_size = get_free_page(GFP_USER))) { + if (!(PIPE_BASE(*inode) = (char *) get_free_page(GFP_USER))) { inode->i_count = 0; return NULL; } inode->i_count = 2; /* sum of readers/writers */ + PIPE_READ_WAIT(*inode) = PIPE_WRITE_WAIT(*inode) = NULL; PIPE_HEAD(*inode) = PIPE_TAIL(*inode) = 0; PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 1; inode->i_pipe = 1;