diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-02-10 19:44:29 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-02-11 20:04:50 -0500 |
commit | 60a3b782b1aaf6e5f8c4f92e99302c48a26d475b (patch) | |
tree | 3a055e1b9ab2067437c27d7938ebf32de2de8bd6 /fs/f2fs | |
parent | 29e7043f405c4c4c3a82f61222790f3ea8c0bf13 (diff) |
f2fs: avoid variable length array
Instead of using variable length array, this patch let preallocate memory for
them.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/debug.c | 1 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 10 | ||||
-rw-r--r-- | fs/f2fs/segment.h | 1 |
3 files changed, 10 insertions, 2 deletions
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c index ac2bd8e7eca9..e671373cc8ab 100644 --- a/fs/f2fs/debug.c +++ b/fs/f2fs/debug.c | |||
@@ -142,6 +142,7 @@ static void update_mem_info(struct f2fs_sb_info *sbi) | |||
142 | si->base_mem += MAIN_SEGS(sbi) * sizeof(struct seg_entry); | 142 | si->base_mem += MAIN_SEGS(sbi) * sizeof(struct seg_entry); |
143 | si->base_mem += f2fs_bitmap_size(MAIN_SEGS(sbi)); | 143 | si->base_mem += f2fs_bitmap_size(MAIN_SEGS(sbi)); |
144 | si->base_mem += 2 * SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi); | 144 | si->base_mem += 2 * SIT_VBLOCK_MAP_SIZE * MAIN_SEGS(sbi); |
145 | si->base_mem += SIT_VBLOCK_MAP_SIZE; | ||
145 | if (sbi->segs_per_sec > 1) | 146 | if (sbi->segs_per_sec > 1) |
146 | si->base_mem += MAIN_SECS(sbi) * sizeof(struct sec_entry); | 147 | si->base_mem += MAIN_SECS(sbi) * sizeof(struct sec_entry); |
147 | si->base_mem += __bitmap_size(sbi, SIT_BITMAP); | 148 | si->base_mem += __bitmap_size(sbi, SIT_BITMAP); |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 877a272a8146..c9d314f44568 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -505,7 +505,7 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
505 | struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start); | 505 | struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start); |
506 | unsigned long *cur_map = (unsigned long *)se->cur_valid_map; | 506 | unsigned long *cur_map = (unsigned long *)se->cur_valid_map; |
507 | unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map; | 507 | unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map; |
508 | unsigned long dmap[entries]; | 508 | unsigned long *dmap = SIT_I(sbi)->tmp_map; |
509 | unsigned int start = 0, end = -1; | 509 | unsigned int start = 0, end = -1; |
510 | bool force = (cpc->reason == CP_DISCARD); | 510 | bool force = (cpc->reason == CP_DISCARD); |
511 | int i; | 511 | int i; |
@@ -924,7 +924,7 @@ static void __next_free_blkoff(struct f2fs_sb_info *sbi, | |||
924 | { | 924 | { |
925 | struct seg_entry *se = get_seg_entry(sbi, seg->segno); | 925 | struct seg_entry *se = get_seg_entry(sbi, seg->segno); |
926 | int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long); | 926 | int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long); |
927 | unsigned long target_map[entries]; | 927 | unsigned long *target_map = SIT_I(sbi)->tmp_map; |
928 | unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map; | 928 | unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map; |
929 | unsigned long *cur_map = (unsigned long *)se->cur_valid_map; | 929 | unsigned long *cur_map = (unsigned long *)se->cur_valid_map; |
930 | int i, pos; | 930 | int i, pos; |
@@ -1855,6 +1855,10 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
1855 | return -ENOMEM; | 1855 | return -ENOMEM; |
1856 | } | 1856 | } |
1857 | 1857 | ||
1858 | sit_i->tmp_map = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | ||
1859 | if (!sit_i->tmp_map) | ||
1860 | return -ENOMEM; | ||
1861 | |||
1858 | if (sbi->segs_per_sec > 1) { | 1862 | if (sbi->segs_per_sec > 1) { |
1859 | sit_i->sec_entries = vzalloc(MAIN_SECS(sbi) * | 1863 | sit_i->sec_entries = vzalloc(MAIN_SECS(sbi) * |
1860 | sizeof(struct sec_entry)); | 1864 | sizeof(struct sec_entry)); |
@@ -2236,6 +2240,8 @@ static void destroy_sit_info(struct f2fs_sb_info *sbi) | |||
2236 | kfree(sit_i->sentries[start].ckpt_valid_map); | 2240 | kfree(sit_i->sentries[start].ckpt_valid_map); |
2237 | } | 2241 | } |
2238 | } | 2242 | } |
2243 | kfree(sit_i->tmp_map); | ||
2244 | |||
2239 | vfree(sit_i->sentries); | 2245 | vfree(sit_i->sentries); |
2240 | vfree(sit_i->sec_entries); | 2246 | vfree(sit_i->sec_entries); |
2241 | kfree(sit_i->dirty_sentries_bitmap); | 2247 | kfree(sit_i->dirty_sentries_bitmap); |
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 421d5794b0c8..ba858ca01445 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h | |||
@@ -189,6 +189,7 @@ struct sit_info { | |||
189 | char *sit_bitmap; /* SIT bitmap pointer */ | 189 | char *sit_bitmap; /* SIT bitmap pointer */ |
190 | unsigned int bitmap_size; /* SIT bitmap size */ | 190 | unsigned int bitmap_size; /* SIT bitmap size */ |
191 | 191 | ||
192 | unsigned long *tmp_map; /* bitmap for temporal use */ | ||
192 | unsigned long *dirty_sentries_bitmap; /* bitmap for dirty sentries */ | 193 | unsigned long *dirty_sentries_bitmap; /* bitmap for dirty sentries */ |
193 | unsigned int dirty_sentries; /* # of dirty sentries */ | 194 | unsigned int dirty_sentries; /* # of dirty sentries */ |
194 | unsigned int sents_per_block; /* # of SIT entries per block */ | 195 | unsigned int sents_per_block; /* # of SIT entries per block */ |