forked from pool/mdadm
Multiple fixes for mdadm:
- upstream bugfixes in 3.3 - simplify array assembly in initrd and normal boot. OBS-URL: https://build.opensuse.org/package/show/Base:System/mdadm?expand=0&rev=93
This commit is contained in:
parent
b5f32620da
commit
231108cf6e
52
DDF-allow-for-possibility-that-there-is-no-secondary.patch
Normal file
52
DDF-allow-for-possibility-that-there-is-no-secondary.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
From b95cb4b9d88c8adf2adb7f2efef3ae3f72b27b8e Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Thu, 12 Sep 2013 14:57:28 +1000
|
||||||
|
Subject: [PATCH] DDF: allow for possibility that there is no secondary copy of
|
||||||
|
metadata.
|
||||||
|
|
||||||
|
If there isn't, we currently write the second copy at some
|
||||||
|
random location :-)
|
||||||
|
|
||||||
|
Reported-and-tested-by: Francis Moreau <francis.moro@gmail.com>
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
---
|
||||||
|
super-ddf.c | 9 +++++++--
|
||||||
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-ddf.c b/super-ddf.c
|
||||||
|
index 636d7b4..d2cdda4 100644
|
||||||
|
--- a/super-ddf.c
|
||||||
|
+++ b/super-ddf.c
|
||||||
|
@@ -880,7 +880,8 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname)
|
||||||
|
super->primary.openflag && !super->secondary.openflag)
|
||||||
|
)
|
||||||
|
super->active = &super->secondary;
|
||||||
|
- } else if (devname)
|
||||||
|
+ } else if (devname &&
|
||||||
|
+ be64_to_cpu(super->anchor.secondary_lba) != ~(__u64)0)
|
||||||
|
pr_err("Failed to load secondary DDF header on %s\n",
|
||||||
|
devname);
|
||||||
|
if (super->active == NULL)
|
||||||
|
@@ -2810,7 +2811,9 @@ static int add_to_super_ddf(struct supertype *st,
|
||||||
|
} while (0)
|
||||||
|
__calc_lba(dd, ddf->dlist, workspace_lba, 32);
|
||||||
|
__calc_lba(dd, ddf->dlist, primary_lba, 16);
|
||||||
|
- __calc_lba(dd, ddf->dlist, secondary_lba, 32);
|
||||||
|
+ if (ddf->dlist == NULL ||
|
||||||
|
+ be64_to_cpu(ddf->dlist->secondary_lba) != ~(__u64)0)
|
||||||
|
+ __calc_lba(dd, ddf->dlist, secondary_lba, 32);
|
||||||
|
pde->config_size = dd->workspace_lba;
|
||||||
|
|
||||||
|
sprintf(pde->path, "%17.17s","Information: nil") ;
|
||||||
|
@@ -2892,6 +2895,8 @@ static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type)
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+ if (sector == ~(__u64)0)
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
header->type = type;
|
||||||
|
header->openflag = 1;
|
||||||
|
--
|
||||||
|
1.8.3.1.487.g3e7a5b4
|
||||||
|
|
252
Make-IRs-and-run-work-properly-for-containers.patch
Normal file
252
Make-IRs-and-run-work-properly-for-containers.patch
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
From d5a4041647d2b3328ce45ff727afe37477f07c75 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Fri, 13 Sep 2013 10:51:20 +1000
|
||||||
|
Subject: [PATCH] Make -IRs and --run work properly for containers.
|
||||||
|
|
||||||
|
We really need to make sure assemble_container_content()
|
||||||
|
gets called to finished the assembly of these.
|
||||||
|
|
||||||
|
Reported-by: Francis Moreau <francis.moro@gmail.com>
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
---
|
||||||
|
Assemble.c | 2 +-
|
||||||
|
Incremental.c | 53 +++++++++++++++++++++++++++++++++++++++++++++--------
|
||||||
|
Manage.c | 4 ++--
|
||||||
|
mdadm.c | 7 ++++---
|
||||||
|
mdadm.h | 4 ++--
|
||||||
|
5 files changed, 54 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Assemble.c b/Assemble.c
|
||||||
|
index bc85603..86b4c89 100644
|
||||||
|
--- a/Assemble.c
|
||||||
|
+++ b/Assemble.c
|
||||||
|
@@ -1817,7 +1817,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
|
||||||
|
working++;
|
||||||
|
} else if (errno == EEXIST)
|
||||||
|
preexist++;
|
||||||
|
- if (working + expansion == 0)
|
||||||
|
+ if (working + expansion == 0 && c->runstop <= 0)
|
||||||
|
return 1;/* Nothing new, don't try to start */
|
||||||
|
|
||||||
|
map_update(&map, fd2devnm(mdfd),
|
||||||
|
diff --git a/Incremental.c b/Incremental.c
|
||||||
|
index f256b48..1bb3638 100644
|
||||||
|
--- a/Incremental.c
|
||||||
|
+++ b/Incremental.c
|
||||||
|
@@ -44,7 +44,7 @@ static int try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||||
|
struct supertype *st, int verbose);
|
||||||
|
|
||||||
|
static int Incremental_container(struct supertype *st, char *devname,
|
||||||
|
- struct context *c);
|
||||||
|
+ struct context *c, char *only);
|
||||||
|
|
||||||
|
int Incremental(char *devname, struct context *c,
|
||||||
|
struct supertype *st)
|
||||||
|
@@ -138,7 +138,7 @@ int Incremental(char *devname, struct context *c,
|
||||||
|
if (map_lock(&map))
|
||||||
|
pr_err("failed to get "
|
||||||
|
"exclusive lock on mapfile\n");
|
||||||
|
- rv = Incremental_container(st, devname, c);
|
||||||
|
+ rv = Incremental_container(st, devname, c, NULL);
|
||||||
|
map_unlock(&map);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
@@ -478,7 +478,7 @@ int Incremental(char *devname, struct context *c,
|
||||||
|
close(mdfd);
|
||||||
|
sysfs_free(sra);
|
||||||
|
if (!rv)
|
||||||
|
- rv = Incremental_container(st, chosen_name, c);
|
||||||
|
+ rv = Incremental_container(st, chosen_name, c, NULL);
|
||||||
|
map_unlock(&map);
|
||||||
|
if (rv == 1)
|
||||||
|
/* Don't fail the whole -I if a subarray didn't
|
||||||
|
@@ -1278,7 +1278,7 @@ static int try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int IncrementalScan(int verbose, char *devnm)
|
||||||
|
+int IncrementalScan(struct context *c, char *devnm)
|
||||||
|
{
|
||||||
|
/* look at every device listed in the 'map' file.
|
||||||
|
* If one is found that is not running then:
|
||||||
|
@@ -1290,10 +1290,13 @@ int IncrementalScan(int verbose, char *devnm)
|
||||||
|
struct map_ent *me;
|
||||||
|
struct mddev_ident *devs, *mddev;
|
||||||
|
int rv = 0;
|
||||||
|
+ char container[32];
|
||||||
|
+ char *only = NULL;
|
||||||
|
|
||||||
|
map_read(&mapl);
|
||||||
|
devs = conf_get_ident(NULL);
|
||||||
|
|
||||||
|
+restart:
|
||||||
|
for (me = mapl ; me ; me = me->next) {
|
||||||
|
mdu_array_info_t array;
|
||||||
|
mdu_bitmap_file_t bmf;
|
||||||
|
@@ -1302,10 +1305,42 @@ int IncrementalScan(int verbose, char *devnm)
|
||||||
|
|
||||||
|
if (devnm && strcmp(devnm, me->devnm) != 0)
|
||||||
|
continue;
|
||||||
|
+ if (devnm && me->metadata[0] == '/') {
|
||||||
|
+ char *sl;
|
||||||
|
+ /* member array, need to work on container */
|
||||||
|
+ strncpy(container, me->metadata+1, 32);
|
||||||
|
+ container[31] = 0;
|
||||||
|
+ sl = strchr(container, '/');
|
||||||
|
+ if (sl)
|
||||||
|
+ *sl = 0;
|
||||||
|
+ only = devnm;
|
||||||
|
+ devnm = container;
|
||||||
|
+ goto restart;
|
||||||
|
+ }
|
||||||
|
mdfd = open_dev(me->devnm);
|
||||||
|
|
||||||
|
if (mdfd < 0)
|
||||||
|
continue;
|
||||||
|
+ if (!isdigit(me->metadata[0])) {
|
||||||
|
+ /* must be a container */
|
||||||
|
+ struct supertype *st = super_by_fd(mdfd, NULL);
|
||||||
|
+ int ret = 0;
|
||||||
|
+ struct map_ent *map = NULL;
|
||||||
|
+ if (st)
|
||||||
|
+ st->ignore_hw_compat = 1;
|
||||||
|
+ if (st && st->ss->load_container)
|
||||||
|
+ ret = st->ss->load_container(st, mdfd, NULL);
|
||||||
|
+ close(mdfd);
|
||||||
|
+ if (!ret && st->ss->container_content) {
|
||||||
|
+ if (map_lock(&map))
|
||||||
|
+ pr_err("failed to get exclusive lock on mapfile\n");
|
||||||
|
+ ret = Incremental_container(st, me->path, c, only);
|
||||||
|
+ map_unlock(&map);
|
||||||
|
+ }
|
||||||
|
+ if (ret)
|
||||||
|
+ rv = 1;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
if (ioctl(mdfd, GET_ARRAY_INFO, &array) == 0 ||
|
||||||
|
errno != ENODEV) {
|
||||||
|
close(mdfd);
|
||||||
|
@@ -1330,7 +1365,7 @@ int IncrementalScan(int verbose, char *devnm)
|
||||||
|
close(bmfd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- if (verbose >= 0) {
|
||||||
|
+ if (c->verbose >= 0) {
|
||||||
|
if (added == 0)
|
||||||
|
pr_err("Added bitmap %s to %s\n",
|
||||||
|
mddev->bitmap_file, me->path);
|
||||||
|
@@ -1346,7 +1381,7 @@ int IncrementalScan(int verbose, char *devnm)
|
||||||
|
if (sra) {
|
||||||
|
if (sysfs_set_str(sra, NULL,
|
||||||
|
"array_state", "read-auto") == 0) {
|
||||||
|
- if (verbose >= 0)
|
||||||
|
+ if (c->verbose >= 0)
|
||||||
|
pr_err("started array %s\n",
|
||||||
|
me->path ?: me->devnm);
|
||||||
|
} else {
|
||||||
|
@@ -1387,7 +1422,7 @@ static char *container2devname(char *devname)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Incremental_container(struct supertype *st, char *devname,
|
||||||
|
- struct context *c)
|
||||||
|
+ struct context *c, char *only)
|
||||||
|
{
|
||||||
|
/* Collect the contents of this container and for each
|
||||||
|
* array, choose a device name and assemble the array.
|
||||||
|
@@ -1458,7 +1493,7 @@ static int Incremental_container(struct supertype *st, char *devname,
|
||||||
|
strcpy(chosen_name, mp->path);
|
||||||
|
else
|
||||||
|
strcpy(chosen_name, mp->devnm);
|
||||||
|
- } else {
|
||||||
|
+ } else if (!only) {
|
||||||
|
|
||||||
|
/* Check in mdadm.conf for container == devname and
|
||||||
|
* member == ra->text_version after second slash.
|
||||||
|
@@ -1515,6 +1550,8 @@ static int Incremental_container(struct supertype *st, char *devname,
|
||||||
|
trustworthy,
|
||||||
|
chosen_name);
|
||||||
|
}
|
||||||
|
+ if (only && (!mp || strcmp(mp->devnm, only) != 0))
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
if (mdfd < 0) {
|
||||||
|
pr_err("failed to open %s: %s.\n",
|
||||||
|
diff --git a/Manage.c b/Manage.c
|
||||||
|
index 910caa6..c8276ca 100644
|
||||||
|
--- a/Manage.c
|
||||||
|
+++ b/Manage.c
|
||||||
|
@@ -170,7 +170,7 @@ static void remove_devices(char *devnm, char *path)
|
||||||
|
free(path2);
|
||||||
|
}
|
||||||
|
|
||||||
|
-int Manage_run(char *devname, int fd, int verbose)
|
||||||
|
+int Manage_run(char *devname, int fd, struct context *c)
|
||||||
|
{
|
||||||
|
/* Run the array. Array must already be configured
|
||||||
|
* Requires >= 0.90.0
|
||||||
|
@@ -187,7 +187,7 @@ int Manage_run(char *devname, int fd, int verbose)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
strcpy(nm, nmp);
|
||||||
|
- return IncrementalScan(verbose, nm);
|
||||||
|
+ return IncrementalScan(c, nm);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
diff --git a/mdadm.c b/mdadm.c
|
||||||
|
index 1ada607..f55a035 100644
|
||||||
|
--- a/mdadm.c
|
||||||
|
+++ b/mdadm.c
|
||||||
|
@@ -1293,7 +1293,7 @@ int main(int argc, char *argv[])
|
||||||
|
if (!rv && c.readonly < 0)
|
||||||
|
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
|
||||||
|
if (!rv && c.runstop > 0)
|
||||||
|
- rv = Manage_run(devlist->devname, mdfd, c.verbose);
|
||||||
|
+ rv = Manage_run(devlist->devname, mdfd, &c);
|
||||||
|
if (!rv && c.runstop < 0)
|
||||||
|
rv = Manage_stop(devlist->devname, mdfd, c.verbose, 0);
|
||||||
|
break;
|
||||||
|
@@ -1535,7 +1535,7 @@ int main(int argc, char *argv[])
|
||||||
|
pr_err("--incremental --scan --fail not supported.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- rv = IncrementalScan(c.verbose, NULL);
|
||||||
|
+ rv = IncrementalScan(&c, NULL);
|
||||||
|
}
|
||||||
|
if (!devlist) {
|
||||||
|
if (!rebuild_map && !c.scan) {
|
||||||
|
@@ -1804,7 +1804,8 @@ static int misc_list(struct mddev_dev *devlist,
|
||||||
|
if (mdfd>=0) {
|
||||||
|
switch(dv->disposition) {
|
||||||
|
case 'R':
|
||||||
|
- rv |= Manage_run(dv->devname, mdfd, c->verbose); break;
|
||||||
|
+ c->runstop = 1;
|
||||||
|
+ rv |= Manage_run(dv->devname, mdfd, c); break;
|
||||||
|
case 'S':
|
||||||
|
rv |= Manage_stop(dv->devname, mdfd, c->verbose, 0); break;
|
||||||
|
case 'o':
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index 2eca603..c90fe10 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -1171,7 +1171,7 @@ struct stat64;
|
||||||
|
extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
|
||||||
|
|
||||||
|
extern int Manage_ro(char *devname, int fd, int readonly);
|
||||||
|
-extern int Manage_run(char *devname, int fd, int quiet);
|
||||||
|
+extern int Manage_run(char *devname, int fd, struct context *c);
|
||||||
|
extern int Manage_stop(char *devname, int fd, int quiet,
|
||||||
|
int will_retry);
|
||||||
|
extern int Manage_subdevs(char *devname, int fd,
|
||||||
|
@@ -1237,7 +1237,7 @@ extern int WaitClean(char *dev, int sock, int verbose);
|
||||||
|
extern int Incremental(char *devname, struct context *c,
|
||||||
|
struct supertype *st);
|
||||||
|
extern void RebuildMap(void);
|
||||||
|
-extern int IncrementalScan(int verbose, char *devnm);
|
||||||
|
+extern int IncrementalScan(struct context *c, char *devnm);
|
||||||
|
extern int IncrementalRemove(char *devname, char *path, int verbose);
|
||||||
|
extern int CreateBitmap(char *filename, int force, char uuid[16],
|
||||||
|
unsigned long chunksize, unsigned long daemon_sleep,
|
||||||
|
--
|
||||||
|
1.8.3.1.487.g3e7a5b4
|
||||||
|
|
45
boot.md
45
boot.md
@ -3,17 +3,17 @@
|
|||||||
# SUSE system startup script for MD RAID autostart
|
# SUSE system startup script for MD RAID autostart
|
||||||
# Copyright (C) 1995--2005 Kurt Garloff, SUSE / Novell Inc.
|
# Copyright (C) 1995--2005 Kurt Garloff, SUSE / Novell Inc.
|
||||||
# Copyright (C) 2006 Marian Jancar, SUSE / Novell Inc.
|
# Copyright (C) 2006 Marian Jancar, SUSE / Novell Inc.
|
||||||
#
|
#
|
||||||
# This library is free software; you can redistribute it and/or modify it
|
# This library is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU Lesser General Public License as published by
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
# the Free Software Foundation; either version 2.1 of the License, or (at
|
# the Free Software Foundation; either version 2.1 of the License, or (at
|
||||||
# your option) any later version.
|
# your option) any later version.
|
||||||
#
|
#
|
||||||
# This library is distributed in the hope that it will be useful, but
|
# This library is distributed in the hope that it will be useful, but
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
# Lesser General Public License for more details.
|
# Lesser General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Lesser General Public
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
# License along with this program; if not, write to the Free Software
|
# License along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
@ -36,7 +36,7 @@
|
|||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
# Source LSB init functions
|
# Source LSB init functions
|
||||||
# providing start_daemon, killproc, pidofproc,
|
# providing start_daemon, killproc, pidofproc,
|
||||||
# log_success_msg, log_failure_msg and log_warning_msg.
|
# log_success_msg, log_failure_msg and log_warning_msg.
|
||||||
# This is currently not used by UnitedLinux based distributions and
|
# This is currently not used by UnitedLinux based distributions and
|
||||||
# not needed for init scripts for UnitedLinux only. If it is used,
|
# not needed for init scripts for UnitedLinux only. If it is used,
|
||||||
@ -70,7 +70,7 @@ rc_reset
|
|||||||
# 6 - program is not configured
|
# 6 - program is not configured
|
||||||
# 7 - program is not running
|
# 7 - program is not running
|
||||||
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
|
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
|
||||||
#
|
#
|
||||||
# Note that starting an already running service, stopping
|
# Note that starting an already running service, stopping
|
||||||
# or restarting a not-running service as well as the restart
|
# or restarting a not-running service as well as the restart
|
||||||
# with force-reload (in case signaling is not supported) are
|
# with force-reload (in case signaling is not supported) are
|
||||||
@ -97,16 +97,14 @@ function _rc_exit {
|
|||||||
case "$1" in
|
case "$1" in
|
||||||
start)
|
start)
|
||||||
echo -n "Starting MD RAID "
|
echo -n "Starting MD RAID "
|
||||||
|
|
||||||
mkdir -p /run/mdadm
|
|
||||||
# restart mdmon (exits silently if there is nothing to monitor)
|
|
||||||
/sbin/mdmon --all --takeover --offroot
|
/sbin/mdmon --all --takeover --offroot
|
||||||
# Check for existence of needed config file and read it
|
# Check for existence of needed config file and read it
|
||||||
[ -r $mdadm_SYSCONFIG ] || _rc_exit 6 "... $mdadm_SYSCONFIG not existing "
|
[ -r $mdadm_SYSCONFIG ] || _rc_exit 6 "... $mdadm_SYSCONFIG not existing "
|
||||||
|
|
||||||
# Read config
|
# Read config
|
||||||
. $mdadm_SYSCONFIG
|
. $mdadm_SYSCONFIG
|
||||||
|
|
||||||
[ "x$MDADM_CONFIG" != x"" ] && mdadm_CONFIG="$MDADM_CONFIG"
|
[ "x$MDADM_CONFIG" != x"" ] && mdadm_CONFIG="$MDADM_CONFIG"
|
||||||
|
|
||||||
# Check for missing binaries (stale symlinks should not happen)
|
# Check for missing binaries (stale symlinks should not happen)
|
||||||
@ -116,22 +114,8 @@ case "$1" in
|
|||||||
[ ! -f /proc/mdstat -a -x /sbin/modprobe ] && /sbin/modprobe md_mod
|
[ ! -f /proc/mdstat -a -x /sbin/modprobe ] && /sbin/modprobe md_mod
|
||||||
[ -f /proc/mdstat ] || _rc_exit 5 "... no MD support in kernel "
|
[ -f /proc/mdstat ] || _rc_exit 5 "... no MD support in kernel "
|
||||||
|
|
||||||
# Wait for udev to settle
|
# leave all array assembly to udev.
|
||||||
if [ "$MDADM_DEVICE_TIMEOUT" -gt 0 ] ; then
|
rc_status -v
|
||||||
/sbin/udevadm settle --timeout="$MDADM_DEVICE_TIMEOUT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! grep -qs '^[^#]*[^[:blank:]#]' $mdadm_CONFIG; then
|
|
||||||
# empty or missing /etc/mdadm.conf, "unused"
|
|
||||||
rc_status -u
|
|
||||||
else
|
|
||||||
# firstly finish any incremental assembly that has started.
|
|
||||||
$mdadm_BIN -IRs
|
|
||||||
$mdadm_BIN -A -s -c $mdadm_CONFIG
|
|
||||||
# a status of 2 is not an error
|
|
||||||
test $? -eq 0 -o $? -eq 2
|
|
||||||
rc_status -v
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
stop)
|
stop)
|
||||||
echo -n "Not shutting down MD RAID - reboot/halt scripts do this."
|
echo -n "Not shutting down MD RAID - reboot/halt scripts do this."
|
||||||
@ -151,11 +135,12 @@ case "$1" in
|
|||||||
rc_status -v
|
rc_status -v
|
||||||
;;
|
;;
|
||||||
reload)
|
reload)
|
||||||
# We cannot really reload the kernel module, or reassemble the
|
# There isn't much that is useful to do.
|
||||||
# arrays, but we can restart mdmon. It will replace existing
|
# We cannot reload the kernel module, or reassemble the
|
||||||
# mdmon, or exit quietly if there is nothing to do.
|
# arrays. Restarting mdmon is pointless and might be bad
|
||||||
echo -n "MD RAID: restarting mdmon if it is needed."
|
# as mdmon might be running in the initrd.
|
||||||
/sbin/mdmon --all --takeover --offroot
|
# We could start and newly-degraded arrays.
|
||||||
|
/sbin/mdadm -IRs
|
||||||
rc_status -v
|
rc_status -v
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
29
config-set-auto_seen-after-processing-the-auto-line.patch
Normal file
29
config-set-auto_seen-after-processing-the-auto-line.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From dbdf3f15e7ed9d5462a6ece09dd1c57ca430d912 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Tue, 10 Sep 2013 17:10:10 +1000
|
||||||
|
Subject: [PATCH] config: set "auto_seen" after processing the auto line.
|
||||||
|
|
||||||
|
Otherwise when we process an empty autoline (to be sure to
|
||||||
|
capture the MDADM_CONF_AUTO environment variable) we can end up
|
||||||
|
setting everything to 'yes' which over-rides 'no'.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
---
|
||||||
|
config.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/config.c b/config.c
|
||||||
|
index f1a70c5..a35807c 100644
|
||||||
|
--- a/config.c
|
||||||
|
+++ b/config.c
|
||||||
|
@@ -575,6 +575,7 @@ void autoline(char *line)
|
||||||
|
|
||||||
|
if (auto_seen)
|
||||||
|
return;
|
||||||
|
+ auto_seen = 1;
|
||||||
|
|
||||||
|
/* Parse the 'auto' line creating policy statements for the 'auto' policy.
|
||||||
|
*
|
||||||
|
--
|
||||||
|
1.8.3.1.487.g3e7a5b4
|
||||||
|
|
@ -1,3 +1,40 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Sep 13 01:46:00 UTC 2013 - nfbrown@suse.com
|
||||||
|
|
||||||
|
- boot.md - simplify boot.
|
||||||
|
As array assembly is done by udev, it shouldn't
|
||||||
|
be done by boot.md. This will avoid some problems
|
||||||
|
with arrays getting started degraded.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Sep 13 00:59:15 UTC 2013 - nfbrown@suse.com
|
||||||
|
|
||||||
|
- Make-IRs-and-run-work-properly-for-containers.patch
|
||||||
|
- mdmon-honour-offroot-again.patch
|
||||||
|
Upstream fixes
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Sep 12 01:12:36 UTC 2013 - nfbrown@suse.com
|
||||||
|
|
||||||
|
- config-set-auto_seen-after-processing-the-auto-line.patch
|
||||||
|
Fix bug which causes "AUTO -all" in mdadm.conf
|
||||||
|
in initrd to be ignored, so array might be
|
||||||
|
auto-assembled too early.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Sep 12 01:05:03 UTC 2013 - nfbrown@suse.com
|
||||||
|
|
||||||
|
- mkinitrd-boot.sh: simplify boot sequence by relying
|
||||||
|
completely on udev running "mdadm -I". Thus
|
||||||
|
mkinitrd-boot.sh needs to do very little.
|
||||||
|
The devfunction script in the mkinitrd package has
|
||||||
|
been modified to start newly degraded array after
|
||||||
|
a suitable timeout.
|
||||||
|
- mkinitrd-setup.sh:
|
||||||
|
- don't save md_devs as it isn't used any more
|
||||||
|
- allow md device names like "/dev/md_foo" which will
|
||||||
|
need to be supported in due course.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Sep 9 03:06:20 UTC 2013 - nfbrown@suse.com
|
Mon Sep 9 03:06:20 UTC 2013 - nfbrown@suse.com
|
||||||
|
|
||||||
|
12
mdadm.spec
12
mdadm.spec
@ -43,6 +43,14 @@ Source5: mkinitrd-setup.sh
|
|||||||
Source6: mkinitrd-boot.sh
|
Source6: mkinitrd-boot.sh
|
||||||
Source7: mdadm.cron
|
Source7: mdadm.cron
|
||||||
Source8: mdadm.shutdown
|
Source8: mdadm.shutdown
|
||||||
|
# PATCH-FIX-UPSTREAM config-set-auto_seen-after-processing-the-auto-line.patch upstream-bugfix nfbrown@suse.de
|
||||||
|
Patch1: config-set-auto_seen-after-processing-the-auto-line.patch
|
||||||
|
# PATCH-FIX-UPSTREAM DDF-allow-for-possibility-that-there-is-no-secondary.patch upstream-bugfix nfbrown@suse.de
|
||||||
|
Patch2: DDF-allow-for-possibility-that-there-is-no-secondary.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Make-IRs-and-run-work-properly-for-containers.patch upstream-bugfix nfbrown@suse.de
|
||||||
|
Patch3: Make-IRs-and-run-work-properly-for-containers.patch
|
||||||
|
# PATCH-FIX-UPSTREAM mdmon-honour-offroot-again.patch upstream-bugfix nfbrown@suse.de
|
||||||
|
Patch4: mdmon-honour-offroot-again.patch
|
||||||
|
|
||||||
%define _udevdir %(pkg-config --variable=udevdir udev)
|
%define _udevdir %(pkg-config --variable=udevdir udev)
|
||||||
%define _systemdshutdowndir %{_unitdir}/../system-shutdown
|
%define _systemdshutdowndir %{_unitdir}/../system-shutdown
|
||||||
@ -54,6 +62,10 @@ programs but with a very different interface.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -a1
|
%setup -q -a1
|
||||||
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
make %{?_smp_mflags} CC="%__cc" CXFLAGS="$RPM_OPT_FLAGS -Wno-error"
|
make %{?_smp_mflags} CC="%__cc" CXFLAGS="$RPM_OPT_FLAGS -Wno-error"
|
||||||
|
40
mdmon-honour-offroot-again.patch
Normal file
40
mdmon-honour-offroot-again.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 5d79c72e16b32d7d6d0f535348286a7f2a966092 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "mwilck@arcor.de" <mwilck@arcor.de>
|
||||||
|
Date: Wed, 11 Sep 2013 22:15:19 +0200
|
||||||
|
Subject: [PATCH] mdmon: honour --offroot, again
|
||||||
|
|
||||||
|
commit 3e32ba9d removed support for --offroot, and a9c15847 made
|
||||||
|
mdmon use @ in argv[0] only when started from initrd.
|
||||||
|
|
||||||
|
This breaks mdadm in OpenSUSE 12.3, which starts mdmon from the
|
||||||
|
root file system and relies on --offroot to work as documented earlier.
|
||||||
|
|
||||||
|
Reintroducing --offroot as an undocumented option, as its use is going to
|
||||||
|
go away soon anyway.
|
||||||
|
|
||||||
|
If this can't be applied, it should probably be included as distro-specific
|
||||||
|
patch if mdadm 3.3 is built for OpenSUSE 12.3. I haven't checked if the
|
||||||
|
patch is necesary for OpenSUSE Factory, too.
|
||||||
|
|
||||||
|
Signed-off-by: Martin Wilck <mwilck@arcor.de>
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
---
|
||||||
|
mdmon.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index f0b0623..8cd53d8 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -320,7 +320,7 @@ int main(int argc, char *argv[])
|
||||||
|
dofork = 0;
|
||||||
|
break;
|
||||||
|
case OffRootOpt:
|
||||||
|
- /* silently ignore old option */
|
||||||
|
+ argv[0][0] = '@';
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
default:
|
||||||
|
--
|
||||||
|
1.8.3.1.487.g3e7a5b4
|
||||||
|
|
131
mkinitrd-boot.sh
131
mkinitrd-boot.sh
@ -1,32 +1,28 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#%stage: softraid
|
#%stage: boot
|
||||||
# grep needed for udev rules file.
|
#%depends: start
|
||||||
#%programs: /sbin/mdadm /sbin/mdmon
|
#%programs: /sbin/mdadm /sbin/mdmon
|
||||||
#%modules: raid0 raid1 raid10 raid456
|
#%modules: raid0 raid1 raid10 raid456
|
||||||
#%if: -n "$need_mdadm"
|
#%if: -n "$need_mdadm"
|
||||||
#
|
#
|
||||||
##### MD (Software-)Raid
|
##### MD (Software-)Raid
|
||||||
##
|
##
|
||||||
## This activates and waits for an MD software raid.
|
## This only sets the 'start_ro' module parameter to ensure
|
||||||
|
## arrays don't start resync until after the first write.
|
||||||
|
## All array assembly is performed by udev -> "mdadm -I"
|
||||||
##
|
##
|
||||||
## Command line parameters
|
## Command line parameters
|
||||||
## -----------------------
|
## -----------------------
|
||||||
##
|
##
|
||||||
## need_mdadm=1 use MD raid
|
## need_mdadm=1 use MD raid
|
||||||
##
|
##
|
||||||
|
|
||||||
# load the necessary module before we initialize the raid system
|
# load the necessary module before we initialize the raid system
|
||||||
load_modules
|
load_modules
|
||||||
|
|
||||||
# Create dir for socket and pid files
|
#check_for_device uses $md_major
|
||||||
mkdir -p /run/mdadm
|
#we depend on 'start' to ensure /proc/devices exists
|
||||||
[ "$mduuid" ] && md_uuid="$mduuid"
|
|
||||||
|
|
||||||
md_major=$(sed -ne 's/\s*\([0-9]\+\)\s*md$/\1/p' /proc/devices)
|
md_major=$(sed -ne 's/\s*\([0-9]\+\)\s*md$/\1/p' /proc/devices)
|
||||||
if [ -n "$md_major" -a "$md_major" = "$maj" ]; then
|
|
||||||
md_minor="$min"
|
|
||||||
md_dev="/dev/md$md_minor"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Always start md devices read/only. They will get set to rw as soon
|
# Always start md devices read/only. They will get set to rw as soon
|
||||||
# as the first write occurs. This way we can guarantee that no
|
# as the first write occurs. This way we can guarantee that no
|
||||||
@ -34,114 +30,3 @@ fi
|
|||||||
if [ -f /sys/module/md_mod/parameters/start_ro ]; then
|
if [ -f /sys/module/md_mod/parameters/start_ro ]; then
|
||||||
echo 1 > /sys/module/md_mod/parameters/start_ro
|
echo 1 > /sys/module/md_mod/parameters/start_ro
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test -n "$debug_linuxrc"; then
|
|
||||||
mdadm="mdadm -v"
|
|
||||||
else
|
|
||||||
mdadm="mdadm"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# uuid -> array name
|
|
||||||
get_md_name()
|
|
||||||
{
|
|
||||||
local uuid=$1 res
|
|
||||||
|
|
||||||
if ! test -f /etc/mdadm.conf; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
res=$(sed -rn "s/^ARRAY +([^ ]+).* UUID=$uuid.*/\1/p" /etc/mdadm.conf)
|
|
||||||
case "$res" in
|
|
||||||
"" | \<* | *=*)
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
/*)
|
|
||||||
echo "$res"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "/dev/md/$res"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
md_assemble()
|
|
||||||
{
|
|
||||||
local dev=$1 type=$2 uuid mdconf container container_name
|
|
||||||
|
|
||||||
if test -e "$dev"; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
case "$dev" in
|
|
||||||
/dev/md[0-9]*p[0-9]*)
|
|
||||||
dev=${dev%p[0-9]*}
|
|
||||||
;;
|
|
||||||
/dev/md*)
|
|
||||||
;;
|
|
||||||
/dev/disk/by-id/md-uuid-*)
|
|
||||||
uuid=${dev#/dev/disk/by-id/md-uuid-}
|
|
||||||
uuid=${uuid%-part*}
|
|
||||||
dev=
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
return
|
|
||||||
esac
|
|
||||||
if test -f /etc/mdadm.conf; then
|
|
||||||
mdconf="-c /etc/mdadm.conf"
|
|
||||||
local line
|
|
||||||
if test -n "$dev"; then
|
|
||||||
line=$(sed -rn "\:^ARRAY +$dev :p" /etc/mdadm.conf)
|
|
||||||
else
|
|
||||||
line=$(sed -rn "/^ARRAY .* UUID=$uuid/p" /etc/mdadm.conf)
|
|
||||||
fi
|
|
||||||
container=$(echo "$line" | \
|
|
||||||
sed -rn 's/.* container=([^ ]*).*/\1/p')
|
|
||||||
else
|
|
||||||
mdconf="-c partitions"
|
|
||||||
fi
|
|
||||||
case "$container" in
|
|
||||||
"")
|
|
||||||
;;
|
|
||||||
/dev/*)
|
|
||||||
$mdadm -A $mdconf $container --offroot
|
|
||||||
;;
|
|
||||||
[0-9a-f]*[0-9a-f])
|
|
||||||
container_name=$(get_md_name "$container")
|
|
||||||
if test -z "$container_name"; then
|
|
||||||
container_name=/dev/md/container
|
|
||||||
fi
|
|
||||||
$mdadm -A $mdconf --uuid="$container" "$container_name" --offroot
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "unrecognized container for $dev: $container"
|
|
||||||
esac
|
|
||||||
if test -n "$dev"; then
|
|
||||||
$mdadm -A $mdconf "$dev" --offroot
|
|
||||||
else
|
|
||||||
dev=$(get_md_name "$uuid")
|
|
||||||
if test -z "$dev"; then
|
|
||||||
# mdadm will pick a device name
|
|
||||||
$mdadm -A $mdconf --uuid=$uuid --offroot
|
|
||||||
else
|
|
||||||
$mdadm -A $mdconf --uuid=$uuid "$dev" --offroot
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# If md and multipath are used, md is not top. Clear
|
|
||||||
# the {root,resume}_major setting from boot-multipath.sh
|
|
||||||
local var=${type}_major
|
|
||||||
read $var </dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# run any degraded arrays assembled incrementally
|
|
||||||
wait_for_events
|
|
||||||
$mdadm --incremental --run --scan --offroot
|
|
||||||
md_assemble "$resumedev" "resume"
|
|
||||||
md_assemble "$rootdev" "root"
|
|
||||||
if [ -n "$md_dev" ] ; then
|
|
||||||
md_assemble "$md_dev"
|
|
||||||
fi
|
|
||||||
# assemble any md devices seen by setup-md.sh at initrd build time
|
|
||||||
for dev in $md_devs; do
|
|
||||||
md_assemble "$dev"
|
|
||||||
done
|
|
||||||
|
|
||||||
wait_for_events
|
|
||||||
|
@ -16,12 +16,12 @@ declare -A md_conf
|
|||||||
for bd in $blockdev ; do
|
for bd in $blockdev ; do
|
||||||
is_part_dev=false
|
is_part_dev=false
|
||||||
case $bd in
|
case $bd in
|
||||||
/dev/md[0-9]*p[0-9]*)
|
/dev/md[_0-9]*p[0-9]* )
|
||||||
# Partitionable MD RAID. This is partition on RAID. Get the RAID
|
# Partitionable MD RAID. This is partition on RAID. Get the RAID
|
||||||
bd=${bd%%p[0-9]*}
|
bd=${bd%%p[0-9]*}
|
||||||
is_part_dev=true
|
is_part_dev=true
|
||||||
;;
|
;;
|
||||||
/dev/md[0-9]*)
|
/dev/md[0-9_]*)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
mdblockdev="$mdblockdev $bd"
|
mdblockdev="$mdblockdev $bd"
|
||||||
@ -95,12 +95,6 @@ if [ -n "$root_md" ] ; then
|
|||||||
echo -e "${md_conf["$md"]}" >> $tmp_mnt/etc/mdadm.conf
|
echo -e "${md_conf["$md"]}" >> $tmp_mnt/etc/mdadm.conf
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
# Remember which arrays are needed for the root or swap device and assemble
|
|
||||||
# them all during boot. The root= or resume= option might not directly refer to
|
|
||||||
# the array.
|
|
||||||
if test -n "$md_devs"; then
|
|
||||||
md_devs=$(printf '/dev/%s ' $md_devs)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "x$need_mdadm" = "x1" ] ; then
|
if [ "x$need_mdadm" = "x1" ] ; then
|
||||||
for rule in \
|
for rule in \
|
||||||
@ -115,4 +109,3 @@ if [ "x$need_mdadm" = "x1" ] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
save_var need_mdadm
|
save_var need_mdadm
|
||||||
save_var md_devs
|
|
||||||
|
Loading…
Reference in New Issue
Block a user