diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-08-02 13:56:40 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-08-24 13:16:14 -0400 |
commit | 3e025740b976c409820a789f8dabc4ec2c50a950 (patch) | |
tree | faf2106cecd92efa0bad1e2c29e99d01303817e1 | |
parent | bb413d6acd4e1c361daebf8486efc3923f429792 (diff) |
f2fs: do not use discard_map for hard disks
We don't need to keep discard_map, if disk does not support discard command.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fs/f2fs/debug.c | 4 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 7 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 28 |
3 files changed, 29 insertions, 10 deletions
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c index badd407bb622..af69d6bcfc3f 100644 --- a/fs/f2fs/debug.c +++ b/fs/f2fs/debug.c | |||
@@ -154,7 +154,9 @@ static void update_mem_info(struct f2fs_sb_info *sbi) | |||
154 | si->base_mem += sizeof(struct sit_info); | 154 | si->base_mem += sizeof(struct sit_info); |
155 | si->base_mem += MAIN_SEGS(sbi) * sizeof(struct seg_entry); | 155 | si->base_mem += MAIN_SEGS(sbi) * sizeof(struct seg_entry); |
156 | si->base_mem += f2fs_bitmap_size(MAIN_SEGS(sbi)); | 156 | si->base_mem += f2fs_bitmap_size(MAIN_SEGS(sbi)); |
157 | si->base_mem += 3 * SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi); | 157 | si->base_mem += 2 * SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi); |
158 | if (f2fs_discard_en(sbi)) | ||
159 | si->base_mem += SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi); | ||
158 | si->base_mem += SIT_VBLOCK_MAP_SIZE; | 160 | si->base_mem += SIT_VBLOCK_MAP_SIZE; |
159 | if (sbi->segs_per_sec > 1) | 161 | if (sbi->segs_per_sec > 1) |
160 | si->base_mem += MAIN_SECS(sbi) * sizeof(struct sec_entry); | 162 | si->base_mem += MAIN_SECS(sbi) * sizeof(struct sec_entry); |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 14f5fe2b841e..f478cb6ec378 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -1072,6 +1072,13 @@ static inline void clear_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f) | |||
1072 | cp->ckpt_flags = cpu_to_le32(ckpt_flags); | 1072 | cp->ckpt_flags = cpu_to_le32(ckpt_flags); |
1073 | } | 1073 | } |
1074 | 1074 | ||
1075 | static inline bool f2fs_discard_en(struct f2fs_sb_info *sbi) | ||
1076 | { | ||
1077 | struct request_queue *q = bdev_get_queue(sbi->sb->s_bdev); | ||
1078 | |||
1079 | return blk_queue_discard(q); | ||
1080 | } | ||
1081 | |||
1075 | static inline void f2fs_lock_op(struct f2fs_sb_info *sbi) | 1082 | static inline void f2fs_lock_op(struct f2fs_sb_info *sbi) |
1076 | { | 1083 | { |
1077 | down_read(&sbi->cp_rwsem); | 1084 | down_read(&sbi->cp_rwsem); |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index a46296f57b02..59f578b68000 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -660,7 +660,7 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
660 | bool force = (cpc->reason == CP_DISCARD); | 660 | bool force = (cpc->reason == CP_DISCARD); |
661 | int i; | 661 | int i; |
662 | 662 | ||
663 | if (se->valid_blocks == max_blocks) | 663 | if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi)) |
664 | return; | 664 | return; |
665 | 665 | ||
666 | if (!force) { | 666 | if (!force) { |
@@ -818,12 +818,14 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) | |||
818 | if (del > 0) { | 818 | if (del > 0) { |
819 | if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) | 819 | if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) |
820 | f2fs_bug_on(sbi, 1); | 820 | f2fs_bug_on(sbi, 1); |
821 | if (!f2fs_test_and_set_bit(offset, se->discard_map)) | 821 | if (f2fs_discard_en(sbi) && |
822 | !f2fs_test_and_set_bit(offset, se->discard_map)) | ||
822 | sbi->discard_blks--; | 823 | sbi->discard_blks--; |
823 | } else { | 824 | } else { |
824 | if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) | 825 | if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) |
825 | f2fs_bug_on(sbi, 1); | 826 | f2fs_bug_on(sbi, 1); |
826 | if (f2fs_test_and_clear_bit(offset, se->discard_map)) | 827 | if (f2fs_discard_en(sbi) && |
828 | f2fs_test_and_clear_bit(offset, se->discard_map)) | ||
827 | sbi->discard_blks++; | 829 | sbi->discard_blks++; |
828 | } | 830 | } |
829 | if (!f2fs_test_bit(offset, se->ckpt_valid_map)) | 831 | if (!f2fs_test_bit(offset, se->ckpt_valid_map)) |
@@ -2127,12 +2129,16 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
2127 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | 2129 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); |
2128 | sit_i->sentries[start].ckpt_valid_map | 2130 | sit_i->sentries[start].ckpt_valid_map |
2129 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | 2131 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); |
2130 | sit_i->sentries[start].discard_map | ||
2131 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | ||
2132 | if (!sit_i->sentries[start].cur_valid_map || | 2132 | if (!sit_i->sentries[start].cur_valid_map || |
2133 | !sit_i->sentries[start].ckpt_valid_map || | 2133 | !sit_i->sentries[start].ckpt_valid_map) |
2134 | !sit_i->sentries[start].discard_map) | ||
2135 | return -ENOMEM; | 2134 | return -ENOMEM; |
2135 | |||
2136 | if (f2fs_discard_en(sbi)) { | ||
2137 | sit_i->sentries[start].discard_map | ||
2138 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | ||
2139 | if (!sit_i->sentries[start].discard_map) | ||
2140 | return -ENOMEM; | ||
2141 | } | ||
2136 | } | 2142 | } |
2137 | 2143 | ||
2138 | sit_i->tmp_map = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | 2144 | sit_i->tmp_map = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); |
@@ -2276,8 +2282,12 @@ got_it: | |||
2276 | seg_info_from_raw_sit(se, &sit); | 2282 | seg_info_from_raw_sit(se, &sit); |
2277 | 2283 | ||
2278 | /* build discard map only one time */ | 2284 | /* build discard map only one time */ |
2279 | memcpy(se->discard_map, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE); | 2285 | if (f2fs_discard_en(sbi)) { |
2280 | sbi->discard_blks += sbi->blocks_per_seg - se->valid_blocks; | 2286 | memcpy(se->discard_map, se->cur_valid_map, |
2287 | SIT_VBLOCK_MAP_SIZE); | ||
2288 | sbi->discard_blks += sbi->blocks_per_seg - | ||
2289 | se->valid_blocks; | ||
2290 | } | ||
2281 | 2291 | ||
2282 | if (sbi->segs_per_sec > 1) { | 2292 | if (sbi->segs_per_sec > 1) { |
2283 | struct sec_entry *e = get_sec_entry(sbi, start); | 2293 | struct sec_entry *e = get_sec_entry(sbi, start); |