OSDN Git Service

f2fs: refactor ->page_mkwrite() flow
authorChao Yu <yuchao0@huawei.com>
Thu, 27 Sep 2018 10:33:18 +0000 (18:33 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 1 Oct 2018 01:41:22 +0000 (18:41 -0700)
commit39a8695824510a951ded696d69b8dea3c720b109
treefa3be21e5cf852b521c4d031b63b29521d4e5f94
parentbab475c5414e8d1fa182fd17ae966864e9c85741
f2fs: refactor ->page_mkwrite() flow

Thread A Thread B
- f2fs_vm_page_mkwrite
- f2fs_setattr
 - down_write(i_mmap_sem)
 - truncate_setsize
 - f2fs_truncate
 - up_write(i_mmap_sem)
 - f2fs_reserve_block
 reserve NEW_ADDR
 - skip dirty page due to truncation

1. we don't need to rserve new block address for a truncated page.
2. dn.data_blkaddr is used out of node page lock coverage.

Refactor ->page_mkwrite() flow to fix above issues:
- use __do_map_lock() to avoid racing checkpoint()
- lock data page in prior to dnode page
- cover f2fs_reserve_block with i_mmap_sem lock
- wait page writeback before zeroing page

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/file.c