Skip to content

Commit e53c568

Browse files
Yi SunJaegeuk Kim
authored andcommitted
f2fs: add parameter @len to f2fs_invalidate_blocks()
New function can process some consecutive blocks at a time. Function f2fs_invalidate_blocks()->down_write() and up_write() are very time-consuming, so if f2fs_invalidate_blocks() can process consecutive blocks at one time, it will save a lot of time. Signed-off-by: Yi Sun <[email protected]> Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 81ffbd2 commit e53c568

File tree

5 files changed

+35
-16
lines changed

5 files changed

+35
-16
lines changed

fs/f2fs/compress.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,7 +1380,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
13801380
if (blkaddr == COMPRESS_ADDR)
13811381
fio.compr_blocks++;
13821382
if (__is_valid_data_blkaddr(blkaddr))
1383-
f2fs_invalidate_blocks(sbi, blkaddr);
1383+
f2fs_invalidate_blocks(sbi, blkaddr, 1);
13841384
f2fs_update_data_blkaddr(&dn, COMPRESS_ADDR);
13851385
goto unlock_continue;
13861386
}
@@ -1390,7 +1390,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
13901390

13911391
if (i > cc->valid_nr_cpages) {
13921392
if (__is_valid_data_blkaddr(blkaddr)) {
1393-
f2fs_invalidate_blocks(sbi, blkaddr);
1393+
f2fs_invalidate_blocks(sbi, blkaddr, 1);
13941394
f2fs_update_data_blkaddr(&dn, NEW_ADDR);
13951395
}
13961396
goto unlock_continue;

fs/f2fs/f2fs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3724,7 +3724,8 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi, nid_t ino);
37243724
int f2fs_create_flush_cmd_control(struct f2fs_sb_info *sbi);
37253725
int f2fs_flush_device_cache(struct f2fs_sb_info *sbi);
37263726
void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free);
3727-
void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr);
3727+
void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr,
3728+
unsigned int len);
37283729
bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr);
37293730
int f2fs_start_discard_thread(struct f2fs_sb_info *sbi);
37303731
void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi);

fs/f2fs/file.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count)
652652
valid_blocks++;
653653
}
654654

655-
f2fs_invalidate_blocks(sbi, blkaddr);
655+
f2fs_invalidate_blocks(sbi, blkaddr, 1);
656656

657657
if (!released || blkaddr != COMPRESS_ADDR)
658658
nr_free++;
@@ -750,7 +750,7 @@ int f2fs_do_truncate_blocks(struct inode *inode, u64 from, bool lock)
750750
unsigned int i;
751751

752752
for (i = 0; i < ei.len; i++)
753-
f2fs_invalidate_blocks(sbi, ei.blk + i);
753+
f2fs_invalidate_blocks(sbi, ei.blk + i, 1);
754754

755755
dec_valid_block_count(sbi, inode, ei.len);
756756
f2fs_update_time(sbi, REQ_TIME);
@@ -1323,7 +1323,7 @@ static int __roll_back_blkaddrs(struct inode *inode, block_t *blkaddr,
13231323
ret = f2fs_get_dnode_of_data(&dn, off + i, LOOKUP_NODE_RA);
13241324
if (ret) {
13251325
dec_valid_block_count(sbi, inode, 1);
1326-
f2fs_invalidate_blocks(sbi, *blkaddr);
1326+
f2fs_invalidate_blocks(sbi, *blkaddr, 1);
13271327
} else {
13281328
f2fs_update_data_blkaddr(&dn, *blkaddr);
13291329
}
@@ -1575,7 +1575,7 @@ static int f2fs_do_zero_range(struct dnode_of_data *dn, pgoff_t start,
15751575
break;
15761576
}
15771577

1578-
f2fs_invalidate_blocks(sbi, dn->data_blkaddr);
1578+
f2fs_invalidate_blocks(sbi, dn->data_blkaddr, 1);
15791579
f2fs_set_data_blkaddr(dn, NEW_ADDR);
15801580
}
15811581

fs/f2fs/node.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,7 @@ static int truncate_node(struct dnode_of_data *dn)
917917
}
918918

919919
/* Deallocate node address */
920-
f2fs_invalidate_blocks(sbi, ni.blk_addr);
920+
f2fs_invalidate_blocks(sbi, ni.blk_addr, 1);
921921
dec_valid_node_count(sbi, dn->inode, dn->nid == dn->inode->i_ino);
922922
set_node_addr(sbi, &ni, NULL_ADDR, false);
923923

@@ -2765,7 +2765,7 @@ int f2fs_recover_xattr_data(struct inode *inode, struct page *page)
27652765
if (err)
27662766
return err;
27672767

2768-
f2fs_invalidate_blocks(sbi, ni.blk_addr);
2768+
f2fs_invalidate_blocks(sbi, ni.blk_addr, 1);
27692769
dec_valid_node_count(sbi, inode, false);
27702770
set_node_addr(sbi, &ni, NULL_ADDR, false);
27712771

fs/f2fs/segment.c

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ static int __replace_atomic_write_block(struct inode *inode, pgoff_t index,
245245
if (!__is_valid_data_blkaddr(new_addr)) {
246246
if (new_addr == NULL_ADDR)
247247
dec_valid_block_count(sbi, inode, 1);
248-
f2fs_invalidate_blocks(sbi, dn.data_blkaddr);
248+
f2fs_invalidate_blocks(sbi, dn.data_blkaddr, 1);
249249
f2fs_update_data_blkaddr(&dn, new_addr);
250250
} else {
251251
f2fs_replace_block(sbi, &dn, dn.data_blkaddr,
@@ -2567,25 +2567,43 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
25672567
get_sec_entry(sbi, segno)->valid_blocks += del;
25682568
}
25692569

2570-
void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr)
2570+
void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr,
2571+
unsigned int len)
25712572
{
25722573
unsigned int segno = GET_SEGNO(sbi, addr);
25732574
struct sit_info *sit_i = SIT_I(sbi);
2575+
block_t addr_start = addr, addr_end = addr + len - 1;
2576+
unsigned int seg_num = GET_SEGNO(sbi, addr_end) - segno + 1;
2577+
unsigned int i = 1, max_blocks = sbi->blocks_per_seg, cnt;
25742578

25752579
f2fs_bug_on(sbi, addr == NULL_ADDR);
25762580
if (addr == NEW_ADDR || addr == COMPRESS_ADDR)
25772581
return;
25782582

2579-
f2fs_invalidate_internal_cache(sbi, addr, 1);
2583+
f2fs_invalidate_internal_cache(sbi, addr, len);
25802584

25812585
/* add it into sit main buffer */
25822586
down_write(&sit_i->sentry_lock);
25832587

2584-
update_segment_mtime(sbi, addr, 0);
2585-
update_sit_entry(sbi, addr, -1);
2588+
if (seg_num == 1)
2589+
cnt = len;
2590+
else
2591+
cnt = max_blocks - GET_BLKOFF_FROM_SEG0(sbi, addr);
25862592

2587-
/* add it into dirty seglist */
2588-
locate_dirty_segment(sbi, segno);
2593+
do {
2594+
update_segment_mtime(sbi, addr_start, 0);
2595+
update_sit_entry(sbi, addr_start, -cnt);
2596+
2597+
/* add it into dirty seglist */
2598+
locate_dirty_segment(sbi, segno);
2599+
2600+
/* update @addr_start and @cnt and @segno */
2601+
addr_start = START_BLOCK(sbi, ++segno);
2602+
if (++i == seg_num)
2603+
cnt = GET_BLKOFF_FROM_SEG0(sbi, addr_end) + 1;
2604+
else
2605+
cnt = max_blocks;
2606+
} while (i <= seg_num);
25892607

25902608
up_write(&sit_i->sentry_lock);
25912609
}

0 commit comments

Comments
 (0)