]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/3.10.30/dm-space-map-metadata-fix-extending-the-space-map.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.10.30 / dm-space-map-metadata-fix-extending-the-space-map.patch
1 From 7e664b3dec431eebf0c5df5ff704d6197634cf35 Mon Sep 17 00:00:00 2001
2 From: Joe Thornber <ejt@redhat.com>
3 Date: Tue, 7 Jan 2014 15:49:02 +0000
4 Subject: dm space map metadata: fix extending the space map
5
6 From: Joe Thornber <ejt@redhat.com>
7
8 commit 7e664b3dec431eebf0c5df5ff704d6197634cf35 upstream.
9
10 When extending a metadata space map we should do the first commit whilst
11 still in bootstrap mode -- a mode where all blocks get allocated in the
12 new area.
13
14 That way the commit overhead is allocated from the newly added space.
15 Otherwise we risk running out of space.
16
17 With this fix, and the previous commit "dm space map common: make sure
18 new space is used during extend", the following device mapper testsuite
19 test passes:
20 dmtest run --suite thin-provisioning -n /resize_metadata_no_io/
21
22 Signed-off-by: Joe Thornber <ejt@redhat.com>
23 Signed-off-by: Mike Snitzer <snitzer@redhat.com>
24 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25
26 ---
27 drivers/md/persistent-data/dm-space-map-metadata.c | 18 +++++++++++++-----
28 1 file changed, 13 insertions(+), 5 deletions(-)
29
30 --- a/drivers/md/persistent-data/dm-space-map-metadata.c
31 +++ b/drivers/md/persistent-data/dm-space-map-metadata.c
32 @@ -608,20 +608,28 @@ static int sm_metadata_extend(struct dm_
33 * Flick into a mode where all blocks get allocated in the new area.
34 */
35 smm->begin = old_len;
36 - memcpy(&smm->sm, &bootstrap_ops, sizeof(smm->sm));
37 + memcpy(sm, &bootstrap_ops, sizeof(*sm));
38
39 /*
40 * Extend.
41 */
42 r = sm_ll_extend(&smm->ll, extra_blocks);
43 + if (r)
44 + goto out;
45
46 + for (i = old_len; !r && i < smm->begin; i++) {
47 + r = sm_ll_inc(&smm->ll, i, &ev);
48 + if (r)
49 + goto out;
50 + }
51 +
52 + r = sm_metadata_commit(sm);
53 +
54 +out:
55 /*
56 * Switch back to normal behaviour.
57 */
58 - memcpy(&smm->sm, &ops, sizeof(smm->sm));
59 - for (i = old_len; !r && i < smm->begin; i++)
60 - r = sm_ll_inc(&smm->ll, i, &ev);
61 -
62 + memcpy(sm, &ops, sizeof(*sm));
63 return r;
64 }
65