Cherrypick master patches up to 20th of July 2018. LP: #1781427
Dimitri John Ledkov
5 years ago
280 | 280 | st->ss->free_super(st); |
281 | 281 | dev_policy_free(pol); |
282 | 282 | domain_free(domains); |
283 | if (tst) | |
284 | tst->ss->free_super(tst); | |
283 | 285 | return -1; |
284 | 286 | } |
285 | 287 | |
778 | 780 | if (best[i] == -1 || (devices[best[i]].i.events |
779 | 781 | < devices[devcnt].i.events)) |
780 | 782 | best[i] = devcnt; |
783 | else if (st->ss == &super_imsm) | |
784 | best[i+1] = devcnt; | |
781 | 785 | } |
782 | 786 | devcnt++; |
783 | 787 | } |
1343 | 1347 | char chosen_name[1024]; |
1344 | 1348 | struct map_ent *map = NULL; |
1345 | 1349 | struct map_ent *mp; |
1346 | int locked = 0; | |
1347 | struct mdp_superblock_1 *sb; | |
1348 | bitmap_super_t *bms; | |
1349 | 1350 | |
1350 | 1351 | /* |
1351 | 1352 | * If any subdevs are listed, then any that don't |
1376 | 1377 | * set of devices failed. Those are now marked as ->used==2 and |
1377 | 1378 | * we ignore them and try again |
1378 | 1379 | */ |
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(); | |
1385 | 1380 | if (!st && ident->st) |
1386 | 1381 | st = ident->st; |
1387 | 1382 | if (c->verbose>0) |
1398 | 1393 | |
1399 | 1394 | if (!st || !st->sb || !content) |
1400 | 1395 | 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 | } | |
1409 | 1396 | |
1410 | 1397 | /* We have a full set of devices - we now need to find the |
1411 | 1398 | * array device. |
1537 | 1524 | err = assemble_container_content(st, mdfd, content, c, |
1538 | 1525 | chosen_name, NULL); |
1539 | 1526 | close(mdfd); |
1540 | if (locked == 1) | |
1541 | cluster_release_dlmlock(); | |
1542 | 1527 | return err; |
1543 | 1528 | } |
1544 | 1529 | |
1848 | 1833 | if (rv == 1 && !pre_exist) |
1849 | 1834 | ioctl(mdfd, STOP_ARRAY, NULL); |
1850 | 1835 | free(devices); |
1836 | out: | |
1851 | 1837 | map_unlock(&map); |
1852 | out: | |
1853 | 1838 | if (rv == 0) { |
1854 | 1839 | wait_for(chosen_name, mdfd); |
1855 | 1840 | close(mdfd); |
1883 | 1868 | close(mdfd); |
1884 | 1869 | |
1885 | 1870 | /* '2' means 'OK, but not started yet' */ |
1886 | if (locked == 1) | |
1887 | cluster_release_dlmlock(); | |
1888 | 1871 | if (rv == -1) { |
1889 | 1872 | free(devices); |
1890 | 1873 | return 1; |
262 | 262 | |
263 | 263 | if (st->ss->export_detail_super) |
264 | 264 | st->ss->export_detail_super(st); |
265 | map_free(map); | |
265 | 266 | } else { |
266 | 267 | struct map_ent *mp, *map = NULL; |
267 | 268 | char nbuf[64]; |
276 | 277 | print_escape(mp->path+8); |
277 | 278 | putchar('\n'); |
278 | 279 | } |
280 | map_free(map); | |
279 | 281 | } |
280 | 282 | if (sra) { |
281 | 283 | struct mdinfo *mdi; |
300 | 300 | } |
301 | 301 | if (c->verbose >= 0) |
302 | 302 | printf("%s restored from %s.\n", dev, fname); |
303 | close(fl); | |
304 | close(fd); | |
305 | free(fname); | |
303 | 306 | return 0; |
304 | 307 | |
305 | 308 | err: |
241 | 241 | if (st->ss->load_super(st, fd2, NULL)) { |
242 | 242 | pr_err("cannot find super block on %s\n", dv); |
243 | 243 | close(fd); |
244 | close(fd2); | |
244 | 245 | return 1; |
245 | 246 | } |
246 | 247 | info.array.raid_disks = nd+1; |
1412 | 1412 | sysfs_free(sra); |
1413 | 1413 | } |
1414 | 1414 | } |
1415 | map_free(mapl); | |
1415 | 1416 | return rv; |
1416 | 1417 | } |
1417 | 1418 | |
1586 | 1587 | |
1587 | 1588 | assemble_container_content(st, mdfd, ra, c, |
1588 | 1589 | chosen_name, &result); |
1590 | map_free(map); | |
1591 | map = NULL; | |
1589 | 1592 | close(mdfd); |
1590 | 1593 | } |
1591 | 1594 | if (c->export && result) { |
1662 | 1665 | close(sfd); |
1663 | 1666 | } |
1664 | 1667 | domain_free(domains); |
1668 | map_free(map); | |
1665 | 1669 | return 0; |
1666 | 1670 | } |
1667 | 1671 |
180 | 180 | } |
181 | 181 | d->next = rv; |
182 | 182 | rv = d; |
183 | map_free(map); | |
184 | map = NULL; | |
183 | 185 | } |
184 | 186 | free_mdstat(mdstat); |
185 | map_free(map); | |
186 | 187 | |
187 | 188 | return rv; |
188 | 189 | } |
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 | ||
0 | 6 | mdadm (4.1~rc1-3) unstable; urgency=medium |
1 | 7 | |
2 | 8 | * Cherrypick master patches up to 4th of June 2018. |
0 | 0 | From 1c7c65a3e5d3e5f6d32bfa4cf0d872f87c654eb2 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Zhipeng Xie <xiezhipeng1@huawei.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | e->percent access the mdstat_ent which was already freed in free_mdstat |
6 | 6 |
0 | 0 | From b91ad097d6eecb85cf28915836370288709fbda8 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Michal Zylowski <michal.zylowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | After 1db03765("Subdevs can't be all missing when create raid device") |
6 | 6 | raid volume can't be created with link to container. This feature should |
0 | 0 | From 59416da78fc66084f721163b914913dc1da37b44 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | scripts |
5 | 5 | |
6 | 6 | We will never mandate an obsolete file system such as ext[2-4] for |
0 | 0 | From 611d95290dd41d73bd8f9cc06f7ec293a40b819e Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Mariusz Dabrowski <mariusz.dabrowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | Due to compatibility to the newest OROM, imsm reserved space has to be |
6 | 6 | expanded to 4MB. |
0 | 0 | From fcc2c9daede11fcc67e4032fd6fa8da198aaa319 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Mariusz Dabrowski <mariusz.dabrowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | Signed-off-by: Mariusz Dabrowski <mariusz.dabrowski@intel.com> |
6 | 6 | Signed-off-by: Jes Sorensen <jsorensen@fb.com> |
0 | 0 | From 9529d3436771d9f38884861683dee3b40ab9d180 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Mariusz Dabrowski <mariusz.dabrowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | imsm_num_data_members |
5 | 5 | |
6 | 6 | In almost every place where imsm_num_data_members is called there is |
0 | 0 | From 444909385fdaccf961308c4319d7029b82bf8bb1 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Mariusz Dabrowski <mariusz.dabrowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | calculations |
5 | 5 | |
6 | 6 | mdadm assumes that blocks_per_member value is equal to num_data_stripes * |
0 | 0 | From 54865c30d5b94920318950e29a4f6c1ce075cae8 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Roman Sobanski <roman.sobanski@intel.com> |
2 | 2 | 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 | |
4 | 4 | chunk |
5 | 5 | |
6 | 6 | Block creation of the imsm volume when given size is smaller than 1M and |
0 | 0 | From 5d518de84e7cd3382b4984cc1243ddb4102aa4f4 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Roman Sobanski <roman.sobanski@intel.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | With commit 4b74a905a67e |
6 | 6 | ("mdadm/grow: Component size must be larger than chunk size") mdadm returns |
0 | 0 | From 3e684231ebe10c08e7cf23743d4516f707e605a2 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Michal Zylowski <michal.zylowski@intel.com> |
2 | 2 | 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' | |
4 | 4 | |
5 | 5 | Set gemetry to geometry in error message about geometry validation failed. |
6 | 6 | Fix misspelled 'alignment' word in imsm_component_size_alignment_check |
0 | 0 | From 760365f94409ccccbcb54d55070f0f422bee44a1 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | gcc-8.1's -Werror=stringop-truncation is easily confused. Rather than |
6 | 6 | disabling the check, make it explicit we are OK truncating here. |
0 | 0 | From 167d8bb8302170676f0e15123738e333383fec7b Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | When added :0 to serial number and copying it back, use memcpy() |
6 | 6 | instead of strncpy() as we know the actual length. This stops gcc |
0 | 0 | From 1cdc06dfda62775647b81e2753fc7908e1bbffc2 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | No need to snprintf() into the string when we don't use it afterards |
6 | 6 |
0 | 0 | From 40659392ff90fc9c2861ec18c34ed1bdb54f92ca Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | snprintf() |
5 | 5 | |
6 | 6 | We know the max size of the volume name, so no need to play the |
0 | 0 | From ebad3af29b401dec7203e8fa5a77bcf16532f49c Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | name |
5 | 5 | |
6 | 6 | Clear up strncpy abuse to avoid gcc-8.1 complaining about truncating |
0 | 0 | From 59632db96bdd09b44e9927f63a67cccbe8b15cdf Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Michal Zylowski <michal.zylowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | disks with mixed sector size |
5 | 5 | |
6 | 6 | Currently when created container keeps disks with mixed sector size (few |
0 | 0 | From 5a5b3a6725ded07697f03ddd05ee537ce289e951 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Michal Zylowski <michal.zylowski@intel.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | Grow feature for IMSM metadata is currently fully supported and tested. |
6 | 6 | Reshape operation is not in experimental state anymore, so usage of this |
0 | 0 | From 975898395951835f5a8051441af21cc995921f8c Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | warning |
5 | 5 | |
6 | 6 | gcc-8.1 complains about truncated string operations. While we know |
0 | 0 | From c1b78589cf042221e22a014332b195b2309cb178 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | We already cut symlinks longer than 1000, so rely on this calling |
6 | 6 | readlink and error out if we are able to read more than 1000 bytes. |
0 | 0 | From 2dcd6492718c2921feac993aa71ed3a7c2522077 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | superblock data |
5 | 5 | |
6 | 6 | memcpy() does not allow overlapping copies, switch to memmove() |
0 | 0 | From 4d061b02b61d5e6d4186e0118166fdd40ea8b55f Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | warning |
5 | 5 | |
6 | 6 | Find the string length, copy it, and zero out the rest, instead of |
0 | 0 | From 002a5978f015a77ecc48487006b1030f9dbe1394 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | Cast to types that are big enough to hold the values, but also guarantee |
6 | 6 | no overflow of the buffer keepts gcc happy. |
0 | 0 | From 27e39ad31cbdfe516f9f390cc860a4f681750ef0 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Xiao Ni <xni@redhat.com> |
2 | 2 | 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 | |
4 | 4 | device |
5 | 5 | |
6 | 6 | It give error message when query a non md device. |
0 | 0 | From 38e955cbf030bc9e564bd87bc9f02f949884a83f Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Zhilong Liu <zlliu@suse.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | Fixes: beb71de04d31 ("mdadm/test: enable clustermd testing under clustermd_tests/") |
6 | 6 | clustermd_tests/func.sh: |
0 | 0 | From 7d4815f84cba133ee7439db5348ce554779f8342 Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Zhilong Liu <zlliu@suse.com> |
2 | 2 | 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 | |
4 | 4 | 02r5grow |
5 | 5 | |
6 | 6 | Fixes: a6994ccc230b ("mdadm/test: get rid of the tests/testdev") |
0 | 0 | From 28156667e5c7dc3c7b978f2d58c2a427038fedda Mon Sep 17 00:00:00 2001 |
1 | 1 | From: Jes Sorensen <jsorensen@fb.com> |
2 | 2 | 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 | |
4 | 4 | |
5 | 5 | Coverity still has issues with gcc-7, not to mention gcc-8. Hack around |
6 | 6 | 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 |
23 | 23 | 0024-mdadm-test-mdadm-needn-t-make-install-on-the-system.patch |
24 | 24 | 0025-mdadm-test-correct-tests-testdev-as-testdev-in-02r5g.patch |
25 | 25 | 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 | |
26 | 40 | debian-conffile-location.diff |
27 | 41 | debian-no-Werror.diff |
28 | 42 | sha1-includes.diff |
142 | 142 | unlink(mapname[2]); |
143 | 143 | fclose(lf); |
144 | 144 | } |
145 | if (*melp) | |
146 | map_free(*melp); | |
145 | 147 | lf = NULL; |
146 | 148 | } |
147 | 149 | |
265 | 267 | map_delete(mapp, devnm); |
266 | 268 | map_write(*mapp); |
267 | 269 | map_free(*mapp); |
270 | *mapp = NULL; | |
268 | 271 | } |
269 | 272 | |
270 | 273 | struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]) |
1884 | 1884 | else |
1885 | 1885 | rv |= WaitClean(name, c->verbose); |
1886 | 1886 | put_md_name(name); |
1887 | map_free(map); | |
1888 | map = NULL; | |
1887 | 1889 | } |
1888 | 1890 | } |
1889 | 1891 | free_mdstat(ms); |
9542 | 9542 | if (u->direction == R10_TO_R0) { |
9543 | 9543 | unsigned long long num_data_stripes; |
9544 | 9544 | |
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 | ||
9551 | 9545 | /* Number of failed disks must be half of initial disk number */ |
9552 | 9546 | if (imsm_count_failed(super, dev, MAP_0) != |
9553 | 9547 | (map->num_members / 2)) |
9573 | 9567 | map->num_domains = 1; |
9574 | 9568 | map->raid_level = 0; |
9575 | 9569 | 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); | |
9576 | 9573 | } |
9577 | 9574 | |
9578 | 9575 | if (u->direction == R0_TO_R10) { |
9579 | 9576 | void **space; |
9577 | unsigned long long num_data_stripes; | |
9578 | ||
9580 | 9579 | /* update slots in current disk list */ |
9581 | 9580 | for (dm = super->disks; dm; dm = dm->next) { |
9582 | 9581 | if (dm->index >= 0) |
9614 | 9613 | map->map_state = IMSM_T_STATE_DEGRADED; |
9615 | 9614 | map->num_domains = 2; |
9616 | 9615 | 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 | ||
9617 | 9621 | /* replace dev<->dev_new */ |
9618 | 9622 | dv->dev = dev_new; |
9619 | 9623 | } |
35 | 35 | imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk |
36 | 36 | testdev $member0 $num_disks $size $chunk |
37 | 37 | |
38 | offset=$(((size & ~(chunk - 1)) + 2048)) | |
38 | offset=$(((size & ~(1024 - 1)) + 4096)) | |
39 | 39 | size=4000 |
40 | 40 | level=1 |
41 | 41 | chunk=0 |
59 | 59 | imsm_check member $member0 $num_disks $level $size $((size*2)) $offset $chunk |
60 | 60 | testdev $member0 $((num_disks-2)) $size $chunk |
61 | 61 | |
62 | offset=$(((size & ~(chunk - 1)) + 2048)) | |
62 | offset=$(((size & ~(1024 - 1)) + 4096)) | |
63 | 63 | size=4000 |
64 | 64 | level=5 |
65 | 65 | mdadm -CR $member1 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $chunk |
4 | 4 | mdadm -CR $container -e imsm -n 6 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5 |
5 | 5 | imsm_check container 6 |
6 | 6 | |
7 | size=1910 | |
7 | size=1024 | |
8 | 8 | level=1 |
9 | 9 | num_disks=2 |
10 | 10 | mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size |
17 | 17 | |
18 | 18 | offset=0 |
19 | 19 | imsm_check member $member0 $num_disks $level $size 1024 $offset |
20 | offset=$((offset+size+2048)) | |
20 | offset=$((offset+size+4096)) | |
21 | 21 | imsm_check member $member1 $num_disks $level $size 1024 $offset |
22 | offset=$((offset+size+2048)) | |
22 | offset=$((offset+size+4096)) | |
23 | 23 | 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)) | |
27 | 25 | imsm_check member $member3 $num_disks $level $size 1024 $offset |
28 | offset=$((offset+size+2048)) | |
26 | offset=$((offset+size+4096)) | |
29 | 27 | imsm_check member $member4 $num_disks $level $size 1024 $offset |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=64 |
20 | 20 | vol1_num_comps=$num_disks |
21 | vol1_offset=$((vol0_comp_size + 2048)) | |
21 | vol1_offset=$((vol0_comp_size + 4096)) | |
22 | 22 | |
23 | 23 | # After: RAID 0 volume in slot #0, 4 disks, 128k chunk size |
24 | 24 | # RAID 0 volume in slot #1, 4 disks, 64k chunk size |
18 | 18 | vol1_comp_size=$((6 * 1024)) |
19 | 19 | vol1_chunk=256 |
20 | 20 | vol1_num_comps=$num_disks |
21 | vol1_offset=$((vol0_comp_size + 2048)) | |
21 | vol1_offset=$((vol0_comp_size + 4096)) | |
22 | 22 | |
23 | 23 | # After: RAID 0 volume in slot #0, 5 disks, 64k chunk size |
24 | 24 | # RAID 0 volume in slot #1, 5 disks, 256k chunk size |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=128 |
20 | 20 | vol1_num_comps=$num_disks |
21 | vol1_offset=$((vol0_comp_size + 2048)) | |
21 | vol1_offset=$((vol0_comp_size + 4096)) | |
22 | 22 | |
23 | 23 | # After: RAID0 volume in slot #0, 4 disks, 128k chunk size |
24 | 24 | # RAID0 volume in slot #1, 4 disks, 512k chunk size |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=128 |
20 | 20 | vol1_num_comps=$((num_disks - 1)) |
21 | vol1_offset=$((vol0_comp_size + 2048)) | |
21 | vol1_offset=$((vol0_comp_size + 4096)) | |
22 | 22 | |
23 | 23 | # After: RAID 0 volume in slot #0, 4 disks, 64k chunk size |
24 | 24 | # RAID 5 volume in slot #1, 4 disks, 128k chunk size |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=128 |
20 | 20 | vol1_num_comps=$((num_disks - 1)) |
21 | vol1_offset=$((vol0_comp_size + 2048)) | |
21 | vol1_offset=$((vol0_comp_size + 4096)) | |
22 | 22 | |
23 | 23 | # After: RAID 0 volume in slot #0, 5 disks, 256k chunk size |
24 | 24 | # RAID 5 volume in slot #1, 5 disks, 512k chunk size |
17 | 17 | vol1_level=0 |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=64 |
20 | vol1_offset=$((vol0_comp_size + 2048)) | |
20 | vol1_offset=$((vol0_comp_size + 4096)) | |
21 | 21 | vol1_num_comps=$num_disks |
22 | 22 | |
23 | 23 | # After: RAID 5 volume in slot #0, 4 disks, 64k chunk size |
17 | 17 | vol1_level=0 |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=64 |
20 | vol1_offset=$((vol0_comp_size + 2048)) | |
20 | vol1_offset=$((vol0_comp_size + 4096)) | |
21 | 21 | vol1_num_comps=$num_disks |
22 | 22 | |
23 | 23 | # After: RAID 5 volume in slot #0, 5 disks, 128k chunk size |
18 | 18 | vol1_comp_size=$((5 * 1024)) |
19 | 19 | vol1_chunk=64 |
20 | 20 | vol1_num_comps=$((num_disks - 1)) |
21 | vol1_offset=$((vol0_comp_size + 2048)) | |
21 | vol1_offset=$((vol0_comp_size + 4096)) | |
22 | 22 | |
23 | 23 | # After: RAID 5 volume, 4 disks, 64k chunk size (only member #0) |
24 | 24 | vol0_new_level=5 |
19 | 19 | vol1_comp_size=$((5 * 1024)) |
20 | 20 | vol1_chunk=64 |
21 | 21 | vol1_num_comps=num_disks |
22 | vol1_offset=$(( $vol0_comp_size + 2048 )) | |
22 | vol1_offset=$(( $vol0_comp_size + 4096 )) | |
23 | 23 | |
24 | 24 | # After: RAID 10, 4 disks, 64k chunk size |
25 | 25 | vol0_new_level=10 |
19 | 19 | vol1_comp_size=$((5 * 1024)) |
20 | 20 | vol1_chunk=64 |
21 | 21 | vol1_num_comps=$(( $num_disks - 1 )) |
22 | vol1_offset=$(( $vol0_comp_size + 2048 )) | |
22 | vol1_offset=$(( $vol0_comp_size + 4096 )) | |
23 | 23 | |
24 | 24 | # After: RAID 10, 4 disks, 64k chunk size |
25 | 25 | vol0_new_level=0 |
23 | 23 | vol1_comp_size=$((5 * 1024)) |
24 | 24 | vol1_chunk=64 |
25 | 25 | vol1_num_comps=$num_disks |
26 | vol1_offset=$((vol0_comp_size + 2048)) | |
26 | vol1_offset=$((vol0_comp_size + 4096)) | |
27 | 27 | |
28 | 28 | # After migration paramters |
29 | 29 | vol1_new_level=0 |
14 | 14 | |
15 | 15 | # After: RAID 5, 4 disks, 64k chunk size |
16 | 16 | vol0_new_level=5 |
17 | new_num_disks=4 | |
17 | 18 | vol0_new_num_comps=$num_disks |
18 | 19 | vol0_new_chunk=64 |
19 | 20 |
16 | 16 | vol0_new_level=5 |
17 | 17 | vol0_new_num_comps=$num_disks |
18 | 18 | vol0_new_chunk=64 |
19 | new_num_disks=6 | |
19 | 20 | |
20 | 21 | . tests/imsm-grow-template 0 1 |
0 | 0 | . tests/env-imsm-template |
1 | 1 | |
2 | 2 | # RAID 5 volume (3 disks) migrate to RAID 0 volume (2 disks) |
3 | # POSITIVE test | |
3 | # NEGATIVE test | |
4 | 4 | |
5 | 5 | num_disks=3 |
6 | 6 | device_list="$dev0 $dev1 $dev2" |
17 | 17 | vol0_new_num_comps=$((num_disks-1)) |
18 | 18 | vol0_new_chunk=64 |
19 | 19 | |
20 | . tests/imsm-grow-template 0 1 | |
20 | . tests/imsm-grow-template 1 1 |
0 | 0 | . tests/env-imsm-template |
1 | 1 | |
2 | 2 | # RAID 5 volume (5 disks) migration to RAID 0 volume (4 disks) |
3 | # POSITIVE test | |
3 | # NEGATIVE test | |
4 | 4 | |
5 | 5 | num_disks=5 |
6 | 6 | device_list="$dev0 $dev1 $dev2 $dev3 $dev4" |
17 | 17 | vol0_new_num_comps=$((num_disks - 1)) |
18 | 18 | vol0_new_chunk=64 |
19 | 19 | |
20 | . tests/imsm-grow-template 0 1 | |
20 | . tests/imsm-grow-template 1 1 |
16 | 16 | vol0_new_level=0 |
17 | 17 | vol0_new_num_comps=1 |
18 | 18 | vol0_new_chunk=64 |
19 | new_num_disks=0 | |
19 | new_num_disks=1 | |
20 | 20 | |
21 | 21 | . tests/imsm-grow-template 0 1 |
13 | 13 | t_offset=$7 |
14 | 14 | t_chunk=$8 |
15 | 15 | |
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 | |
19 | 19 | t_chunk=64 |
20 | 20 | 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 | ||
23 | 41 | err=0 |
24 | 42 | |
25 | 43 | eval `stat -L -c "let major=0x%t; let minor=0x%T;" $t_member` |
29 | 47 | fi |
30 | 48 | _chunk=`cat ${sysfs}/md/chunk_size` |
31 | 49 | 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 | |
33 | 51 | err=$((err + 1)) |
34 | 52 | fi |
35 | 53 | for i in `seq 0 $((t_num_disks - 1))`; do |
12 | 12 | local size=$5 |
13 | 13 | local offset=$6 |
14 | 14 | local chunk=$7 |
15 | local old_chunk=$8 | |
15 | 16 | local array_size=$((comps * size)) |
16 | 17 | |
17 | 18 | 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 | |
19 | 24 | local status=$? |
20 | 25 | if [ $negative_test -ne 0 ]; then |
21 | 26 | if [ $status -eq 0 ]; then |
75 | 80 | if [ -z $new_num_disks ]; then |
76 | 81 | new_num_disks=$num_disks |
77 | 82 | 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 | |
79 | 84 | 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 | |
81 | 86 | fi |
82 | 87 | else |
83 | 88 | rm -f $backup_imsm |