Messages in this thread Patch in this message | | | From | Chao Yu <> | Subject | [PATCH v2] f2fs: skip f2fs_preallocate_blocks() for overwrite case | Date | Fri, 4 Feb 2022 17:10:05 +0800 |
| |
There is potential hangtask happened during swapfile's writeback:
- loop_kthread_worker_fn - do_checkpoint - kthread_worker_fn - loop_queue_work - lo_rw_aio - f2fs_file_write_iter - f2fs_preallocate_blocks - f2fs_map_blocks - down_write - down_read - rwsem_down_read_slowpath - schedule
One cause is f2fs_preallocate_blocks() will always be called no matter the physical block addresses are allocated or not.
This patch tries to check whether block addresses are all allocated with i_size and i_blocks of inode, it's rough because blocks can be allocated beyond i_size, however, we can afford skipping block preallocation in this condition since it's not necessary to do preallocation all the time.
Signed-off-by: Chao Yu <chao@kernel.org> --- v2: - check overwrite case with i_size and i_blocks roughly. fs/f2fs/file.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index cfdc41f87f5d..09565d10611d 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -4390,6 +4390,16 @@ static int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *iter, int flag; int ret; + /* + * It tries to check whether block addresses are all allocated, + * it's rough because blocks can be allocated beyond i_size, + * however, we can afford skipping block preallocation since + * it's not necessary all the time. + */ + if (F2FS_BLK_ALIGN(i_size_read(inode)) == + SECTOR_TO_BLOCK(inode->i_blocks)) + return 0; + /* If it will be an out-of-place direct write, don't bother. */ if (dio && f2fs_lfs_mode(sbi)) return 0; -- 2.32.0
| |