Update to mdadm-3.2.3
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
This commit is contained in:
parent
82fbb33bf7
commit
09420a0c0f
@ -1,20 +0,0 @@
|
||||
--- mdadm-3.2.1/udev-md-raid.rules.udev 2011-03-27 22:31:20.000000000 -0400
|
||||
+++ mdadm-3.2.1/udev-md-raid.rules 2011-03-28 10:14:26.047232843 -0400
|
||||
@@ -2,11 +2,13 @@
|
||||
|
||||
SUBSYSTEM!="block", GOTO="md_end"
|
||||
|
||||
+# In Fedora we handle the raid components in 65-md-incremental.rules so that
|
||||
+# we can do things like honor anaconda command line options and such
|
||||
# handle potential components of arrays
|
||||
-ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="remove", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||
-ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="add", RUN+="/sbin/mdadm --incremental $env{DEVNAME}"
|
||||
-ENV{ID_FS_TYPE}=="isw_raid_member", ACTION=="remove", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||
-ENV{ID_FS_TYPE}=="isw_raid_member", ACTION=="add", RUN+="/sbin/mdadm --incremental $env{DEVNAME}"
|
||||
+#ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="remove", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||
+#ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="add", RUN+="/sbin/mdadm --incremental $env{DEVNAME}"
|
||||
+#ENV{ID_FS_TYPE}=="isw_raid_member", ACTION=="remove", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||
+#ENV{ID_FS_TYPE}=="isw_raid_member", ACTION=="add", RUN+="/sbin/mdadm --incremental $env{DEVNAME}"
|
||||
|
||||
# handle md arrays
|
||||
ACTION!="add|change", GOTO="md_end"
|
@ -1,24 +0,0 @@
|
||||
--- a/util.c
|
||||
+++ b/util.c
|
||||
@@ -146,16 +146,16 @@ int get_linux_version()
|
||||
{
|
||||
struct utsname name;
|
||||
char *cp;
|
||||
- int a,b,c;
|
||||
+ int a = 0, b = 0,c = 0;
|
||||
if (uname(&name) <0)
|
||||
return -1;
|
||||
|
||||
cp = name.release;
|
||||
a = strtoul(cp, &cp, 10);
|
||||
- if (*cp != '.') return -1;
|
||||
- b = strtoul(cp+1, &cp, 10);
|
||||
- if (*cp != '.') return -1;
|
||||
- c = strtoul(cp+1, NULL, 10);
|
||||
+ if (*cp == '.')
|
||||
+ b = strtoul(cp+1, &cp, 10);
|
||||
+ if (*cp == '.')
|
||||
+ c = strtoul(cp+1, &cp, 10);
|
||||
|
||||
return (a*1000000)+(b*1000)+c;
|
||||
}
|
@ -1,163 +0,0 @@
|
||||
From 11b391ece9fa284a151362537af093aa44883696 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Thu, 8 Sep 2011 13:05:31 +1000
|
||||
Subject: [PATCH 2/3] Discourage large devices from being added to 0.90
|
||||
arrays.
|
||||
|
||||
0.90 arrays can only use up to 4TB per device. So when a larger
|
||||
device is added, complain a bit. Still allow it if --force is given
|
||||
as there could be a valid use.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Grow.c | 2 +-
|
||||
Incremental.c | 8 ++++----
|
||||
Manage.c | 29 +++++++++++++++++++++++++----
|
||||
mdadm.c | 3 ++-
|
||||
mdadm.h | 2 +-
|
||||
5 files changed, 33 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/Grow.c b/Grow.c
|
||||
index 1aab113..048351d 100644
|
||||
--- a/Grow.c
|
||||
+++ b/Grow.c
|
||||
@@ -1893,7 +1893,7 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||
*/
|
||||
if (devlist)
|
||||
Manage_subdevs(devname, fd, devlist, !quiet,
|
||||
- 0,NULL);
|
||||
+ 0,NULL, 0);
|
||||
|
||||
if (reshape.backup_blocks == 0) {
|
||||
/* No restriping needed, but we might need to impose
|
||||
diff --git a/Incremental.c b/Incremental.c
|
||||
index 09cdd9b..791ad85 100644
|
||||
--- a/Incremental.c
|
||||
+++ b/Incremental.c
|
||||
@@ -1035,7 +1035,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||
close(dfd);
|
||||
*dfdp = -1;
|
||||
rv = Manage_subdevs(chosen->sys_name, mdfd, &devlist,
|
||||
- -1, 0, NULL);
|
||||
+ -1, 0, NULL, 0);
|
||||
close(mdfd);
|
||||
}
|
||||
if (verbose > 0) {
|
||||
@@ -1666,15 +1666,15 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||
if (subfd >= 0) {
|
||||
Manage_subdevs(memb->dev, subfd,
|
||||
&devlist, verbose, 0,
|
||||
- NULL);
|
||||
+ NULL, 0);
|
||||
close(subfd);
|
||||
}
|
||||
}
|
||||
free_mdstat(mdstat);
|
||||
} else
|
||||
- Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL);
|
||||
+ Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL, 0);
|
||||
devlist.disposition = 'r';
|
||||
- rv = Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL);
|
||||
+ rv = Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0, NULL, 0);
|
||||
close(mdfd);
|
||||
free_mdstat(ent);
|
||||
return rv;
|
||||
diff --git a/Manage.c b/Manage.c
|
||||
index 66d6978..1b2b75a 100644
|
||||
--- a/Manage.c
|
||||
+++ b/Manage.c
|
||||
@@ -371,7 +371,7 @@ int Manage_resize(char *devname, int fd, long long size, int raid_disks)
|
||||
|
||||
int Manage_subdevs(char *devname, int fd,
|
||||
struct mddev_dev *devlist, int verbose, int test,
|
||||
- char *update)
|
||||
+ char *update, int force)
|
||||
{
|
||||
/* do something to each dev.
|
||||
* devmode can be
|
||||
@@ -632,6 +632,27 @@ int Manage_subdevs(char *devname, int fd,
|
||||
continue;
|
||||
}
|
||||
|
||||
+ if (tst->ss->validate_geometry(
|
||||
+ tst, array.level, array.layout,
|
||||
+ array.raid_disks, NULL,
|
||||
+ ldsize >> 9, NULL, NULL, 0) == 0) {
|
||||
+ if (!force) {
|
||||
+ fprintf(stderr, Name
|
||||
+ ": %s is larger than %s can "
|
||||
+ "effectively use.\n"
|
||||
+ " Add --force is you "
|
||||
+ "really wan to add this device.\n",
|
||||
+ add_dev, devname);
|
||||
+ close(tfd);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ fprintf(stderr, Name
|
||||
+ ": %s is larger than %s can "
|
||||
+ "effectively use.\n"
|
||||
+ " Adding anyway as --force "
|
||||
+ "was given.\n",
|
||||
+ add_dev, devname);
|
||||
+ }
|
||||
if (!tst->ss->external &&
|
||||
array.major_version == 0 &&
|
||||
md_get_version(fd)%100 < 2) {
|
||||
@@ -1188,9 +1209,9 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
|
||||
sprintf(devname, "%d:%d", major(devid), minor(devid));
|
||||
|
||||
devlist.disposition = 'r';
|
||||
- if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL) == 0) {
|
||||
+ if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0) == 0) {
|
||||
devlist.disposition = 'a';
|
||||
- if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0, NULL) == 0) {
|
||||
+ if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0, NULL, 0) == 0) {
|
||||
/* make sure manager is aware of changes */
|
||||
ping_manager(to_devname);
|
||||
ping_manager(from_devname);
|
||||
@@ -1198,7 +1219,7 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
|
||||
close(fd2);
|
||||
return 1;
|
||||
}
|
||||
- else Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL);
|
||||
+ else Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0);
|
||||
}
|
||||
close(fd1);
|
||||
close(fd2);
|
||||
diff --git a/mdadm.c b/mdadm.c
|
||||
index fb51051..4b817ab 100644
|
||||
--- a/mdadm.c
|
||||
+++ b/mdadm.c
|
||||
@@ -609,6 +609,7 @@ int main(int argc, char *argv[])
|
||||
case O(ASSEMBLE,Force): /* force assembly */
|
||||
case O(MISC,'f'): /* force zero */
|
||||
case O(MISC,Force): /* force zero */
|
||||
+ case O(MANAGE,Force): /* add device which is too large */
|
||||
force=1;
|
||||
continue;
|
||||
|
||||
@@ -1202,7 +1203,7 @@ int main(int argc, char *argv[])
|
||||
if (!rv && devs_found>1)
|
||||
rv = Manage_subdevs(devlist->devname, mdfd,
|
||||
devlist->next, verbose-quiet, test,
|
||||
- update);
|
||||
+ update, force);
|
||||
if (!rv && readonly < 0)
|
||||
rv = Manage_ro(devlist->devname, mdfd, readonly);
|
||||
if (!rv && runstop)
|
||||
diff --git a/mdadm.h b/mdadm.h
|
||||
index 8bd0077..d616966 100644
|
||||
--- a/mdadm.h
|
||||
+++ b/mdadm.h
|
||||
@@ -1010,7 +1010,7 @@ extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
|
||||
extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
|
||||
extern int Manage_subdevs(char *devname, int fd,
|
||||
struct mddev_dev *devlist, int verbose, int test,
|
||||
- char *update);
|
||||
+ char *update, int force);
|
||||
extern int autodetect(void);
|
||||
extern int Grow_Add_device(char *devname, int fd, char *newdev);
|
||||
extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);
|
||||
--
|
||||
1.7.6.4
|
||||
|
@ -1,84 +0,0 @@
|
||||
From 9ad6f6e65a535f77f180e87393043a8ffcfb30d8 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Kwolek <adam.kwolek@intel.com>
|
||||
Date: Wed, 26 Oct 2011 18:16:55 +0200
|
||||
Subject: [PATCH] FIX: Close unused handle in child process during reshape
|
||||
restart
|
||||
|
||||
When array reshape (e.g. raid0->raid5 migration) is restarted during
|
||||
array assembly, file system placed on this array cannot be mounted until
|
||||
reshape is finished due to "busy" error.
|
||||
|
||||
This is caused when reshape is executed on array for external metadata
|
||||
and array handle is cloned /forked/ to child process environment but not
|
||||
closed.
|
||||
|
||||
Handle can't be closed before executing Grow_continue() because it is
|
||||
used later in code.
|
||||
|
||||
Close unused handle in child process /reshape_container()/.
|
||||
It is similar to close fd handle in reshape_array() before calling
|
||||
manage_reshape()/child_monitor() in Grow.c:2290.
|
||||
|
||||
Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Grow.c | 13 +++++++++++--
|
||||
1 files changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Grow.c b/Grow.c
|
||||
index 0e4dd10..93a69fd 100644
|
||||
--- a/Grow.c
|
||||
+++ b/Grow.c
|
||||
@@ -1350,6 +1350,7 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||
char *backup_file, int quiet, int forked,
|
||||
int restart);
|
||||
static int reshape_container(char *container, char *devname,
|
||||
+ int mdfd,
|
||||
struct supertype *st,
|
||||
struct mdinfo *info,
|
||||
int force,
|
||||
@@ -1768,7 +1769,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||
* number of devices (On-Line Capacity Expansion) must be
|
||||
* performed at the level of the container
|
||||
*/
|
||||
- rv = reshape_container(container, devname, st, &info,
|
||||
+ rv = reshape_container(container, devname, -1, st, &info,
|
||||
force, backup_file, quiet, 0);
|
||||
frozen = 0;
|
||||
} else {
|
||||
@@ -2403,7 +2404,10 @@ release:
|
||||
return 1;
|
||||
}
|
||||
|
||||
+/* mdfd handle is passed to be closed in child process (after fork).
|
||||
+ */
|
||||
int reshape_container(char *container, char *devname,
|
||||
+ int mdfd,
|
||||
struct supertype *st,
|
||||
struct mdinfo *info,
|
||||
int force,
|
||||
@@ -2446,6 +2450,11 @@ int reshape_container(char *container, char *devname,
|
||||
break;
|
||||
}
|
||||
|
||||
+ /* close unused handle in child process
|
||||
+ */
|
||||
+ if (mdfd > -1)
|
||||
+ close(mdfd);
|
||||
+
|
||||
while(1) {
|
||||
/* For each member array with reshape_active,
|
||||
* we need to perform the reshape.
|
||||
@@ -3571,7 +3580,7 @@
|
||||
return 1;
|
||||
st->ss->load_container(st, cfd, container);
|
||||
close(cfd);
|
||||
- return reshape_container(container, NULL,
|
||||
+ return reshape_container(container, NULL, mdfd,
|
||||
st, info, 0, backup_file,
|
||||
0, 1);
|
||||
}
|
||||
|
||||
--
|
||||
1.7.7.3
|
||||
|
@ -1,76 +0,0 @@
|
||||
From 01619b481883926f13da2b1b88f3125359a6a08b Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Thu, 8 Sep 2011 12:20:36 +1000
|
||||
Subject: [PATCH 1/3] Fix component size checks in validate_super0.
|
||||
|
||||
A 0.90 array can use at most 4TB of each device - 2TB between
|
||||
2.6.39 and 3.1 due to a kernel bug.
|
||||
|
||||
The test for this in validate_super0 is very wrong. 'size' is sectors
|
||||
and the number it is compared against is just confusing.
|
||||
|
||||
So fix it all up and correct the spelling of terabytes and remove
|
||||
a second redundant test on 'size'.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super0.c | 14 ++++++++++----
|
||||
util.c | 2 +-
|
||||
2 files changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/super0.c b/super0.c
|
||||
index 4a165f9..62c4ff0 100644
|
||||
--- a/super0.c
|
||||
+++ b/super0.c
|
||||
@@ -1115,6 +1115,13 @@ static int validate_geometry0(struct supertype *st, int level,
|
||||
{
|
||||
unsigned long long ldsize;
|
||||
int fd;
|
||||
+ unsigned int tbmax = 4;
|
||||
+
|
||||
+ /* prior to linux 3.1, a but limits usable device size to 2TB.
|
||||
+ * It was introduced in 2.6.29, but we won't worry about that detail
|
||||
+ */
|
||||
+ if (get_linux_version() < 3001000)
|
||||
+ tbmax = 2;
|
||||
|
||||
if (level == LEVEL_CONTAINER) {
|
||||
if (verbose)
|
||||
@@ -1127,9 +1134,10 @@ static int validate_geometry0(struct supertype *st, int level,
|
||||
MD_SB_DISKS);
|
||||
return 0;
|
||||
}
|
||||
- if (size > (0x7fffffffULL<<9)) {
|
||||
+ if (size >= tbmax * 1024*1024*1024*2ULL) {
|
||||
if (verbose)
|
||||
- fprintf(stderr, Name ": 0.90 metadata supports at most 2 terrabytes per device\n");
|
||||
+ fprintf(stderr, Name ": 0.90 metadata supports at most "
|
||||
+ "%d terabytes per device\n", tbmax);
|
||||
return 0;
|
||||
}
|
||||
if (chunk && *chunk == UnSet)
|
||||
@@ -1154,8 +1162,6 @@ static int validate_geometry0(struct supertype *st, int level,
|
||||
|
||||
if (ldsize < MD_RESERVED_SECTORS * 512)
|
||||
return 0;
|
||||
- if (size > (0x7fffffffULL<<9))
|
||||
- return 0;
|
||||
*freesize = MD_NEW_SIZE_SECTORS(ldsize >> 9);
|
||||
return 1;
|
||||
}
|
||||
diff --git a/util.c b/util.c
|
||||
index e68d55f..0ea7e0d 100644
|
||||
--- a/util.c
|
||||
+++ b/util.c
|
||||
@@ -640,7 +640,7 @@ char *human_size(long long bytes)
|
||||
* We allow upto 2048Megabytes before converting to
|
||||
* gigabytes, as that shows more precision and isn't
|
||||
* too large a number.
|
||||
- * Terrabytes are not yet handled.
|
||||
+ * Terabytes are not yet handled.
|
||||
*/
|
||||
|
||||
if (bytes < 5000*1024)
|
||||
--
|
||||
1.7.6.4
|
||||
|
@ -1,113 +0,0 @@
|
||||
From 758be4f1c9cda8eefb2fd241835521462196e16c Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Date: Mon, 19 Sep 2011 13:26:05 +1000
|
||||
Subject: [PATCH] Fix serious memory leak
|
||||
|
||||
During reshape function restore_stripes is called periodically
|
||||
and every time the buffer stripe_buf (of size raid_disks*chunk_size)
|
||||
is allocated but is not freed. It happens also upon successful completion.
|
||||
In case of huge arrays it can lead to the seizure of the entire
|
||||
system memory (even of the order of gigabytes).
|
||||
|
||||
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
restripe.c | 50 +++++++++++++++++++++++++++++++++-----------------
|
||||
1 files changed, 33 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/restripe.c b/restripe.c
|
||||
index 9c83e2e..00e7a82 100644
|
||||
--- a/restripe.c
|
||||
+++ b/restripe.c
|
||||
@@ -687,6 +687,7 @@ int restore_stripes(int *dest, unsigned long long *offsets,
|
||||
char **stripes = malloc(raid_disks * sizeof(char*));
|
||||
char **blocks = malloc(raid_disks * sizeof(char*));
|
||||
int i;
|
||||
+ int rv;
|
||||
|
||||
int data_disks = raid_disks - (level == 0 ? 0 : level <= 5 ? 1 : 2);
|
||||
|
||||
@@ -704,11 +705,8 @@ int restore_stripes(int *dest, unsigned long long *offsets,
|
||||
|
||||
if (stripe_buf == NULL || stripes == NULL || blocks == NULL
|
||||
|| zero == NULL) {
|
||||
- free(stripe_buf);
|
||||
- free(stripes);
|
||||
- free(blocks);
|
||||
- free(zero);
|
||||
- return -2;
|
||||
+ rv = -2;
|
||||
+ goto abort;
|
||||
}
|
||||
for (i = 0; i < raid_disks; i++)
|
||||
stripes[i] = stripe_buf + i * chunk_size;
|
||||
@@ -717,20 +715,26 @@ int restore_stripes(int *dest, unsigned long long *offsets,
|
||||
unsigned long long offset;
|
||||
int disk, qdisk;
|
||||
int syndrome_disks;
|
||||
- if (length < len)
|
||||
- return -3;
|
||||
+ if (length < len) {
|
||||
+ rv = -3;
|
||||
+ goto abort;
|
||||
+ }
|
||||
for (i = 0; i < data_disks; i++) {
|
||||
int disk = geo_map(i, start/chunk_size/data_disks,
|
||||
raid_disks, level, layout);
|
||||
if (src_buf == NULL) {
|
||||
/* read from file */
|
||||
- if (lseek64(source,
|
||||
- read_offset, 0) != (off64_t)read_offset)
|
||||
- return -1;
|
||||
+ if (lseek64(source, read_offset, 0) !=
|
||||
+ (off64_t)read_offset) {
|
||||
+ rv = -1;
|
||||
+ goto abort;
|
||||
+ }
|
||||
if (read(source,
|
||||
stripes[disk],
|
||||
- chunk_size) != chunk_size)
|
||||
- return -1;
|
||||
+ chunk_size) != chunk_size) {
|
||||
+ rv = -1;
|
||||
+ goto abort;
|
||||
+ }
|
||||
} else {
|
||||
/* read from input buffer */
|
||||
memcpy(stripes[disk],
|
||||
@@ -782,15 +786,27 @@ int restore_stripes(int *dest, unsigned long long *offsets,
|
||||
}
|
||||
for (i=0; i < raid_disks ; i++)
|
||||
if (dest[i] >= 0) {
|
||||
- if (lseek64(dest[i], offsets[i]+offset, 0) < 0)
|
||||
- return -1;
|
||||
- if (write(dest[i], stripes[i], chunk_size) != chunk_size)
|
||||
- return -1;
|
||||
+ if (lseek64(dest[i],
|
||||
+ offsets[i]+offset, 0) < 0) {
|
||||
+ rv = -1;
|
||||
+ goto abort;
|
||||
+ }
|
||||
+ if (write(dest[i], stripes[i],
|
||||
+ chunk_size) != chunk_size) {
|
||||
+ rv = -1;
|
||||
+ goto abort;
|
||||
+ }
|
||||
}
|
||||
length -= len;
|
||||
start += len;
|
||||
}
|
||||
- return 0;
|
||||
+ rv = 0;
|
||||
+
|
||||
+abort:
|
||||
+ free(stripe_buf);
|
||||
+ free(stripes);
|
||||
+ free(blocks);
|
||||
+ return rv;
|
||||
}
|
||||
|
||||
#ifdef MAIN
|
||||
--
|
||||
1.7.7.3
|
||||
|
@ -1,77 +0,0 @@
|
||||
From 20a4675688e0384a1b4eac61b05f60fbf7747df9 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Thu, 8 Sep 2011 13:08:51 +1000
|
||||
Subject: [PATCH 3/3] Grow: refuse to grow a 0.90 array beyond 2TB
|
||||
|
||||
A kernel bug makes handling for arrays using more than 2TB per device
|
||||
incorrect, and the kernel doesn't stop an array from growing beyond
|
||||
any limit.
|
||||
This is fixed in 3.1
|
||||
|
||||
So prior to 3.1, make sure not to ask for an array to grow bigger than
|
||||
2TB per device.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Grow.c | 37 ++++++++++++++++++++++++++++++++++---
|
||||
1 files changed, 34 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Grow.c b/Grow.c
|
||||
index 048351d..17d14b6 100644
|
||||
--- a/Grow.c
|
||||
+++ b/Grow.c
|
||||
@@ -1446,6 +1446,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||
/* ========= set size =============== */
|
||||
if (size >= 0 && (size == 0 || size != array.size)) {
|
||||
long long orig_size = get_component_size(fd)/2;
|
||||
+ long long min_csize;
|
||||
struct mdinfo *mdi;
|
||||
|
||||
if (orig_size == 0)
|
||||
@@ -1461,10 +1462,40 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
|
||||
/* Update the size of each member device in case
|
||||
* they have been resized. This will never reduce
|
||||
* below the current used-size. The "size" attribute
|
||||
- * understand '0' to mean 'max'.
|
||||
+ * understands '0' to mean 'max'.
|
||||
*/
|
||||
- for (mdi = sra->devs; mdi; mdi = mdi->next)
|
||||
- sysfs_set_num(sra, mdi, "size", size);
|
||||
+ min_csize = 0;
|
||||
+ for (mdi = sra->devs; mdi; mdi = mdi->next) {
|
||||
+ if (sysfs_set_num(sra, mdi, "size", size) < 0)
|
||||
+ break;
|
||||
+ if (array.not_persistent == 0 &&
|
||||
+ array.major_version == 0 &&
|
||||
+ get_linux_version() < 3001000) {
|
||||
+ /* Dangerous to allow size to exceed 2TB */
|
||||
+ unsigned long long csize;
|
||||
+ if (sysfs_get_ll(sra, mdi, "size", &csize) == 0) {
|
||||
+ if (csize >= 2ULL*1024*1024*1024)
|
||||
+ csize = 2ULL*1024*1024*1024;
|
||||
+ if ((min_csize == 0 || (min_csize
|
||||
+ > (long long)csize)))
|
||||
+ min_csize = csize;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if (min_csize && size > min_csize) {
|
||||
+ fprintf(stderr, Name ": Cannot safely make this array "
|
||||
+ "use more than 2TB per device on this kernel.\n");
|
||||
+ rv = 1;
|
||||
+ goto release;
|
||||
+ }
|
||||
+ if (min_csize && size == 0) {
|
||||
+ /* Don't let the kernel choose a size - it will get
|
||||
+ * it wrong
|
||||
+ */
|
||||
+ fprintf(stderr, Name ": Limited v0.90 array to "
|
||||
+ "2TB per device\n");
|
||||
+ size = min_csize;
|
||||
+ }
|
||||
|
||||
array.size = size;
|
||||
if (array.size != size) {
|
||||
--
|
||||
1.7.6.4
|
||||
|
@ -1,88 +0,0 @@
|
||||
commit 5fc8cff3a4177dfbab594947283117620b4b8c9c
|
||||
Author: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Sat Oct 22 11:29:47 2011 +1100
|
||||
|
||||
Remove race for starting container devices.
|
||||
|
||||
This moves the lock handling out of Incremental_container() and relies
|
||||
on the caller holding the lock. This prevents conflict with a
|
||||
follow-on mdadm comment which may try and launch the device in
|
||||
parallel.
|
||||
|
||||
This involves replacing a call to "Incremental" with an
|
||||
unrolled version with just the case that calls Incremental_container
|
||||
and so needs a call to ->load_container.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
|
||||
---
|
||||
Incremental.c | 22 ++++++++++++----------
|
||||
1 files changed, 12 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/Incremental.c b/Incremental.c
|
||||
index 14184da..9fa6800 100644
|
||||
--- a/Incremental.c
|
||||
+++ b/Incremental.c
|
||||
@@ -138,9 +138,15 @@
|
||||
rv = st->ss->load_container(st, dfd, NULL);
|
||||
|
||||
close(dfd);
|
||||
- if (!rv && st->ss->container_content)
|
||||
- return Incremental_container(st, devname, homehost,
|
||||
- verbose, runstop, autof);
|
||||
+ if (!rv && st->ss->container_content) {
|
||||
+ if (map_lock(&map))
|
||||
+ fprintf(stderr, Name ": failed to get "
|
||||
+ "exclusive lock on mapfile\n");
|
||||
+ rv = Incremental_container(st, devname, homehost,
|
||||
+ verbose, runstop, autof);
|
||||
+ map_unlock(&map);
|
||||
+ return rv;
|
||||
+ }
|
||||
|
||||
fprintf(stderr, Name ": %s is not part of an md array.\n",
|
||||
devname);
|
||||
@@ -438,7 +444,6 @@
|
||||
if (info.array.level == LEVEL_CONTAINER) {
|
||||
int devnum = devnum; /* defined and used iff ->external */
|
||||
/* Try to assemble within the container */
|
||||
- map_unlock(&map);
|
||||
sysfs_uevent(&info, "change");
|
||||
if (verbose >= 0)
|
||||
fprintf(stderr, Name
|
||||
@@ -447,10 +452,14 @@
|
||||
wait_for(chosen_name, mdfd);
|
||||
if (st->ss->external)
|
||||
devnum = fd2devnum(mdfd);
|
||||
+ if (st->ss->load_container)
|
||||
+ rv = st->ss->load_container(st, mdfd, NULL);
|
||||
close(mdfd);
|
||||
sysfs_free(sra);
|
||||
- rv = Incremental(chosen_name, verbose, runstop,
|
||||
- NULL, homehost, require_homehost, autof);
|
||||
+ if (!rv)
|
||||
+ rv = Incremental_container(st, chosen_name, homehost,
|
||||
+ verbose, runstop, autof);
|
||||
+ map_unlock(&map);
|
||||
if (rv == 1)
|
||||
/* Don't fail the whole -I if a subarray didn't
|
||||
* have enough devices to start yet
|
||||
@@ -1460,9 +1469,6 @@
|
||||
trustworthy = FOREIGN;
|
||||
|
||||
list = st->ss->container_content(st, NULL);
|
||||
- if (map_lock(&map))
|
||||
- fprintf(stderr, Name ": failed to get exclusive lock on "
|
||||
- "mapfile\n");
|
||||
/* do not assemble arrays that might have bad blocks */
|
||||
if (list->array.state & (1<<MD_SB_BBM_ERRORS)) {
|
||||
fprintf(stderr, Name ": BBM log found in metadata. "
|
||||
@@ -1600,7 +1606,6 @@
|
||||
close(sfd);
|
||||
}
|
||||
domain_free(domains);
|
||||
- map_unlock(&map);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,41 +0,0 @@
|
||||
diff -up mdadm-3.2.2/super-intel.c.attributes mdadm-3.2.2/super-intel.c
|
||||
--- mdadm-3.2.2/super-intel.c.attributes 2011-08-31 15:50:02.919229255 -0400
|
||||
+++ mdadm-3.2.2/super-intel.c 2011-08-31 15:51:58.560231484 -0400
|
||||
@@ -74,14 +74,18 @@
|
||||
|
||||
/* Define all supported attributes that have to be accepted by mdadm
|
||||
*/
|
||||
-#define MPB_ATTRIB_SUPPORTED MPB_ATTRIB_CHECKSUM_VERIFY | \
|
||||
+#define MPB_ATTRIB_SUPPORTED (MPB_ATTRIB_CHECKSUM_VERIFY | \
|
||||
MPB_ATTRIB_2TB | \
|
||||
MPB_ATTRIB_2TB_DISK | \
|
||||
MPB_ATTRIB_RAID0 | \
|
||||
MPB_ATTRIB_RAID1 | \
|
||||
MPB_ATTRIB_RAID10 | \
|
||||
MPB_ATTRIB_RAID5 | \
|
||||
- MPB_ATTRIB_EXP_STRIPE_SIZE
|
||||
+ MPB_ATTRIB_EXP_STRIPE_SIZE)
|
||||
+
|
||||
+/* Define attributes that are unused but not harmful */
|
||||
+#define MPB_ATTRIB_IGNORED (MPB_ATTRIB_NEVER_USE | \
|
||||
+ MPB_ATTRIB_NEVER_USE2)
|
||||
|
||||
#define MPB_SECTOR_CNT 2210
|
||||
#define IMSM_RESERVED_SECTORS 4096
|
||||
@@ -1141,11 +1145,14 @@ void examine_migr_rec_imsm(struct intel_
|
||||
static int imsm_check_attributes(__u32 attributes)
|
||||
{
|
||||
int ret_val = 1;
|
||||
- __u32 not_supported = (MPB_ATTRIB_SUPPORTED)^0xffffffff;
|
||||
+ __u32 not_supported = MPB_ATTRIB_SUPPORTED^0xffffffff;
|
||||
+
|
||||
+ not_supported &= ~MPB_ATTRIB_IGNORED;
|
||||
|
||||
not_supported &= attributes;
|
||||
if (not_supported) {
|
||||
- fprintf(stderr, Name "(IMSM): Unsupported attributes : %x\n", not_supported);
|
||||
+ fprintf(stderr, Name "(IMSM): Unsupported attributes : %x\n",
|
||||
+ (unsigned)__le32_to_cpu(not_supported));
|
||||
if (not_supported & MPB_ATTRIB_CHECKSUM_VERIFY) {
|
||||
dprintf("\t\tMPB_ATTRIB_CHECKSUM_VERIFY \n");
|
||||
not_supported ^= MPB_ATTRIB_CHECKSUM_VERIFY;
|
@ -1,26 +0,0 @@
|
||||
--- a/super-intel.c
|
||||
+++ b/super-intel.c
|
||||
@@ -2326,7 +2326,9 @@ static void getinfo_super_imsm_volume(st
|
||||
|
||||
dprintf("IMSM: General Migration checkpoint : %llu "
|
||||
"(%llu) -> read reshape progress : %llu\n",
|
||||
- units, blocks_per_unit, info->reshape_progress);
|
||||
+ (unsigned long long)units,
|
||||
+ (unsigned long long)blocks_per_unit,
|
||||
+ info->reshape_progress);
|
||||
|
||||
used_disks = imsm_num_data_members(dev, 1);
|
||||
if (used_disks > 0) {
|
||||
@@ -8661,7 +8663,11 @@ static int imsm_reshape_super(struct sup
|
||||
dprintf("imsm: info: Volume operation\n");
|
||||
/* find requested device */
|
||||
while (dev) {
|
||||
- imsm_find_array_minor_by_subdev(dev->index, st->container_dev, &devnum);
|
||||
+ if (imsm_find_array_minor_by_subdev(dev->index,
|
||||
+ st->container_dev, &devnum) < 0) {
|
||||
+ dprintf("imsm: cannot find array\n");
|
||||
+ goto exit_imsm_reshape_super;
|
||||
+ }
|
||||
if (devnum == geo.dev_id)
|
||||
break;
|
||||
dev = dev->next;
|
@ -1,45 +0,0 @@
|
||||
From 2eebfb2ed16c7c73fc46c3575160fa47c5fa51c5 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Mon, 17 Oct 2011 22:09:17 +0200
|
||||
Subject: [PATCH 3/3] Hold the map lock while performing Assemble to avoid
|
||||
races with udev
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
mdadm.c | 6 ++++++
|
||||
1 files changed, 6 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/mdadm.c b/mdadm.c
|
||||
index e01beec..7fa8feb 100644
|
||||
--- a/mdadm.c
|
||||
+++ b/mdadm.c
|
||||
@@ -1257,6 +1257,7 @@ int main(int argc, char *argv[])
|
||||
} else {
|
||||
struct mddev_ident *a, *array_list = conf_get_ident(NULL);
|
||||
struct mddev_dev *devlist = conf_get_devs();
|
||||
+ struct map_ent *map = NULL;
|
||||
int cnt = 0;
|
||||
int failures, successes;
|
||||
if (devlist == NULL) {
|
||||
@@ -1276,6 +1277,10 @@ int main(int argc, char *argv[])
|
||||
if (a->autof == 0)
|
||||
a->autof = autof;
|
||||
}
|
||||
+ if (map_lock(&map))
|
||||
+ fprintf(stderr, Name " %s: failed to get "
|
||||
+ "exclusive lock on mapfile\n",
|
||||
+ __func__);
|
||||
do {
|
||||
failures = 0;
|
||||
successes = 0;
|
||||
@@ -1366,6 +1371,7 @@ int main(int argc, char *argv[])
|
||||
fprintf(stderr, Name ": No arrays found in config file\n");
|
||||
rv = 1;
|
||||
}
|
||||
+ map_unlock(&map);
|
||||
}
|
||||
break;
|
||||
case BUILD:
|
||||
--
|
||||
1.7.6.4
|
||||
|
@ -1,178 +0,0 @@
|
||||
--- mdadm-3.2.2/mdadm.8.in.man 2011-06-17 01:15:50.000000000 -0400
|
||||
+++ mdadm-3.2.2/mdadm.8.in 2011-07-14 20:18:49.240997107 -0400
|
||||
@@ -336,7 +336,7 @@ It can easily be moved between hosts wit
|
||||
recovery operation can be checkpointed and restarted. The different
|
||||
sub-versions store the superblock at different locations on the
|
||||
device, either at the end (for 1.0), at the start (for 1.1) or 4K from
|
||||
-the start (for 1.2). "1" is equivalent to "1.0".
|
||||
+the start (for 1.2). "1" is equivalent to "1.2".
|
||||
'if '{DEFAULT_METADATA}'1.2' "default" is equivalent to "1.2".
|
||||
.IP ddf
|
||||
Use the "Industry Standard" DDF (Disk Data Format) format defined by
|
||||
@@ -706,7 +706,7 @@ facts the operator knows.
|
||||
When an array is resized to a larger size with
|
||||
.B "\-\-grow \-\-size="
|
||||
the new space is normally resynced in that same way that the whole
|
||||
-array is resynced at creation. From Linux version 2.6.40,
|
||||
+array is resynced at creation. From Linux version 3.0,
|
||||
.B \-\-assume\-clean
|
||||
can be used with that command to avoid the automatic resync.
|
||||
|
||||
@@ -811,6 +811,11 @@ number, and there is no entry in /dev fo
|
||||
non-standard name. Names that are not in 'standard' format are only
|
||||
allowed in "/dev/md/".
|
||||
|
||||
+This is meaningful with
|
||||
+.B \-\-create
|
||||
+or
|
||||
+.BR \-\-build .
|
||||
+
|
||||
.ig XX
|
||||
.\".TP
|
||||
.\".BR \-\-symlink = no
|
||||
@@ -835,6 +840,28 @@ allowed in "/dev/md/".
|
||||
.\"
|
||||
.XX
|
||||
|
||||
+.TP
|
||||
+.BR \-a ", " "\-\-add"
|
||||
+This option can be used in Grow mode in two cases.
|
||||
+
|
||||
+If the target array is a Linear array, then
|
||||
+.B \-\-add
|
||||
+can be used to add one or more devices to the array. They
|
||||
+are simply catenated on to the end of the array. Once added, the
|
||||
+devices cannot be removed.
|
||||
+
|
||||
+If the
|
||||
+.B \-\-raid\-disks
|
||||
+option is being used to increase the number of devices in an array,
|
||||
+then
|
||||
+.B \-\-add
|
||||
+can be used to add some extra devices to be included in the array.
|
||||
+In most cases this is not needed as the extra devices can be added as
|
||||
+spares first, and then the number of raid-disks can be changed.
|
||||
+However for RAID0, it is not possible to add spares. So to increase
|
||||
+the number of devices in a RAID0, it is necessary to set the new
|
||||
+number of devices, and to add the new devices, in the same command.
|
||||
+
|
||||
.SH For assemble:
|
||||
|
||||
.TP
|
||||
@@ -912,28 +939,6 @@ not as reliable as you would like.
|
||||
See this option under Create and Build options.
|
||||
|
||||
.TP
|
||||
-.BR \-a ", " "\-\-add"
|
||||
-This option can be used in Grow mode in two cases.
|
||||
-
|
||||
-If the target array is a Linear array, then
|
||||
-.B \-\-add
|
||||
-can be used to add one or more devices to the array. They
|
||||
-are simply catenated on to the end of the array. Once added, the
|
||||
-devices cannot be removed.
|
||||
-
|
||||
-If the
|
||||
-.B \-\-raid\-disks
|
||||
-option is being used to increase the number of devices in an array,
|
||||
-then
|
||||
-.B \-\-add
|
||||
-can be used to add some extra devices to be included in the array.
|
||||
-In most cases this is not needed as the extra devices can be added as
|
||||
-spares first, and then the number of raid-disks can be changed.
|
||||
-However for RAID0, it is not possible to add spares. So to increase
|
||||
-the number of devices in a RAID0, it is necessary to set the new
|
||||
-number of devices, and to add the new devices, in the same command.
|
||||
-
|
||||
-.TP
|
||||
.BR \-b ", " \-\-bitmap=
|
||||
Specify the bitmap file that was given when the array was created. If
|
||||
an array has an
|
||||
@@ -1491,7 +1496,7 @@ the first device given is the md device.
|
||||
In the second usage example, all devices listed are treated as md
|
||||
devices and assembly is attempted.
|
||||
In the third (where no devices are listed) all md devices that are
|
||||
-listed in the configuration file are assembled. If not arrays are
|
||||
+listed in the configuration file are assembled. If no arrays are
|
||||
described by the configuration file, then any arrays that
|
||||
can be found on unused devices will be assembled.
|
||||
|
||||
@@ -1600,7 +1605,7 @@ and no devices are listed,
|
||||
will first attempt to assemble all the arrays listed in the config
|
||||
file.
|
||||
|
||||
-In no array at listed in the config (other than those marked
|
||||
+If no arrays are listed in the config (other than those marked
|
||||
.BR <ignore> )
|
||||
it will look through the available devices for possible arrays and
|
||||
will try to assemble anything that it finds. Arrays which are tagged
|
||||
@@ -2200,11 +2205,11 @@ change the "size" attribute for RAID1, R
|
||||
.IP \(bu 4
|
||||
increase or decrease the "raid\-devices" attribute of RAID0, RAID1, RAID4,
|
||||
RAID5, and RAID6.
|
||||
-.IP \bu 4
|
||||
+.IP \(bu 4
|
||||
change the chunk-size and layout of RAID0, RAID4, RAID5 and RAID6.
|
||||
-.IP \bu 4
|
||||
+.IP \(bu 4
|
||||
convert between RAID1 and RAID5, between RAID5 and RAID6, between
|
||||
-RAID0, RAID5, and RAID5, and between RAID0 and RAID10 (in the near-2 mode).
|
||||
+RAID0, RAID4, and RAID5, and between RAID0 and RAID10 (in the near-2 mode).
|
||||
.IP \(bu 4
|
||||
add a write-intent bitmap to any array which supports these bitmaps, or
|
||||
remove a write-intent bitmap from such an array.
|
||||
@@ -2250,7 +2255,7 @@ space to start being used. If the size
|
||||
are synchronised.
|
||||
|
||||
Note that when an array changes size, any filesystem that may be
|
||||
-stored in the array will not automatically grow for shrink to use or
|
||||
+stored in the array will not automatically grow or shrink to use or
|
||||
vacate the space. The
|
||||
filesystem will need to be explicitly told to use the extra space
|
||||
after growing, or to reduce its size
|
||||
@@ -2259,7 +2264,7 @@ to shrinking the array.
|
||||
|
||||
Also the size of an array cannot be changed while it has an active
|
||||
bitmap. If an array has a bitmap, it must be removed before the size
|
||||
-can be changed. Once the change it complete a new bitmap can be created.
|
||||
+can be changed. Once the change is complete a new bitmap can be created.
|
||||
|
||||
.SS RAID\-DEVICES CHANGES
|
||||
|
||||
@@ -2435,8 +2440,8 @@ must match one of the names or patterns
|
||||
line.
|
||||
|
||||
.IP +
|
||||
-Does the device have a valid md superblock. If a specific metadata
|
||||
-version is request with
|
||||
+Does the device have a valid md superblock? If a specific metadata
|
||||
+version is requested with
|
||||
.B \-\-metadata
|
||||
or
|
||||
.B \-e
|
||||
@@ -2467,6 +2472,7 @@ is not able to positively identify the a
|
||||
current host, the device will be rejected.
|
||||
..
|
||||
|
||||
+.PP
|
||||
.I mdadm
|
||||
keeps a list of arrays that it has partially assembled in
|
||||
.B /var/run/mdadm/map
|
||||
@@ -2639,7 +2645,7 @@ can be started.
|
||||
Any devices which are components of /dev/md4 will be marked as faulty
|
||||
and then remove from the array.
|
||||
|
||||
-.B " mdadm --grow /dev/md4 --level=6 --backup-file=/root/backup-md4
|
||||
+.B " mdadm --grow /dev/md4 --level=6 --backup-file=/root/backup-md4"
|
||||
.br
|
||||
The array
|
||||
.B /dev/md4
|
||||
@@ -2787,7 +2793,7 @@ configuration file at all.
|
||||
For further information on mdadm usage, MD and the various levels of
|
||||
RAID, see:
|
||||
.IP
|
||||
-.B http://linux\-raid.osdl.org/
|
||||
+.B http://raid.wiki.kernel.org/
|
||||
.PP
|
||||
(based upon Jakob \(/Ostergaard's Software\-RAID.HOWTO)
|
||||
.\".PP
|
@ -1,26 +0,0 @@
|
||||
From 91d610e0cb5a22685c6cc1d31b0ff3d4539a6c99 Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Thu, 13 Oct 2011 19:46:52 +0200
|
||||
Subject: [PATCH 2/3] Don't tell sysfs to launch the container as we are doing
|
||||
it ourselves
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
---
|
||||
Incremental.c | 1 -
|
||||
1 files changed, 0 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/Incremental.c b/Incremental.c
|
||||
index 9fa6800..55a4589 100644
|
||||
--- a/Incremental.c
|
||||
+++ b/Incremental.c
|
||||
@@ -446,7 +446,6 @@ int Incremental(char *devname, int verbose, int runstop,
|
||||
if (info.array.level == LEVEL_CONTAINER) {
|
||||
int devnum = devnum; /* defined and used iff ->external */
|
||||
/* Try to assemble within the container */
|
||||
- sysfs_uevent(&info, "change");
|
||||
if (verbose >= 0)
|
||||
fprintf(stderr, Name
|
||||
": container %s now has %d devices\n",
|
||||
--
|
||||
1.7.6.4
|
||||
|
@ -1,26 +0,0 @@
|
||||
--- mdadm-3.2.2/util.c.readd 2011-06-17 01:15:50.000000000 -0400
|
||||
+++ mdadm-3.2.2/util.c 2011-07-18 14:43:40.776150946 -0400
|
||||
@@ -364,19 +364,21 @@ int enough_fd(int fd)
|
||||
struct mdu_disk_info_s disk;
|
||||
int avail_disks = 0;
|
||||
int i;
|
||||
+ int raid_disks;
|
||||
char *avail;
|
||||
|
||||
if (ioctl(fd, GET_ARRAY_INFO, &array) != 0 ||
|
||||
array.raid_disks <= 0)
|
||||
return 0;
|
||||
avail = calloc(array.raid_disks, 1);
|
||||
- for (i=0; i < 1024 && array.nr_disks > 0; i++) {
|
||||
+ raid_disks = array.raid_disks;
|
||||
+ for (i=0; i < 1024 && raid_disks > 0; i++) {
|
||||
disk.number = i;
|
||||
if (ioctl(fd, GET_DISK_INFO, &disk) != 0)
|
||||
continue;
|
||||
if (disk.major == 0 && disk.minor == 0)
|
||||
continue;
|
||||
- array.nr_disks--;
|
||||
+ raid_disks--;
|
||||
|
||||
if (! (disk.state & (1<<MD_DISK_SYNC)))
|
||||
continue;
|
@ -1,56 +0,0 @@
|
||||
From b601104eb4a4733a838fb86e9e279fed14ce9d3f Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Date: Mon, 10 Oct 2011 09:16:40 +1100
|
||||
Subject: [PATCH] imsm: fix: stopped resync does not continue after
|
||||
auto-assemblation
|
||||
|
||||
Resync stopped with "mdadm -Ss" command does not continue
|
||||
after issuing "mdadm -As" command.
|
||||
|
||||
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
mdadm.conf.5 | 5 ++++-
|
||||
super-intel.c | 3 ++-
|
||||
2 files changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
--- mdadm-3.2.2/mdadm.conf.5.orig 2011-10-18 14:35:24.254923974 +0200
|
||||
+++ mdadm-3.2.2/mdadm.conf.5 2011-10-18 14:35:36.231924727 +0200
|
||||
@@ -439,7 +439,7 @@
|
||||
of domains of all devices in that array. A spare can be automatically
|
||||
moved from one array to another if the set of the destination array's
|
||||
.I domains
|
||||
-contains all the
|
||||
+ppcontains all the
|
||||
.I domains
|
||||
of the new disk or if both arrays have the same
|
||||
.IR spare-group .
|
||||
@@ -463,6 +463,7 @@
|
||||
.B path=
|
||||
file glob matching anything from
|
||||
.B /dev/disk/by-path
|
||||
+.TP
|
||||
.B type=
|
||||
either
|
||||
.B disk
|
||||
@@ -471,6 +472,8 @@
|
||||
.TP
|
||||
.B action=
|
||||
include, re-add, spare, spare-same-slot, or force-spare
|
||||
+.B auto=
|
||||
+yes, no, or homehost.
|
||||
|
||||
.P
|
||||
The
|
||||
--- mdadm-3.2.2/super-intel.c.orig 2011-10-18 14:34:24.000000000 +0200
|
||||
+++ mdadm-3.2.2/super-intel.c 2011-10-18 14:36:23.356925467 +0200
|
||||
@@ -2223,7 +2223,8 @@
|
||||
info->custom_array_size = __le32_to_cpu(dev->size_high);
|
||||
info->custom_array_size <<= 32;
|
||||
info->custom_array_size |= __le32_to_cpu(dev->size_low);
|
||||
- if (prev_map && map->map_state == prev_map->map_state) {
|
||||
+ if (prev_map && map->map_state == prev_map->map_state &&
|
||||
+ (migr_type(dev) == MIGR_GEN_MIGR)) {
|
||||
info->reshape_active = 1;
|
||||
info->new_level = get_imsm_raid_level(map);
|
||||
info->new_layout = imsm_level_to_layout(info->new_level);
|
@ -1,29 +0,0 @@
|
||||
From 9c8c121881769c9ce77fd7d981608c976aac8b5b Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Thu, 20 Oct 2011 13:14:26 +1100
|
||||
Subject: [PATCH] super0: fix overflow when checking max size.
|
||||
|
||||
We need to force multiplication to use ULL before they
|
||||
get to big, else it overflows. So move the "2ULL" to the start.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super0.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/super0.c b/super0.c
|
||||
index 3061ecf..f3d0c07 100644
|
||||
--- a/super0.c
|
||||
+++ b/super0.c
|
||||
@@ -1142,7 +1142,7 @@ static int validate_geometry0(struct supertype *st, int level,
|
||||
MD_SB_DISKS);
|
||||
return 0;
|
||||
}
|
||||
- if (size >= tbmax * 1024*1024*1024*2ULL) {
|
||||
+ if (size >= tbmax * 2ULL*1024*1024*1024) {
|
||||
if (verbose)
|
||||
fprintf(stderr, Name ": 0.90 metadata supports at most "
|
||||
"%d terabytes per device\n", tbmax);
|
||||
--
|
||||
1.7.6.4
|
||||
|
@ -1,87 +0,0 @@
|
||||
diff -up mdadm-3.2.2/Manage.c.writemostly mdadm-3.2.2/Manage.c
|
||||
--- mdadm-3.2.2/Manage.c.writemostly 2011-06-13 22:50:01.000000000 -0400
|
||||
+++ mdadm-3.2.2/Manage.c 2011-07-27 14:12:18.629889841 -0400
|
||||
@@ -741,11 +741,24 @@ int Manage_subdevs(char *devname, int fd
|
||||
remove_partitions(tfd);
|
||||
close(tfd);
|
||||
tfd = -1;
|
||||
- if (update) {
|
||||
+ if (update || dv->writemostly > 0) {
|
||||
int rv = -1;
|
||||
tfd = dev_open(dv->devname, O_RDWR);
|
||||
+ if (tfd < 0) {
|
||||
+ fprintf(stderr, Name ": failed to open %s for"
|
||||
+ " superblock update during re-add\n", dv->devname);
|
||||
+ return 1;
|
||||
+ }
|
||||
|
||||
- if (tfd >= 0)
|
||||
+ if (dv->writemostly == 1)
|
||||
+ rv = st->ss->update_super(
|
||||
+ st, NULL, "writemostly",
|
||||
+ devname, verbose, 0, NULL);
|
||||
+ if (dv->writemostly == 2)
|
||||
+ rv = st->ss->update_super(
|
||||
+ st, NULL, "readwrite",
|
||||
+ devname, verbose, 0, NULL);
|
||||
+ if (update)
|
||||
rv = st->ss->update_super(
|
||||
st, NULL, update,
|
||||
devname, verbose, 0, NULL);
|
||||
diff -up mdadm-3.2.2/mdadm.h.writemostly mdadm-3.2.2/mdadm.h
|
||||
--- mdadm-3.2.2/mdadm.h.writemostly 2011-07-27 14:12:28.800779575 -0400
|
||||
+++ mdadm-3.2.2/mdadm.h 2011-07-27 14:04:34.669932148 -0400
|
||||
@@ -646,6 +646,8 @@ extern struct superswitch {
|
||||
* linear-grow-new - add a new device to a linear array, but don't
|
||||
* change the size: so superblock still matches
|
||||
* linear-grow-update - now change the size of the array.
|
||||
+ * writemostly - set the WriteMostly1 bit in the superblock devflags
|
||||
+ * readwrite - clear the WriteMostly1 bit in the superblock devflags
|
||||
*/
|
||||
int (*update_super)(struct supertype *st, struct mdinfo *info,
|
||||
char *update,
|
||||
diff -up mdadm-3.2.2/super0.c.writemostly mdadm-3.2.2/super0.c
|
||||
--- mdadm-3.2.2/super0.c.writemostly 2011-06-17 01:15:50.000000000 -0400
|
||||
+++ mdadm-3.2.2/super0.c 2011-07-27 14:12:18.655889559 -0400
|
||||
@@ -570,6 +570,10 @@ static int update_super0(struct supertyp
|
||||
sb->state &= ~(1<<MD_SB_BITMAP_PRESENT);
|
||||
} else if (strcmp(update, "_reshape_progress")==0)
|
||||
sb->reshape_position = info->reshape_progress;
|
||||
+ else if (strcmp(update, "writemostly")==0)
|
||||
+ sb->state |= (1<<MD_DISK_WRITEMOSTLY);
|
||||
+ else if (strcmp(update, "readwrite")==0)
|
||||
+ sb->state &= ~(1<<MD_DISK_WRITEMOSTLY);
|
||||
else
|
||||
rv = -1;
|
||||
|
||||
@@ -688,6 +692,8 @@ static int add_to_super0(struct supertyp
|
||||
dk->minor = dinfo->minor;
|
||||
dk->raid_disk = dinfo->raid_disk;
|
||||
dk->state = dinfo->state;
|
||||
+ /* In case our source disk was writemostly, don't copy that bit */
|
||||
+ dk->state &= ~(1<<MD_DISK_WRITEMOSTLY);
|
||||
|
||||
sb->this_disk = sb->disks[dinfo->number];
|
||||
sb->sb_csum = calc_sb0_csum(sb);
|
||||
diff -up mdadm-3.2.2/super1.c.writemostly mdadm-3.2.2/super1.c
|
||||
--- mdadm-3.2.2/super1.c.writemostly 2011-06-17 01:15:50.000000000 -0400
|
||||
+++ mdadm-3.2.2/super1.c 2011-07-27 14:12:18.656889548 -0400
|
||||
@@ -803,6 +803,10 @@ static int update_super1(struct supertyp
|
||||
__le64_to_cpu(sb->data_size));
|
||||
} else if (strcmp(update, "_reshape_progress")==0)
|
||||
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
|
||||
+ else if (strcmp(update, "writemostly")==0)
|
||||
+ sb->devflags |= WriteMostly1;
|
||||
+ else if (strcmp(update, "readwrite")==0)
|
||||
+ sb->devflags &= ~WriteMostly1;
|
||||
else
|
||||
rv = -1;
|
||||
|
||||
@@ -923,6 +927,7 @@ static int add_to_super1(struct supertyp
|
||||
sb->max_dev = __cpu_to_le32(dk->number+1);
|
||||
|
||||
sb->dev_number = __cpu_to_le32(dk->number);
|
||||
+ sb->devflags = 0; /* don't copy another disks flags */
|
||||
sb->sb_csum = calc_sb_1_csum(sb);
|
||||
|
||||
dip = (struct devinfo **)&st->info;
|
32
mdadm-3.2.3-udev.patch
Normal file
32
mdadm-3.2.3-udev.patch
Normal file
@ -0,0 +1,32 @@
|
||||
--- mdadm-3.2.3/udev-md-raid.rules.udev 2011-12-15 05:13:08.000000000 +0100
|
||||
+++ mdadm-3.2.3/udev-md-raid.rules 2011-12-28 17:18:02.753053345 +0100
|
||||
@@ -2,19 +2,21 @@
|
||||
|
||||
SUBSYSTEM!="block", GOTO="md_end"
|
||||
|
||||
+# In Fedora we handle the raid components in 65-md-incremental.rules so that
|
||||
+# we can do things like honor anaconda command line options and such
|
||||
# handle potential components of arrays (the ones supported by md)
|
||||
-ENV{ID_FS_TYPE}=="ddf_raid_member|isw_raid_member|linux_raid_member", GOTO="md_inc"
|
||||
-GOTO="md_inc_skip"
|
||||
-
|
||||
-LABEL="md_inc"
|
||||
+#ENV{ID_FS_TYPE}=="ddf_raid_member|isw_raid_member|linux_raid_member", GOTO="md_inc"
|
||||
+#GOTO="md_inc_skip"
|
||||
+#
|
||||
+#LABEL="md_inc"
|
||||
|
||||
# remember you can limit what gets auto/incrementally assembled by
|
||||
# mdadm.conf(5)'s 'AUTO' and selectively whitelist using 'ARRAY'
|
||||
-ACTION=="add", RUN+="/sbin/mdadm --incremental $tempnode"
|
||||
-ACTION=="remove", ENV{ID_PATH}=="?*", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||
-ACTION=="remove", ENV{ID_PATH}!="?*", RUN+="/sbin/mdadm -If $name"
|
||||
+#ACTION=="add", RUN+="/sbin/mdadm --incremental $tempnode"
|
||||
+#ACTION=="remove", ENV{ID_PATH}=="?*", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||
+#ACTION=="remove", ENV{ID_PATH}!="?*", RUN+="/sbin/mdadm -If $name"
|
||||
|
||||
-LABEL="md_inc_skip"
|
||||
+#LABEL="md_inc_skip"
|
||||
|
||||
# handle md arrays
|
||||
ACTION!="add|change", GOTO="md_end"
|
44
mdadm.spec
44
mdadm.spec
@ -1,7 +1,7 @@
|
||||
Summary: The mdadm program controls Linux md devices (software RAID arrays)
|
||||
Name: mdadm
|
||||
Version: 3.2.2
|
||||
Release: 15%{?dist}
|
||||
Version: 3.2.3
|
||||
Release: 1%{?dist}
|
||||
Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.bz2
|
||||
Source1: mdmonitor.init
|
||||
Source2: raid-check
|
||||
@ -11,23 +11,7 @@ Source5: mdadm-cron
|
||||
Source6: mdmonitor.service
|
||||
Source7: mdmonitor-takeover.service
|
||||
Source8: mdadm.conf
|
||||
Patch0: mdadm-3.2.2-man.patch
|
||||
Patch1: mdadm-3.2.1-version.patch
|
||||
Patch2: mdadm-3.2.2-fixbuild.patch
|
||||
Patch3: mdadm-3.2.2-readd.patch
|
||||
Patch4: mdadm-3.2.2-writemostly.patch
|
||||
Patch5: mdadm-3.2.2-attributes.patch
|
||||
Patch6: mdadm-3.2.2-resync-does-not-continue-after-auto.patch
|
||||
Patch7: mdadm-3.2.2-Remove-race-for-starting-container-devices.patch
|
||||
Patch8: mdadm-3.2.2-no-sysfs-launch-container.patch
|
||||
Patch9: mdadm-3.2.2-hold-lock-during-assemble.patch
|
||||
Patch10: mdadm-3.2.2-Fix-component-size-checks-in-validate_super0.patch
|
||||
Patch11: mdadm-3.2.2-Discourage-large-devices-from-being-added-to-0.90-ar.patch
|
||||
Patch12: mdadm-3.2.2-Grow-refuse-to-grow-a-0.90-array-beyond-2TB.patch
|
||||
Patch13: mdadm-3.2.2-super0-fix-overflow-when-checking-max-size.patch
|
||||
Patch14: mdadm-3.2.2-Fix-serious-memory-leak.patch
|
||||
Patch15: mdadm-3.2.2-FIX-Close-unused-handle-in-child-process-during-resh.patch
|
||||
Patch19: mdadm-3.1.3-udev.patch
|
||||
Patch19: mdadm-3.2.3-udev.patch
|
||||
Patch20: mdadm-2.5.2-static.patch
|
||||
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
|
||||
License: GPLv2+
|
||||
@ -61,22 +45,6 @@ is not used as the system init process.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
%patch0 -p1 -b .man
|
||||
%patch1 -p1 -b .version
|
||||
%patch2 -p1 -b .build
|
||||
%patch3 -p1 -b .readd
|
||||
%patch4 -p1 -b .writemostly
|
||||
%patch5 -p1 -b .attributes
|
||||
%patch6 -p1 -b .resync
|
||||
%patch7 -p1 -b .container
|
||||
%patch8 -p1 -b .sysfs
|
||||
%patch9 -p1 -b .assemble
|
||||
%patch10 -p1 -b .component
|
||||
%patch11 -p1 -b .discourage
|
||||
%patch12 -p1 -b .grow
|
||||
%patch13 -p1 -b .overflow
|
||||
%patch14 -p1 -b .memleak
|
||||
%patch15 -p1 -b .reshape
|
||||
%patch19 -p1 -b .udev
|
||||
%patch20 -p1 -b .static
|
||||
|
||||
@ -151,6 +119,12 @@ fi
|
||||
%{_initrddir}/*
|
||||
|
||||
%changelog
|
||||
* Wed Jan 4 2012 Jes Sorensen <Jes.Sorensen@redhat.com> - 3.2.3-1
|
||||
- Update to upstream 3.2.3
|
||||
- Resolves: bz770110 (rawhide) bz771413 (f16) bz759014 (rawhide)
|
||||
- Resolves: bz759015 (f16) bz759035 (rawhide) bz759036 (f16)
|
||||
- Resolves: bz771608 (f15) bz759016 (f15) bz759039 (f15)
|
||||
|
||||
* Mon Nov 21 2011 Jes Sorensen <Jes.Sorensen@redhat.com> - 3.2.2-15
|
||||
- Backport upstream fix for memory leak that can prevent migration to
|
||||
RAID5 from completing.
|
||||
|
Loading…
Reference in New Issue
Block a user