f2fs: allow write page cache when writting cp
This patch allow write data to normal file when writting new checkpoint. We relax three limitations for write_begin path: 1. data allocation 2. node allocation 3. variables in checkpoint Signed-off-by: Yunlei He <heyunlei@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Tento commit je obsažen v:
@@ -787,6 +787,21 @@ int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline void __do_map_lock(struct f2fs_sb_info *sbi, int flag, bool lock)
|
||||
{
|
||||
if (flag == F2FS_GET_BLOCK_PRE_AIO) {
|
||||
if (lock)
|
||||
down_read(&sbi->node_change);
|
||||
else
|
||||
up_read(&sbi->node_change);
|
||||
} else {
|
||||
if (lock)
|
||||
f2fs_lock_op(sbi);
|
||||
else
|
||||
f2fs_unlock_op(sbi);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* f2fs_map_blocks() now supported readahead/bmap/rw direct_IO with
|
||||
* f2fs_map_blocks structure.
|
||||
@@ -829,7 +844,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
|
||||
|
||||
next_dnode:
|
||||
if (create)
|
||||
f2fs_lock_op(sbi);
|
||||
__do_map_lock(sbi, flag, true);
|
||||
|
||||
/* When reading holes, we need its node page */
|
||||
set_new_dnode(&dn, inode, NULL, NULL, 0);
|
||||
@@ -939,7 +954,7 @@ skip:
|
||||
f2fs_put_dnode(&dn);
|
||||
|
||||
if (create) {
|
||||
f2fs_unlock_op(sbi);
|
||||
__do_map_lock(sbi, flag, false);
|
||||
f2fs_balance_fs(sbi, dn.node_changed);
|
||||
}
|
||||
goto next_dnode;
|
||||
@@ -948,7 +963,7 @@ sync_out:
|
||||
f2fs_put_dnode(&dn);
|
||||
unlock_out:
|
||||
if (create) {
|
||||
f2fs_unlock_op(sbi);
|
||||
__do_map_lock(sbi, flag, false);
|
||||
f2fs_balance_fs(sbi, dn.node_changed);
|
||||
}
|
||||
out:
|
||||
@@ -1688,7 +1703,7 @@ static int prepare_write_begin(struct f2fs_sb_info *sbi,
|
||||
|
||||
if (f2fs_has_inline_data(inode) ||
|
||||
(pos & PAGE_MASK) >= i_size_read(inode)) {
|
||||
f2fs_lock_op(sbi);
|
||||
__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, true);
|
||||
locked = true;
|
||||
}
|
||||
restart:
|
||||
@@ -1724,7 +1739,8 @@ restart:
|
||||
err = get_dnode_of_data(&dn, index, LOOKUP_NODE);
|
||||
if (err || dn.data_blkaddr == NULL_ADDR) {
|
||||
f2fs_put_dnode(&dn);
|
||||
f2fs_lock_op(sbi);
|
||||
__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO,
|
||||
true);
|
||||
locked = true;
|
||||
goto restart;
|
||||
}
|
||||
@@ -1738,7 +1754,7 @@ out:
|
||||
f2fs_put_dnode(&dn);
|
||||
unlock_out:
|
||||
if (locked)
|
||||
f2fs_unlock_op(sbi);
|
||||
__do_map_lock(sbi, F2FS_GET_BLOCK_PRE_AIO, false);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Odkázat v novém úkolu
Zablokovat Uživatele