Codebase list mdadm / 3bed526
Cherrypick master patches up to 20th of July 2018. LP: #1781427 Dimitri John Ledkov 5 years ago
71 changed file(s) with 1123 addition(s) and 89 deletion(s). Raw diff Collapse all Expand all
280280 st->ss->free_super(st);
281281 dev_policy_free(pol);
282282 domain_free(domains);
283 if (tst)
284 tst->ss->free_super(tst);
283285 return -1;
284286 }
285287
778780 if (best[i] == -1 || (devices[best[i]].i.events
779781 < devices[devcnt].i.events))
780782 best[i] = devcnt;
783 else if (st->ss == &super_imsm)
784 best[i+1] = devcnt;
781785 }
782786 devcnt++;
783787 }
13431347 char chosen_name[1024];
13441348 struct map_ent *map = NULL;
13451349 struct map_ent *mp;
1346 int locked = 0;
1347 struct mdp_superblock_1 *sb;
1348 bitmap_super_t *bms;
13491350
13501351 /*
13511352 * If any subdevs are listed, then any that don't
13761377 * set of devices failed. Those are now marked as ->used==2 and
13771378 * we ignore them and try again
13781379 */
1379 if (locked)
1380 /*
1381 * if come back try_again is called, then need to unlock first,
1382 * and lock again since the metadate is re-read.
1383 */
1384 cluster_release_dlmlock();
13851380 if (!st && ident->st)
13861381 st = ident->st;
13871382 if (c->verbose>0)
13981393
13991394 if (!st || !st->sb || !content)
14001395 return 2;
1401
1402 sb = st->sb;
1403 bms = (bitmap_super_t*)(((char*)sb) + 4096);
1404 if (sb && bms->version == BITMAP_MAJOR_CLUSTERED) {
1405 locked = cluster_get_dlmlock();
1406 if (locked != 1)
1407 return 1;
1408 }
14091396
14101397 /* We have a full set of devices - we now need to find the
14111398 * array device.
15371524 err = assemble_container_content(st, mdfd, content, c,
15381525 chosen_name, NULL);
15391526 close(mdfd);
1540 if (locked == 1)
1541 cluster_release_dlmlock();
15421527 return err;
15431528 }
15441529
18481833 if (rv == 1 && !pre_exist)
18491834 ioctl(mdfd, STOP_ARRAY, NULL);
18501835 free(devices);
1836 out:
18511837 map_unlock(&map);
1852 out:
18531838 if (rv == 0) {
18541839 wait_for(chosen_name, mdfd);
18551840 close(mdfd);
18831868 close(mdfd);
18841869
18851870 /* '2' means 'OK, but not started yet' */
1886 if (locked == 1)
1887 cluster_release_dlmlock();
18881871 if (rv == -1) {
18891872 free(devices);
18901873 return 1;
262262
263263 if (st->ss->export_detail_super)
264264 st->ss->export_detail_super(st);
265 map_free(map);
265266 } else {
266267 struct map_ent *mp, *map = NULL;
267268 char nbuf[64];
276277 print_escape(mp->path+8);
277278 putchar('\n');
278279 }
280 map_free(map);
279281 }
280282 if (sra) {
281283 struct mdinfo *mdi;
300300 }
301301 if (c->verbose >= 0)
302302 printf("%s restored from %s.\n", dev, fname);
303 close(fl);
304 close(fd);
305 free(fname);
303306 return 0;
304307
305308 err:
241241 if (st->ss->load_super(st, fd2, NULL)) {
242242 pr_err("cannot find super block on %s\n", dv);
243243 close(fd);
244 close(fd2);
244245 return 1;
245246 }
246247 info.array.raid_disks = nd+1;
14121412 sysfs_free(sra);
14131413 }
14141414 }
1415 map_free(mapl);
14151416 return rv;
14161417 }
14171418
15861587
15871588 assemble_container_content(st, mdfd, ra, c,
15881589 chosen_name, &result);
1590 map_free(map);
1591 map = NULL;
15891592 close(mdfd);
15901593 }
15911594 if (c->export && result) {
16621665 close(sfd);
16631666 }
16641667 domain_free(domains);
1668 map_free(map);
16651669 return 0;
16661670 }
16671671
180180 }
181181 d->next = rv;
182182 rv = d;
183 map_free(map);
184 map = NULL;
183185 }
184186 free_mdstat(mdstat);
185 map_free(map);
186187
187188 return rv;
188189 }
0 mdadm (4.1~rc1-4) UNRELEASED; urgency=medium
1
2 * Cherrypick master patches up to 20th of July 2018. LP: #1781427
3
4 -- Dimitri John Ledkov <xnox@ubuntu.com> Mon, 23 Jul 2018 11:40:06 +0100
5
06 mdadm (4.1~rc1-3) unstable; urgency=medium
17
28 * Cherrypick master patches up to 4th of June 2018.
00 From 1c7c65a3e5d3e5f6d32bfa4cf0d872f87c654eb2 Mon Sep 17 00:00:00 2001
11 From: Zhipeng Xie <xiezhipeng1@huawei.com>
22 Date: Tue, 10 Apr 2018 09:25:39 +0800
3 Subject: [PATCH 01/26] mdadm: fix use-after-free after free_mdstat
3 Subject: [PATCH 01/40] mdadm: fix use-after-free after free_mdstat
44
55 e->percent access the mdstat_ent which was already freed in free_mdstat
66
00 From b91ad097d6eecb85cf28915836370288709fbda8 Mon Sep 17 00:00:00 2001
11 From: Michal Zylowski <michal.zylowski@intel.com>
22 Date: Wed, 4 Apr 2018 14:20:17 +0200
3 Subject: [PATCH 02/26] imsm: Allow create RAID volume with link to container
3 Subject: [PATCH 02/40] imsm: Allow create RAID volume with link to container
44
55 After 1db03765("Subdevs can't be all missing when create raid device")
66 raid volume can't be created with link to container. This feature should
00 From 59416da78fc66084f721163b914913dc1da37b44 Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Wed, 11 Apr 2018 17:01:50 -0400
3 Subject: [PATCH 03/26] tests/func.sh: Fix some total breakage in the test
3 Subject: [PATCH 03/40] tests/func.sh: Fix some total breakage in the test
44 scripts
55
66 We will never mandate an obsolete file system such as ext[2-4] for
00 From 611d95290dd41d73bd8f9cc06f7ec293a40b819e Mon Sep 17 00:00:00 2001
11 From: Mariusz Dabrowski <mariusz.dabrowski@intel.com>
22 Date: Thu, 5 Apr 2018 13:38:35 +0200
3 Subject: [PATCH 04/26] imsm: change reserved space to 4MB
3 Subject: [PATCH 04/40] imsm: change reserved space to 4MB
44
55 Due to compatibility to the newest OROM, imsm reserved space has to be
66 expanded to 4MB.
00 From fcc2c9daede11fcc67e4032fd6fa8da198aaa319 Mon Sep 17 00:00:00 2001
11 From: Mariusz Dabrowski <mariusz.dabrowski@intel.com>
22 Date: Thu, 5 Apr 2018 13:38:36 +0200
3 Subject: [PATCH 05/26] imsm: add functions to get and set imsm dev size
3 Subject: [PATCH 05/40] imsm: add functions to get and set imsm dev size
44
55 Signed-off-by: Mariusz Dabrowski <mariusz.dabrowski@intel.com>
66 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
00 From 9529d3436771d9f38884861683dee3b40ab9d180 Mon Sep 17 00:00:00 2001
11 From: Mariusz Dabrowski <mariusz.dabrowski@intel.com>
22 Date: Thu, 5 Apr 2018 13:38:37 +0200
3 Subject: [PATCH 06/26] imsm: pass already existing map to
3 Subject: [PATCH 06/40] imsm: pass already existing map to
44 imsm_num_data_members
55
66 In almost every place where imsm_num_data_members is called there is
00 From 444909385fdaccf961308c4319d7029b82bf8bb1 Mon Sep 17 00:00:00 2001
11 From: Mariusz Dabrowski <mariusz.dabrowski@intel.com>
22 Date: Thu, 5 Apr 2018 13:38:38 +0200
3 Subject: [PATCH 07/26] imsm: do not use blocks_per_member in array size
3 Subject: [PATCH 07/40] imsm: do not use blocks_per_member in array size
44 calculations
55
66 mdadm assumes that blocks_per_member value is equal to num_data_stripes *
00 From 54865c30d5b94920318950e29a4f6c1ce075cae8 Mon Sep 17 00:00:00 2001
11 From: Roman Sobanski <roman.sobanski@intel.com>
22 Date: Wed, 25 Apr 2018 11:25:06 +0200
3 Subject: [PATCH 08/26] Prevent create IMSM volume with size smaller than 1M or
3 Subject: [PATCH 08/40] Prevent create IMSM volume with size smaller than 1M or
44 chunk
55
66 Block creation of the imsm volume when given size is smaller than 1M and
00 From 5d518de84e7cd3382b4984cc1243ddb4102aa4f4 Mon Sep 17 00:00:00 2001
11 From: Roman Sobanski <roman.sobanski@intel.com>
22 Date: Fri, 27 Apr 2018 12:12:21 +0200
3 Subject: [PATCH 09/26] mdadm/grow: correct size and chunk_size casting
3 Subject: [PATCH 09/40] mdadm/grow: correct size and chunk_size casting
44
55 With commit 4b74a905a67e
66 ("mdadm/grow: Component size must be larger than chunk size") mdadm returns
00 From 3e684231ebe10c08e7cf23743d4516f707e605a2 Mon Sep 17 00:00:00 2001
11 From: Michal Zylowski <michal.zylowski@intel.com>
22 Date: Tue, 29 May 2018 15:46:40 +0200
3 Subject: [PATCH 10/26] Fix misspelling of 'alignment' and 'geometry'
3 Subject: [PATCH 10/40] Fix misspelling of 'alignment' and 'geometry'
44
55 Set gemetry to geometry in error message about geometry validation failed.
66 Fix misspelled 'alignment' word in imsm_component_size_alignment_check
00 From 760365f94409ccccbcb54d55070f0f422bee44a1 Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Tue, 29 May 2018 15:52:48 -0400
3 Subject: [PATCH 11/26] Do not confuse gcc
3 Subject: [PATCH 11/40] Do not confuse gcc
44
55 gcc-8.1's -Werror=stringop-truncation is easily confused. Rather than
66 disabling the check, make it explicit we are OK truncating here.
00 From 167d8bb8302170676f0e15123738e333383fec7b Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Tue, 29 May 2018 16:09:47 -0400
3 Subject: [PATCH 12/26] super-intel: Use memcpy() to avoid confusing gcc
3 Subject: [PATCH 12/40] super-intel: Use memcpy() to avoid confusing gcc
44
55 When added :0 to serial number and copying it back, use memcpy()
66 instead of strncpy() as we know the actual length. This stops gcc
00 From 1cdc06dfda62775647b81e2753fc7908e1bbffc2 Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Tue, 29 May 2018 16:55:41 -0400
3 Subject: [PATCH 13/26] super-intel: Get rid of unnused string
3 Subject: [PATCH 13/40] super-intel: Get rid of unnused string
44
55 No need to snprintf() into the string when we don't use it afterards
66
00 From 40659392ff90fc9c2861ec18c34ed1bdb54f92ca Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Wed, 30 May 2018 11:56:37 -0400
3 Subject: [PATCH 14/26] super-intel: Avoid gcc-8.1 complaining about truncating
3 Subject: [PATCH 14/40] super-intel: Avoid gcc-8.1 complaining about truncating
44 snprintf()
55
66 We know the max size of the volume name, so no need to play the
00 From ebad3af29b401dec7203e8fa5a77bcf16532f49c Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Wed, 30 May 2018 12:10:13 -0400
3 Subject: [PATCH 15/26] super-intel: Do not truncate last character of volume
3 Subject: [PATCH 15/40] super-intel: Do not truncate last character of volume
44 name
55
66 Clear up strncpy abuse to avoid gcc-8.1 complaining about truncating
00 From 59632db96bdd09b44e9927f63a67cccbe8b15cdf Mon Sep 17 00:00:00 2001
11 From: Michal Zylowski <michal.zylowski@intel.com>
22 Date: Tue, 29 May 2018 15:47:09 +0200
3 Subject: [PATCH 16/26] imsm: Do not block volume creation when container has
3 Subject: [PATCH 16/40] imsm: Do not block volume creation when container has
44 disks with mixed sector size
55
66 Currently when created container keeps disks with mixed sector size (few
00 From 5a5b3a6725ded07697f03ddd05ee537ce289e951 Mon Sep 17 00:00:00 2001
11 From: Michal Zylowski <michal.zylowski@intel.com>
22 Date: Tue, 29 May 2018 15:47:25 +0200
3 Subject: [PATCH 17/26] imsm: Do not require MDADM_EXPERIMENTAL flag anymore
3 Subject: [PATCH 17/40] imsm: Do not require MDADM_EXPERIMENTAL flag anymore
44
55 Grow feature for IMSM metadata is currently fully supported and tested.
66 Reshape operation is not in experimental state anymore, so usage of this
00 From 975898395951835f5a8051441af21cc995921f8c Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Thu, 31 May 2018 11:45:21 -0400
3 Subject: [PATCH 18/26] Monitor: Increase size of percentalert to avoid gcc
3 Subject: [PATCH 18/40] Monitor: Increase size of percentalert to avoid gcc
44 warning
55
66 gcc-8.1 complains about truncated string operations. While we know
00 From c1b78589cf042221e22a014332b195b2309cb178 Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Thu, 31 May 2018 13:11:21 -0400
3 Subject: [PATCH 19/26] mdopen: fix gcc 8.1 string overflow error
3 Subject: [PATCH 19/40] mdopen: fix gcc 8.1 string overflow error
44
55 We already cut symlinks longer than 1000, so rely on this calling
66 readlink and error out if we are able to read more than 1000 bytes.
00 From 2dcd6492718c2921feac993aa71ed3a7c2522077 Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Thu, 31 May 2018 13:17:46 -0400
3 Subject: [PATCH 20/26] super0: Use memmove() when adjusting sparc2.2
3 Subject: [PATCH 20/40] super0: Use memmove() when adjusting sparc2.2
44 superblock data
55
66 memcpy() does not allow overlapping copies, switch to memmove()
00 From 4d061b02b61d5e6d4186e0118166fdd40ea8b55f Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Thu, 31 May 2018 13:38:08 -0400
3 Subject: [PATCH 21/26] super1: Fix cases triggering gcc-8.1 strncpy truncate
3 Subject: [PATCH 21/40] super1: Fix cases triggering gcc-8.1 strncpy truncate
44 warning
55
66 Find the string length, copy it, and zero out the rest, instead of
00 From 002a5978f015a77ecc48487006b1030f9dbe1394 Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Thu, 31 May 2018 16:07:33 -0400
3 Subject: [PATCH 22/26] super-ddf: Fix gcc-8.1 overflow warnings
3 Subject: [PATCH 22/40] super-ddf: Fix gcc-8.1 overflow warnings
44
55 Cast to types that are big enough to hold the values, but also guarantee
66 no overflow of the buffer keepts gcc happy.
00 From 27e39ad31cbdfe516f9f390cc860a4f681750ef0 Mon Sep 17 00:00:00 2001
11 From: Xiao Ni <xni@redhat.com>
22 Date: Wed, 30 May 2018 13:49:41 +0800
3 Subject: [PATCH 23/26] Check major number of block device when querying md
3 Subject: [PATCH 23/40] Check major number of block device when querying md
44 device
55
66 It give error message when query a non md device.
00 From 38e955cbf030bc9e564bd87bc9f02f949884a83f Mon Sep 17 00:00:00 2001
11 From: Zhilong Liu <zlliu@suse.com>
22 Date: Wed, 30 May 2018 15:04:05 +0800
3 Subject: [PATCH 24/26] mdadm/test: mdadm needn't make install on the system
3 Subject: [PATCH 24/40] mdadm/test: mdadm needn't make install on the system
44
55 Fixes: beb71de04d31 ("mdadm/test: enable clustermd testing under clustermd_tests/")
66 clustermd_tests/func.sh:
00 From 7d4815f84cba133ee7439db5348ce554779f8342 Mon Sep 17 00:00:00 2001
11 From: Zhilong Liu <zlliu@suse.com>
22 Date: Wed, 30 May 2018 15:04:41 +0800
3 Subject: [PATCH 25/26] mdadm/test: correct tests/testdev as testdev in
3 Subject: [PATCH 25/40] mdadm/test: correct tests/testdev as testdev in
44 02r5grow
55
66 Fixes: a6994ccc230b ("mdadm/test: get rid of the tests/testdev")
00 From 28156667e5c7dc3c7b978f2d58c2a427038fedda Mon Sep 17 00:00:00 2001
11 From: Jes Sorensen <jsorensen@fb.com>
22 Date: Mon, 4 Jun 2018 14:49:59 -0400
3 Subject: [PATCH 26/26] gcc-8 coverity hack
3 Subject: [PATCH 26/40] gcc-8 coverity hack
44
55 Coverity still has issues with gcc-7, not to mention gcc-8. Hack around
66 it, until they fix it.
0 From 7298c9a6facea469d9e7ed55a7a0806500096415 Mon Sep 17 00:00:00 2001
1 From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
2 Date: Thu, 7 Jun 2018 14:47:47 +0200
3 Subject: [PATCH 27/40] Assemble.c Don't ignore faulty disk when array is auto
4 assembled.
5
6 Since commit 20dc76d15b40 ("imsm: Set disk slot number") mdadm
7 sets slot number for each disk in imsm array. Now auto-assemble determines
8 devices using slot number and ignores devices on the same slot that have
9 older generation number.
10 It causes infinit loop if failed device is still visible in system
11 (it has metadata, but it is not merged with exisiting array).
12
13 To avoid it, out-of-sync device should be added to the best[]. Later
14 mdadm adds it as spare to the container.
15
16 Imsm doesn't support disk replacement feature, so it can use rooms for
17 replacements.
18
19 Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
20 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
21 ---
22 Assemble.c | 2 ++
23 1 file changed, 2 insertions(+)
24
25 diff --git a/Assemble.c b/Assemble.c
26 index e83d550b..32e6f6ff 100644
27 --- a/Assemble.c
28 +++ b/Assemble.c
29 @@ -779,6 +779,8 @@ static int load_devices(struct devs *devices, char *devmap,
30 if (best[i] == -1 || (devices[best[i]].i.events
31 < devices[devcnt].i.events))
32 best[i] = devcnt;
33 + else if (st->ss == &super_imsm)
34 + best[i+1] = devcnt;
35 }
36 devcnt++;
37 }
38 --
39 2.17.1
40
0 From 4a353e6ec48e35437b27978add6cd2cd015f2cfe Mon Sep 17 00:00:00 2001
1 From: Roman Sobanski <roman.sobanski@intel.com>
2 Date: Fri, 8 Jun 2018 12:34:18 +0200
3 Subject: [PATCH 28/40] imsm: correct num_data_stripes in metadata map for
4 migration
5
6 When migrating an array from R0 to R10 num_data_stripes in metadata map
7 will not be updated. Update it to allow correct migration process.
8 Changes in R10 to R0 migration for clarity of code.
9
10 Signed-off-by: Roman Sobanski <roman.sobanski@intel.com>
11 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
12 ---
13 super-intel.c | 16 ++++++++++------
14 1 file changed, 10 insertions(+), 6 deletions(-)
15
16 diff --git a/super-intel.c b/super-intel.c
17 index a01be132..f011a31f 100644
18 --- a/super-intel.c
19 +++ b/super-intel.c
20 @@ -9543,12 +9543,6 @@ static int apply_takeover_update(struct imsm_update_takeover *u,
21 if (u->direction == R10_TO_R0) {
22 unsigned long long num_data_stripes;
23
24 - map->num_domains = 1;
25 - num_data_stripes = imsm_dev_size(dev) / 2;
26 - num_data_stripes /= map->blocks_per_strip;
27 - num_data_stripes /= map->num_domains;
28 - set_num_data_stripes(map, num_data_stripes);
29 -
30 /* Number of failed disks must be half of initial disk number */
31 if (imsm_count_failed(super, dev, MAP_0) !=
32 (map->num_members / 2))
33 @@ -9574,10 +9568,15 @@ static int apply_takeover_update(struct imsm_update_takeover *u,
34 map->num_domains = 1;
35 map->raid_level = 0;
36 map->failed_disk_num = -1;
37 + num_data_stripes = imsm_dev_size(dev) / 2;
38 + num_data_stripes /= map->blocks_per_strip;
39 + set_num_data_stripes(map, num_data_stripes);
40 }
41
42 if (u->direction == R0_TO_R10) {
43 void **space;
44 + unsigned long long num_data_stripes;
45 +
46 /* update slots in current disk list */
47 for (dm = super->disks; dm; dm = dm->next) {
48 if (dm->index >= 0)
49 @@ -9615,6 +9614,11 @@ static int apply_takeover_update(struct imsm_update_takeover *u,
50 map->map_state = IMSM_T_STATE_DEGRADED;
51 map->num_domains = 2;
52 map->raid_level = 1;
53 + num_data_stripes = imsm_dev_size(dev) / 2;
54 + num_data_stripes /= map->blocks_per_strip;
55 + num_data_stripes /= map->num_domains;
56 + set_num_data_stripes(map, num_data_stripes);
57 +
58 /* replace dev<->dev_new */
59 dv->dev = dev_new;
60 }
61 --
62 2.17.1
63
0 From 898bd1ecefe6c72102f398680dcfef80e4de21c1 Mon Sep 17 00:00:00 2001
1 From: Guoqing Jiang <gqjiang@suse.com>
2 Date: Mon, 11 Jun 2018 17:03:44 +0800
3 Subject: [PATCH 29/40] Free map to avoid resource leak issues
4
5 1. There are some places which didn't free map as
6 discovered by coverity.
7
8 CID 289661 (#1 of 1): Resource leak (RESOURCE_LEAK)12. leaked_storage: Variable mapl going out of scope leaks the storage it points to.
9 CID 289619 (#3 of 3): Resource leak (RESOURCE_LEAK)63. leaked_storage: Variable map going out of scope leaks the storage it points to.
10 CID 289618 (#1 of 1): Resource leak (RESOURCE_LEAK)26. leaked_storage: Variable map going out of scope leaks the storage it points to.
11 CID 289607 (#1 of 1): Resource leak (RESOURCE_LEAK)41. leaked_storage: Variable map going out of scope leaks the storage it points to.
12
13 2. If we call map_by_* inside a loop, then map_free
14 should be called in the same loop, and it is better
15 to set map to NULL after free.
16
17 3. And map_unlock is always called with map_lock,
18 if we don't call map_remove before map_unlock,
19 then the memory (allocated by map_lock -> map_read
20 -> map_add -> xmalloc) could be leaked. So we
21 need to free it in map_unlock as well.
22
23 Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
24 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
25 ---
26 Assemble.c | 2 +-
27 Detail.c | 2 ++
28 Incremental.c | 4 ++++
29 config.c | 3 ++-
30 mapfile.c | 2 ++
31 mdadm.c | 2 ++
32 6 files changed, 13 insertions(+), 2 deletions(-)
33
34 diff --git a/Assemble.c b/Assemble.c
35 index 32e6f6ff..5a907c14 100644
36 --- a/Assemble.c
37 +++ b/Assemble.c
38 @@ -1851,8 +1851,8 @@ try_again:
39 if (rv == 1 && !pre_exist)
40 ioctl(mdfd, STOP_ARRAY, NULL);
41 free(devices);
42 - map_unlock(&map);
43 out:
44 + map_unlock(&map);
45 if (rv == 0) {
46 wait_for(chosen_name, mdfd);
47 close(mdfd);
48 diff --git a/Detail.c b/Detail.c
49 index 860241ce..b3e857a7 100644
50 --- a/Detail.c
51 +++ b/Detail.c
52 @@ -263,6 +263,7 @@ int Detail(char *dev, struct context *c)
53
54 if (st->ss->export_detail_super)
55 st->ss->export_detail_super(st);
56 + map_free(map);
57 } else {
58 struct map_ent *mp, *map = NULL;
59 char nbuf[64];
60 @@ -277,6 +278,7 @@ int Detail(char *dev, struct context *c)
61 print_escape(mp->path+8);
62 putchar('\n');
63 }
64 + map_free(map);
65 }
66 if (sra) {
67 struct mdinfo *mdi;
68 diff --git a/Incremental.c b/Incremental.c
69 index 0beab163..0c5698ee 100644
70 --- a/Incremental.c
71 +++ b/Incremental.c
72 @@ -1413,6 +1413,7 @@ restart:
73 sysfs_free(sra);
74 }
75 }
76 + map_free(mapl);
77 return rv;
78 }
79
80 @@ -1587,6 +1588,8 @@ static int Incremental_container(struct supertype *st, char *devname,
81
82 assemble_container_content(st, mdfd, ra, c,
83 chosen_name, &result);
84 + map_free(map);
85 + map = NULL;
86 close(mdfd);
87 }
88 if (c->export && result) {
89 @@ -1663,6 +1666,7 @@ static int Incremental_container(struct supertype *st, char *devname,
90 close(sfd);
91 }
92 domain_free(domains);
93 + map_free(map);
94 return 0;
95 }
96
97 diff --git a/config.c b/config.c
98 index 48e02788..e14eae0c 100644
99 --- a/config.c
100 +++ b/config.c
101 @@ -181,9 +181,10 @@ struct mddev_dev *load_containers(void)
102 }
103 d->next = rv;
104 rv = d;
105 + map_free(map);
106 + map = NULL;
107 }
108 free_mdstat(mdstat);
109 - map_free(map);
110
111 return rv;
112 }
113 diff --git a/mapfile.c b/mapfile.c
114 index f3c8191e..a5025563 100644
115 --- a/mapfile.c
116 +++ b/mapfile.c
117 @@ -143,6 +143,8 @@ void map_unlock(struct map_ent **melp)
118 unlink(mapname[2]);
119 fclose(lf);
120 }
121 + if (*melp)
122 + map_free(*melp);
123 lf = NULL;
124 }
125
126 diff --git a/mdadm.c b/mdadm.c
127 index 5afe4155..1cf5c189 100644
128 --- a/mdadm.c
129 +++ b/mdadm.c
130 @@ -1885,6 +1885,8 @@ static int misc_scan(char devmode, struct context *c)
131 else
132 rv |= WaitClean(name, c->verbose);
133 put_md_name(name);
134 + map_free(map);
135 + map = NULL;
136 }
137 }
138 free_mdstat(ms);
139 --
140 2.17.1
141
0 From 4a670aabdcf6b7870aaa0088574a62603bb22f31 Mon Sep 17 00:00:00 2001
1 From: Anthony Youngman <anthony@youngman.org.uk>
2 Date: Fri, 15 Jun 2018 22:18:14 +0100
3 Subject: [PATCH 30/40] Coverity: Resource leak: fix return without free
4
5 Signed-off-by: Anthony Youngman <anthony@youngman.org.uk>
6 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
7 ---
8 Assemble.c | 2 ++
9 1 file changed, 2 insertions(+)
10
11 diff --git a/Assemble.c b/Assemble.c
12 index 5a907c14..0a7ab6f5 100644
13 --- a/Assemble.c
14 +++ b/Assemble.c
15 @@ -281,6 +281,8 @@ static int select_devices(struct mddev_dev *devlist,
16 st->ss->free_super(st);
17 dev_policy_free(pol);
18 domain_free(domains);
19 + if (tst)
20 + tst->ss->free_super(tst);
21 return -1;
22 }
23
24 --
25 2.17.1
26
0 From 29446c962f6099b9f0c22b76891ff6a0baeb673d Mon Sep 17 00:00:00 2001
1 From: Anthony Youngman <anthony@youngman.org.uk>
2 Date: Sat, 16 Jun 2018 20:48:46 +0100
3 Subject: [PATCH 31/40] Coverity: Resource leak: close fds and free array
4 before return
5
6 Signed-off-by: Anthony Youngman <anthony@youngman.org.uk>
7 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
8 ---
9 Dump.c | 3 +++
10 1 file changed, 3 insertions(+)
11
12 diff --git a/Dump.c b/Dump.c
13 index 7bdbf6f7..38e8f238 100644
14 --- a/Dump.c
15 +++ b/Dump.c
16 @@ -301,6 +301,9 @@ int Restore_metadata(char *dev, char *dir, struct context *c,
17 }
18 if (c->verbose >= 0)
19 printf("%s restored from %s.\n", dev, fname);
20 + close(fl);
21 + close(fd);
22 + free(fname);
23 return 0;
24
25 err:
26 --
27 2.17.1
28
0 From d94eb07f82a7e9c086da23b31c8021107b60f884 Mon Sep 17 00:00:00 2001
1 From: Anthony Youngman <anthony@youngman.org.uk>
2 Date: Fri, 15 Jun 2018 22:36:42 +0100
3 Subject: [PATCH 32/40] Coverity: Resource leak: close fd before return
4
5 Anthony Youngman <anthony@youngman.org.uk>
6 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
7 ---
8 Grow.c | 1 +
9 1 file changed, 1 insertion(+)
10
11 diff --git a/Grow.c b/Grow.c
12 index a4be7e7b..30c5fa91 100644
13 --- a/Grow.c
14 +++ b/Grow.c
15 @@ -242,6 +242,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
16 if (st->ss->load_super(st, fd2, NULL)) {
17 pr_err("cannot find super block on %s\n", dv);
18 close(fd);
19 + close(fd2);
20 return 1;
21 }
22 info.array.raid_disks = nd+1;
23 --
24 2.17.1
25
0 From 6adfeaa7a23775a70d22b79a672a4b1a542455b4 Mon Sep 17 00:00:00 2001
1 From: Michal Zylowski <michal.zylowski@intel.com>
2 Date: Fri, 22 Jun 2018 16:34:07 +0200
3 Subject: [PATCH 33/40] tests, imsm: Set correct expected offset between
4 volumes
5
6 Since 611d9529 (imsm: change reserved space to 4MB) gap between RAID
7 volumes has changed. Tests should expect correct offset in size
8 calulations.
9
10 Fix expected offset for tests.
11
12 Signed-off-by: Michal Zylowski <michal.zylowski@intel.com>
13 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
14 ---
15 tests/09imsm-create-fail-rebuild | 4 ++--
16 tests/09imsm-overlap | 10 ++++------
17 tests/13imsm-r0_r0_2d-grow-r0_r0_4d | 2 +-
18 tests/13imsm-r0_r0_2d-grow-r0_r0_5d | 2 +-
19 tests/13imsm-r0_r0_3d-grow-r0_r0_4d | 2 +-
20 tests/13imsm-r0_r5_3d-grow-r0_r5_4d | 2 +-
21 tests/13imsm-r0_r5_3d-grow-r0_r5_5d | 2 +-
22 tests/13imsm-r5_r0_3d-grow-r5_r0_4d | 2 +-
23 tests/13imsm-r5_r0_3d-grow-r5_r0_5d | 2 +-
24 tests/14imsm-r0_3d-r5_3d-migrate-r5_4d-r5_4d | 2 +-
25 tests/14imsm-r0_r0_2d-takeover-r10_4d | 2 +-
26 tests/14imsm-r10_r5_4d-takeover-r0_2d | 2 +-
27 tests/15imsm-r5_r0_3d_64k-migrate-r5_r0_3d_256k | 2 +-
28 13 files changed, 17 insertions(+), 19 deletions(-)
29
30 diff --git a/tests/09imsm-create-fail-rebuild b/tests/09imsm-create-fail-rebuild
31 index de17f321..886d385a 100644
32 --- a/tests/09imsm-create-fail-rebuild
33 +++ b/tests/09imsm-create-fail-rebuild
34 @@ -36,7 +36,7 @@ mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size -c $chunk
35 imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk
36 testdev $member0 $num_disks $size $chunk
37
38 -offset=$(((size & ~(chunk - 1)) + 2048))
39 +offset=$(((size & ~(chunk - 1)) + 4096))
40 size=4000
41 level=1
42 chunk=0
43 @@ -60,7 +60,7 @@ mdadm -CR $member0 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $
44 imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk
45 testdev $member0 $((num_disks-2)) $size $chunk
46
47 -offset=$(((size & ~(chunk - 1)) + 2048))
48 +offset=$(((size & ~(chunk - 1)) + 4096))
49 size=4000
50 level=5
51 mdadm -CR $member1 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $chunk
52 diff --git a/tests/09imsm-overlap b/tests/09imsm-overlap
53 index e832257c..2d1ab692 100644
54 --- a/tests/09imsm-overlap
55 +++ b/tests/09imsm-overlap
56 @@ -18,13 +18,11 @@ udevadm settle
57
58 offset=0
59 imsm_check member $member0 $num_disks $level $size 1024 $offset
60 -offset=$((offset+size+2048))
61 +offset=$((offset+size+4096))
62 imsm_check member $member1 $num_disks $level $size 1024 $offset
63 -offset=$((offset+size+2048))
64 +offset=$((offset+size+4096))
65 imsm_check member $member2 $num_disks $level $size 1024 $offset
66 -# at this point there should be more freespace at the start of the disk
67 -# than the end
68 -offset=0
69 +offset=$((offset+size+4096))
70 imsm_check member $member3 $num_disks $level $size 1024 $offset
71 -offset=$((offset+size+2048))
72 +offset=$((offset+size+4096))
73 imsm_check member $member4 $num_disks $level $size 1024 $offset
74 diff --git a/tests/13imsm-r0_r0_2d-grow-r0_r0_4d b/tests/13imsm-r0_r0_2d-grow-r0_r0_4d
75 index f85efa5d..66ceeb36 100644
76 --- a/tests/13imsm-r0_r0_2d-grow-r0_r0_4d
77 +++ b/tests/13imsm-r0_r0_2d-grow-r0_r0_4d
78 @@ -19,7 +19,7 @@ vol1_level=0
79 vol1_comp_size=$((5 * 1024))
80 vol1_chunk=64
81 vol1_num_comps=$num_disks
82 -vol1_offset=$((vol0_comp_size + 2048))
83 +vol1_offset=$((vol0_comp_size + 4096))
84
85 # After: RAID 0 volume in slot #0, 4 disks, 128k chunk size
86 # RAID 0 volume in slot #1, 4 disks, 64k chunk size
87 diff --git a/tests/13imsm-r0_r0_2d-grow-r0_r0_5d b/tests/13imsm-r0_r0_2d-grow-r0_r0_5d
88 index 1b851a9b..0da9ef32 100644
89 --- a/tests/13imsm-r0_r0_2d-grow-r0_r0_5d
90 +++ b/tests/13imsm-r0_r0_2d-grow-r0_r0_5d
91 @@ -19,7 +19,7 @@ vol1_level=0
92 vol1_comp_size=$((6 * 1024))
93 vol1_chunk=256
94 vol1_num_comps=$num_disks
95 -vol1_offset=$((vol0_comp_size + 2048))
96 +vol1_offset=$((vol0_comp_size + 4096))
97
98 # After: RAID 0 volume in slot #0, 5 disks, 64k chunk size
99 # RAID 0 volume in slot #1, 5 disks, 256k chunk size
100 diff --git a/tests/13imsm-r0_r0_3d-grow-r0_r0_4d b/tests/13imsm-r0_r0_3d-grow-r0_r0_4d
101 index 27ba83b3..1ff60257 100644
102 --- a/tests/13imsm-r0_r0_3d-grow-r0_r0_4d
103 +++ b/tests/13imsm-r0_r0_3d-grow-r0_r0_4d
104 @@ -19,7 +19,7 @@ vol1_level=0
105 vol1_comp_size=$((5 * 1024))
106 vol1_chunk=128
107 vol1_num_comps=$num_disks
108 -vol1_offset=$((vol0_comp_size + 2048))
109 +vol1_offset=$((vol0_comp_size + 4096))
110
111 # After: RAID0 volume in slot #0, 4 disks, 128k chunk size
112 # RAID0 volume in slot #1, 4 disks, 512k chunk size
113 diff --git a/tests/13imsm-r0_r5_3d-grow-r0_r5_4d b/tests/13imsm-r0_r5_3d-grow-r0_r5_4d
114 index b4bde449..2977f367 100644
115 --- a/tests/13imsm-r0_r5_3d-grow-r0_r5_4d
116 +++ b/tests/13imsm-r0_r5_3d-grow-r0_r5_4d
117 @@ -19,7 +19,7 @@ vol1_level=5
118 vol1_comp_size=$((5 * 1024))
119 vol1_chunk=128
120 vol1_num_comps=$((num_disks - 1))
121 -vol1_offset=$((vol0_comp_size + 2048))
122 +vol1_offset=$((vol0_comp_size + 4096))
123
124 # After: RAID 0 volume in slot #0, 4 disks, 64k chunk size
125 # RAID 5 volume in slot #1, 4 disks, 128k chunk size
126 diff --git a/tests/13imsm-r0_r5_3d-grow-r0_r5_5d b/tests/13imsm-r0_r5_3d-grow-r0_r5_5d
127 index d0db9aeb..ff15ad09 100644
128 --- a/tests/13imsm-r0_r5_3d-grow-r0_r5_5d
129 +++ b/tests/13imsm-r0_r5_3d-grow-r0_r5_5d
130 @@ -19,7 +19,7 @@ vol1_level=5
131 vol1_comp_size=$((5 * 1024))
132 vol1_chunk=128
133 vol1_num_comps=$((num_disks - 1))
134 -vol1_offset=$((vol0_comp_size + 2048))
135 +vol1_offset=$((vol0_comp_size + 4096))
136
137 # After: RAID 0 volume in slot #0, 5 disks, 256k chunk size
138 # RAID 5 volume in slot #1, 5 disks, 512k chunk size
139 diff --git a/tests/13imsm-r5_r0_3d-grow-r5_r0_4d b/tests/13imsm-r5_r0_3d-grow-r5_r0_4d
140 index 32ebc924..9fed88a2 100644
141 --- a/tests/13imsm-r5_r0_3d-grow-r5_r0_4d
142 +++ b/tests/13imsm-r5_r0_3d-grow-r5_r0_4d
143 @@ -18,7 +18,7 @@ vol0_offset=0
144 vol1_level=0
145 vol1_comp_size=$((5 * 1024))
146 vol1_chunk=64
147 -vol1_offset=$((vol0_comp_size + 2048))
148 +vol1_offset=$((vol0_comp_size + 4096))
149 vol1_num_comps=$num_disks
150
151 # After: RAID 5 volume in slot #0, 4 disks, 64k chunk size
152 diff --git a/tests/13imsm-r5_r0_3d-grow-r5_r0_5d b/tests/13imsm-r5_r0_3d-grow-r5_r0_5d
153 index a97002d0..e8beddc3 100644
154 --- a/tests/13imsm-r5_r0_3d-grow-r5_r0_5d
155 +++ b/tests/13imsm-r5_r0_3d-grow-r5_r0_5d
156 @@ -18,7 +18,7 @@ vol0_offset=0
157 vol1_level=0
158 vol1_comp_size=$((5 * 1024))
159 vol1_chunk=64
160 -vol1_offset=$((vol0_comp_size + 2048))
161 +vol1_offset=$((vol0_comp_size + 4096))
162 vol1_num_comps=$num_disks
163
164 # After: RAID 5 volume in slot #0, 5 disks, 128k chunk size
165 diff --git a/tests/14imsm-r0_3d-r5_3d-migrate-r5_4d-r5_4d b/tests/14imsm-r0_3d-r5_3d-migrate-r5_4d-r5_4d
166 index 386abeee..cb7328a9 100644
167 --- a/tests/14imsm-r0_3d-r5_3d-migrate-r5_4d-r5_4d
168 +++ b/tests/14imsm-r0_3d-r5_3d-migrate-r5_4d-r5_4d
169 @@ -19,7 +19,7 @@ vol1_level=5
170 vol1_comp_size=$((5 * 1024))
171 vol1_chunk=64
172 vol1_num_comps=$((num_disks - 1))
173 -vol1_offset=$((vol0_comp_size + 2048))
174 +vol1_offset=$((vol0_comp_size + 4096))
175
176 # After: RAID 5 volume, 4 disks, 64k chunk size (only member #0)
177 vol0_new_level=5
178 diff --git a/tests/14imsm-r0_r0_2d-takeover-r10_4d b/tests/14imsm-r0_r0_2d-takeover-r10_4d
179 index df5b0ce3..d068abb3 100644
180 --- a/tests/14imsm-r0_r0_2d-takeover-r10_4d
181 +++ b/tests/14imsm-r0_r0_2d-takeover-r10_4d
182 @@ -20,7 +20,7 @@ vol1_level=0
183 vol1_comp_size=$((5 * 1024))
184 vol1_chunk=64
185 vol1_num_comps=num_disks
186 -vol1_offset=$(( $vol0_comp_size + 2048 ))
187 +vol1_offset=$(( $vol0_comp_size + 4096 ))
188
189 # After: RAID 10, 4 disks, 64k chunk size
190 vol0_new_level=10
191 diff --git a/tests/14imsm-r10_r5_4d-takeover-r0_2d b/tests/14imsm-r10_r5_4d-takeover-r0_2d
192 index 9e5205e2..720e575b 100644
193 --- a/tests/14imsm-r10_r5_4d-takeover-r0_2d
194 +++ b/tests/14imsm-r10_r5_4d-takeover-r0_2d
195 @@ -20,7 +20,7 @@ vol1_level=5
196 vol1_comp_size=$((5 * 1024))
197 vol1_chunk=64
198 vol1_num_comps=$(( $num_disks - 1 ))
199 -vol1_offset=$(( $vol0_comp_size + 2048 ))
200 +vol1_offset=$(( $vol0_comp_size + 4096 ))
201
202 # After: RAID 10, 4 disks, 64k chunk size
203 vol0_new_level=0
204 diff --git a/tests/15imsm-r5_r0_3d_64k-migrate-r5_r0_3d_256k b/tests/15imsm-r5_r0_3d_64k-migrate-r5_r0_3d_256k
205 index da218efa..f9369d5d 100644
206 --- a/tests/15imsm-r5_r0_3d_64k-migrate-r5_r0_3d_256k
207 +++ b/tests/15imsm-r5_r0_3d_64k-migrate-r5_r0_3d_256k
208 @@ -24,7 +24,7 @@ vol1_level=0
209 vol1_comp_size=$((5 * 1024))
210 vol1_chunk=64
211 vol1_num_comps=$num_disks
212 -vol1_offset=$((vol0_comp_size + 2048))
213 +vol1_offset=$((vol0_comp_size + 4096))
214
215 # After migration paramters
216 vol1_new_level=0
217 --
218 2.17.1
219
0 From b202e322c13572078cc1285c41a8de23609e0820 Mon Sep 17 00:00:00 2001
1 From: Michal Zylowski <michal.zylowski@intel.com>
2 Date: Fri, 22 Jun 2018 16:34:08 +0200
3 Subject: [PATCH 34/40] tests, imsm: Fix unit inconsistency in tests error
4 messages
5
6 Chunk size copied from sysfs should be divied by 1024 to compare with
7 expected chunk size.
8
9 Signed-off-by: Michal Zylowski <michal.zylowski@intel.com>
10 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
11 ---
12 tests/env-imsm-template | 2 +-
13 1 file changed, 1 insertion(+), 1 deletion(-)
14
15 diff --git a/tests/env-imsm-template b/tests/env-imsm-template
16 index ea45bae9..40479b48 100644
17 --- a/tests/env-imsm-template
18 +++ b/tests/env-imsm-template
19 @@ -30,7 +30,7 @@ imsm_check() {
20 fi
21 _chunk=`cat ${sysfs}/md/chunk_size`
22 if [ $t_chunk -ne $((_chunk/1024)) ]; then
23 - echo "**Error**: Chunk size mismatch - expected $t_chunk, actual $_chunk" >&2
24 + echo "**Error**: Chunk size mismatch - expected $t_chunk, actual $(($_chunk/1024))" >&2
25 err=$((err + 1))
26 fi
27 for i in `seq 0 $((t_num_disks - 1))`; do
28 --
29 2.17.1
30
0 From 2b2ccdc04b604ef8644a0f87dc27ccfbd2159cb9 Mon Sep 17 00:00:00 2001
1 From: Michal Zylowski <michal.zylowski@intel.com>
2 Date: Fri, 22 Jun 2018 16:34:09 +0200
3 Subject: [PATCH 35/40] tests, imsm: Set new_num_disks value corectly to
4 perform expected size calculations
5
6 In some migration tests, variable new_num_disks should be set to expected
7 number of disks after migration. This is required for proper expected size
8 calculation.
9
10 Pass new_num_disks variable during test execution for:
11 - 16imsm-r0_3d-migrate-r5_4d
12 - 18imsm-r1_2d-takeover-r0_1d
13 - 16imsm-r0_5d-migrate-r5_6d
14
15 Signed-off-by: Michal Zylowski <michal.zylowski@intel.com>
16 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
17 ---
18 tests/16imsm-r0_3d-migrate-r5_4d | 1 +
19 tests/16imsm-r0_5d-migrate-r5_6d | 1 +
20 tests/18imsm-r1_2d-takeover-r0_1d | 2 +-
21 3 files changed, 3 insertions(+), 1 deletion(-)
22
23 diff --git a/tests/16imsm-r0_3d-migrate-r5_4d b/tests/16imsm-r0_3d-migrate-r5_4d
24 index 4f45479a..265adf94 100644
25 --- a/tests/16imsm-r0_3d-migrate-r5_4d
26 +++ b/tests/16imsm-r0_3d-migrate-r5_4d
27 @@ -15,6 +15,7 @@ vol0_offset=0
28
29 # After: RAID 5, 4 disks, 64k chunk size
30 vol0_new_level=5
31 +new_num_disks=4
32 vol0_new_num_comps=$num_disks
33 vol0_new_chunk=64
34
35 diff --git a/tests/16imsm-r0_5d-migrate-r5_6d b/tests/16imsm-r0_5d-migrate-r5_6d
36 index bee505bf..535b6099 100644
37 --- a/tests/16imsm-r0_5d-migrate-r5_6d
38 +++ b/tests/16imsm-r0_5d-migrate-r5_6d
39 @@ -17,5 +17,6 @@ vol0_offset=0
40 vol0_new_level=5
41 vol0_new_num_comps=$num_disks
42 vol0_new_chunk=64
43 +new_num_disks=6
44
45 . tests/imsm-grow-template 0 1
46 diff --git a/tests/18imsm-r1_2d-takeover-r0_1d b/tests/18imsm-r1_2d-takeover-r0_1d
47 index cb10ec97..fd5852ed 100644
48 --- a/tests/18imsm-r1_2d-takeover-r0_1d
49 +++ b/tests/18imsm-r1_2d-takeover-r0_1d
50 @@ -17,6 +17,6 @@ vol0_offset=0
51 vol0_new_level=0
52 vol0_new_num_comps=1
53 vol0_new_chunk=64
54 -new_num_disks=0
55 +new_num_disks=1
56
57 . tests/imsm-grow-template 0 1
58 --
59 2.17.1
60
0 From 1a90fd84582757ae384c85f0c477f52eb6f66e81 Mon Sep 17 00:00:00 2001
1 From: Michal Zylowski <michal.zylowski@intel.com>
2 Date: Fri, 22 Jun 2018 16:34:10 +0200
3 Subject: [PATCH 36/40] tests, imsm: Test shouldn't call grow with chunk and
4 level in one command
5
6 Since a3b831c9 "Grow.c: Block any level migration with chunk size change"
7 there is no possibility to perform migration between level and chunk in
8 one operation. When any test tries to do this error message is printed
9 and tests finishes with fail.
10
11 Signed-off-by: Michal Zylowski <michal.zylowski@intel.com>
12 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
13 ---
14 tests/imsm-grow-template | 11 ++++++++---
15 1 file changed, 8 insertions(+), 3 deletions(-)
16
17 diff --git a/tests/imsm-grow-template b/tests/imsm-grow-template
18 index 71a0bbb1..428e448e 100644
19 --- a/tests/imsm-grow-template
20 +++ b/tests/imsm-grow-template
21 @@ -13,10 +13,15 @@ function grow_member() {
22 local size=$5
23 local offset=$6
24 local chunk=$7
25 + local old_chunk=$8
26 local array_size=$((comps * size))
27
28 rm -f $backup_imsm
29 - ( set -ex; mdadm --grow $member --chunk=$chunk --level=$level )
30 + if [ $chunk -eq $old_chunk ]; then
31 + ( set -ex; mdadm --grow $member --level=$level )
32 + else
33 + ( set -ex; mdadm --grow $member --chunk=$chunk )
34 + fi
35 local status=$?
36 if [ $negative_test -ne 0 ]; then
37 if [ $status -eq 0 ]; then
38 @@ -76,9 +81,9 @@ if [ $migration_test -ne 0 ]; then
39 if [ -z $new_num_disks ]; then
40 new_num_disks=$num_disks
41 fi
42 - grow_member $member0 $new_num_disks $vol0_new_num_comps $vol0_new_level $vol0_comp_size $vol0_offset $vol0_new_chunk
43 + grow_member $member0 $new_num_disks $vol0_new_num_comps $vol0_new_level $vol0_comp_size $vol0_offset $vol0_new_chunk $vol0_chunk
44 if [[ $vol1_new_chunk -ne 0 ]] ; then
45 - grow_member $member1 $new_num_disks $vol1_new_num_comps $vol1_new_level $vol1_comp_size $vol1_offset $vol1_new_chunk
46 + grow_member $member1 $new_num_disks $vol1_new_num_comps $vol1_new_level $vol1_comp_size $vol1_offset $vol1_new_chunk $vol1_chunk
47 fi
48 else
49 rm -f $backup_imsm
50 --
51 2.17.1
52
0 From f49f083e2ccfe3d0c72819cf4aa615d3dce85cda Mon Sep 17 00:00:00 2001
1 From: Michal Zylowski <michal.zylowski@intel.com>
2 Date: Fri, 22 Jun 2018 16:34:11 +0200
3 Subject: [PATCH 37/40] tests, imsm: Migration from RAID5 to RAID0 is not
4 supported for IMSM metadata
5
6 When test tries to change RAID level from RAID5 to RAID0 mdadm respond with
7 error about unsporrted operation.
8
9 Make 16imsm-r5_3d-migrate-r0_3d and 16imsm-r5_5d-migrate-r0_5d test
10 negative.
11
12 Signed-off-by: Michal Zylowski <michal.zylowski@intel.com>
13 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
14 ---
15 tests/16imsm-r5_3d-migrate-r0_3d | 4 ++--
16 tests/16imsm-r5_5d-migrate-r0_5d | 4 ++--
17 2 files changed, 4 insertions(+), 4 deletions(-)
18
19 diff --git a/tests/16imsm-r5_3d-migrate-r0_3d b/tests/16imsm-r5_3d-migrate-r0_3d
20 index b1459cc1..bcb57090 100644
21 --- a/tests/16imsm-r5_3d-migrate-r0_3d
22 +++ b/tests/16imsm-r5_3d-migrate-r0_3d
23 @@ -1,7 +1,7 @@
24 . tests/env-imsm-template
25
26 # RAID 5 volume (3 disks) migrate to RAID 0 volume (2 disks)
27 -# POSITIVE test
28 +# NEGATIVE test
29
30 num_disks=3
31 device_list="$dev0 $dev1 $dev2"
32 @@ -18,4 +18,4 @@ vol0_new_level=0
33 vol0_new_num_comps=$((num_disks-1))
34 vol0_new_chunk=64
35
36 -. tests/imsm-grow-template 0 1
37 +. tests/imsm-grow-template 1 1
38 diff --git a/tests/16imsm-r5_5d-migrate-r0_5d b/tests/16imsm-r5_5d-migrate-r0_5d
39 index 323ca52e..ca77435f 100644
40 --- a/tests/16imsm-r5_5d-migrate-r0_5d
41 +++ b/tests/16imsm-r5_5d-migrate-r0_5d
42 @@ -1,7 +1,7 @@
43 . tests/env-imsm-template
44
45 # RAID 5 volume (5 disks) migration to RAID 0 volume (4 disks)
46 -# POSITIVE test
47 +# NEGATIVE test
48
49 num_disks=5
50 device_list="$dev0 $dev1 $dev2 $dev3 $dev4"
51 @@ -18,4 +18,4 @@ vol0_new_level=0
52 vol0_new_num_comps=$((num_disks - 1))
53 vol0_new_chunk=64
54
55 -. tests/imsm-grow-template 0 1
56 +. tests/imsm-grow-template 1 1
57 --
58 2.17.1
59
0 From cf42a1c7074a4f6258e6f0e4c122a93fd9c89850 Mon Sep 17 00:00:00 2001
1 From: Michal Zylowski <michal.zylowski@intel.com>
2 Date: Fri, 22 Jun 2018 16:34:12 +0200
3 Subject: [PATCH 38/40] tests, imsm: Calculate expected array_size in proper
4 way
5
6 Tests should calucalte expected array_size accordingly to raid level. Also
7 tests should take care about runding to neares MB introduced from b53bfba6
8 "imsm: use rounded size for metadata initialization".
9
10 Expect proper size in tests. Simplify 09imsm-overlap test by creating array
11 with size which has not been rounded. Main purpose of this test is checking
12 something else.
13
14 Signed-off-by: Michal Zylowski <michal.zylowski@intel.com>
15 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
16 ---
17 tests/09imsm-create-fail-rebuild | 4 ++--
18 tests/09imsm-overlap | 2 +-
19 tests/env-imsm-template | 28 +++++++++++++++++++++++-----
20 3 files changed, 26 insertions(+), 8 deletions(-)
21
22 diff --git a/tests/09imsm-create-fail-rebuild b/tests/09imsm-create-fail-rebuild
23 index 886d385a..f09b437b 100644
24 --- a/tests/09imsm-create-fail-rebuild
25 +++ b/tests/09imsm-create-fail-rebuild
26 @@ -36,7 +36,7 @@ mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size -c $chunk
27 imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk
28 testdev $member0 $num_disks $size $chunk
29
30 -offset=$(((size & ~(chunk - 1)) + 4096))
31 +offset=$(((size & ~(1024 - 1)) + 4096))
32 size=4000
33 level=1
34 chunk=0
35 @@ -60,7 +60,7 @@ mdadm -CR $member0 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $
36 imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk
37 testdev $member0 $((num_disks-2)) $size $chunk
38
39 -offset=$(((size & ~(chunk - 1)) + 4096))
40 +offset=$(((size & ~(1024 - 1)) + 4096))
41 size=4000
42 level=5
43 mdadm -CR $member1 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $chunk
44 diff --git a/tests/09imsm-overlap b/tests/09imsm-overlap
45 index 2d1ab692..ff5d2093 100644
46 --- a/tests/09imsm-overlap
47 +++ b/tests/09imsm-overlap
48 @@ -5,7 +5,7 @@
49 mdadm -CR $container -e imsm -n 6 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5
50 imsm_check container 6
51
52 -size=1910
53 +size=1024
54 level=1
55 num_disks=2
56 mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size
57 diff --git a/tests/env-imsm-template b/tests/env-imsm-template
58 index 40479b48..d5247714 100644
59 --- a/tests/env-imsm-template
60 +++ b/tests/env-imsm-template
61 @@ -14,13 +14,31 @@ imsm_check() {
62 t_offset=$7
63 t_chunk=$8
64
65 - if [ $t_level -ne 1 ]; then
66 - t_rd_size=$((t_rd_size & ~(t_chunk - 1)))
67 - else
68 + t_rd_size=$((t_rd_size & ~(1024 - 1)))
69 +
70 + if [ $t_level -eq 1 ]; then
71 t_chunk=64
72 fi
73 - t_size=$((t_size/1024))
74 - t_size=$((t_size*1024))
75 +
76 + t_num_data_disks=0
77 +
78 + case $t_level in
79 + 0)
80 + t_num_data_disks=$t_num_disks
81 + ;;
82 + 1)
83 + t_num_data_disks=1
84 + ;;
85 + 5)
86 + t_num_data_disks=$((t_num_disks-1))
87 + ;;
88 + 10)
89 + t_num_data_disks=$((t_num_disks/2))
90 + ;;
91 + esac
92 +
93 + t_size=$((t_rd_size*t_num_data_disks))
94 +
95 err=0
96
97 eval `stat -L -c "let major=0x%t; let minor=0x%T;" $t_member`
98 --
99 2.17.1
100
0 From 531d7991476f8358a36fb7f320db93d38b0e4c8d Mon Sep 17 00:00:00 2001
1 From: Guoqing Jiang <gqjiang@suse.com>
2 Date: Thu, 19 Jul 2018 09:40:42 +0800
3 Subject: [PATCH 39/40] mapfile: set *mapp to NULL after map_free
4
5 We can see "double free or corruption" with below steps
6 as reported by Mariusz:
7
8 export IMSM_NO_PLATFORM=1
9 export IMSM_DEVNAME_AS_SERIAL=1
10 mdadm --zero-super /dev/sd*
11 mdadm -C /dev/md/imsm -n2 -eimsm /dev/sdb /dev/sdc --run
12 mdadm -C /dev/md/r1 -n2 -z15G -eimsm /dev/sdb /dev/sdc -l1 --run --assume-clean
13 mdadm -f /dev/md126 /dev/sdb
14 mdadm -Ss
15
16 It is caused by Manage_stop calls map_remove and map_unlock,
17 but *mapp is not set to NULL after map_remove -> map_free,
18 so map_unlock will call map_free again.
19
20 Reported-by: Tkaczyk Mariusz <mariusz.tkaczyk@intel.com>
21 Tested-by: Tkaczyk Mariusz <mariusz.tkaczyk@intel.com>
22 Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
23 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
24 ---
25 mapfile.c | 1 +
26 1 file changed, 1 insertion(+)
27
28 diff --git a/mapfile.c b/mapfile.c
29 index a5025563..8d7acb3c 100644
30 --- a/mapfile.c
31 +++ b/mapfile.c
32 @@ -268,6 +268,7 @@ void map_remove(struct map_ent **mapp, char *devnm)
33 map_delete(mapp, devnm);
34 map_write(*mapp);
35 map_free(*mapp);
36 + *mapp = NULL;
37 }
38
39 struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4])
40 --
41 2.17.1
42
0 From 80d1256e98b4995b0a753678f6c7e4a8bb369741 Mon Sep 17 00:00:00 2001
1 From: Guoqing Jiang <gqjiang@suse.com>
2 Date: Fri, 20 Jul 2018 16:05:14 +0800
3 Subject: [PATCH 40/40] Assemble: remove the protection when clustered raid do
4 assemble
5
6 For HA product, RA (resource agent) assembles cluster raid
7 through call below cmd:
8
9 $MDADM --assemble $mddev --config=$RAIDCONF $MDADM_HOMEHOST
10
11 Sometimes node can't assemble array because all the nodes
12 need to contend dlm lock, which causes node fence in automatic
13 test.
14
15 And in fact, we don't need the protection since the assemble
16 cmd called by RA doesn't change superblock, so revert the
17 commit 76781701a487090172d32befae07671a10ea88ad ("Assemble:
18 provide protection when clustered raid do assemble") to remove
19 unneccessary protection.
20
21 Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
22 Signed-off-by: Jes Sorensen <jsorensen@fb.com>
23 ---
24 Assemble.c | 21 ---------------------
25 1 file changed, 21 deletions(-)
26
27 diff --git a/Assemble.c b/Assemble.c
28 index 0a7ab6f5..23892a37 100644
29 --- a/Assemble.c
30 +++ b/Assemble.c
31 @@ -1348,9 +1348,6 @@ int Assemble(struct supertype *st, char *mddev,
32 char chosen_name[1024];
33 struct map_ent *map = NULL;
34 struct map_ent *mp;
35 - int locked = 0;
36 - struct mdp_superblock_1 *sb;
37 - bitmap_super_t *bms;
38
39 /*
40 * If any subdevs are listed, then any that don't
41 @@ -1381,12 +1378,6 @@ try_again:
42 * set of devices failed. Those are now marked as ->used==2 and
43 * we ignore them and try again
44 */
45 - if (locked)
46 - /*
47 - * if come back try_again is called, then need to unlock first,
48 - * and lock again since the metadate is re-read.
49 - */
50 - cluster_release_dlmlock();
51 if (!st && ident->st)
52 st = ident->st;
53 if (c->verbose>0)
54 @@ -1404,14 +1395,6 @@ try_again:
55 if (!st || !st->sb || !content)
56 return 2;
57
58 - sb = st->sb;
59 - bms = (bitmap_super_t*)(((char*)sb) + 4096);
60 - if (sb && bms->version == BITMAP_MAJOR_CLUSTERED) {
61 - locked = cluster_get_dlmlock();
62 - if (locked != 1)
63 - return 1;
64 - }
65 -
66 /* We have a full set of devices - we now need to find the
67 * array device.
68 * However there is a risk that we are racing with "mdadm -I"
69 @@ -1542,8 +1525,6 @@ try_again:
70 err = assemble_container_content(st, mdfd, content, c,
71 chosen_name, NULL);
72 close(mdfd);
73 - if (locked == 1)
74 - cluster_release_dlmlock();
75 return err;
76 }
77
78 @@ -1888,8 +1869,6 @@ out:
79 close(mdfd);
80
81 /* '2' means 'OK, but not started yet' */
82 - if (locked == 1)
83 - cluster_release_dlmlock();
84 if (rv == -1) {
85 free(devices);
86 return 1;
87 --
88 2.17.1
89
2323 0024-mdadm-test-mdadm-needn-t-make-install-on-the-system.patch
2424 0025-mdadm-test-correct-tests-testdev-as-testdev-in-02r5g.patch
2525 0026-gcc-8-coverity-hack.patch
26 0027-Assemble.c-Don-t-ignore-faulty-disk-when-array-is-au.patch
27 0028-imsm-correct-num_data_stripes-in-metadata-map-for-mi.patch
28 0029-Free-map-to-avoid-resource-leak-issues.patch
29 0030-Coverity-Resource-leak-fix-return-without-free.patch
30 0031-Coverity-Resource-leak-close-fds-and-free-array-befo.patch
31 0032-Coverity-Resource-leak-close-fd-before-return.patch
32 0033-tests-imsm-Set-correct-expected-offset-between-volum.patch
33 0034-tests-imsm-Fix-unit-inconsistency-in-tests-error-mes.patch
34 0035-tests-imsm-Set-new_num_disks-value-corectly-to-perfo.patch
35 0036-tests-imsm-Test-shouldn-t-call-grow-with-chunk-and-l.patch
36 0037-tests-imsm-Migration-from-RAID5-to-RAID0-is-not-supp.patch
37 0038-tests-imsm-Calculate-expected-array_size-in-proper-w.patch
38 0039-mapfile-set-mapp-to-NULL-after-map_free.patch
39 0040-Assemble-remove-the-protection-when-clustered-raid-d.patch
2640 debian-conffile-location.diff
2741 debian-no-Werror.diff
2842 sha1-includes.diff
142142 unlink(mapname[2]);
143143 fclose(lf);
144144 }
145 if (*melp)
146 map_free(*melp);
145147 lf = NULL;
146148 }
147149
265267 map_delete(mapp, devnm);
266268 map_write(*mapp);
267269 map_free(*mapp);
270 *mapp = NULL;
268271 }
269272
270273 struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4])
18841884 else
18851885 rv |= WaitClean(name, c->verbose);
18861886 put_md_name(name);
1887 map_free(map);
1888 map = NULL;
18871889 }
18881890 }
18891891 free_mdstat(ms);
95429542 if (u->direction == R10_TO_R0) {
95439543 unsigned long long num_data_stripes;
95449544
9545 map->num_domains = 1;
9546 num_data_stripes = imsm_dev_size(dev) / 2;
9547 num_data_stripes /= map->blocks_per_strip;
9548 num_data_stripes /= map->num_domains;
9549 set_num_data_stripes(map, num_data_stripes);
9550
95519545 /* Number of failed disks must be half of initial disk number */
95529546 if (imsm_count_failed(super, dev, MAP_0) !=
95539547 (map->num_members / 2))
95739567 map->num_domains = 1;
95749568 map->raid_level = 0;
95759569 map->failed_disk_num = -1;
9570 num_data_stripes = imsm_dev_size(dev) / 2;
9571 num_data_stripes /= map->blocks_per_strip;
9572 set_num_data_stripes(map, num_data_stripes);
95769573 }
95779574
95789575 if (u->direction == R0_TO_R10) {
95799576 void **space;
9577 unsigned long long num_data_stripes;
9578
95809579 /* update slots in current disk list */
95819580 for (dm = super->disks; dm; dm = dm->next) {
95829581 if (dm->index >= 0)
96149613 map->map_state = IMSM_T_STATE_DEGRADED;
96159614 map->num_domains = 2;
96169615 map->raid_level = 1;
9616 num_data_stripes = imsm_dev_size(dev) / 2;
9617 num_data_stripes /= map->blocks_per_strip;
9618 num_data_stripes /= map->num_domains;
9619 set_num_data_stripes(map, num_data_stripes);
9620
96179621 /* replace dev<->dev_new */
96189622 dv->dev = dev_new;
96199623 }
3535 imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk
3636 testdev $member0 $num_disks $size $chunk
3737
38 offset=$(((size & ~(chunk - 1)) + 2048))
38 offset=$(((size & ~(1024 - 1)) + 4096))
3939 size=4000
4040 level=1
4141 chunk=0
5959 imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk
6060 testdev $member0 $((num_disks-2)) $size $chunk
6161
62 offset=$(((size & ~(chunk - 1)) + 2048))
62 offset=$(((size & ~(1024 - 1)) + 4096))
6363 size=4000
6464 level=5
6565 mdadm -CR $member1 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $chunk
44 mdadm -CR $container -e imsm -n 6 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5
55 imsm_check container 6
66
7 size=1910
7 size=1024
88 level=1
99 num_disks=2
1010 mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size
1717
1818 offset=0
1919 imsm_check member $member0 $num_disks $level $size 1024 $offset
20 offset=$((offset+size+2048))
20 offset=$((offset+size+4096))
2121 imsm_check member $member1 $num_disks $level $size 1024 $offset
22 offset=$((offset+size+2048))
22 offset=$((offset+size+4096))
2323 imsm_check member $member2 $num_disks $level $size 1024 $offset
24 # at this point there should be more freespace at the start of the disk
25 # than the end
26 offset=0
24 offset=$((offset+size+4096))
2725 imsm_check member $member3 $num_disks $level $size 1024 $offset
28 offset=$((offset+size+2048))
26 offset=$((offset+size+4096))
2927 imsm_check member $member4 $num_disks $level $size 1024 $offset
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=64
2020 vol1_num_comps=$num_disks
21 vol1_offset=$((vol0_comp_size + 2048))
21 vol1_offset=$((vol0_comp_size + 4096))
2222
2323 # After: RAID 0 volume in slot #0, 4 disks, 128k chunk size
2424 # RAID 0 volume in slot #1, 4 disks, 64k chunk size
1818 vol1_comp_size=$((6 * 1024))
1919 vol1_chunk=256
2020 vol1_num_comps=$num_disks
21 vol1_offset=$((vol0_comp_size + 2048))
21 vol1_offset=$((vol0_comp_size + 4096))
2222
2323 # After: RAID 0 volume in slot #0, 5 disks, 64k chunk size
2424 # RAID 0 volume in slot #1, 5 disks, 256k chunk size
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=128
2020 vol1_num_comps=$num_disks
21 vol1_offset=$((vol0_comp_size + 2048))
21 vol1_offset=$((vol0_comp_size + 4096))
2222
2323 # After: RAID0 volume in slot #0, 4 disks, 128k chunk size
2424 # RAID0 volume in slot #1, 4 disks, 512k chunk size
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=128
2020 vol1_num_comps=$((num_disks - 1))
21 vol1_offset=$((vol0_comp_size + 2048))
21 vol1_offset=$((vol0_comp_size + 4096))
2222
2323 # After: RAID 0 volume in slot #0, 4 disks, 64k chunk size
2424 # RAID 5 volume in slot #1, 4 disks, 128k chunk size
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=128
2020 vol1_num_comps=$((num_disks - 1))
21 vol1_offset=$((vol0_comp_size + 2048))
21 vol1_offset=$((vol0_comp_size + 4096))
2222
2323 # After: RAID 0 volume in slot #0, 5 disks, 256k chunk size
2424 # RAID 5 volume in slot #1, 5 disks, 512k chunk size
1717 vol1_level=0
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=64
20 vol1_offset=$((vol0_comp_size + 2048))
20 vol1_offset=$((vol0_comp_size + 4096))
2121 vol1_num_comps=$num_disks
2222
2323 # After: RAID 5 volume in slot #0, 4 disks, 64k chunk size
1717 vol1_level=0
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=64
20 vol1_offset=$((vol0_comp_size + 2048))
20 vol1_offset=$((vol0_comp_size + 4096))
2121 vol1_num_comps=$num_disks
2222
2323 # After: RAID 5 volume in slot #0, 5 disks, 128k chunk size
1818 vol1_comp_size=$((5 * 1024))
1919 vol1_chunk=64
2020 vol1_num_comps=$((num_disks - 1))
21 vol1_offset=$((vol0_comp_size + 2048))
21 vol1_offset=$((vol0_comp_size + 4096))
2222
2323 # After: RAID 5 volume, 4 disks, 64k chunk size (only member #0)
2424 vol0_new_level=5
1919 vol1_comp_size=$((5 * 1024))
2020 vol1_chunk=64
2121 vol1_num_comps=num_disks
22 vol1_offset=$(( $vol0_comp_size + 2048 ))
22 vol1_offset=$(( $vol0_comp_size + 4096 ))
2323
2424 # After: RAID 10, 4 disks, 64k chunk size
2525 vol0_new_level=10
1919 vol1_comp_size=$((5 * 1024))
2020 vol1_chunk=64
2121 vol1_num_comps=$(( $num_disks - 1 ))
22 vol1_offset=$(( $vol0_comp_size + 2048 ))
22 vol1_offset=$(( $vol0_comp_size + 4096 ))
2323
2424 # After: RAID 10, 4 disks, 64k chunk size
2525 vol0_new_level=0
2323 vol1_comp_size=$((5 * 1024))
2424 vol1_chunk=64
2525 vol1_num_comps=$num_disks
26 vol1_offset=$((vol0_comp_size + 2048))
26 vol1_offset=$((vol0_comp_size + 4096))
2727
2828 # After migration paramters
2929 vol1_new_level=0
1414
1515 # After: RAID 5, 4 disks, 64k chunk size
1616 vol0_new_level=5
17 new_num_disks=4
1718 vol0_new_num_comps=$num_disks
1819 vol0_new_chunk=64
1920
1616 vol0_new_level=5
1717 vol0_new_num_comps=$num_disks
1818 vol0_new_chunk=64
19 new_num_disks=6
1920
2021 . tests/imsm-grow-template 0 1
00 . tests/env-imsm-template
11
22 # RAID 5 volume (3 disks) migrate to RAID 0 volume (2 disks)
3 # POSITIVE test
3 # NEGATIVE test
44
55 num_disks=3
66 device_list="$dev0 $dev1 $dev2"
1717 vol0_new_num_comps=$((num_disks-1))
1818 vol0_new_chunk=64
1919
20 . tests/imsm-grow-template 0 1
20 . tests/imsm-grow-template 1 1
00 . tests/env-imsm-template
11
22 # RAID 5 volume (5 disks) migration to RAID 0 volume (4 disks)
3 # POSITIVE test
3 # NEGATIVE test
44
55 num_disks=5
66 device_list="$dev0 $dev1 $dev2 $dev3 $dev4"
1717 vol0_new_num_comps=$((num_disks - 1))
1818 vol0_new_chunk=64
1919
20 . tests/imsm-grow-template 0 1
20 . tests/imsm-grow-template 1 1
1616 vol0_new_level=0
1717 vol0_new_num_comps=1
1818 vol0_new_chunk=64
19 new_num_disks=0
19 new_num_disks=1
2020
2121 . tests/imsm-grow-template 0 1
1313 t_offset=$7
1414 t_chunk=$8
1515
16 if [ $t_level -ne 1 ]; then
17 t_rd_size=$((t_rd_size & ~(t_chunk - 1)))
18 else
16 t_rd_size=$((t_rd_size & ~(1024 - 1)))
17
18 if [ $t_level -eq 1 ]; then
1919 t_chunk=64
2020 fi
21 t_size=$((t_size/1024))
22 t_size=$((t_size*1024))
21
22 t_num_data_disks=0
23
24 case $t_level in
25 0)
26 t_num_data_disks=$t_num_disks
27 ;;
28 1)
29 t_num_data_disks=1
30 ;;
31 5)
32 t_num_data_disks=$((t_num_disks-1))
33 ;;
34 10)
35 t_num_data_disks=$((t_num_disks/2))
36 ;;
37 esac
38
39 t_size=$((t_rd_size*t_num_data_disks))
40
2341 err=0
2442
2543 eval `stat -L -c "let major=0x%t; let minor=0x%T;" $t_member`
2947 fi
3048 _chunk=`cat ${sysfs}/md/chunk_size`
3149 if [ $t_chunk -ne $((_chunk/1024)) ]; then
32 echo "**Error**: Chunk size mismatch - expected $t_chunk, actual $_chunk" >&2
50 echo "**Error**: Chunk size mismatch - expected $t_chunk, actual $(($_chunk/1024))" >&2
3351 err=$((err + 1))
3452 fi
3553 for i in `seq 0 $((t_num_disks - 1))`; do
1212 local size=$5
1313 local offset=$6
1414 local chunk=$7
15 local old_chunk=$8
1516 local array_size=$((comps * size))
1617
1718 rm -f $backup_imsm
18 ( set -ex; mdadm --grow $member --chunk=$chunk --level=$level )
19 if [ $chunk -eq $old_chunk ]; then
20 ( set -ex; mdadm --grow $member --level=$level )
21 else
22 ( set -ex; mdadm --grow $member --chunk=$chunk )
23 fi
1924 local status=$?
2025 if [ $negative_test -ne 0 ]; then
2126 if [ $status -eq 0 ]; then
7580 if [ -z $new_num_disks ]; then
7681 new_num_disks=$num_disks
7782 fi
78 grow_member $member0 $new_num_disks $vol0_new_num_comps $vol0_new_level $vol0_comp_size $vol0_offset $vol0_new_chunk
83 grow_member $member0 $new_num_disks $vol0_new_num_comps $vol0_new_level $vol0_comp_size $vol0_offset $vol0_new_chunk $vol0_chunk
7984 if [[ $vol1_new_chunk -ne 0 ]] ; then
80 grow_member $member1 $new_num_disks $vol1_new_num_comps $vol1_new_level $vol1_comp_size $vol1_offset $vol1_new_chunk
85 grow_member $member1 $new_num_disks $vol1_new_num_comps $vol1_new_level $vol1_comp_size $vol1_offset $vol1_new_chunk $vol1_chunk
8186 fi
8287 else
8388 rm -f $backup_imsm