diff options
Diffstat (limited to 'fs/logfs/readwrite.c')
| -rw-r--r-- | fs/logfs/readwrite.c | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index 0718d112a1a5..6127baf0e188 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c | |||
| @@ -1972,31 +1972,6 @@ static struct page *inode_to_page(struct inode *inode) | |||
| 1972 | return page; | 1972 | return page; |
| 1973 | } | 1973 | } |
| 1974 | 1974 | ||
| 1975 | /* Cheaper version of write_inode. All changes are concealed in | ||
| 1976 | * aliases, which are moved back. No write to the medium happens. | ||
| 1977 | */ | ||
| 1978 | void logfs_clear_inode(struct inode *inode) | ||
| 1979 | { | ||
| 1980 | struct super_block *sb = inode->i_sb; | ||
| 1981 | struct logfs_inode *li = logfs_inode(inode); | ||
| 1982 | struct logfs_block *block = li->li_block; | ||
| 1983 | struct page *page; | ||
| 1984 | |||
| 1985 | /* Only deleted files may be dirty at this point */ | ||
| 1986 | BUG_ON(inode->i_state & I_DIRTY && inode->i_nlink); | ||
| 1987 | if (!block) | ||
| 1988 | return; | ||
| 1989 | if ((logfs_super(sb)->s_flags & LOGFS_SB_FLAG_SHUTDOWN)) { | ||
| 1990 | block->ops->free_block(inode->i_sb, block); | ||
| 1991 | return; | ||
| 1992 | } | ||
| 1993 | |||
| 1994 | BUG_ON(inode->i_ino < LOGFS_RESERVED_INOS); | ||
| 1995 | page = inode_to_page(inode); | ||
| 1996 | BUG_ON(!page); /* FIXME: Use emergency page */ | ||
| 1997 | logfs_put_write_page(page); | ||
| 1998 | } | ||
| 1999 | |||
| 2000 | static int do_write_inode(struct inode *inode) | 1975 | static int do_write_inode(struct inode *inode) |
| 2001 | { | 1976 | { |
| 2002 | struct super_block *sb = inode->i_sb; | 1977 | struct super_block *sb = inode->i_sb; |
| @@ -2164,18 +2139,40 @@ static int do_delete_inode(struct inode *inode) | |||
| 2164 | * ZOMBIE inodes have already been deleted before and should remain dead, | 2139 | * ZOMBIE inodes have already been deleted before and should remain dead, |
| 2165 | * if it weren't for valid checking. No need to kill them again here. | 2140 | * if it weren't for valid checking. No need to kill them again here. |
| 2166 | */ | 2141 | */ |
| 2167 | void logfs_delete_inode(struct inode *inode) | 2142 | void logfs_evict_inode(struct inode *inode) |
| 2168 | { | 2143 | { |
| 2144 | struct super_block *sb = inode->i_sb; | ||
| 2169 | struct logfs_inode *li = logfs_inode(inode); | 2145 | struct logfs_inode *li = logfs_inode(inode); |
| 2146 | struct logfs_block *block = li->li_block; | ||
| 2147 | struct page *page; | ||
| 2170 | 2148 | ||
| 2171 | if (!(li->li_flags & LOGFS_IF_ZOMBIE)) { | 2149 | if (!inode->i_nlink) { |
| 2172 | li->li_flags |= LOGFS_IF_ZOMBIE; | 2150 | if (!(li->li_flags & LOGFS_IF_ZOMBIE)) { |
| 2173 | if (i_size_read(inode) > 0) | 2151 | li->li_flags |= LOGFS_IF_ZOMBIE; |
| 2174 | logfs_truncate(inode, 0); | 2152 | if (i_size_read(inode) > 0) |
| 2175 | do_delete_inode(inode); | 2153 | logfs_truncate(inode, 0); |
| 2154 | do_delete_inode(inode); | ||
| 2155 | } | ||
| 2176 | } | 2156 | } |
| 2177 | truncate_inode_pages(&inode->i_data, 0); | 2157 | truncate_inode_pages(&inode->i_data, 0); |
| 2178 | clear_inode(inode); | 2158 | end_writeback(inode); |
| 2159 | |||
| 2160 | /* Cheaper version of write_inode. All changes are concealed in | ||
| 2161 | * aliases, which are moved back. No write to the medium happens. | ||
| 2162 | */ | ||
| 2163 | /* Only deleted files may be dirty at this point */ | ||
| 2164 | BUG_ON(inode->i_state & I_DIRTY && inode->i_nlink); | ||
| 2165 | if (!block) | ||
| 2166 | return; | ||
| 2167 | if ((logfs_super(sb)->s_flags & LOGFS_SB_FLAG_SHUTDOWN)) { | ||
| 2168 | block->ops->free_block(inode->i_sb, block); | ||
| 2169 | return; | ||
| 2170 | } | ||
| 2171 | |||
| 2172 | BUG_ON(inode->i_ino < LOGFS_RESERVED_INOS); | ||
| 2173 | page = inode_to_page(inode); | ||
| 2174 | BUG_ON(!page); /* FIXME: Use emergency page */ | ||
| 2175 | logfs_put_write_page(page); | ||
| 2179 | } | 2176 | } |
| 2180 | 2177 | ||
| 2181 | void btree_write_block(struct logfs_block *block) | 2178 | void btree_write_block(struct logfs_block *block) |
| @@ -2272,7 +2269,6 @@ void logfs_cleanup_rw(struct super_block *sb) | |||
| 2272 | { | 2269 | { |
| 2273 | struct logfs_super *super = logfs_super(sb); | 2270 | struct logfs_super *super = logfs_super(sb); |
| 2274 | 2271 | ||
| 2275 | destroy_meta_inode(super->s_segfile_inode); | ||
| 2276 | logfs_mempool_destroy(super->s_block_pool); | 2272 | logfs_mempool_destroy(super->s_block_pool); |
| 2277 | logfs_mempool_destroy(super->s_shadow_pool); | 2273 | logfs_mempool_destroy(super->s_shadow_pool); |
| 2278 | } | 2274 | } |
