--- linux/fs/inode.c 2018/04/24 18:08:40 1.1.1.9 +++ linux/fs/inode.c 2018/04/24 18:14:06 1.1.1.12 @@ -1,15 +1,15 @@ /* * linux/fs/inode.c * - * (C) 1991 Linus Torvalds + * Copyright (C) 1991, 1992 Linus Torvalds */ -#include #include - #include #include #include +#include + #include struct inode inode_table[NR_INODE]={{0,},}; @@ -100,7 +100,7 @@ void sync_inodes(void) inode = 0+inode_table; for(i=0 ; ii_dirt && !inode->i_pipe) + if (inode->i_dirt) write_inode(inode); } } @@ -117,29 +117,28 @@ void iput(struct inode * inode) return; } if (inode->i_pipe) { - wake_up(&inode->i_wait); - wake_up(&inode->i_wait2); - if (--inode->i_count) - return; - free_page(inode->i_size); - inode->i_count=0; - inode->i_dirt=0; - inode->i_pipe=0; - return; + wake_up(&PIPE_READ_WAIT(*inode)); + wake_up(&PIPE_WRITE_WAIT(*inode)); } - if (!inode->i_dev) { +repeat: + if (inode->i_count>1) { inode->i_count--; return; } -repeat: - if (inode->i_count>1) { + if (inode->i_pipe) { + unsigned long page = (unsigned long) PIPE_BASE(*inode); + PIPE_BASE(*inode) = NULL; + free_page(page); + } + if (!inode->i_dev) { inode->i_count--; return; } if (!inode->i_nlink) { - if (inode->i_sb && inode->i_sb->s_op && inode->i_sb->s_op->put_inode) + if (inode->i_sb && inode->i_sb->s_op && inode->i_sb->s_op->put_inode) { inode->i_sb->s_op->put_inode(inode); - return; + return; + } } if (inode->i_dirt) { write_inode(inode); /* we can sleep - so do again */ @@ -190,12 +189,14 @@ struct inode * get_pipe_inode(void) if (!(inode = get_empty_inode())) return NULL; - if (!(inode->i_size=get_free_page())) { + 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; return inode; } @@ -253,6 +254,7 @@ struct inode * iget(int dev,int nr) } inode->i_dev = dev; inode->i_ino = nr; + inode->i_flags = inode->i_sb->s_flags; read_inode(inode); return inode; }