|
@@ -335,13 +335,26 @@ static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno)
|
|
|
mutex_unlock(&dirty_i->seglist_lock);
|
|
|
}
|
|
|
|
|
|
-static void f2fs_issue_discard(struct f2fs_sb_info *sbi,
|
|
|
+static int f2fs_issue_discard(struct f2fs_sb_info *sbi,
|
|
|
block_t blkstart, block_t blklen)
|
|
|
{
|
|
|
sector_t start = SECTOR_FROM_BLOCK(sbi, blkstart);
|
|
|
sector_t len = SECTOR_FROM_BLOCK(sbi, blklen);
|
|
|
- blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0);
|
|
|
trace_f2fs_issue_discard(sbi->sb, blkstart, blklen);
|
|
|
+ return blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0);
|
|
|
+}
|
|
|
+
|
|
|
+void discard_next_dnode(struct f2fs_sb_info *sbi)
|
|
|
+{
|
|
|
+ struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE);
|
|
|
+ block_t blkaddr = NEXT_FREE_BLKADDR(sbi, curseg);
|
|
|
+
|
|
|
+ if (f2fs_issue_discard(sbi, blkaddr, 1)) {
|
|
|
+ struct page *page = grab_meta_page(sbi, blkaddr);
|
|
|
+ /* zero-filled page */
|
|
|
+ set_page_dirty(page);
|
|
|
+ f2fs_put_page(page, 1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void add_discard_addrs(struct f2fs_sb_info *sbi,
|