Update mdadm to upstream v4.0
Resolves: bz#1411555 Signed-off-by: Xiao Ni <xni@redhat.com>
This commit is contained in:
parent
c950024ba2
commit
104980a243
1
.gitignore
vendored
1
.gitignore
vendored
@ -20,3 +20,4 @@ clog
|
||||
/mdadm-3.3.2.tar.xz
|
||||
/mdadm-3.3.4.tar.xz
|
||||
/mdadm-3.4.tar.xz
|
||||
/mdadm-4.0.tar.xz
|
||||
|
@ -1,18 +0,0 @@
|
||||
--- mdadm-3.2.4/Makefile.map-dir 2012-05-10 12:29:09.687578525 +0200
|
||||
+++ mdadm-3.2.4/Makefile 2012-05-10 12:28:05.514380800 +0200
|
||||
@@ -67,12 +67,12 @@
|
||||
# Both MAP_DIR and MDMON_DIR should be somewhere that persists across the
|
||||
# pivotroot from early boot to late boot.
|
||||
# /run is best, but for distros that don't support that, /dev can work.
|
||||
-MAP_DIR=/run/mdadm
|
||||
-MAP_FILE = map
|
||||
+MAP_DIR=/dev/md
|
||||
+MAP_FILE = md-device-map
|
||||
MAP_PATH = $(MAP_DIR)/$(MAP_FILE)
|
||||
MDMON_DIR = $(MAP_DIR)
|
||||
# place for autoreplace cookies
|
||||
-FAILED_SLOTS_DIR = /run/mdadm/failed-slots
|
||||
+FAILED_SLOTS_DIR = $(MDMON_DIR)/failed-slots
|
||||
DIRFLAGS = -DMAP_DIR=\"$(MAP_DIR)\" -DMAP_FILE=\"$(MAP_FILE)\"
|
||||
DIRFLAGS += -DMDMON_DIR=\"$(MDMON_DIR)\"
|
||||
DIRFLAGS += -DFAILED_SLOTS_DIR=\"$(FAILED_SLOTS_DIR)\"
|
@ -1,92 +0,0 @@
|
||||
From d9751e06a601b5576b1b9e2c8126584083110ca5 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 15 May 2012 09:51:03 +1000
|
||||
Subject: [PATCH] super1: fix choice of data_offset.
|
||||
|
||||
While it is nice to set a high data_offset to leave plenty of head
|
||||
room it is much more important to leave enough space to allow
|
||||
of the data of the array.
|
||||
So after we check that sb->size is still available, only reduce the
|
||||
'reserved', don't increase it.
|
||||
|
||||
This fixes a bug where --adding a spare fails because it does not have
|
||||
enough space in it.
|
||||
|
||||
Reported-by: nowhere <nowhere@hakkenden.ath.cx>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super1.c | 31 ++++++++++++++++---------------
|
||||
1 files changed, 16 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/super1.c b/super1.c
|
||||
index be77c33..4f20cc3 100644
|
||||
--- a/super1.c
|
||||
+++ b/super1.c
|
||||
@@ -1189,40 +1189,42 @@ static int write_init_super1(struct supertype *st)
|
||||
case 1:
|
||||
sb->super_offset = __cpu_to_le64(0);
|
||||
reserved = bm_space + 4*2;
|
||||
+ if (reserved < headroom)
|
||||
+ reserved = headroom;
|
||||
+ if (reserved + array_size > dsize)
|
||||
+ reserved = dsize - array_size;
|
||||
/* Try for multiple of 1Meg so it is nicely aligned */
|
||||
#define ONE_MEG (2*1024)
|
||||
- reserved = ((reserved + ONE_MEG-1)/ONE_MEG) * ONE_MEG;
|
||||
- if (reserved + __le64_to_cpu(sb->size) > dsize)
|
||||
- reserved = dsize - __le64_to_cpu(sb->size);
|
||||
+ if (reserved > ONE_MEG)
|
||||
+ reserved = (reserved/ONE_MEG) * ONE_MEG;
|
||||
+
|
||||
/* force 4K alignment */
|
||||
reserved &= ~7ULL;
|
||||
|
||||
- if (reserved < headroom)
|
||||
- reserved = headroom;
|
||||
-
|
||||
sb->data_offset = __cpu_to_le64(reserved);
|
||||
sb->data_size = __cpu_to_le64(dsize - reserved);
|
||||
break;
|
||||
case 2:
|
||||
sb_offset = 4*2;
|
||||
sb->super_offset = __cpu_to_le64(4*2);
|
||||
- if (4*2 + 4*2 + bm_space + __le64_to_cpu(sb->size)
|
||||
+ if (4*2 + 4*2 + bm_space + array_size
|
||||
> dsize)
|
||||
- bm_space = dsize - __le64_to_cpu(sb->size)
|
||||
+ bm_space = dsize - array_size
|
||||
- 4*2 - 4*2;
|
||||
|
||||
reserved = bm_space + 4*2 + 4*2;
|
||||
+ if (reserved < headroom)
|
||||
+ reserved = headroom;
|
||||
+ if (reserved + array_size > dsize)
|
||||
+ reserved = dsize - array_size;
|
||||
/* Try for multiple of 1Meg so it is nicely aligned */
|
||||
#define ONE_MEG (2*1024)
|
||||
- reserved = ((reserved + ONE_MEG-1)/ONE_MEG) * ONE_MEG;
|
||||
- if (reserved + __le64_to_cpu(sb->size) > dsize)
|
||||
- reserved = dsize - __le64_to_cpu(sb->size);
|
||||
+ if (reserved > ONE_MEG)
|
||||
+ reserved = (reserved/ONE_MEG) * ONE_MEG;
|
||||
+
|
||||
/* force 4K alignment */
|
||||
reserved &= ~7ULL;
|
||||
|
||||
- if (reserved < headroom)
|
||||
- reserved = headroom;
|
||||
-
|
||||
sb->data_offset = __cpu_to_le64(reserved);
|
||||
sb->data_size = __cpu_to_le64(dsize - reserved);
|
||||
break;
|
||||
@@ -1234,7 +1236,6 @@ static int write_init_super1(struct supertype *st)
|
||||
goto out;
|
||||
}
|
||||
|
||||
-
|
||||
sb->sb_csum = calc_sb_1_csum(sb);
|
||||
rv = store_super1(st, di->fd);
|
||||
if (rv == 0 && (__le32_to_cpu(sb->feature_map) & 1))
|
||||
--
|
||||
1.7.7.6
|
||||
|
@ -1,45 +0,0 @@
|
||||
From 39fe768b8d9f3bd641f98029cb33f61f0c66841b Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 3 Oct 2012 10:00:34 +0200
|
||||
Subject: [PATCH 2/2] Add zlib license to crc32.c
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
crc32.c | 20 ++++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
diff --git a/crc32.c b/crc32.c
|
||||
index 12d08e5..94fda06 100644
|
||||
--- a/crc32.c
|
||||
+++ b/crc32.c
|
||||
@@ -2,6 +2,26 @@
|
||||
* Copyright (C) 1995-2003 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*
|
||||
+ * Note: zlib license from from zlib.h added explicitly as mdadm does
|
||||
+ * not include zlib.h. License from v1.2.2 of zlib:
|
||||
+ *
|
||||
+ * This software is provided 'as-is', without any express or implied
|
||||
+ * warranty. In no event will the authors be held liable for any damages
|
||||
+ * arising from the use of this software.
|
||||
+ *
|
||||
+ * Permission is granted to anyone to use this software for any purpose,
|
||||
+ * including commercial applications, and to alter it and redistribute it
|
||||
+ * freely, subject to the following restrictions:
|
||||
+ *
|
||||
+ * 1. The origin of this software must not be misrepresented; you must not
|
||||
+ * claim that you wrote the original software. If you use this software
|
||||
+ * in a product, an acknowledgment in the product documentation would be
|
||||
+ * appreciated but is not required.
|
||||
+ * 2. Altered source versions must be plainly marked as such, and must not be
|
||||
+ * misrepresented as being the original software.
|
||||
+ * 3. This notice may not be removed or altered from any source distribution.
|
||||
+ *
|
||||
+ *
|
||||
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
|
||||
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
|
||||
* tables for updating the shift register in one step with three exclusive-ors
|
||||
--
|
||||
1.7.11.4
|
||||
|
@ -1,39 +0,0 @@
|
||||
From c0e59ebcf91e43bdf3e1dbd69a59980655e3ac38 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Wed, 3 Oct 2012 13:34:15 +1000
|
||||
Subject: [PATCH 1/2] Replace sha1.h with slightly older version.
|
||||
|
||||
sha1.h claims GPL3+, while sha1.c claims GPL2+. This is
|
||||
inconsistent and technically prevents the whole from being
|
||||
distributed under GPL2.
|
||||
So replace sha1.h with a version from the GCC sources from before
|
||||
Tue Apr 20 08:36:39 2010
|
||||
when the copyright notice was updated.
|
||||
|
||||
Reported-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
sha1.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/sha1.h b/sha1.h
|
||||
index a601d96..d9b07f8 100644
|
||||
--- a/sha1.h
|
||||
+++ b/sha1.h
|
||||
@@ -1,11 +1,11 @@
|
||||
/* Declarations of functions and data types used for SHA1 sum
|
||||
library functions.
|
||||
- Copyright (C) 2000, 2001, 2003, 2005, 2006, 2008, 2010
|
||||
+ Copyright (C) 2000, 2001, 2003, 2005, 2006, 2008
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
- Free Software Foundation; either version 3, or (at your option) any
|
||||
+ Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
--
|
||||
1.7.11.4
|
||||
|
@ -1,46 +0,0 @@
|
||||
From e1993023991a6fa6539cc604b4b3d6718833250d Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Date: Fri, 25 May 2012 15:06:41 +0200
|
||||
Subject: [PATCH] imsm: fix: correct checking volume's degradation
|
||||
|
||||
We do not check the return value of sysfs_get_ll() now. It is wrong.
|
||||
If reading of the sysfs "degraded" key does not succeed,
|
||||
the "new_degraded" variable will not be initiated
|
||||
and accidentally it can have the value of "degraded" variable.
|
||||
In that case the change of degradation will not be checked.
|
||||
|
||||
It happens if mdadm is compiled with gcc's "-fstack-protector" option
|
||||
when one tries to stop a volume under reshape (e.g. OLCE).
|
||||
Reshape seems to be finished then (metadata is in normal/clean state)
|
||||
but it is not finished, it is broken and data are corrupted.
|
||||
|
||||
Now we always check the return value of sysfs_get_ll().
|
||||
Even if reading of the sysfs "degraded" key does not succeed
|
||||
(rv == -1) the change of degradation will be checked.
|
||||
|
||||
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-intel.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index 6c87e20..07ab9ae 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -10370,8 +10370,10 @@ int check_degradation_change(struct mdinfo *info,
|
||||
int degraded)
|
||||
{
|
||||
unsigned long long new_degraded;
|
||||
- sysfs_get_ll(info, NULL, "degraded", &new_degraded);
|
||||
- if (new_degraded != (unsigned long long)degraded) {
|
||||
+ int rv;
|
||||
+
|
||||
+ rv = sysfs_get_ll(info, NULL, "degraded", &new_degraded);
|
||||
+ if ((rv == -1) || (new_degraded != (unsigned long long)degraded)) {
|
||||
/* check each device to ensure it is still working */
|
||||
struct mdinfo *sd;
|
||||
new_degraded = 0;
|
||||
--
|
||||
1.7.10.2
|
||||
|
@ -1,49 +0,0 @@
|
||||
From 4edb8530e889fc7b5e1b5471a0fbfd6c3c116b4a Mon Sep 17 00:00:00 2001
|
||||
From: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Date: Wed, 3 Apr 2013 12:43:42 +1100
|
||||
Subject: [PATCH] Add updating component_size to manager thread of mdmon
|
||||
|
||||
Mdmon does not update component_size now. It is wrong because in case
|
||||
of size's expansion component_size is changed by mdadm but mdmon does not
|
||||
reread its new value and uses a wrong, old one. As a result the metadata
|
||||
is incorrect during size's expansion. It contains no information that
|
||||
resync is in progress (there is no checkpoint too). The metadata is
|
||||
as if resync has already been finished but it has not.
|
||||
|
||||
Component_size will be set to match information in sysfs. This value
|
||||
will be updated by manager thread in manage_member() function.
|
||||
Now mdmon uses the correct, current value of component_size and the
|
||||
correct metadata (containing information about resync and checkpoint)
|
||||
is written.
|
||||
|
||||
Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
managemon.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/managemon.c b/managemon.c
|
||||
index d155b04..2c55b3c 100644
|
||||
--- a/managemon.c
|
||||
+++ b/managemon.c
|
||||
@@ -444,6 +444,7 @@ static void manage_member(struct mdstat_ent *mdstat,
|
||||
char buf[64];
|
||||
int frozen;
|
||||
struct supertype *container = a->container;
|
||||
+ unsigned long long int component_size = 0;
|
||||
|
||||
if (container == NULL)
|
||||
/* Raced with something */
|
||||
@@ -453,6 +454,9 @@ static void manage_member(struct mdstat_ent *mdstat,
|
||||
a->info.array.raid_disks = mdstat->raid_disks;
|
||||
// MORE
|
||||
|
||||
+ if (sysfs_get_ll(&a->info, NULL, "component_size", &component_size) >= 0)
|
||||
+ a->info.component_size = component_size << 1;
|
||||
+
|
||||
/* honor 'frozen' */
|
||||
if (sysfs_get_str(&a->info, NULL, "metadata_version", buf, sizeof(buf)) > 0)
|
||||
frozen = buf[9] == '-';
|
||||
--
|
||||
1.8.1.4
|
||||
|
@ -1,30 +0,0 @@
|
||||
From 066e92f017df22c879c455494d2c1743ef7f3aca Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Date: Fri, 16 Nov 2012 17:24:36 +0100
|
||||
Subject: [PATCH] Create.c: check if freesize is equal 0
|
||||
|
||||
"freesize" can be equal 0, particularly after rounding to the chunk's size.
|
||||
Creating should be aborted in such case.
|
||||
|
||||
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Create.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/Create.c b/Create.c
|
||||
index afcf1a5..436bd1d 100644
|
||||
--- a/Create.c
|
||||
+++ b/Create.c
|
||||
@@ -407,6 +407,11 @@
|
||||
do_default_chunk = 0;
|
||||
}
|
||||
}
|
||||
+ if (!freesize) {
|
||||
+ fprintf(stderr, Name ": no free space left on %s\n", dname);
|
||||
+ fail = 1;
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
if (size && freesize < size) {
|
||||
fprintf(stderr, Name ": %s is smaller than given size."
|
@ -1,54 +0,0 @@
|
||||
From 2fdf559d74a48806900b63f1b4504a18dec048a9 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Mon, 22 Apr 2013 17:05:33 +1000
|
||||
Subject: [PATCH] Manage_runstop: call flush_mdmon if O_EXCL fails on stopping
|
||||
mdmon array.
|
||||
|
||||
When stopping an mdmon array, at reshape might be being aborted
|
||||
which inhibets O_EXCL. So if that is possible, call flush_mdmon
|
||||
to make sure mdmon isn't still busy.
|
||||
|
||||
Reported-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Manage.c | 29 ++++++++++++++++++++++++-----
|
||||
1 file changed, 24 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/Manage.c b/Manage.c
|
||||
index e3d3041..e37f415 100644
|
||||
--- a/Manage.c
|
||||
+++ b/Manage.c
|
||||
@@ -221,8 +222,19 @@ int Manage_runstop(char *devname, int fd, int runstop,
|
||||
/* Get EXCL access first. If this fails, then attempting
|
||||
* to stop is probably a bad idea.
|
||||
*/
|
||||
- close(fd);
|
||||
- fd = open(devname, O_RDONLY|O_EXCL);
|
||||
+ mdi = sysfs_read(fd, -1, GET_LEVEL|GET_VERSION);
|
||||
+ close(fd);
|
||||
+ count = 5;
|
||||
+ while (((fd = open(devname, O_RDONLY|O_EXCL)) < 0
|
||||
+ || fd2devnum(fd) != devnum)
|
||||
+ && mdi && !is_subarray(mdi->text_version)
|
||||
+ && mdmon_running(devname2devnum(mdi->sys_name))
|
||||
+ && count) {
|
||||
+ if (fd >= 0)
|
||||
+ close(fd);
|
||||
+ flush_mdmon(mdi->sys_name);
|
||||
+ count--;
|
||||
+ }
|
||||
if (fd < 0 || fd2devnum(fd) != devnum) {
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
@@ -237,7 +257,6 @@ int Manage_runstop(char *devname, int fd, int runstop,
|
||||
devname);
|
||||
return 1;
|
||||
}
|
||||
- mdi = sysfs_read(fd, -1, GET_LEVEL|GET_VERSION);
|
||||
if (mdi &&
|
||||
mdi->array.level > 0 &&
|
||||
is_subarray(mdi->text_version)) {
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,73 +0,0 @@
|
||||
From 3c309c82699ae3bebc716dbd5abea079dd41184a Mon Sep 17 00:00:00 2001
|
||||
From: Marcin Tomczak <marcin.tomczak@intel.com>
|
||||
Date: Fri, 9 Nov 2012 15:46:36 +0100
|
||||
Subject: [PATCH] imsm: Forbid spanning between multiple controllers.
|
||||
|
||||
Attaching disks to multiple controllers of the same type has been
|
||||
allowed so far. Now spanning between multiple controllers is disallowed
|
||||
at all by IMSM metadata.
|
||||
|
||||
Signed-off-by: Marcin Tomczak <marcin.tomczak@intel.com>
|
||||
Reviewed-by: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-intel.c | 25 ++++++++-----------------
|
||||
1 file changed, 8 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index 202b83f..4ac9d42 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -558,20 +558,11 @@ static int attach_hba_to_super(struct intel_super *super, struct sys_dev *device
|
||||
if (super->hba == NULL) {
|
||||
super->hba = alloc_intel_hba(device);
|
||||
return 1;
|
||||
- }
|
||||
-
|
||||
- hba = super->hba;
|
||||
- /* Intel metadata allows for all disks attached to the same type HBA.
|
||||
- * Do not sypport odf HBA types mixing
|
||||
- */
|
||||
- if (device->type != hba->type)
|
||||
+ } else
|
||||
+ /* IMSM metadata disallows to attach disks to multiple
|
||||
+ * controllers.
|
||||
+ */
|
||||
return 2;
|
||||
-
|
||||
- while (hba->next)
|
||||
- hba = hba->next;
|
||||
-
|
||||
- hba->next = alloc_intel_hba(device);
|
||||
- return 1;
|
||||
}
|
||||
|
||||
static struct sys_dev* find_disk_attached_hba(int fd, const char *devname)
|
||||
@@ -3073,11 +3064,11 @@ static int compare_super_imsm(struct supertype *st, struct supertype *tst)
|
||||
*/
|
||||
if (!check_env("IMSM_NO_PLATFORM")) {
|
||||
- if (!first->hba || !sec->hba ||
|
||||
- (first->hba->type != sec->hba->type)) {
|
||||
+ if (first->hba && sec->hba &&
|
||||
+ strcmp(first->hba->path, sec->hba->path) != 0) {
|
||||
fprintf(stderr,
|
||||
"HBAs of devices does not match %s != %s\n",
|
||||
- first->hba ? get_sys_dev_type(first->hba->type) : NULL,
|
||||
- sec->hba ? get_sys_dev_type(sec->hba->type) : NULL);
|
||||
+ first->hba ? first->hba->path : NULL,
|
||||
+ sec->hba ? sec->hba->path : NULL);
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
@@ -3819,7 +3810,7 @@ static int find_intel_hba_capability(int fd, struct intel_super *super, char *de
|
||||
}
|
||||
|
||||
fprintf(stderr, ").\n"
|
||||
- " Mixing devices attached to different controllers "
|
||||
+ " Mixing devices attached to multiple controllers "
|
||||
"is not allowed.\n");
|
||||
}
|
||||
free_sys_dev(&hba_name);
|
||||
--
|
||||
1.7.11.7
|
||||
|
@ -1,49 +0,0 @@
|
||||
From 79b68f1b48b0967da999945e310aef628c9bca4c Mon Sep 17 00:00:00 2001
|
||||
From: Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com>
|
||||
Date: Thu, 18 Apr 2013 10:51:37 +0200
|
||||
Subject: [PATCH] imsm: monitor: do not finish migration if there are no failed
|
||||
disks
|
||||
|
||||
Transition from "degraded" to "recovery" made in OROM is slightly different
|
||||
than the same transision in mdadm. Missing disk is not removed from list of
|
||||
raid devices, but just from map. Therefore mdadm should not end migration
|
||||
basing on existence of list of missing disks but should rely on count of
|
||||
failed disks.
|
||||
|
||||
Signed-off-by: Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com>
|
||||
Tested-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-intel.c | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index 24016b7..3f15b0f 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -6886,6 +6886,12 @@ static void handle_missing(struct intel_super *super, struct imsm_dev *dev)
|
||||
if (!super->missing)
|
||||
return;
|
||||
|
||||
+ /* When orom adds replacement for missing disk it does
|
||||
+ * not remove entry of missing disk, but just updates map with
|
||||
+ * new added disk. So it is not enough just to test if there is
|
||||
+ * any missing disk, we have to look if there are any failed disks
|
||||
+ * in map to stop migration */
|
||||
+
|
||||
dprintf("imsm: mark missing\n");
|
||||
/* end process for initialization and rebuild only
|
||||
*/
|
||||
@@ -6896,7 +6902,8 @@ static void handle_missing(struct intel_super *super, struct imsm_dev *dev)
|
||||
failed = imsm_count_failed(super, dev, MAP_0);
|
||||
map_state = imsm_check_degraded(super, dev, failed, MAP_0);
|
||||
|
||||
- end_migration(dev, super, map_state);
|
||||
+ if (failed)
|
||||
+ end_migration(dev, super, map_state);
|
||||
}
|
||||
for (dl = super->missing; dl; dl = dl->next)
|
||||
mark_missing(dev, &dl->disk, dl->index);
|
||||
--
|
||||
1.8.1.4
|
||||
|
@ -1,54 +0,0 @@
|
||||
From fa0d79e2b2642a2f8b04d34dfef866dbabc69e1e Mon Sep 17 00:00:00 2001
|
||||
From: Samuli Suominen <ssuominen@gentoo.org>
|
||||
Date: Mon, 13 Aug 2012 13:44:22 -0400
|
||||
Subject: [PATCH] query udev dir via pkg-config
|
||||
|
||||
Since udev is moving its internal dir around, query it via pkg-config
|
||||
rather than hardcoding the old path. This should work with new/old
|
||||
versions.
|
||||
|
||||
Signed-off-by: Samuli Suominen <ssuominen@gentoo.org>
|
||||
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Makefile | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 72f609e..a3e4027 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -57,6 +57,8 @@ else
|
||||
DEFAULT_METADATA=1.2
|
||||
endif
|
||||
|
||||
+PKG_CONFIG ?= pkg-config
|
||||
+
|
||||
SYSCONFDIR = /etc
|
||||
CONFFILE = $(SYSCONFDIR)/mdadm.conf
|
||||
CONFFILE2 = $(SYSCONFDIR)/mdadm/mdadm.conf
|
||||
@@ -96,6 +98,11 @@ MAN4DIR = $(MANDIR)/man4
|
||||
MAN5DIR = $(MANDIR)/man5
|
||||
MAN8DIR = $(MANDIR)/man8
|
||||
|
||||
+UDEVDIR := $(shell $(PKG_CONFIG) --variable=udevdir udev 2>/dev/null)
|
||||
+ifndef UDEVDIR
|
||||
+ UDEVDIR = /lib/udev
|
||||
+endif
|
||||
+
|
||||
OBJS = mdadm.o config.o policy.o mdstat.o ReadMe.o util.o maps.o lib.o \
|
||||
Manage.o Assemble.o Build.o \
|
||||
Create.o Detail.o Examine.o Grow.o Monitor.o dlink.o Kill.o Query.o \
|
||||
@@ -255,7 +262,7 @@ install-man: mdadm.8 md.4 mdadm.conf.5 mdmon.8
|
||||
$(INSTALL) -D -m 644 mdadm.conf.5 $(DESTDIR)$(MAN5DIR)/mdadm.conf.5
|
||||
|
||||
install-udev: udev-md-raid.rules
|
||||
- $(INSTALL) -D -m 644 udev-md-raid.rules $(DESTDIR)/lib/udev/rules.d/64-md-raid.rules
|
||||
+ $(INSTALL) -D -m 644 udev-md-raid.rules $(DESTDIR)$(UDEVDIR)/rules.d/64-md-raid.rules
|
||||
|
||||
uninstall:
|
||||
rm -f $(DESTDIR)$(MAN8DIR)/mdadm.8 $(DESTDIR)$(MAN8DIR)/mdmon.8 $(DESTDIR)$(MAN4DIR)/md.4 $(DESTDIR)$(MAN5DIR)/mdadm.conf.5 $(DESTDIR)$(BINDIR)/mdadm
|
||||
|
||||
--
|
||||
1.8.1.4
|
||||
|
@ -1,85 +0,0 @@
|
||||
From 5141638c54535b4ac80b8481404d868a63a18ecd Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 29 Jul 2014 13:48:23 +1000
|
||||
Subject: [PATCH] Assemble: Only fail auto-assemble in face of mdadm.conf
|
||||
conflicts.
|
||||
|
||||
We should never auto-assemble things that conflict with mdadm.conf
|
||||
However explicit assembly requests should be allowed.
|
||||
|
||||
Reported-by: olovopb
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1070245
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Assemble.c | 47 ++++++++++++++++++++++++++---------------------
|
||||
1 file changed, 26 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/Assemble.c b/Assemble.c
|
||||
index aca28be..cdcdb0f 100644
|
||||
--- a/Assemble.c
|
||||
+++ b/Assemble.c
|
||||
@@ -366,9 +366,6 @@ static int select_devices(struct mddev_dev *devlist,
|
||||
tmpdev = NULL;
|
||||
goto loop;
|
||||
} else {
|
||||
- int rv = 0;
|
||||
- struct mddev_ident *match;
|
||||
-
|
||||
content = *contentp;
|
||||
tst->ss->getinfo_super(tst, content, NULL);
|
||||
|
||||
@@ -377,25 +374,33 @@ static int select_devices(struct mddev_dev *devlist,
|
||||
report_mismatch ? devname : NULL))
|
||||
goto loop;
|
||||
|
||||
- match = conf_match(tst, content, devname,
|
||||
- report_mismatch ? c->verbose : -1,
|
||||
- &rv);
|
||||
- if (!match && rv == 2)
|
||||
- goto loop;
|
||||
- if (match && match->devname &&
|
||||
- strcasecmp(match->devname, "<ignore>") == 0) {
|
||||
- if (report_mismatch)
|
||||
- pr_err("%s is a member of an explicitly ignored array\n",
|
||||
- devname);
|
||||
- goto loop;
|
||||
- }
|
||||
- if (match && !ident_matches(match, content, tst,
|
||||
- c->homehost, c->update,
|
||||
- report_mismatch ? devname : NULL))
|
||||
- /* Array exists in mdadm.conf but some
|
||||
- * details don't match, so reject it
|
||||
+ if (auto_assem) {
|
||||
+ /* Never auto-assemble things that conflict
|
||||
+ * with mdadm.conf in some way
|
||||
*/
|
||||
- goto loop;
|
||||
+ struct mddev_ident *match;
|
||||
+ int rv = 0;
|
||||
+
|
||||
+ match = conf_match(tst, content, devname,
|
||||
+ report_mismatch ? c->verbose : -1,
|
||||
+ &rv);
|
||||
+ if (!match && rv == 2)
|
||||
+ goto loop;
|
||||
+ if (match && match->devname &&
|
||||
+ strcasecmp(match->devname, "<ignore>") == 0) {
|
||||
+ if (report_mismatch)
|
||||
+ pr_err("%s is a member of an explicitly ignored array\n",
|
||||
+ devname);
|
||||
+ goto loop;
|
||||
+ }
|
||||
+ if (match && !ident_matches(match, content, tst,
|
||||
+ c->homehost, c->update,
|
||||
+ report_mismatch ? devname : NULL))
|
||||
+ /* Array exists in mdadm.conf but some
|
||||
+ * details don't match, so reject it
|
||||
+ */
|
||||
+ goto loop;
|
||||
+ }
|
||||
|
||||
/* should be safe to try an exclusive open now, we
|
||||
* have rejected anything that some other mdadm might
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,51 +0,0 @@
|
||||
From d13566f9b6ff8377f45cd025a1cd1a58bcb4e857 Mon Sep 17 00:00:00 2001
|
||||
From: Guy Menanteau <menantea@linux.vnet.ibm.com>
|
||||
Date: Mon, 4 Aug 2014 16:53:03 +0200
|
||||
Subject: [PATCH] DDF: cast print arguments in super-ddf.c
|
||||
|
||||
mdadm fails to build on ppc64 and ppc64le architectures.
|
||||
===
|
||||
super-ddf.c: In function '_set_config_size':
|
||||
super-ddf.c:2849:4: error: format '%llx' expects argument of type 'long long unsigned int', but argument 6 has type '__u64' [-Werror=format=]
|
||||
pr_err("%s: %x:%x: workspace size 0x%llx too big, ignoring\n",
|
||||
^
|
||||
super-ddf.c:2855:2: error: format '%llx' expects argument of type 'long long unsigned int', but argument 6 has type '__u64' [-Werror=format=]
|
||||
dprintf("%s: %x:%x config_size %llx, DDF structure is %llx blocks\n",
|
||||
^
|
||||
cc1: all warnings being treated as errors
|
||||
<builtin>: recipe for target 'super-ddf.o' failed
|
||||
===
|
||||
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1125883
|
||||
Signed-off-by: <menantea@linux.vnet.ibm.com>
|
||||
Signed-off-by: Michel Normand <normand@linux.vnet.ibm.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/super-ddf.c b/super-ddf.c
|
||||
index 8957c2e..bc0ce2c 100644
|
||||
--- a/super-ddf.c
|
||||
+++ b/super-ddf.c
|
||||
@@ -2847,13 +2847,15 @@ static void _set_config_size(struct phys_disk_entry *pde, const struct dl *dl)
|
||||
__u64 wsp = cfs - t;
|
||||
if (wsp > 1024*1024*2ULL && wsp > dl->size / 16) {
|
||||
pr_err("%s: %x:%x: workspace size 0x%llx too big, ignoring\n",
|
||||
- __func__, dl->major, dl->minor, wsp);
|
||||
+ __func__, dl->major, dl->minor,
|
||||
+ (unsigned long long)wsp);
|
||||
} else
|
||||
cfs = t;
|
||||
}
|
||||
pde->config_size = cpu_to_be64(cfs);
|
||||
dprintf("%s: %x:%x config_size %llx, DDF structure is %llx blocks\n",
|
||||
- __func__, dl->major, dl->minor, cfs, dl->size-cfs);
|
||||
+ __func__, dl->major, dl->minor,
|
||||
+ (unsigned long long)cfs, (unsigned long long)(dl->size-cfs));
|
||||
}
|
||||
|
||||
/* Add a device to a container, either while creating it or while
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,38 +0,0 @@
|
||||
From 46643e1ad5ece5f1257b2d827e36231df44929a2 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 29 Jul 2014 13:37:42 +1000
|
||||
Subject: [PATCH] Grow: improve error message is "--grow -n2" used on Linear
|
||||
arrays.
|
||||
|
||||
Linear arrays don't respond to setting raid-disks, only to
|
||||
adding a device.
|
||||
|
||||
Reported-by: mulhern
|
||||
Reported-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1122146
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Grow.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Grow.c b/Grow.c
|
||||
index af59347..a9c8589 100644
|
||||
--- a/Grow.c
|
||||
+++ b/Grow.c
|
||||
@@ -1028,7 +1028,12 @@ char *analyse_change(char *devname, struct mdinfo *info, struct reshape *re)
|
||||
|
||||
switch (info->array.level) {
|
||||
default:
|
||||
- return "Cannot understand this RAID level";
|
||||
+ return "No reshape is possibly for this RAID level";
|
||||
+ case LEVEL_LINEAR:
|
||||
+ if (info->delta_disks != UnSet)
|
||||
+ return "Only --add is supported for LINEAR, setting --raid-disks is not needed";
|
||||
+ else
|
||||
+ return "Only --add is supported for LINEAR, other --grow options are not meaningful";
|
||||
case 1:
|
||||
/* RAID1 can convert to RAID1 with different disks, or
|
||||
* raid5 with 2 disks, or
|
||||
--
|
||||
1.9.3
|
||||
|
@ -1,51 +0,0 @@
|
||||
commit 12add44564f195878c3e346e4bbae845dec67db3
|
||||
Author: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Fri Mar 4 16:30:22 2016 -0500
|
||||
|
||||
Grow: Grow_continue_command() remove dead code
|
||||
|
||||
All cases where fd2 is used are completed with a close(fd2), so there
|
||||
is no need to set fd2 = -1 or check for it before exiting.
|
||||
|
||||
Reviewed-by: NeilBrown <neilb@suse.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
|
||||
diff --git a/Grow.c b/Grow.c
|
||||
index c4f417e..c4af5c0 100755
|
||||
--- a/Grow.c
|
||||
+++ b/Grow.c
|
||||
@@ -4752,7 +4752,7 @@ int Grow_continue_command(char *devname, int fd,
|
||||
struct mdinfo *cc = NULL;
|
||||
struct mdstat_ent *mdstat = NULL;
|
||||
int cfd = -1;
|
||||
- int fd2 = -1;
|
||||
+ int fd2;
|
||||
|
||||
dprintf("Grow continue from command line called for %s\n",
|
||||
devname);
|
||||
@@ -4796,8 +4796,6 @@ int Grow_continue_command(char *devname, int fd,
|
||||
continue;
|
||||
err = st->ss->load_super(st, fd2, NULL);
|
||||
close(fd2);
|
||||
- /* invalidate fd2 to avoid possible double close() */
|
||||
- fd2 = -1;
|
||||
if (err)
|
||||
continue;
|
||||
break;
|
||||
@@ -4894,7 +4892,6 @@ int Grow_continue_command(char *devname, int fd,
|
||||
sysfs_init(content, fd2, mdstat->devnm);
|
||||
|
||||
close(fd2);
|
||||
- fd2 = -1;
|
||||
|
||||
/* start mdmon in case it is not running
|
||||
*/
|
||||
@@ -4924,8 +4921,6 @@ int Grow_continue_command(char *devname, int fd,
|
||||
ret_val = Grow_continue(fd, st, content, backup_file, 1, 0);
|
||||
|
||||
Grow_continue_command_exit:
|
||||
- if (fd2 > -1)
|
||||
- close(fd2);
|
||||
if (cfd > -1)
|
||||
close(cfd);
|
||||
st->ss->free_super(st);
|
@ -1,56 +0,0 @@
|
||||
From df2647fa5bbe84960dae11531e34bafef549b8ff Mon Sep 17 00:00:00 2001
|
||||
From: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Date: Tue, 17 May 2016 13:24:41 +0200
|
||||
Subject: [PATCH] IMSM: retry reading sync_completed during reshape
|
||||
|
||||
The sync_completed after restarting a reshape
|
||||
(for example - after reboot) is set to "delayed" until
|
||||
mdmon changes the state. Mdadm does not wait for that change with
|
||||
old kernels. If this condition occurs - it exits and reshape
|
||||
is not continuing. This patch adds retry of reading sync_complete
|
||||
with a delay. It gives time for mdmon to change the "delayed" state.
|
||||
|
||||
Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
super-intel.c | 17 ++++++++++++-----
|
||||
1 file changed, 12 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index ba3ee48..7e2860c 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -10378,6 +10378,7 @@ exit_imsm_reshape_super:
|
||||
int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||
{
|
||||
int fd = sysfs_get_fd(sra, NULL, "sync_completed");
|
||||
+ int retry = 3;
|
||||
unsigned long long completed;
|
||||
/* to_complete : new sync_max position */
|
||||
unsigned long long to_complete = sra->reshape_progress;
|
||||
@@ -10388,11 +10389,17 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||
return 1;
|
||||
}
|
||||
|
||||
- if (sysfs_fd_get_ll(fd, &completed) < 0) {
|
||||
- dprintf("cannot read reshape_position (no reshape in progres)\n");
|
||||
- close(fd);
|
||||
- return 1;
|
||||
- }
|
||||
+ do {
|
||||
+ if (sysfs_fd_get_ll(fd, &completed) < 0) {
|
||||
+ if (!retry) {
|
||||
+ dprintf("cannot read reshape_position (no reshape in progres)\n");
|
||||
+ close(fd);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ usleep(30000);
|
||||
+ } else
|
||||
+ break;
|
||||
+ } while (retry--);
|
||||
|
||||
if (completed > position_to_set) {
|
||||
dprintf("wrong next position to set %llu (%llu)\n",
|
||||
--
|
||||
2.5.5
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 6e6e98746dba7e900f23e92bbb0da01fe7a169da Mon Sep 17 00:00:00 2001
|
||||
From: Nikhil Kshirsagar <nkshirsa@redhat.com>
|
||||
Date: Fri, 10 Jun 2016 08:50:10 +0530
|
||||
Subject: [PATCH] The sys_name array in the mdinfo structure is 20 bytes of
|
||||
storage.
|
||||
|
||||
Increasing the size of this array to 32 bytes to handle cases with
|
||||
longer device names.
|
||||
|
||||
Signed-off-by: Nikhil Kshirsagar <nkshirsa@redhat.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
mdadm.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/mdadm.h b/mdadm.h
|
||||
index 3d6c638..1fd38a3 100755
|
||||
--- a/mdadm.h
|
||||
+++ b/mdadm.h
|
||||
@@ -289,7 +289,7 @@ struct mdinfo {
|
||||
int container_enough; /* flag external handlers can set to
|
||||
* indicate that subarrays have not enough (-1),
|
||||
* enough to start (0), or all expected disks (1) */
|
||||
- char sys_name[20];
|
||||
+ char sys_name[32];
|
||||
struct mdinfo *devs;
|
||||
struct mdinfo *next;
|
||||
|
||||
--
|
||||
2.5.5
|
||||
|
@ -1,106 +0,0 @@
|
||||
commit 8800f85381d0cd9689dee62bbbdafdb359100389
|
||||
Author: Xiao Ni <xni@redhat.com>
|
||||
Date: Thu Jun 16 09:41:02 2016 +0800
|
||||
|
||||
MDADM:Check mdinfo->reshape_active more times before calling Grow_continue
|
||||
|
||||
When reshaping a 3 drives raid5 to 4 drives raid5, there is a chance that
|
||||
it can't start the reshape. If the disks are not enough to have spaces for
|
||||
relocating the data_offset, it needs to call start_reshape and then run
|
||||
mdadm --grow --continue by systemd. But mdadm --grow --continue fails
|
||||
because it checkes that info->reshape_active is 0.
|
||||
|
||||
The info->reshape_active is got from the superblock of underlying devices.
|
||||
Function start_reshape write reshape to /sys/../sync_action. Before writing
|
||||
latest superblock to underlying devices, mdadm --grow --continue is called.
|
||||
There is a chance info->reshape_active is 0. We should wait for superblock
|
||||
updating more time before calling Grow_continue.
|
||||
|
||||
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
|
||||
diff --git a/Grow.c b/Grow.c
|
||||
index f184d9c..628f0e7 100755
|
||||
--- a/Grow.c
|
||||
+++ b/Grow.c
|
||||
@@ -4788,6 +4788,7 @@ int Grow_continue_command(char *devname, int fd,
|
||||
dprintf("Grow continue is run for ");
|
||||
if (st->ss->external == 0) {
|
||||
int d;
|
||||
+ int cnt = 5;
|
||||
dprintf_cont("native array (%s)\n", devname);
|
||||
if (ioctl(fd, GET_ARRAY_INFO, &array.array) < 0) {
|
||||
pr_err("%s is not an active md array - aborting\n", devname);
|
||||
@@ -4799,36 +4800,42 @@ int Grow_continue_command(char *devname, int fd,
|
||||
* FIXME we should really get what we need from
|
||||
* sysfs
|
||||
*/
|
||||
- for (d = 0; d < MAX_DISKS; d++) {
|
||||
- mdu_disk_info_t disk;
|
||||
- char *dv;
|
||||
- int err;
|
||||
- disk.number = d;
|
||||
- if (ioctl(fd, GET_DISK_INFO, &disk) < 0)
|
||||
- continue;
|
||||
- if (disk.major == 0 && disk.minor == 0)
|
||||
- continue;
|
||||
- if ((disk.state & (1 << MD_DISK_ACTIVE)) == 0)
|
||||
- continue;
|
||||
- dv = map_dev(disk.major, disk.minor, 1);
|
||||
- if (!dv)
|
||||
- continue;
|
||||
- fd2 = dev_open(dv, O_RDONLY);
|
||||
- if (fd2 < 0)
|
||||
- continue;
|
||||
- err = st->ss->load_super(st, fd2, NULL);
|
||||
- close(fd2);
|
||||
- if (err)
|
||||
- continue;
|
||||
- break;
|
||||
- }
|
||||
- if (d == MAX_DISKS) {
|
||||
- pr_err("Unable to load metadata for %s\n",
|
||||
- devname);
|
||||
- ret_val = 1;
|
||||
- goto Grow_continue_command_exit;
|
||||
- }
|
||||
- st->ss->getinfo_super(st, content, NULL);
|
||||
+ do {
|
||||
+ for (d = 0; d < MAX_DISKS; d++) {
|
||||
+ mdu_disk_info_t disk;
|
||||
+ char *dv;
|
||||
+ int err;
|
||||
+ disk.number = d;
|
||||
+ if (ioctl(fd, GET_DISK_INFO, &disk) < 0)
|
||||
+ continue;
|
||||
+ if (disk.major == 0 && disk.minor == 0)
|
||||
+ continue;
|
||||
+ if ((disk.state & (1 << MD_DISK_ACTIVE)) == 0)
|
||||
+ continue;
|
||||
+ dv = map_dev(disk.major, disk.minor, 1);
|
||||
+ if (!dv)
|
||||
+ continue;
|
||||
+ fd2 = dev_open(dv, O_RDONLY);
|
||||
+ if (fd2 < 0)
|
||||
+ continue;
|
||||
+ err = st->ss->load_super(st, fd2, NULL);
|
||||
+ close(fd2);
|
||||
+ if (err)
|
||||
+ continue;
|
||||
+ break;
|
||||
+ }
|
||||
+ if (d == MAX_DISKS) {
|
||||
+ pr_err("Unable to load metadata for %s\n",
|
||||
+ devname);
|
||||
+ ret_val = 1;
|
||||
+ goto Grow_continue_command_exit;
|
||||
+ }
|
||||
+ st->ss->getinfo_super(st, content, NULL);
|
||||
+ if (!content->reshape_active)
|
||||
+ sleep(3);
|
||||
+ else
|
||||
+ break;
|
||||
+ } while (cnt-- > 0);
|
||||
} else {
|
||||
char *container;
|
||||
|
@ -1,42 +0,0 @@
|
||||
From b2be2b628b6305712c8df0b3a20ddddc0ac410fb Mon Sep 17 00:00:00 2001
|
||||
From: Alexey Obitotskiy <aleksey.obitotskiy@intel.com>
|
||||
Date: Thu, 16 Jun 2016 11:31:36 +0200
|
||||
Subject: [PATCH 1/2] imsm: add handling of sync_action is equal to 'idle'
|
||||
|
||||
After resync is stopped sync_action value become 'idle'.
|
||||
We treat this case as normal termination of waiting, not as error.
|
||||
|
||||
Signed-off-by: Alexey Obitotskiy <aleksey.obitotskiy@intel.com>
|
||||
Reviewed-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
super-intel.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index 7e2860c..7950bef 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -10423,6 +10423,8 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||
if (sysfs_get_str(sra, NULL, "sync_action",
|
||||
action, 20) > 0 &&
|
||||
strncmp(action, "reshape", 7) != 0) {
|
||||
+ if (strncmp(action, "idle", 4) == 0)
|
||||
+ break;
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
@@ -10432,9 +10434,9 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||
return 1;
|
||||
}
|
||||
} while (completed < position_to_set);
|
||||
+
|
||||
close(fd);
|
||||
return 0;
|
||||
-
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
--
|
||||
2.5.5
|
||||
|
@ -1,89 +0,0 @@
|
||||
From 0febb20c458a488460eadade74a6c283aadaf96a Mon Sep 17 00:00:00 2001
|
||||
From: Alexey Obitotskiy <aleksey.obitotskiy@intel.com>
|
||||
Date: Thu, 16 Jun 2016 11:31:37 +0200
|
||||
Subject: [PATCH 2/2] imsm: properly handle values of sync_completed
|
||||
|
||||
The sync_completed can be set to such values:
|
||||
- two numbers of processed sectors and total during synchronization,
|
||||
separated with '/';
|
||||
- 'none' if synchronization process is stopped;
|
||||
- 'delayed' if synchronization process is delayed.
|
||||
Handle value of sync_completed not only as numbers but
|
||||
also check for 'none' and 'delayed'.
|
||||
|
||||
Signed-off-by: Alexey Obitotskiy <aleksey.obitotskiy@intel.com>
|
||||
Reviewed-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
super-intel.c | 36 ++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 34 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index 7950bef..92817e9 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -10363,6 +10363,33 @@ exit_imsm_reshape_super:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
+#define COMPLETED_OK 0
|
||||
+#define COMPLETED_NONE 1
|
||||
+#define COMPLETED_DELAYED 2
|
||||
+
|
||||
+static int read_completed(int fd, unsigned long long *val)
|
||||
+{
|
||||
+ int ret;
|
||||
+ char buf[50];
|
||||
+
|
||||
+ ret = sysfs_fd_get_str(fd, buf, 50);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = COMPLETED_OK;
|
||||
+ if (strncmp(buf, "none", 4) == 0) {
|
||||
+ ret = COMPLETED_NONE;
|
||||
+ } else if (strncmp(buf, "delayed", 7) == 0) {
|
||||
+ ret = COMPLETED_DELAYED;
|
||||
+ } else {
|
||||
+ char *ep;
|
||||
+ *val = strtoull(buf, &ep, 0);
|
||||
+ if (ep == buf || (*ep != 0 && *ep != '\n' && *ep != ' '))
|
||||
+ ret = -1;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/*******************************************************************************
|
||||
* Function: wait_for_reshape_imsm
|
||||
* Description: Function writes new sync_max value and waits until
|
||||
@@ -10417,8 +10444,10 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||
}
|
||||
|
||||
do {
|
||||
+ int rc;
|
||||
char action[20];
|
||||
int timeout = 3000;
|
||||
+
|
||||
sysfs_wait(fd, &timeout);
|
||||
if (sysfs_get_str(sra, NULL, "sync_action",
|
||||
action, 20) > 0 &&
|
||||
@@ -10428,11 +10457,14 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata)
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
- if (sysfs_fd_get_ll(fd, &completed) < 0) {
|
||||
+
|
||||
+ rc = read_completed(fd, &completed);
|
||||
+ if (rc < 0) {
|
||||
dprintf("cannot read reshape_position (in loop)\n");
|
||||
close(fd);
|
||||
return 1;
|
||||
- }
|
||||
+ } else if (rc == COMPLETED_NONE)
|
||||
+ break;
|
||||
} while (completed < position_to_set);
|
||||
|
||||
close(fd);
|
||||
--
|
||||
2.5.5
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 977d12d739deedd21ea3ca5a96d0ffd83bd5b4ea Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 15 Aug 2016 11:30:39 -0400
|
||||
Subject: [PATCH] mdadm.h: Fix build problem against newer glibc
|
||||
|
||||
Newer glibc requires direct include of sys/sysmacros.h in order to
|
||||
access makedev().
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
mdadm.h | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/mdadm.h b/mdadm.h
|
||||
index 1fd38a3..cfa5beb 100755
|
||||
--- a/mdadm.h
|
||||
+++ b/mdadm.h
|
||||
@@ -45,6 +45,10 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <syslog.h>
|
||||
+#ifdef __GLIBC__
|
||||
+/* Newer glibc requires sys/sysmacros.h directly for makedev() */
|
||||
+#include <sys/sysmacros.h>
|
||||
+#endif
|
||||
#ifdef __dietlibc__
|
||||
#include <strings.h>
|
||||
/* dietlibc has deprecated random and srandom!! */
|
||||
--
|
||||
2.7.4
|
||||
|
@ -1,63 +0,0 @@
|
||||
From 942e1cdb4a6a5be02672bc686169c679e775c2be Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.com>
|
||||
Date: Thu, 18 Feb 2016 15:53:32 +1100
|
||||
Subject: [PATCH] super-intel: ensure suspended region is removed when reshape
|
||||
completes.
|
||||
|
||||
A recent commit removed a call to abort_reshape() when IMSM reshape
|
||||
completed. An unanticipated result of this is that the suspended
|
||||
region is not cleared as it should be.
|
||||
So after a reshape, a region of the array will cause all IO to block.
|
||||
|
||||
Re-instate the required updates to suspend_{lo,hi} coped from
|
||||
abort_reshape().
|
||||
|
||||
This is caught (sometimes) by the test suite.
|
||||
|
||||
Also fix a couple of typos found while exploring the code.
|
||||
|
||||
Reported-by: Ken Moffat <zarniwhoop@ntlworld.com>
|
||||
Cc: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
|
||||
Fixes: 2139b03c2080 ("imsm: don't call abort_reshape() in imsm_manage_reshape()")
|
||||
Signed-off-by: NeilBrown <neilb@suse.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
super-intel.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/super-intel.c b/super-intel.c
|
||||
index 90b7b6d..ff0506d 100644
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -10465,7 +10465,7 @@ int check_degradation_change(struct mdinfo *info,
|
||||
* Function: imsm_manage_reshape
|
||||
* Description: Function finds array under reshape and it manages reshape
|
||||
* process. It creates stripes backups (if required) and sets
|
||||
- * checheckpoits.
|
||||
+ * checkpoints.
|
||||
* Parameters:
|
||||
* afd : Backup handle (nattive) - not used
|
||||
* sra : general array info
|
||||
@@ -10595,7 +10595,7 @@ static int imsm_manage_reshape(
|
||||
|
||||
start = current_position * 512;
|
||||
|
||||
- /* allign reading start to old geometry */
|
||||
+ /* align reading start to old geometry */
|
||||
start_buf_shift = start % old_data_stripe_length;
|
||||
start_src = start - start_buf_shift;
|
||||
|
||||
@@ -10700,6 +10700,10 @@ static int imsm_manage_reshape(
|
||||
ret_val = 1;
|
||||
abort:
|
||||
free(buf);
|
||||
+ /* See Grow.c: abort_reshape() for further explanation */
|
||||
+ sysfs_set_num(sra, NULL, "suspend_lo", 0x7FFFFFFFFFFFFFFFULL);
|
||||
+ sysfs_set_num(sra, NULL, "suspend_hi", 0);
|
||||
+ sysfs_set_num(sra, NULL, "suspend_lo", 0);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
--
|
||||
2.5.0
|
||||
|
@ -1,36 +0,0 @@
|
||||
From 1dcee1c9cbcf9592275914706b76b1931490092c Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 6 Apr 2016 16:13:59 -0400
|
||||
Subject: [PATCH] super1: Clear memory allocated for superblock + bitmap before
|
||||
use
|
||||
|
||||
load_super1() did not clear memory allocated for the superblock +
|
||||
bitmap. This causes issues if the superblock does not contain a bitmap
|
||||
as later checks of bitmap features would rely on the bits being
|
||||
cleared.
|
||||
|
||||
This bug has been around for a long time, but was only exposed in
|
||||
mdadm-3.4 with the introduction of the clustering code.
|
||||
|
||||
Reported-by: Jan Stodola <jstodola@redhat.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
super1.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/super1.c b/super1.c
|
||||
index d6f3c93..8d5543f 100644
|
||||
--- a/super1.c
|
||||
+++ b/super1.c
|
||||
@@ -2016,6 +2016,8 @@ static int load_super1(struct supertype *st, int fd, char *devname)
|
||||
return 1;
|
||||
}
|
||||
|
||||
+ memset(super, 0, SUPER1_SIZE);
|
||||
+
|
||||
if (aread(&afd, super, MAX_SB_SIZE) != MAX_SB_SIZE) {
|
||||
if (devname)
|
||||
pr_err("Cannot read superblock on %s\n",
|
||||
--
|
||||
2.5.5
|
||||
|
@ -1,41 +0,0 @@
|
||||
commit 1d13b599607e48446273913ce594931ba53df9fd
|
||||
Author: Xiao Ni <xni@redhat.com>
|
||||
Date: Sat Feb 6 09:18:41 2016 +0800
|
||||
|
||||
Fix some type comparison problems
|
||||
|
||||
As 26714713cd2bad9e0bf7f4669f6cc4659ceaab6c said, 32 bit signed
|
||||
timestamps will overflow in the year 2038. It already changed the
|
||||
utime and ctime in struct mdu_array_info_s from int to unsigned
|
||||
int. So we need to change the values that compared with them to
|
||||
unsigned int too.
|
||||
|
||||
Signed-off-by : Xiao Ni <xni@redhat.com>
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
|
||||
diff --git a/Monitor.c b/Monitor.c
|
||||
index f19c2e5..6df80f9 100644
|
||||
--- a/Monitor.c
|
||||
+++ b/Monitor.c
|
||||
@@ -33,7 +33,7 @@
|
||||
struct state {
|
||||
char *devname;
|
||||
char devnm[32]; /* to sync with mdstat info */
|
||||
- long utime;
|
||||
+ unsigned int utime;
|
||||
int err;
|
||||
char *spare_group;
|
||||
int active, working, failed, spare, raid;
|
||||
diff --git a/util.c b/util.c
|
||||
index 970d484..6e7d3fb 100644
|
||||
--- a/util.c
|
||||
+++ b/util.c
|
||||
@@ -1267,7 +1267,7 @@ struct supertype *guess_super_type(int fd, enum guess_types guess_type)
|
||||
*/
|
||||
struct superswitch *ss;
|
||||
struct supertype *st;
|
||||
- time_t besttime = 0;
|
||||
+ unsigned int besttime = 0;
|
||||
int bestsuper = -1;
|
||||
int i;
|
||||
|
29
mdadm.spec
29
mdadm.spec
@ -1,7 +1,7 @@
|
||||
Summary: The mdadm program controls Linux md devices (software RAID arrays)
|
||||
Name: mdadm
|
||||
Version: 3.4
|
||||
Release: 3%{?dist}
|
||||
Version: 4.0
|
||||
Release: 1%{?dist}
|
||||
Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.xz
|
||||
Source1: mdmonitor.init
|
||||
Source2: raid-check
|
||||
@ -12,16 +12,6 @@ Source6: mdmonitor.service
|
||||
Source7: mdadm.conf
|
||||
Source8: mdadm_event.conf
|
||||
|
||||
Patch1: mdadm-3.4.1-fix-some-type-comparison.patch
|
||||
Patch2: mdadm-3.4-super-intel-ensure-suspended-region-is-removed-when-.patch
|
||||
Patch3: mdadm-3.4-super1-Clear-memory-allocated-for-superblock-bitmap-.patch
|
||||
Patch4: mdadm-3.4-IMSM-retry-reading-sync_completed-during-reshape.patch
|
||||
Patch5: mdadm-3.4-imsm-add-handling-of-sync_action-is-equal-to-idle.patch
|
||||
Patch6: mdadm-3.4-imsm-properly-handle-values-of-sync_completed.patch
|
||||
Patch7: mdadm-3.4-The-sys_name-array-in-the-mdinfo-structure-is-20-byt.patch
|
||||
Patch8: mdadm-3.4-Grow_continue_command-remove-dead-code.patch
|
||||
Patch9: mdadm-3.4-check-reshape_active-more-times-before-Grow_continue.patch
|
||||
Patch10: mdadm-3.4-mdadm.h-Fix-build-problem-against-newer-glibc.patch
|
||||
# Fedora customization patches
|
||||
Patch97: mdadm-3.3-udev.patch
|
||||
Patch98: mdadm-2.5.2-static.patch
|
||||
@ -50,17 +40,6 @@ file can be used to help with some common tasks.
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%patch1 -p1 -b .comparison
|
||||
%patch2 -p1 -b .stop-reshape
|
||||
%patch3 -p1 -b .clear
|
||||
%patch4 -p1 -b .retry
|
||||
%patch5 -p1 -b .syncaction
|
||||
%patch6 -p1 -b .synccompleted
|
||||
%patch7 -p1 -b .sysname
|
||||
%patch8 -p1 -b .dead
|
||||
%patch9 -p1 -b .before
|
||||
%patch10 -p1 -b .glibc
|
||||
|
||||
# Fedora customization patches
|
||||
%patch97 -p1 -b .udev
|
||||
%patch98 -p1 -b .static
|
||||
@ -125,6 +104,10 @@ rm -rf %{buildroot}
|
||||
/etc/libreport/events.d/*
|
||||
|
||||
%changelog
|
||||
* Thu Jan 12 2017 Xiao Ni <xni@redhat.com> - 4.0-1
|
||||
- Upgrade to mdadm-4.0
|
||||
- Resolves bz1411555
|
||||
|
||||
* Mon Aug 15 2016 Jes Sorensen <Jes.Sorensen@redhat.com> - 3.4-3
|
||||
- Fix build against newer glibc (Fedora 26+)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user