This commit is contained in:
parent
1de2eeb520
commit
bc4cbaecaa
5
boot.md
5
boot.md
@ -130,9 +130,11 @@ case "$1" in
|
|||||||
rm -rf /tmp/mdadm.conf
|
rm -rf /tmp/mdadm.conf
|
||||||
if ! mdadm --examine --scan --config=partitions >/tmp/mdadm.conf
|
if ! mdadm --examine --scan --config=partitions >/tmp/mdadm.conf
|
||||||
then
|
then
|
||||||
|
echo "mdadm --examine --scan failed:"
|
||||||
|
cat /tmp/mdadm.conf
|
||||||
|
rm -f /tmp/mdadm.conf
|
||||||
rc_failed 1
|
rc_failed 1
|
||||||
rc_status -v
|
rc_status -v
|
||||||
chmod 0600 /tmp/mdadm.conf
|
|
||||||
rc_exit
|
rc_exit
|
||||||
fi
|
fi
|
||||||
chmod 0600 /tmp/mdadm.conf
|
chmod 0600 /tmp/mdadm.conf
|
||||||
@ -143,6 +145,7 @@ case "$1" in
|
|||||||
# no partitions found, "unused"
|
# no partitions found, "unused"
|
||||||
rc_status -u
|
rc_status -u
|
||||||
fi
|
fi
|
||||||
|
rm -f /tmp/mdadm.conf
|
||||||
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
based on
|
|
||||||
|
|
||||||
commit 519561f73f7ba987affde8b174d2691bb098439d
|
|
||||||
Author: Neil Brown <neilb@suse.de>
|
|
||||||
Date: Tue Apr 29 17:13:53 2008 +1000
|
|
||||||
|
|
||||||
Fix possible bug with bitmap space allocation with v1.0 metadata
|
|
||||||
|
|
||||||
When adding a device to an array, make sure we don't reserve
|
|
||||||
so much space for the bitmap that there isn't room for the data.
|
|
||||||
|
|
||||||
(minus the roff comments change)
|
|
||||||
---
|
|
||||||
super1.c | 4 +++-
|
|
||||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
--- super1.c.orig
|
|
||||||
+++ super1.c
|
|
||||||
@@ -903,7 +903,7 @@ static int write_init_super1(struct supe
|
|
||||||
* for a bitmap.
|
|
||||||
*/
|
|
||||||
array_size = __le64_to_cpu(sb->size);
|
|
||||||
- /* work out how much space we left of a bitmap */
|
|
||||||
+ /* work out how much space we left for a bitmap */
|
|
||||||
bm_space = choose_bm_space(array_size);
|
|
||||||
|
|
||||||
switch(st->minor_version) {
|
|
||||||
@@ -913,6 +913,8 @@ static int write_init_super1(struct supe
|
|
||||||
sb_offset &= ~(4*2-1);
|
|
||||||
sb->super_offset = __cpu_to_le64(sb_offset);
|
|
||||||
sb->data_offset = __cpu_to_le64(0);
|
|
||||||
+ if (sb_offset - bm_space < array_size)
|
|
||||||
+ bm_space = sb_offset - array_size;
|
|
||||||
sb->data_size = __cpu_to_le64(sb_offset - bm_space);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
@ -1,70 +0,0 @@
|
|||||||
based on
|
|
||||||
commit 6fb79233b050b4a3575f0e466ab04b5d301ac1de
|
|
||||||
Author: Neil Brown <neilb@suse.de>
|
|
||||||
Date: Mon Apr 28 16:30:09 2008 +1000
|
|
||||||
|
|
||||||
Allow creation of a RAID6 with a single missing device.
|
|
||||||
|
|
||||||
This did not work before as we couldn't mark it clean as there would
|
|
||||||
be some parity blocks out of sync, and raid6 will not assemble a
|
|
||||||
dirty degraded array.
|
|
||||||
So make such arrays doubly degraded (the last device becomes a spare)
|
|
||||||
and clean.
|
|
||||||
|
|
||||||
---
|
|
||||||
Create.c | 20 ++++++++++++++++++--
|
|
||||||
1 file changed, 18 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
--- Create.c.orig
|
|
||||||
+++ Create.c
|
|
||||||
@@ -63,6 +63,7 @@ int Create(struct supertype *st, char *m
|
|
||||||
int fail=0, warn=0;
|
|
||||||
struct stat stb;
|
|
||||||
int first_missing = subdevs * 2;
|
|
||||||
+ int second_missing = subdevs * 2;
|
|
||||||
int missing_disks = 0;
|
|
||||||
int insert_point = subdevs * 2; /* where to insert a missing drive */
|
|
||||||
void *super;
|
|
||||||
@@ -203,6 +204,8 @@ int Create(struct supertype *st, char *m
|
|
||||||
if (strcasecmp(dname, "missing")==0) {
|
|
||||||
if (first_missing > dnum)
|
|
||||||
first_missing = dnum;
|
|
||||||
+ if (second_missing > dnum && dnum > first_missing)
|
|
||||||
+ second_missing = dnum;
|
|
||||||
missing_disks ++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
@@ -341,6 +344,18 @@ int Create(struct supertype *st, char *m
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ /* For raid6, if creating with 1 missing drive, make a good drive
|
|
||||||
+ * into a spare, else the create will fail
|
|
||||||
+ */
|
|
||||||
+ if (assume_clean == 0 && force == 0 && first_missing < raiddisks &&
|
|
||||||
+ second_missing >= raiddisks && level == 6) {
|
|
||||||
+ insert_point = raiddisks - 1;
|
|
||||||
+ if (insert_point == first_missing)
|
|
||||||
+ insert_point--;
|
|
||||||
+ sparedisks ++;
|
|
||||||
+ array.active_disks--;
|
|
||||||
+ missing_disks++;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (level <= 0 && first_missing != subdevs * 2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
@@ -360,11 +375,12 @@ int Create(struct supertype *st, char *m
|
|
||||||
if (fstat(mdfd, &stb)==0)
|
|
||||||
array.md_minor = minor(stb.st_rdev);
|
|
||||||
array.not_persistent = 0;
|
|
||||||
- /*** FIX: Need to do something about RAID-6 here ***/
|
|
||||||
+
|
|
||||||
if ( ( (level == 4 || level == 5) &&
|
|
||||||
(insert_point < raiddisks || first_missing < raiddisks) )
|
|
||||||
||
|
|
||||||
- ( level == 6 && missing_disks == 2)
|
|
||||||
+ ( level == 6 && (insert_point < raiddisks
|
|
||||||
+ || second_missing < raiddisks))
|
|
||||||
||
|
|
||||||
assume_clean
|
|
||||||
)
|
|
@ -1,76 +0,0 @@
|
|||||||
Based on
|
|
||||||
commit 7a3be72fc621b4a7589e923cf0652c51493f831a
|
|
||||||
Author: Neil Brown <neilb@suse.de>
|
|
||||||
Date: Mon Apr 28 16:29:37 2008 +1000
|
|
||||||
|
|
||||||
Fix problems with array.size overflowing on large arrays.
|
|
||||||
|
|
||||||
array.size is 32bits and counts K. So for arrays with
|
|
||||||
more than 4Terrabytes, it can overflow.
|
|
||||||
The correct number can be read from sysfs, but there are still
|
|
||||||
a few places that use array.size and risk truncation. What is worse.
|
|
||||||
they compare a number of kilobytes with a number of sectors !!
|
|
||||||
|
|
||||||
So use get_component_size() to read the sysfs information, and be
|
|
||||||
more consistent about units.
|
|
||||||
|
|
||||||
---
|
|
||||||
Detail.c | 2 +-
|
|
||||||
Manage.c | 14 ++++++++++++--
|
|
||||||
2 files changed, 13 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
--- Detail.c.orig
|
|
||||||
+++ Detail.c
|
|
||||||
@@ -174,7 +174,7 @@ int Detail(char *dev, int brief, int exp
|
|
||||||
if (dsize > 0)
|
|
||||||
printf(" Used Dev Size : %llu%s\n",
|
|
||||||
dsize,
|
|
||||||
- human_size((long long)array.size<<10));
|
|
||||||
+ human_size((long long)dsize<<10));
|
|
||||||
else
|
|
||||||
printf(" Used Dev Size : unknown\n");
|
|
||||||
} else
|
|
||||||
--- Manage.c.orig
|
|
||||||
+++ Manage.c
|
|
||||||
@@ -188,6 +188,7 @@ int Manage_subdevs(char *devname, int fd
|
|
||||||
*/
|
|
||||||
mdu_array_info_t array;
|
|
||||||
mdu_disk_info_t disc;
|
|
||||||
+ unsigned long long array_size;
|
|
||||||
mddev_dev_t dv, next = NULL;
|
|
||||||
struct stat stb;
|
|
||||||
int j, jnext = 0;
|
|
||||||
@@ -203,6 +204,15 @@ int Manage_subdevs(char *devname, int fd
|
|
||||||
devname);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ /* array.size is only 32 bit and may be truncated.
|
|
||||||
+ * So read from sysfs if possible, and record number of sectors
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+ array_size = get_component_size(fd);
|
|
||||||
+ if (array_size <= 0)
|
|
||||||
+ array_size = array.size * 2;
|
|
||||||
+
|
|
||||||
for (dv = devlist, j=0 ; dv; dv = next, j = jnext) {
|
|
||||||
unsigned long long ldsize;
|
|
||||||
char dvname[20];
|
|
||||||
@@ -335,7 +345,7 @@ int Manage_subdevs(char *devname, int fd
|
|
||||||
|
|
||||||
/* Make sure device is large enough */
|
|
||||||
if (st->ss->avail_size(st, ldsize/512) <
|
|
||||||
- array.size) {
|
|
||||||
+ array_size) {
|
|
||||||
fprintf(stderr, Name ": %s not large enough to join array\n",
|
|
||||||
dv->devname);
|
|
||||||
return 1;
|
|
||||||
@@ -409,7 +419,7 @@ int Manage_subdevs(char *devname, int fd
|
|
||||||
/* non-persistent. Must ensure that new drive
|
|
||||||
* is at least array.size big.
|
|
||||||
*/
|
|
||||||
- if (ldsize/512 < array.size) {
|
|
||||||
+ if (ldsize/512 < array_size) {
|
|
||||||
fprintf(stderr, Name ": %s not large enough to join array\n",
|
|
||||||
dv->devname);
|
|
||||||
return 1;
|
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:1d39f110eda550b9e7dbe9d1e56098ef77197029cb8c5f5d638d2c255feaf23d
|
|
||||||
size 152401
|
|
31
mdadm-2.6.7-56f8add2.patch
Normal file
31
mdadm-2.6.7-56f8add2.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
commit 56f8add211a840faaed325bd16483b55da544e93
|
||||||
|
Author: Neil Brown <neilb@suse.de>
|
||||||
|
Date: Thu Jun 19 16:30:36 2008 +1000
|
||||||
|
|
||||||
|
Fix an error when assembling arrays that are in the middle of a reshape.
|
||||||
|
|
||||||
|
It is important that dup_super always returns an 'st' with the same
|
||||||
|
->ss and ->minor_version as the st that was passed.
|
||||||
|
This wasn't happening for 0.91 metadata (i.e. in the middle of a reshape).
|
||||||
|
|
||||||
|
diff --git a/super0.c b/super0.c
|
||||||
|
index 7e81482..8e4c568 100644
|
||||||
|
--- a/super0.c
|
||||||
|
+++ b/super0.c
|
||||||
|
@@ -849,12 +849,15 @@ static struct supertype *match_metadata_desc0(char *arg)
|
||||||
|
st->sb = NULL;
|
||||||
|
if (strcmp(arg, "0") == 0 ||
|
||||||
|
strcmp(arg, "0.90") == 0 ||
|
||||||
|
- strcmp(arg, "0.91") == 0 ||
|
||||||
|
strcmp(arg, "default") == 0 ||
|
||||||
|
strcmp(arg, "") == 0 /* no metadata */
|
||||||
|
)
|
||||||
|
return st;
|
||||||
|
|
||||||
|
+ st->minor_version = 91; /* reshape in progress */
|
||||||
|
+ if (strcmp(arg, "0.91") == 0) /* For dup_super support */
|
||||||
|
+ return st;
|
||||||
|
+
|
||||||
|
st->minor_version = 9; /* flag for 'byte-swapped' */
|
||||||
|
if (strcmp(arg, "0.swap")==0 ||
|
||||||
|
strcmp(arg, "0.9") == 0) /* For dup_super support */
|
24
mdadm-2.6.7-60b435db.patch
Normal file
24
mdadm-2.6.7-60b435db.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
commit 60b435db5a7b085ad1204168879037bf14ebd6d1
|
||||||
|
Author: Chris Webb <chris@arachsys.com>
|
||||||
|
Date: Thu Jun 19 16:30:39 2008 +1000
|
||||||
|
|
||||||
|
Fix bug in forced assemble.
|
||||||
|
|
||||||
|
From: Chris Webb <chris@arachsys.com>
|
||||||
|
|
||||||
|
We are loading into the already-loaded 'st' instead of the
|
||||||
|
newly create 'tst', which is clearly wrong.
|
||||||
|
|
||||||
|
diff --git a/Assemble.c b/Assemble.c
|
||||||
|
index 36b2304..79f0912 100644
|
||||||
|
--- a/Assemble.c
|
||||||
|
+++ b/Assemble.c
|
||||||
|
@@ -656,7 +656,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tst = dup_super(st);
|
||||||
|
- if (tst->ss->load_super(st,fd, NULL)) {
|
||||||
|
+ if (tst->ss->load_super(tst,fd, NULL)) {
|
||||||
|
close(fd);
|
||||||
|
fprintf(stderr, Name ": RAID superblock disappeared from %s - not updating.\n",
|
||||||
|
devices[chosen_drive].devname);
|
3
mdadm-2.6.7.tar.bz2
Normal file
3
mdadm-2.6.7.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:f2ec116bb1fc0102861796bc56777e751ea65202b460b0d43ae6ad277def807e
|
||||||
|
size 153982
|
@ -1,3 +1,24 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Jun 20 14:28:20 CEST 2008 - mmarek@suse.cz
|
||||||
|
|
||||||
|
- updated to 2.6.7 + fixes from git
|
||||||
|
* Avoid segfault when parsing /proc/mdstat with auto-read-only
|
||||||
|
arrays.
|
||||||
|
* For v0.90 superblocks, print the 'Events' count as a real
|
||||||
|
count, not 2 numbers separated by a dot.
|
||||||
|
* Allow creation of a RAID6 with exactly one missing device.
|
||||||
|
* Use LOG_PID for syslog, so you get the pid of mdadm in the
|
||||||
|
log files.
|
||||||
|
* --export now works with --examine too (not just --detail)
|
||||||
|
* Improve auto-creation of device special file when using
|
||||||
|
--incremental
|
||||||
|
* Simple locking for --incremental so mdadm doesn't get
|
||||||
|
confused when run concurrently with itself.
|
||||||
|
* Make --incremental cope better with arrays that are being
|
||||||
|
reshaped.
|
||||||
|
* Fix autoassemble for stack arrays.
|
||||||
|
- remove /tmp/mdadm.conf in boot.md (bnc#401138)
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Apr 30 15:57:14 CEST 2008 - mmarek@suse.cz
|
Wed Apr 30 15:57:14 CEST 2008 - mmarek@suse.cz
|
||||||
|
|
||||||
|
34
mdadm.spec
34
mdadm.spec
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# spec file for package mdadm (Version 2.6.4)
|
# spec file for package mdadm (Version 2.6.7)
|
||||||
#
|
#
|
||||||
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
# This file and all modifications and additions to the pristine
|
# This file and all modifications and additions to the pristine
|
||||||
@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
|
|
||||||
Name: mdadm
|
Name: mdadm
|
||||||
Version: 2.6.4
|
Version: 2.6.7
|
||||||
Release: 37
|
Release: 1
|
||||||
BuildRequires: sgmltool
|
BuildRequires: sgmltool
|
||||||
PreReq: %fillup_prereq %insserv_prereq
|
PreReq: %fillup_prereq %insserv_prereq
|
||||||
Obsoletes: raidtools
|
Obsoletes: raidtools
|
||||||
@ -28,9 +28,8 @@ Source1: Software-RAID.HOWTO.tar.bz2
|
|||||||
Source2: sysconfig.mdadm
|
Source2: sysconfig.mdadm
|
||||||
Source3: mdadmd
|
Source3: mdadmd
|
||||||
Source4: boot.md
|
Source4: boot.md
|
||||||
Patch1: mdadm-2.6.4-7a3be72f.patch
|
Patch1: mdadm-2.6.7-56f8add2.patch
|
||||||
Patch2: mdadm-2.6.4-6fb79233.patch
|
Patch2: mdadm-2.6.7-60b435db.patch
|
||||||
Patch3: mdadm-2.6.4-519561f7.patch
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Mdadm is a program that can be used to control Linux md devices. It is
|
Mdadm is a program that can be used to control Linux md devices. It is
|
||||||
@ -45,9 +44,8 @@ Authors:
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -a1
|
%setup -q -a1
|
||||||
%patch1
|
%patch1 -p1
|
||||||
%patch2
|
%patch2 -p1
|
||||||
%patch3
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%{suse_update_config -f}
|
%{suse_update_config -f}
|
||||||
@ -122,6 +120,24 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{_var}/adm/fillup-templates/sysconfig.mdadm
|
%{_var}/adm/fillup-templates/sysconfig.mdadm
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jun 20 2008 mmarek@suse.cz
|
||||||
|
- updated to 2.6.7 + fixes from git
|
||||||
|
* Avoid segfault when parsing /proc/mdstat with auto-read-only
|
||||||
|
arrays.
|
||||||
|
* For v0.90 superblocks, print the 'Events' count as a real
|
||||||
|
count, not 2 numbers separated by a dot.
|
||||||
|
* Allow creation of a RAID6 with exactly one missing device.
|
||||||
|
* Use LOG_PID for syslog, so you get the pid of mdadm in the
|
||||||
|
log files.
|
||||||
|
* --export now works with --examine too (not just --detail)
|
||||||
|
* Improve auto-creation of device special file when using
|
||||||
|
--incremental
|
||||||
|
* Simple locking for --incremental so mdadm doesn't get
|
||||||
|
confused when run concurrently with itself.
|
||||||
|
* Make --incremental cope better with arrays that are being
|
||||||
|
reshaped.
|
||||||
|
* Fix autoassemble for stack arrays.
|
||||||
|
- remove /tmp/mdadm.conf in boot.md (bnc#401138)
|
||||||
* Wed Apr 30 2008 mmarek@suse.cz
|
* Wed Apr 30 2008 mmarek@suse.cz
|
||||||
- added some fixes from Neil's git repo, fixing bnc#368704 among
|
- added some fixes from Neil's git repo, fixing bnc#368704 among
|
||||||
others
|
others
|
||||||
|
Loading…
Reference in New Issue
Block a user