diff options
author | Zach Brown <zab@redhat.com> | 2013-08-14 16:16:35 -0700 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2013-09-03 19:41:03 +0200 |
commit | fd074864c4cc319f1969b9b3513cef654a6648ea (patch) | |
tree | 5bfce93cc02d87c9427efa9473b0d4180ea11f23 /volumes.c | |
parent | 19a2e1f4611eeff9668dacecafb6e51b5ca0f704 (diff) |
btrfs-progs: remove variable length stack arrays
sparse hates variable length array definitions on the stack:
btrfs-show-super.c:155:21: warning: Variable length array is used.
And it's right to. They're a fragile construct that doesn't handle bad
input well at all.
Signed-off-by: Zach Brown <zab@redhat.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'volumes.c')
-rw-r--r-- | volumes.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -1779,12 +1779,15 @@ int write_raid56_with_parity(struct btrfs_fs_info *info, struct btrfs_multi_bio *multi, u64 stripe_len, u64 *raid_map) { - struct extent_buffer *ebs[multi->num_stripes], *p_eb = NULL, *q_eb = NULL; + struct extent_buffer **ebs, *p_eb = NULL, *q_eb = NULL; int i; int j; int ret; int alloc_size = eb->len; + ebs = kmalloc(sizeof(*ebs) * multi->num_stripes, GFP_NOFS); + BUG_ON(!ebs); + if (stripe_len > alloc_size) alloc_size = stripe_len; @@ -1813,7 +1816,12 @@ int write_raid56_with_parity(struct btrfs_fs_info *info, q_eb = new_eb; } if (q_eb) { - void *pointers[multi->num_stripes]; + void **pointers; + + pointers = kmalloc(sizeof(*pointers) * multi->num_stripes, + GFP_NOFS); + BUG_ON(!pointers); + ebs[multi->num_stripes - 2] = p_eb; ebs[multi->num_stripes - 1] = q_eb; @@ -1821,6 +1829,7 @@ int write_raid56_with_parity(struct btrfs_fs_info *info, pointers[i] = ebs[i]->data; raid6_gen_syndrome(multi->num_stripes, stripe_len, pointers); + kfree(pointers); } else { ebs[multi->num_stripes - 1] = p_eb; memcpy(p_eb->data, ebs[0]->data, stripe_len); @@ -1838,5 +1847,8 @@ int write_raid56_with_parity(struct btrfs_fs_info *info, if (ebs[i] != eb) kfree(ebs[i]); } + + kfree(ebs); + return 0; } |