f2fs: return directly if block has been removed from the victim
If one block has been to written to a new place, just return in move data process. This patch check it again with holding page lock. Signed-off-by: Yunlei He <heyunlei@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
d47b871595
commit
2061471128
16
fs/f2fs/gc.c
16
fs/f2fs/gc.c
|
@ -544,7 +544,8 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_encrypted_block(struct inode *inode, block_t bidx)
|
static void move_encrypted_block(struct inode *inode, block_t bidx,
|
||||||
|
unsigned int segno, int off)
|
||||||
{
|
{
|
||||||
struct f2fs_io_info fio = {
|
struct f2fs_io_info fio = {
|
||||||
.sbi = F2FS_I_SB(inode),
|
.sbi = F2FS_I_SB(inode),
|
||||||
|
@ -565,6 +566,9 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
|
||||||
if (!page)
|
if (!page)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!check_valid_map(F2FS_I_SB(inode), segno, off))
|
||||||
|
goto out;
|
||||||
|
|
||||||
set_new_dnode(&dn, inode, NULL, NULL, 0);
|
set_new_dnode(&dn, inode, NULL, NULL, 0);
|
||||||
err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);
|
err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -645,7 +649,8 @@ out:
|
||||||
f2fs_put_page(page, 1);
|
f2fs_put_page(page, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_data_page(struct inode *inode, block_t bidx, int gc_type)
|
static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
|
||||||
|
unsigned int segno, int off)
|
||||||
{
|
{
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
|
@ -653,6 +658,9 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type)
|
||||||
if (IS_ERR(page))
|
if (IS_ERR(page))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!check_valid_map(F2FS_I_SB(inode), segno, off))
|
||||||
|
goto out;
|
||||||
|
|
||||||
if (gc_type == BG_GC) {
|
if (gc_type == BG_GC) {
|
||||||
if (PageWriteback(page))
|
if (PageWriteback(page))
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -796,9 +804,9 @@ next_step:
|
||||||
start_bidx = start_bidx_of_node(nofs, inode)
|
start_bidx = start_bidx_of_node(nofs, inode)
|
||||||
+ ofs_in_node;
|
+ ofs_in_node;
|
||||||
if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
|
if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
|
||||||
move_encrypted_block(inode, start_bidx);
|
move_encrypted_block(inode, start_bidx, segno, off);
|
||||||
else
|
else
|
||||||
move_data_page(inode, start_bidx, gc_type);
|
move_data_page(inode, start_bidx, gc_type, segno, off);
|
||||||
|
|
||||||
if (locked) {
|
if (locked) {
|
||||||
up_write(&fi->dio_rwsem[WRITE]);
|
up_write(&fi->dio_rwsem[WRITE]);
|
||||||
|
|
Loading…
Reference in New Issue