diff options
Diffstat (limited to 'fs/f2fs/segment.c')
-rw-r--r-- | fs/f2fs/segment.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 1e264e761f71..9993f94848fc 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -335,13 +335,26 @@ static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno) | |||
335 | mutex_unlock(&dirty_i->seglist_lock); | 335 | mutex_unlock(&dirty_i->seglist_lock); |
336 | } | 336 | } |
337 | 337 | ||
338 | static void f2fs_issue_discard(struct f2fs_sb_info *sbi, | 338 | static int f2fs_issue_discard(struct f2fs_sb_info *sbi, |
339 | block_t blkstart, block_t blklen) | 339 | block_t blkstart, block_t blklen) |
340 | { | 340 | { |
341 | sector_t start = SECTOR_FROM_BLOCK(sbi, blkstart); | 341 | sector_t start = SECTOR_FROM_BLOCK(sbi, blkstart); |
342 | sector_t len = SECTOR_FROM_BLOCK(sbi, blklen); | 342 | sector_t len = SECTOR_FROM_BLOCK(sbi, blklen); |
343 | blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0); | ||
344 | trace_f2fs_issue_discard(sbi->sb, blkstart, blklen); | 343 | trace_f2fs_issue_discard(sbi->sb, blkstart, blklen); |
344 | return blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0); | ||
345 | } | ||
346 | |||
347 | void discard_next_dnode(struct f2fs_sb_info *sbi) | ||
348 | { | ||
349 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE); | ||
350 | block_t blkaddr = NEXT_FREE_BLKADDR(sbi, curseg); | ||
351 | |||
352 | if (f2fs_issue_discard(sbi, blkaddr, 1)) { | ||
353 | struct page *page = grab_meta_page(sbi, blkaddr); | ||
354 | /* zero-filled page */ | ||
355 | set_page_dirty(page); | ||
356 | f2fs_put_page(page, 1); | ||
357 | } | ||
345 | } | 358 | } |
346 | 359 | ||
347 | static void add_discard_addrs(struct f2fs_sb_info *sbi, | 360 | static void add_discard_addrs(struct f2fs_sb_info *sbi, |