Commit 37208879 authored by Jaegeuk Kim's avatar Jaegeuk Kim

f2fs: introduce f2fs_issue_discard() to clean up

Change log from v1:
 o fix 32bit drops reported by Dan Carpenter

This patch adds f2fs_issue_discard() to clean up blkdev_issue_discard() flows.

Dan carpenter reported:
"block_t is a 32 bit type and sector_t is a 64 bit type.  The upper 32
bits of the sector_t are not used because the shift will wrap."
Bug-Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
parent 7ac8c3b0
...@@ -266,6 +266,14 @@ static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno) ...@@ -266,6 +266,14 @@ static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno)
mutex_unlock(&dirty_i->seglist_lock); mutex_unlock(&dirty_i->seglist_lock);
} }
static void f2fs_issue_discard(struct f2fs_sb_info *sbi,
block_t blkstart, block_t blklen)
{
sector_t start = ((sector_t)blkstart) << sbi->log_sectors_per_block;
sector_t len = ((sector_t)blklen) << sbi->log_sectors_per_block;
blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0);
}
static void add_discard_addrs(struct f2fs_sb_info *sbi, static void add_discard_addrs(struct f2fs_sb_info *sbi,
unsigned int segno, struct seg_entry *se) unsigned int segno, struct seg_entry *se)
{ {
...@@ -354,22 +362,15 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi) ...@@ -354,22 +362,15 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi)
if (!test_opt(sbi, DISCARD)) if (!test_opt(sbi, DISCARD))
continue; continue;
blkdev_issue_discard(sbi->sb->s_bdev, f2fs_issue_discard(sbi, START_BLOCK(sbi, start),
START_BLOCK(sbi, start) << (end - start) << sbi->log_blocks_per_seg);
sbi->log_sectors_per_block,
(1 << (sbi->log_sectors_per_block +
sbi->log_blocks_per_seg)) * (end - start),
GFP_NOFS, 0);
} }
mutex_unlock(&dirty_i->seglist_lock); mutex_unlock(&dirty_i->seglist_lock);
/* send small discards */ /* send small discards */
list_for_each_safe(this, next, head) { list_for_each_safe(this, next, head) {
entry = list_entry(this, struct discard_entry, list); entry = list_entry(this, struct discard_entry, list);
blkdev_issue_discard(sbi->sb->s_bdev, f2fs_issue_discard(sbi, entry->blkaddr, entry->len);
entry->blkaddr << sbi->log_sectors_per_block,
(1 << sbi->log_sectors_per_block) * entry->len,
GFP_NOFS, 0);
list_del(&entry->list); list_del(&entry->list);
SM_I(sbi)->nr_discards -= entry->len; SM_I(sbi)->nr_discards -= entry->len;
kmem_cache_free(discard_entry_slab, entry); kmem_cache_free(discard_entry_slab, entry);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment