Commit 5dc23bdd5f846ef868e82f789dfd9b13093f9ba6
Committed by
Theodore Ts'o
1 parent
c724585b62
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
ext4: remove ext4_ioend_wait()
Now that we clear PageWriteback after extent conversion, there's no need to wait for io_end processing in ext4_evict_inode(). Running AIO/DIO keeps file reference until aio_complete() is called so ext4_evict_inode() cannot be called. For io_end structures resulting from buffered IO waiting is happening because we wait for PageWriteback in truncate_inode_pages(). Reviewed-by: Zheng Liu <wenqing.lz@taobao.com> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Showing 3 changed files with 3 additions and 22 deletions Side-by-side Diff
fs/ext4/ext4.h
... | ... | @@ -2651,7 +2651,6 @@ |
2651 | 2651 | /* page-io.c */ |
2652 | 2652 | extern int __init ext4_init_pageio(void); |
2653 | 2653 | extern void ext4_exit_pageio(void); |
2654 | -extern void ext4_ioend_shutdown(struct inode *); | |
2655 | 2654 | extern ext4_io_end_t *ext4_init_io_end(struct inode *inode, gfp_t flags); |
2656 | 2655 | extern ext4_io_end_t *ext4_get_io_end(ext4_io_end_t *io_end); |
2657 | 2656 | extern int ext4_put_io_end(ext4_io_end_t *io_end); |
fs/ext4/inode.c
... | ... | @@ -215,7 +215,8 @@ |
215 | 215 | filemap_write_and_wait(&inode->i_data); |
216 | 216 | } |
217 | 217 | truncate_inode_pages(&inode->i_data, 0); |
218 | - ext4_ioend_shutdown(inode); | |
218 | + | |
219 | + WARN_ON(atomic_read(&EXT4_I(inode)->i_ioend_count)); | |
219 | 220 | goto no_delete; |
220 | 221 | } |
221 | 222 | |
222 | 223 | |
... | ... | @@ -225,8 +226,8 @@ |
225 | 226 | if (ext4_should_order_data(inode)) |
226 | 227 | ext4_begin_ordered_truncate(inode, 0); |
227 | 228 | truncate_inode_pages(&inode->i_data, 0); |
228 | - ext4_ioend_shutdown(inode); | |
229 | 229 | |
230 | + WARN_ON(atomic_read(&EXT4_I(inode)->i_ioend_count)); | |
230 | 231 | if (is_bad_inode(inode)) |
231 | 232 | goto no_delete; |
232 | 233 |
fs/ext4/page-io.c
... | ... | @@ -46,25 +46,6 @@ |
46 | 46 | } |
47 | 47 | |
48 | 48 | /* |
49 | - * This function is called by ext4_evict_inode() to make sure there is | |
50 | - * no more pending I/O completion work left to do. | |
51 | - */ | |
52 | -void ext4_ioend_shutdown(struct inode *inode) | |
53 | -{ | |
54 | - wait_queue_head_t *wq = ext4_ioend_wq(inode); | |
55 | - | |
56 | - wait_event(*wq, (atomic_read(&EXT4_I(inode)->i_ioend_count) == 0)); | |
57 | - /* | |
58 | - * We need to make sure the work structure is finished being | |
59 | - * used before we let the inode get destroyed. | |
60 | - */ | |
61 | - if (work_pending(&EXT4_I(inode)->i_rsv_conversion_work)) | |
62 | - cancel_work_sync(&EXT4_I(inode)->i_rsv_conversion_work); | |
63 | - if (work_pending(&EXT4_I(inode)->i_unrsv_conversion_work)) | |
64 | - cancel_work_sync(&EXT4_I(inode)->i_unrsv_conversion_work); | |
65 | -} | |
66 | - | |
67 | -/* | |
68 | 49 | * Print an buffer I/O error compatible with the fs/buffer.c. This |
69 | 50 | * provides compatibility with dmesg scrapers that look for a specific |
70 | 51 | * buffer I/O error message. We really need a unified error reporting |