Commit b0683aa638b3326c6fc22e5290dfa75e08bd83f5
1 parent
661074e91b
Exists in
master
and in
4 other branches
new helper: end_writeback()
Essentially, the minimal variant of ->evict_inode(). It's a trimmed-down clear_inode(), sans any fs callbacks. Once it returns we know that no async writeback will be happening; every ->evict_inode() instance should do that once and do that before doing anything ->write_inode() could interfere with (e.g. freeing the on-disk inode). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 3 changed files with 14 additions and 1 deletions Side-by-side Diff
fs/hugetlbfs/inode.c
fs/inode.c
... | ... | @@ -294,6 +294,18 @@ |
294 | 294 | inodes_stat.nr_unused--; |
295 | 295 | } |
296 | 296 | |
297 | +void end_writeback(struct inode *inode) | |
298 | +{ | |
299 | + might_sleep(); | |
300 | + BUG_ON(inode->i_data.nrpages); | |
301 | + BUG_ON(!list_empty(&inode->i_data.private_list)); | |
302 | + BUG_ON(!(inode->i_state & I_FREEING)); | |
303 | + BUG_ON(inode->i_state & I_CLEAR); | |
304 | + inode_sync_wait(inode); | |
305 | + inode->i_state = I_FREEING | I_CLEAR; | |
306 | +} | |
307 | +EXPORT_SYMBOL(end_writeback); | |
308 | + | |
297 | 309 | /** |
298 | 310 | * clear_inode - clear an inode |
299 | 311 | * @inode: inode to clear |
include/linux/fs.h
... | ... | @@ -2184,6 +2184,7 @@ |
2184 | 2184 | extern void __iget(struct inode * inode); |
2185 | 2185 | extern void iget_failed(struct inode *); |
2186 | 2186 | extern void clear_inode(struct inode *); |
2187 | +extern void end_writeback(struct inode *); | |
2187 | 2188 | extern void destroy_inode(struct inode *); |
2188 | 2189 | extern void __destroy_inode(struct inode *); |
2189 | 2190 | extern struct inode *new_inode(struct super_block *); |