diff --git a/mdadm-3.2.3-Add-offroot-argument-to-mdadm.patch b/mdadm-3.2.3-Add-offroot-argument-to-mdadm.patch new file mode 100644 index 0000000..7c67e1f --- /dev/null +++ b/mdadm-3.2.3-Add-offroot-argument-to-mdadm.patch @@ -0,0 +1,101 @@ +From 08ca2adffffeb3bfda3cafababfc26706a60463b Mon Sep 17 00:00:00 2001 +From: Jes Sorensen +Date: Wed, 25 Jan 2012 15:18:02 +0100 +Subject: [PATCH 2/4] Add --offroot argument to mdadm + +When --offroot is specified, mdadm will change the first character of +argv[0] to '@'. This is used to signal to systemd that mdadm was +launched from initramfs and should not be shut down before returning +to the initramfs. + +Acked-by: Doug Ledford +Signed-off-by: Jes Sorensen +Signed-off-by: NeilBrown +--- + ReadMe.c | 5 +++++ + mdadm.8.in | 12 ++++++++++++ + mdadm.c | 9 +++++++++ + mdadm.h | 1 + + 4 files changed, 27 insertions(+), 0 deletions(-) + +diff --git a/ReadMe.c b/ReadMe.c +index 9aa798b..a60e11b 100644 +--- a/ReadMe.c ++++ b/ReadMe.c +@@ -111,6 +111,7 @@ struct option long_options[] = { + {"kill-subarray", 1, 0, KillSubarray}, + {"update-subarray", 1, 0, UpdateSubarray}, + {"udev-rules", 2, 0, UdevRules}, ++ {"offroot", 0, 0, OffRootOpt}, + + /* synonyms */ + {"monitor", 0, 0, 'F'}, +@@ -268,6 +269,10 @@ char OptionHelp[] = + " --query -Q : Display general information about how a\n" + " device relates to the md driver\n" + " --auto-detect : Start arrays auto-detected by the kernel\n" ++" --offroot : Set first character of argv[0] to @ to indicate the\n" ++" application was launched from initrd/initramfs and\n" ++" should not be shutdown by systemd as part of the\n" ++" regular shutdown process.\n" + ; + /* + "\n" +diff --git a/mdadm.8.in b/mdadm.8.in +index 27be110..4f06a88 100644 +--- a/mdadm.8.in ++++ b/mdadm.8.in +@@ -255,6 +255,18 @@ Avoid printing purely informative messages. With this, + will be silent unless there is something really important to report. + + .TP ++.BR \-\-offroot ++Set first character of argv[0] to @ to indicate mdadm was launched ++from initrd/initramfs and should not be shutdown by systemd as part of ++the regular shutdown process. This option is normally only used by ++the system's initscripts. Please see here for more details on how ++systemd handled argv[0]: ++.IP ++.B http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons ++.PP ++ ++ ++.TP + .BR \-f ", " \-\-force + Be more forceful about certain operations. See the various modes for + the exact meaning of this option in different contexts. +diff --git a/mdadm.c b/mdadm.c +index f07fac2..78f28d5 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -174,6 +174,15 @@ int main(int argc, char *argv[]) + homehost = optarg; + continue; + ++ /* ++ * --offroot sets first char of argv[0] to @. This is used ++ * by systemd to signal that the tast was launched from ++ * initrd/initramfs and should be preserved during shutdown ++ */ ++ case OffRootOpt: ++ argv[0][0] = '@'; ++ continue; ++ + case ':': + case '?': + fputs(Usage, stderr); +diff --git a/mdadm.h b/mdadm.h +index 381ef86..fec93aa 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -321,6 +321,7 @@ enum special_options { + UdevRules, + FreezeReshape, + Continue, ++ OffRootOpt, + }; + + /* structures read from config file */ +-- +1.7.8.4 + diff --git a/mdadm-3.2.3-Add-offroot-argument-to-mdmon.patch b/mdadm-3.2.3-Add-offroot-argument-to-mdmon.patch new file mode 100644 index 0000000..339b780 --- /dev/null +++ b/mdadm-3.2.3-Add-offroot-argument-to-mdmon.patch @@ -0,0 +1,79 @@ +From da827518c1f062e7d49433691d33e103525f9d6a Mon Sep 17 00:00:00 2001 +From: Jes Sorensen +Date: Wed, 25 Jan 2012 15:18:03 +0100 +Subject: [PATCH 3/4] Add --offroot argument to mdmon + +Acked-by: Doug Ledford +Signed-off-by: Jes Sorensen +Signed-off-by: NeilBrown +--- + mdmon.8 | 12 +++++++++++- + mdmon.c | 8 ++++++++ + 2 files changed, 19 insertions(+), 1 deletions(-) + +diff --git a/mdmon.8 b/mdmon.8 +index 8c1ce5f..a9178b6 100644 +--- a/mdmon.8 ++++ b/mdmon.8 +@@ -5,7 +5,7 @@ mdmon \- monitor MD external metadata arrays + + .SH SYNOPSIS + +-.BI mdmon " [--all] [--takeover] CONTAINER" ++.BI mdmon " [--all] [--takeover] [--offroot] CONTAINER" + + .SH OVERVIEW + The 2.6.27 kernel brings the ability to support external metadata arrays. +@@ -165,6 +165,16 @@ argument is over-written with the name of the container. To allow for + containers with names longer than 5 characters, this argument can be + arbitrarily extended, e.g. to + .BR \-\-all-active-arrays . ++.TP ++.BR \-\-offroot ++Set first character of argv[0] to @ to indicate mdmon was launched ++from initrd/initramfs and should not be shutdown by systemd as part of ++the regular shutdown process. This option is normally only used by ++the system's initscripts. Please see here for more details on how ++systemd handled argv[0]: ++.IP ++.B http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons ++.PP + + .PP + Note that +diff --git a/mdmon.c b/mdmon.c +index a65c4a4..2093476 100644 +--- a/mdmon.c ++++ b/mdmon.c +@@ -272,6 +272,10 @@ void usage(void) + " --help -h : This message\n" + " --all : All devices\n" + " --takeover -t : Takeover container\n" ++" --offroot : Set first character of argv[0] to @ to indicate the\n" ++" application was launched from initrd/initramfs and\n" ++" should not be shutdown by systemd as part of the\n" ++" regular shutdown process.\n" + ); + exit(2); + } +@@ -291,6 +295,7 @@ int main(int argc, char *argv[]) + {"all", 0, NULL, 'a'}, + {"takeover", 0, NULL, 't'}, + {"help", 0, NULL, 'h'}, ++ {"offroot", 0, NULL, OffRootOpt}, + {NULL, 0, NULL, 0} + }; + +@@ -304,6 +309,9 @@ int main(int argc, char *argv[]) + container_name = optarg; + takeover = 1; + break; ++ case OffRootOpt: ++ argv[0][0] = '@'; ++ break; + case 'h': + default: + usage(); +-- +1.7.8.4 + diff --git a/mdadm-3.2.3-Spawn-mdmon-with-offroot-if-mdadm-was-launched-with-.patch b/mdadm-3.2.3-Spawn-mdmon-with-offroot-if-mdadm-was-launched-with-.patch new file mode 100644 index 0000000..1d677c4 --- /dev/null +++ b/mdadm-3.2.3-Spawn-mdmon-with-offroot-if-mdadm-was-launched-with-.patch @@ -0,0 +1,75 @@ +From a0963a86e12a55d501f421048bd7c09cf4d78b93 Mon Sep 17 00:00:00 2001 +From: Jes Sorensen +Date: Wed, 25 Jan 2012 15:18:04 +0100 +Subject: [PATCH 4/4] Spawn mdmon with --offroot if mdadm was launched with + --offroot + +Acked-by: Doug Ledford +Signed-off-by: Jes Sorensen +Signed-off-by: NeilBrown +--- + mdadm.c | 1 + + mdadm.h | 2 ++ + util.c | 17 +++++++++++++---- + 3 files changed, 16 insertions(+), 4 deletions(-) + +diff --git a/mdadm.c b/mdadm.c +index 78f28d5..1efa3e8 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -181,6 +181,7 @@ int main(int argc, char *argv[]) + */ + case OffRootOpt: + argv[0][0] = '@'; ++ __offroot = 1; + continue; + + case ':': +diff --git a/mdadm.h b/mdadm.h +index fec93aa..d862b3e 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1383,3 +1383,5 @@ static inline int xasprintf(char **strp, const char *fmt, ...) { + + #define PROCESS_DELAYED -2 + #define PROCESS_PENDING -3 ++ ++extern int __offroot; +diff --git a/util.c b/util.c +index 6985a70..4ba44e6 100644 +--- a/util.c ++++ b/util.c +@@ -32,6 +32,8 @@ + #include + #include + ++int __offroot; ++ + /* + * following taken from linux/blkpg.h because they aren't + * anywhere else and it isn't safe to #include linux/ * stuff. +@@ -1622,10 +1624,17 @@ int start_mdmon(int devnum) + skipped = 0; + + for (i=0; paths[i]; i++) +- if (paths[i][0]) +- execl(paths[i], "mdmon", +- devnum2devname(devnum), +- NULL); ++ if (paths[i][0]) { ++ if (__offroot) { ++ execl(paths[i], "mdmon", "--offroot", ++ devnum2devname(devnum), ++ NULL); ++ } else { ++ execl(paths[i], "mdmon", ++ devnum2devname(devnum), ++ NULL); ++ } ++ } + exit(1); + case -1: fprintf(stderr, Name ": cannot run mdmon. " + "Array remains readonly\n"); +-- +1.7.8.4 + diff --git a/mdadm-3.2.3-mdmon-Use-getopt_long-to-parse-command-line-options.patch b/mdadm-3.2.3-mdmon-Use-getopt_long-to-parse-command-line-options.patch new file mode 100644 index 0000000..e191997 --- /dev/null +++ b/mdadm-3.2.3-mdmon-Use-getopt_long-to-parse-command-line-options.patch @@ -0,0 +1,97 @@ +From eb155f6de0986dc14c37dc9c4172bf0bcb8779fe Mon Sep 17 00:00:00 2001 +From: Jes Sorensen +Date: Wed, 25 Jan 2012 15:18:01 +0100 +Subject: [PATCH 1/4] mdmon: Use getopt_long() to parse command line options + +This changes mdmon over to use getopt_long() for option parsing, +making it easier to add new options. In addition this patch introduces +a short version -t for --takeover and adds -h/--help. + +Acked-by: Doug Ledford +Signed-off-by: Jes Sorensen +Signed-off-by: NeilBrown +--- + mdmon.c | 51 ++++++++++++++++++++++++++++++++++++++++----------- + 1 files changed, 40 insertions(+), 11 deletions(-) + +diff --git a/mdmon.c b/mdmon.c +index b6ae0e6..a65c4a4 100644 +--- a/mdmon.c ++++ b/mdmon.c +@@ -265,7 +265,14 @@ static int do_fork(void) + + void usage(void) + { +- fprintf(stderr, "Usage: mdmon [--all] [--takeover] CONTAINER\n"); ++ fprintf(stderr, ++"Usage: mdmon [options] CONTAINER\n" ++"\n" ++"Options are:\n" ++" --help -h : This message\n" ++" --all : All devices\n" ++" --takeover -t : Takeover container\n" ++); + exit(2); + } + +@@ -277,25 +284,47 @@ int main(int argc, char *argv[]) + int devnum; + char *devname; + int status = 0; +- int arg; ++ int opt; + int all = 0; + int takeover = 0; +- +- for (arg = 1; arg < argc; arg++) { +- if (strncmp(argv[arg], "--all",5) == 0 || +- strcmp(argv[arg], "/proc/mdstat") == 0) { +- container_name = argv[arg]; ++ static struct option options[] = { ++ {"all", 0, NULL, 'a'}, ++ {"takeover", 0, NULL, 't'}, ++ {"help", 0, NULL, 'h'}, ++ {NULL, 0, NULL, 0} ++ }; ++ ++ while ((opt = getopt_long(argc, argv, "th", options, NULL)) != -1) { ++ switch (opt) { ++ case 'a': ++ container_name = argv[optind-1]; + all = 1; +- } else if (strcmp(argv[arg], "--takeover") == 0) ++ break; ++ case 't': ++ container_name = optarg; + takeover = 1; +- else if (container_name == NULL) +- container_name = argv[arg]; +- else ++ break; ++ case 'h': ++ default: + usage(); ++ break; ++ } + } ++ ++ if (all == 0 && container_name == NULL) { ++ if (argv[optind]) ++ container_name = argv[optind]; ++ } ++ + if (container_name == NULL) + usage(); + ++ if (argc - optind > 1) ++ usage(); ++ ++ if (strcmp(container_name, "/proc/mdstat") == 0) ++ all = 1; ++ + if (all) { + struct mdstat_ent *mdstat, *e; + int container_len = strlen(container_name); +-- +1.7.8.4 + diff --git a/mdadm.spec b/mdadm.spec index b04c119..45c58eb 100644 --- a/mdadm.spec +++ b/mdadm.spec @@ -1,7 +1,7 @@ Summary: The mdadm program controls Linux md devices (software RAID arrays) Name: mdadm Version: 3.2.3 -Release: 3%{?dist} +Release: 4%{?dist} Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.bz2 Source1: mdmonitor.init Source2: raid-check @@ -14,6 +14,10 @@ Source8: mdadm.conf Patch1: mdadm-3.2.3-Work-around-gcc-4.7-s-strict-aliasing-checks.patch Patch2: mdadm-3.2.3-monitor-make-return-from-read_and_act-more-symbolic.patch Patch3: mdadm-3.2.3-monitor-ensure-we-retry-soon-when-remove-fails.patch +Patch4: mdadm-3.2.3-mdmon-Use-getopt_long-to-parse-command-line-options.patch +Patch5: mdadm-3.2.3-Add-offroot-argument-to-mdadm.patch +Patch6: mdadm-3.2.3-Add-offroot-argument-to-mdmon.patch +Patch7: mdadm-3.2.3-Spawn-mdmon-with-offroot-if-mdadm-was-launched-with-.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/ @@ -49,6 +53,12 @@ is not used as the system init process. %prep %setup -q %patch1 -p1 -b .gcc47 +%patch2 -p1 -b .read +%patch3 -p1 -b .retry +%patch4 -p1 -b .getopt +%patch5 -p1 -b .offroot-mdadm +%patch6 -p1 -b .offroot-mdmon +%patch7 -p1 -b .offroot-spawn %patch19 -p1 -b .udev %patch20 -p1 -b .static @@ -123,6 +133,10 @@ fi %{_initrddir}/* %changelog +* Mon Jan 30 2012 Jes Sorensen - 3.2.3-4 +- Add support for --offroot to mdadm/mdmon +- Resolves: bz785739 (rawhide) bz785737 (f16) bz771405 (f15) + * Thu Jan 12 2012 Jes Sorensen - 3.2.3-3 - Fix case where we have to retry in case a remove fails due to an array being busy