| From 9c1d4de56066e4d6abc66ec188faafd7b303fb08 Mon Sep 17 00:00:00 2001 |
| From: Joe Thornber <ejt@redhat.com> |
| Date: Wed, 30 Oct 2013 11:19:59 +0000 |
| Subject: dm array: fix bug in growing array |
| |
| From: Joe Thornber <ejt@redhat.com> |
| |
| commit 9c1d4de56066e4d6abc66ec188faafd7b303fb08 upstream. |
| |
| Entries would be lost if the old tail block was partially filled. |
| |
| Signed-off-by: Joe Thornber <ejt@redhat.com> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/persistent-data/dm-array.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/md/persistent-data/dm-array.c |
| +++ b/drivers/md/persistent-data/dm-array.c |
| @@ -509,15 +509,18 @@ static int grow_add_tail_block(struct re |
| static int grow_needs_more_blocks(struct resize *resize) |
| { |
| int r; |
| + unsigned old_nr_blocks = resize->old_nr_full_blocks; |
| |
| if (resize->old_nr_entries_in_last_block > 0) { |
| + old_nr_blocks++; |
| + |
| r = grow_extend_tail_block(resize, resize->max_entries); |
| if (r) |
| return r; |
| } |
| |
| r = insert_full_ablocks(resize->info, resize->size_of_block, |
| - resize->old_nr_full_blocks, |
| + old_nr_blocks, |
| resize->new_nr_full_blocks, |
| resize->max_entries, resize->value, |
| &resize->root); |