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 | } |