Accepting request 230133 from Base:System
Automatic submission by obs-autosubmit OBS-URL: https://build.opensuse.org/request/show/230133 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/mdadm?expand=0&rev=90
This commit is contained in:
commit
8773a97f68
@ -0,0 +1,82 @@
|
||||
From df842e69a3cb7316a06ba45f8f04d7b9beb0170f Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 25 Feb 2014 14:54:34 +1100
|
||||
Subject: [PATCH 1/3] Assemble: allow load_devices to change the 'st' which is
|
||||
passed in.
|
||||
|
||||
The given 'st' might not be best. Making this interface change
|
||||
will allow load_devices to return a better 'st'.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Assemble.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- mdadm-3.3.orig/Assemble.c
|
||||
+++ mdadm-3.3/Assemble.c
|
||||
@@ -551,7 +551,7 @@ struct devs {
|
||||
};
|
||||
|
||||
static int load_devices(struct devs *devices, char *devmap,
|
||||
- struct mddev_ident *ident, struct supertype *st,
|
||||
+ struct mddev_ident *ident, struct supertype **stp,
|
||||
struct mddev_dev *devlist, struct context *c,
|
||||
struct mdinfo *content,
|
||||
int mdfd, char *mddev,
|
||||
@@ -567,6 +567,7 @@ static int load_devices(struct devs *dev
|
||||
int most_recent = -1;
|
||||
int bestcnt = 0;
|
||||
int *best = *bestp;
|
||||
+ struct supertype *st = *stp;
|
||||
|
||||
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) {
|
||||
char *devname = tmpdev->devname;
|
||||
@@ -610,6 +611,7 @@ static int load_devices(struct devs *dev
|
||||
close(mdfd);
|
||||
free(devices);
|
||||
free(devmap);
|
||||
+ *stp = st;
|
||||
return -1;
|
||||
}
|
||||
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
|
||||
@@ -636,6 +638,7 @@ static int load_devices(struct devs *dev
|
||||
close(dfd);
|
||||
free(devices);
|
||||
free(devmap);
|
||||
+ *stp = st;
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(c->update, "uuid")==0 &&
|
||||
@@ -675,6 +678,7 @@ static int load_devices(struct devs *dev
|
||||
close(mdfd);
|
||||
free(devices);
|
||||
free(devmap);
|
||||
+ *stp = st;
|
||||
return -1;
|
||||
}
|
||||
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
|
||||
@@ -759,6 +763,7 @@ static int load_devices(struct devs *dev
|
||||
close(mdfd);
|
||||
free(devices);
|
||||
free(devmap);
|
||||
+ *stp = st;
|
||||
return -1;
|
||||
}
|
||||
if (best[i] == -1
|
||||
@@ -772,6 +777,7 @@ static int load_devices(struct devs *dev
|
||||
*most_recentp = most_recent;
|
||||
*bestcntp = bestcnt;
|
||||
*bestp = best;
|
||||
+ *stp = st;
|
||||
return devcnt;
|
||||
}
|
||||
|
||||
@@ -1432,7 +1438,7 @@ try_again:
|
||||
/* Ok, no bad inconsistancy, we can try updating etc */
|
||||
devices = xcalloc(num_devs, sizeof(*devices));
|
||||
devmap = xcalloc(num_devs, content->array.raid_disks);
|
||||
- devcnt = load_devices(devices, devmap, ident, st, devlist,
|
||||
+ devcnt = load_devices(devices, devmap, ident, &st, devlist,
|
||||
c, content, mdfd, mddev,
|
||||
&most_recent, &bestcnt, &best, inargv);
|
||||
if (devcnt < 0)
|
75
0001-DDF-mark-missing-on-assembly-device-properly.patch
Normal file
75
0001-DDF-mark-missing-on-assembly-device-properly.patch
Normal file
@ -0,0 +1,75 @@
|
||||
From e5a03804dc27e662be94290c62760dbc544c0211 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 1 Apr 2014 16:15:06 +1100
|
||||
Subject: [PATCH 1/4] DDF: mark missing-on-assembly device properly.
|
||||
|
||||
As well as removing from the array we really should mark
|
||||
it is 'failed', and mark the array as degraded.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 31 ++++++++++++++++++++++++++++---
|
||||
1 file changed, 28 insertions(+), 3 deletions(-)
|
||||
|
||||
--- mdadm-3.3.orig/super-ddf.c
|
||||
+++ mdadm-3.3/super-ddf.c
|
||||
@@ -4117,7 +4117,7 @@ static int ddf_open_new(struct supertype
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void handle_missing(struct ddf_super *ddf, int inst)
|
||||
+static void handle_missing(struct ddf_super *ddf, struct active_array *a, int inst)
|
||||
{
|
||||
/* This member array is being activated. If any devices
|
||||
* are missing they must now be marked as failed.
|
||||
@@ -4126,7 +4126,9 @@ static void handle_missing(struct ddf_su
|
||||
unsigned int n_bvd;
|
||||
struct vcl *vcl;
|
||||
struct dl *dl;
|
||||
+ int pd;
|
||||
int n;
|
||||
+ int state;
|
||||
|
||||
for (n = 0; ; n++) {
|
||||
vc = find_vdcr(ddf, inst, n, &n_bvd, &vcl);
|
||||
@@ -4138,7 +4140,30 @@ static void handle_missing(struct ddf_su
|
||||
if (dl)
|
||||
/* Found this disk, so not missing */
|
||||
continue;
|
||||
- vc->phys_refnum[n_bvd] = cpu_to_be32(0);
|
||||
+
|
||||
+ /* Mark the device as failed/missing. */
|
||||
+ pd = find_phys(ddf, vc->phys_refnum[n_bvd]);
|
||||
+ if (pd >= 0 && be16_and(ddf->phys->entries[pd].state,
|
||||
+ cpu_to_be16(DDF_Online))) {
|
||||
+ be16_clear(ddf->phys->entries[pd].state,
|
||||
+ cpu_to_be16(DDF_Online));
|
||||
+ be16_set(ddf->phys->entries[pd].state,
|
||||
+ cpu_to_be16(DDF_Failed|DDF_Missing));
|
||||
+ vc->phys_refnum[n_bvd] = cpu_to_be32(0);
|
||||
+ ddf_set_updates_pending(ddf);
|
||||
+ }
|
||||
+
|
||||
+ /* Mark the array as Degraded */
|
||||
+ state = get_svd_state(ddf, vcl);
|
||||
+ if (ddf->virt->entries[inst].state !=
|
||||
+ ((ddf->virt->entries[inst].state & ~DDF_state_mask)
|
||||
+ | state)) {
|
||||
+ ddf->virt->entries[inst].state =
|
||||
+ (ddf->virt->entries[inst].state & ~DDF_state_mask)
|
||||
+ | state;
|
||||
+ a->check_degraded = 1;
|
||||
+ ddf_set_updates_pending(ddf);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4157,7 +4182,7 @@ static int ddf_set_array_state(struct ac
|
||||
int inst = a->info.container_member;
|
||||
int old = ddf->virt->entries[inst].state;
|
||||
if (consistent == 2) {
|
||||
- handle_missing(ddf, inst);
|
||||
+ handle_missing(ddf, a, inst);
|
||||
/* Should check if a recovery should be started FIXME */
|
||||
consistent = 1;
|
||||
if (!is_resync_complete(&a->info))
|
@ -0,0 +1,42 @@
|
||||
From 2167de78aab599e7a7a8d057ef04bf18527bc129 Mon Sep 17 00:00:00 2001
|
||||
From: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Date: Thu, 6 Mar 2014 15:51:44 +0100
|
||||
Subject: [PATCH 1/6] mdmon@.service: Change type of process start-up to
|
||||
'forking'.
|
||||
|
||||
Mdadm does not wait enough time when mdmon is started by systemd.
|
||||
It causes various problems with behaviour of a RAID volume with external metadata.
|
||||
For example: mdmon does not update a value of checkpoint during migration
|
||||
and second RAID5 volume is read-only after reboot done during
|
||||
container reshape (both problems occur with IMSM matadata).
|
||||
If a type of process start-up is changed to 'forking', systemctl will
|
||||
wait until mdmon (parent) process exits after calling fork.
|
||||
This way mdmon will always be fully initialized after start_mdmon
|
||||
and these problems will not occur.
|
||||
In this case it is recommended to add a path to PIDFile, so that systemd
|
||||
does not have to guess a PID of the mdmon process.
|
||||
|
||||
Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
|
||||
Reviewed-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
|
||||
Reviewed-by: Lukasz Dorau <lukasz.dorau@intel.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
systemd/mdmon@.service | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/systemd/mdmon@.service b/systemd/mdmon@.service
|
||||
index 5520cd03137c..304b26e890c7 100644
|
||||
--- a/systemd/mdmon@.service
|
||||
+++ b/systemd/mdmon@.service
|
||||
@@ -14,5 +14,7 @@ Before=initrd-switch-root.target
|
||||
# mdmon should never complain due to lack of a platform,
|
||||
# that is mdadm's job if at all.
|
||||
Environment=IMSM_NO_PLATFORM=1
|
||||
-ExecStart=/sbin/mdmon --foreground %I
|
||||
+ExecStart=/sbin/mdmon %I
|
||||
+Type=forking
|
||||
+PIDFile=/run/mdadm/%I.pid
|
||||
KillMode=none
|
||||
--
|
||||
1.8.3.1.487.g3e7a5b4
|
||||
|
@ -0,0 +1,83 @@
|
||||
From 8d1d32bb33da1bd08a398d26f364b84e69ac7b41 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 8 Apr 2014 17:22:18 +1000
|
||||
Subject: [PATCH] systemd: various fixes for boot with container-arrays.
|
||||
|
||||
1/ Add systemd shutdown script to ensure DDF and IMSM are
|
||||
clean before we actually shutdown
|
||||
|
||||
2/ Get udev to tell systemd to run the mdmon@mdXXX.service
|
||||
units when a member array appears.
|
||||
|
||||
If we boot off a member array (with dracut at least),
|
||||
the mdmon started in the initramfs will lose track of
|
||||
/sys etc, so we need to restart it.
|
||||
systemd will try to forget about it too (but not actually
|
||||
kill it because we said not to do this).
|
||||
Having udev tell it to start it will allow a new mdmon to
|
||||
run which can see /sys, and systemd will know about it.
|
||||
|
||||
3/ Always use --offroot and --takeover when starting mdmon with
|
||||
systemd
|
||||
--offroot is needed else shutdown will hang.
|
||||
--takeover is needed incase an mdmon was started earlier
|
||||
(e.g. in initramfs).
|
||||
Neither hurt if they aren't actually needed.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Makefile | 1 +
|
||||
systemd/mdadm.shutdown | 4 ++++
|
||||
systemd/mdmon@.service | 12 ++++++++++--
|
||||
udev-md-raid-arrays.rules | 4 ++++
|
||||
4 files changed, 19 insertions(+), 2 deletions(-)
|
||||
create mode 100644 systemd/mdadm.shutdown
|
||||
|
||||
--- mdadm-3.3.orig/Makefile
|
||||
+++ mdadm-3.3/Makefile
|
||||
@@ -286,6 +286,7 @@ install-udev: udev-md-raid-arrays.rules
|
||||
install-systemd: systemd/mdmon@.service
|
||||
$(INSTALL) -D -m 644 systemd/mdmon@.service $(DESTDIR)$(SYSTEMD_DIR)/mdmon@.service
|
||||
$(INSTALL) -D -m 644 systemd/mdmonitor.service $(DESTDIR)$(SYSTEMD_DIR)/mdmonitor.service
|
||||
+ $(INSTALL) -D -m 755 systemd/mdadm.shutdown $(DESTDIR)$(SYSTEMD_DIR)-shutdown/mdadm.shutdown
|
||||
[ -f /etc/SuSE-release -o -n "$(SUSE)" ] && $(INSTALL) -D -m 755 systemd/SUSE-mdadm_env.sh $(DESTDIR)$(SYSTEMD_DIR)/../scripts/mdadm_env.sh || true
|
||||
|
||||
uninstall:
|
||||
--- /dev/null
|
||||
+++ mdadm-3.3/systemd/mdadm.shutdown
|
||||
@@ -0,0 +1,4 @@
|
||||
+#!/bin/sh
|
||||
+# We need to ensure all md arrays with external metadata
|
||||
+# (e.g. IMSM, DDF) are clean before completing the shutdown.
|
||||
+/sbin/mdadm --wait-clean --scan
|
||||
--- mdadm-3.3.orig/systemd/mdmon@.service
|
||||
+++ mdadm-3.3/systemd/mdmon@.service
|
||||
@@ -14,7 +14,15 @@ Before=initrd-switch-root.target
|
||||
# mdmon should never complain due to lack of a platform,
|
||||
# that is mdadm's job if at all.
|
||||
Environment=IMSM_NO_PLATFORM=1
|
||||
-ExecStart=/sbin/mdmon %I
|
||||
+# The mdmon starting in the initramfs (with dracut at least)
|
||||
+# cannot see sysfs after root is mounted, so we will have to
|
||||
+# 'takeover'. As the '--offroot --takeover' don't hurt when
|
||||
+# not necessary, are are useful with root-on-md in dracut,
|
||||
+# have them always present.
|
||||
+ExecStart=/sbin/mdmon --offroot --takeover %I
|
||||
Type=forking
|
||||
-PIDFile=/run/mdadm/%I.pid
|
||||
+# Don't set the PIDFile. It isn't necessary (systemd can work
|
||||
+# it out) and systemd will remove it when transitioning from
|
||||
+# initramfs to rootfs.
|
||||
+#PIDFile=/run/mdadm/%I.pid
|
||||
KillMode=none
|
||||
--- mdadm-3.3.orig/udev-md-raid-arrays.rules
|
||||
+++ mdadm-3.3/udev-md-raid-arrays.rules
|
||||
@@ -34,4 +34,8 @@ ENV{ID_FS_USAGE}=="filesystem|other", EN
|
||||
|
||||
ENV{MD_LEVEL}=="raid[1-9]*", ENV{SYSTEMD_WANTS}+="mdmonitor.service"
|
||||
|
||||
+# Tell systemd to run mdmon for our container, if we need it.
|
||||
+ENV{MD_LEVEL}=="raid[1-9]*", ENV{MD_CONTAINER}=="?*", PROGRAM="/usr/bin/readlink $env{MD_CONTAINER}", ENV{MD_MON_THIS}="%c"
|
||||
+ENV{MD_MON_THIS}=="?*", PROGRAM="/usr/bin/basename $env{MD_MON_THIS}", ENV{SYSTEMD_WANTS}+="mdmon@%c.service"
|
||||
+
|
||||
LABEL="md_end"
|
@ -0,0 +1,89 @@
|
||||
From 9ee314dab91dc8479d2e981d0849ce777f7ea492 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 25 Feb 2014 14:59:12 +1100
|
||||
Subject: [PATCH 2/3] Assemble: re-arrange freeing of 'tst' in load_devices().
|
||||
|
||||
When we return in error, we need to free(tst), and ->free_super(tst);
|
||||
Sometimes we didn't.
|
||||
|
||||
Also the final ->free_super(tst) should be followed by free(tst)
|
||||
but wasn't.
|
||||
|
||||
Move that file free forward in the code a bit as we will want to use
|
||||
the tst there in the next patch.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Assemble.c | 19 +++++++++++--------
|
||||
1 file changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
--- mdadm-3.3.orig/Assemble.c
|
||||
+++ mdadm-3.3/Assemble.c
|
||||
@@ -572,6 +572,7 @@ static int load_devices(struct devs *dev
|
||||
for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) {
|
||||
char *devname = tmpdev->devname;
|
||||
struct stat stb;
|
||||
+ struct supertype *tst;
|
||||
int i;
|
||||
|
||||
if (tmpdev->used != 1)
|
||||
@@ -582,7 +583,6 @@ static int load_devices(struct devs *dev
|
||||
int dfd;
|
||||
/* prepare useful information in info structures */
|
||||
struct stat stb2;
|
||||
- struct supertype *tst;
|
||||
int err;
|
||||
fstat(mdfd, &stb2);
|
||||
|
||||
@@ -611,6 +611,8 @@ static int load_devices(struct devs *dev
|
||||
close(mdfd);
|
||||
free(devices);
|
||||
free(devmap);
|
||||
+ tst->ss->free_super(tst);
|
||||
+ free(tst);
|
||||
*stp = st;
|
||||
return -1;
|
||||
}
|
||||
@@ -660,15 +662,13 @@ static int load_devices(struct devs *dev
|
||||
else
|
||||
bitmap_done = 1;
|
||||
}
|
||||
- tst->ss->free_super(tst);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
- struct supertype *tst = dup_super(st);
|
||||
- int dfd;
|
||||
- dfd = dev_open(devname,
|
||||
- tmpdev->disposition == 'I'
|
||||
- ? O_RDWR : (O_RDWR|O_EXCL));
|
||||
+ int dfd = dev_open(devname,
|
||||
+ tmpdev->disposition == 'I'
|
||||
+ ? O_RDWR : (O_RDWR|O_EXCL));
|
||||
+ tst = dup_super(st);
|
||||
|
||||
if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
|
||||
pr_err("cannot re-read metadata from %s - aborting\n",
|
||||
@@ -678,11 +678,12 @@ static int load_devices(struct devs *dev
|
||||
close(mdfd);
|
||||
free(devices);
|
||||
free(devmap);
|
||||
+ tst->ss->free_super(tst);
|
||||
+ free(tst);
|
||||
*stp = st;
|
||||
return -1;
|
||||
}
|
||||
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
|
||||
- tst->ss->free_super(tst);
|
||||
close(dfd);
|
||||
}
|
||||
|
||||
@@ -705,6 +706,8 @@ static int load_devices(struct devs *dev
|
||||
> devices[most_recent].i.events)
|
||||
most_recent = devcnt;
|
||||
}
|
||||
+ tst->ss->free_super(tst);
|
||||
+ free(tst);
|
||||
|
||||
if (content->array.level == LEVEL_MULTIPATH)
|
||||
/* with multipath, the raid_disk from the superblock is meaningless */
|
90
0002-DDF-guard-against-pdnum-being-negative.patch
Normal file
90
0002-DDF-guard-against-pdnum-being-negative.patch
Normal file
@ -0,0 +1,90 @@
|
||||
From a44e993e37a76561fa30e932b93d85fab9bcc272 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Wed, 2 Apr 2014 13:34:10 +1100
|
||||
Subject: [PATCH 2/4] DDF: guard against ->pdnum being negative.
|
||||
|
||||
It is conceivable that ->pdnum could be -1, though only if
|
||||
the metadata is corrupt.
|
||||
We should be careful not to use it if it is.
|
||||
|
||||
Also remove an assignment for pdnum to ->container_member.
|
||||
This is never used and cannot possibly mean anything.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 22 ++++++++++++++++------
|
||||
1 file changed, 16 insertions(+), 6 deletions(-)
|
||||
|
||||
--- mdadm-3.3.orig/super-ddf.c
|
||||
+++ mdadm-3.3/super-ddf.c
|
||||
@@ -2465,7 +2465,11 @@ static struct extent *get_extents(struct
|
||||
struct extent *rv;
|
||||
int n = 0;
|
||||
unsigned int i;
|
||||
- __u16 state = be16_to_cpu(ddf->phys->entries[dl->pdnum].state);
|
||||
+ __u16 state;
|
||||
+
|
||||
+ if (dl->pdnum < 0)
|
||||
+ return NULL;
|
||||
+ state = be16_to_cpu(ddf->phys->entries[dl->pdnum].state);
|
||||
|
||||
if ((state & (DDF_Online|DDF_Failed|DDF_Missing)) != DDF_Online)
|
||||
return NULL;
|
||||
@@ -2900,7 +2904,7 @@ static int remove_from_super_ddf(struct
|
||||
if (dl->major == dk->major &&
|
||||
dl->minor == dk->minor)
|
||||
break;
|
||||
- if (!dl)
|
||||
+ if (!dl || dl->pdnum < 0)
|
||||
return -1;
|
||||
|
||||
if (st->update_tail) {
|
||||
@@ -4096,7 +4100,7 @@ static int ddf_open_new(struct supertype
|
||||
if (dl->major == dev->disk.major &&
|
||||
dl->minor == dev->disk.minor)
|
||||
break;
|
||||
- if (!dl) {
|
||||
+ if (!dl || dl->pdnum < 0) {
|
||||
pr_err("%s: device %d/%d of subarray %d not found in meta data\n",
|
||||
__func__, dev->disk.major, dev->disk.minor, n);
|
||||
return -1;
|
||||
@@ -4728,6 +4732,9 @@ static void ddf_process_update(struct su
|
||||
for (dl = ddf->dlist; dl; dl = dl->next) {
|
||||
unsigned int vn = 0;
|
||||
int in_degraded = 0;
|
||||
+
|
||||
+ if (dl->pdnum < 0)
|
||||
+ continue;
|
||||
for (vcl = ddf->conflist; vcl ; vcl = vcl->next) {
|
||||
unsigned int dn, ibvd;
|
||||
const struct vd_config *conf;
|
||||
@@ -4991,7 +4998,11 @@ static struct mdinfo *ddf_activate_spare
|
||||
int is_dedicated = 0;
|
||||
struct extent *ex;
|
||||
unsigned int j;
|
||||
- be16 state = ddf->phys->entries[dl->pdnum].state;
|
||||
+ be16 state;
|
||||
+
|
||||
+ if (dl->pdnum < 0)
|
||||
+ continue;
|
||||
+ state = ddf->phys->entries[dl->pdnum].state;
|
||||
if (be16_and(state,
|
||||
cpu_to_be16(DDF_Failed|DDF_Missing)) ||
|
||||
!be16_and(state,
|
||||
@@ -5082,7 +5093,6 @@ static struct mdinfo *ddf_activate_spare
|
||||
di->recovery_start = 0;
|
||||
di->data_offset = pos;
|
||||
di->component_size = a->info.component_size;
|
||||
- di->container_member = dl->pdnum;
|
||||
di->next = rv;
|
||||
rv = di;
|
||||
dprintf("%x:%x (%08x) to be %d at %llu\n",
|
||||
@@ -5140,7 +5150,7 @@ static struct mdinfo *ddf_activate_spare
|
||||
if (dl->major == di->disk.major
|
||||
&& dl->minor == di->disk.minor)
|
||||
break;
|
||||
- if (!dl) {
|
||||
+ if (!dl || dl->pdnum < 0) {
|
||||
pr_err("%s: BUG: can't find disk %d (%d/%d)\n",
|
||||
__func__, di->disk.raid_disk,
|
||||
di->disk.major, di->disk.minor);
|
@ -0,0 +1,36 @@
|
||||
From 56bbc588f7f0f3bdd3ec23f02109b427c1d3b8f1 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Tue, 25 Feb 2014 15:04:16 +1100
|
||||
Subject: [PATCH 3/3] Assemble: change load_devices to return most_recent 'st'
|
||||
value.
|
||||
|
||||
This means that
|
||||
|
||||
st->ss->getinfo_super(st, content, NULL);
|
||||
clean = content->array.state & 1;
|
||||
|
||||
will get an up-to-date value for 'clean'. This fix allows
|
||||
tests/03r5assem-failed
|
||||
to work.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
Assemble.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- mdadm-3.3.orig/Assemble.c
|
||||
+++ mdadm-3.3/Assemble.c
|
||||
@@ -703,8 +703,12 @@ static int load_devices(struct devs *dev
|
||||
if (devices[devcnt].i.disk.state == 6) {
|
||||
if (most_recent < 0 ||
|
||||
devices[devcnt].i.events
|
||||
- > devices[most_recent].i.events)
|
||||
+ > devices[most_recent].i.events) {
|
||||
+ struct supertype *tmp = tst;
|
||||
+ tst = st;
|
||||
+ st = tmp;
|
||||
most_recent = devcnt;
|
||||
+ }
|
||||
}
|
||||
tst->ss->free_super(tst);
|
||||
free(tst);
|
@ -0,0 +1,27 @@
|
||||
From 188d31ed2b6dc195a4be1f5620ce2e5185d4e789 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Wed, 2 Apr 2014 15:14:43 +1100
|
||||
Subject: [PATCH 3/4] DDF: fix possible mdmon crash when updating metadata.
|
||||
|
||||
Testing 'c' and then using 'vdc' assumes that the two are in sync,
|
||||
but sometimes they aren't.
|
||||
Testing 'vdc' is safer.
|
||||
This avoids a crash in some cases when failing/removing/added devices
|
||||
to a DDF.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- mdadm-3.3.orig/super-ddf.c
|
||||
+++ mdadm-3.3/super-ddf.c
|
||||
@@ -3000,7 +3000,7 @@ static int __write_ddf_structure(struct
|
||||
(const struct vd_config **)&vdc,
|
||||
&dummy);
|
||||
}
|
||||
- if (c) {
|
||||
+ if (vdc) {
|
||||
dprintf("writing conf record %i on disk %08x for %s/%u\n",
|
||||
i, be32_to_cpu(d->disk.refnum),
|
||||
guid_str(vdc->guid),
|
@ -0,0 +1,38 @@
|
||||
From 76d0f1886fdef89891d617df7e7f3fde89a38e1a Mon Sep 17 00:00:00 2001
|
||||
From: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Date: Wed, 19 Mar 2014 14:26:02 +0100
|
||||
Subject: [PATCH 3/6] Work around architectures having statfs.f_type defined as
|
||||
long
|
||||
|
||||
Having RAMFS_MAGIC defined as 0x858458f6 causing problems when trying
|
||||
to compare it directly against statfs.f_type being cast from long to
|
||||
unsigned long.
|
||||
|
||||
This hack is extremly ugly, but it should at least do the right thing
|
||||
for every situation.
|
||||
|
||||
Thanks to Arnd Bergmann for suggesting the fix.
|
||||
|
||||
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
util.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- mdadm-3.3.orig/util.c
|
||||
+++ mdadm-3.3/util.c
|
||||
@@ -1948,9 +1948,13 @@ int in_initrd(void)
|
||||
{
|
||||
/* This is based on similar function in systemd. */
|
||||
struct statfs s;
|
||||
+ /* statfs.f_type is signed long on s390x and MIPS, causing all
|
||||
+ sorts of sign extension problems with RAMFS_MAGIC being
|
||||
+ defined as 0x858458f6 */
|
||||
return statfs("/", &s) >= 0 &&
|
||||
((unsigned long)s.f_type == TMPFS_MAGIC ||
|
||||
- (unsigned long)s.f_type == RAMFS_MAGIC);
|
||||
+ ((unsigned long)s.f_type & 0xFFFFFFFFUL) ==
|
||||
+ ((unsigned long)RAMFS_MAGIC & 0xFFFFFFFFUL));
|
||||
}
|
||||
|
||||
void reopen_mddev(int mdfd)
|
@ -0,0 +1,86 @@
|
||||
From f43f5b32991c7f5a188940b00989c27f87feee81 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Wed, 2 Apr 2014 15:26:35 +1100
|
||||
Subject: [PATCH 4/4] DDF: Don't fail compare_super_ddf due to re-configure
|
||||
changes.
|
||||
|
||||
It is possible that one device has seem some reconfig but the other
|
||||
hasn't. In that case they are still the "same" DDF, even though
|
||||
one might be older. Such age will be detected by 'seq' differences.
|
||||
|
||||
If A is new and B is old, then it is import that
|
||||
mdadm -I B
|
||||
mdadm -I A
|
||||
|
||||
doesn't get confused because A has the same uuid as B, but compare_super fails.
|
||||
|
||||
So: if the seq numbers are different, then just accept as two
|
||||
different superblocks.
|
||||
If they are the same, then look to copy data from new to old.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 44 +++++++++++---------------------------------
|
||||
1 file changed, 11 insertions(+), 33 deletions(-)
|
||||
|
||||
--- mdadm-3.3.orig/super-ddf.c
|
||||
+++ mdadm-3.3/super-ddf.c
|
||||
@@ -3937,47 +3937,25 @@ static int compare_super_ddf(struct supe
|
||||
if (memcmp(first->anchor.guid, second->anchor.guid, DDF_GUID_LEN) != 0)
|
||||
return 2;
|
||||
|
||||
- if (first->max_part != second->max_part ||
|
||||
- !be16_eq(first->phys->used_pdes, second->phys->used_pdes) ||
|
||||
- !be16_eq(first->virt->populated_vdes,
|
||||
- second->virt->populated_vdes)) {
|
||||
- dprintf("%s: PD/VD number mismatch\n", __func__);
|
||||
- return 3;
|
||||
- }
|
||||
+ /* It is only OK to compare info in the anchor. Anything else
|
||||
+ * could be changing due to a reconfig so must be ignored.
|
||||
+ * guid really should be enough anyway.
|
||||
+ */
|
||||
|
||||
- max_pds = be16_to_cpu(first->phys->used_pdes);
|
||||
- for (dl2 = second->dlist; dl2; dl2 = dl2->next) {
|
||||
- for (pd = 0; pd < max_pds; pd++)
|
||||
- if (be32_eq(first->phys->entries[pd].refnum,
|
||||
- dl2->disk.refnum))
|
||||
- break;
|
||||
- if (pd == max_pds) {
|
||||
- dprintf("%s: no match for disk %08x\n", __func__,
|
||||
- be32_to_cpu(dl2->disk.refnum));
|
||||
- return 3;
|
||||
- }
|
||||
+ if (!be32_eq(first->active->seq, second->active->seq)) {
|
||||
+ dprintf("%s: sequence number mismatch %u<->%u\n", __func__,
|
||||
+ be32_to_cpu(first->active->seq),
|
||||
+ be32_to_cpu(second->active->seq));
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
- max_vds = be16_to_cpu(first->active->max_vd_entries);
|
||||
- for (vl2 = second->conflist; vl2; vl2 = vl2->next) {
|
||||
- if (!be32_eq(vl2->conf.magic, DDF_VD_CONF_MAGIC))
|
||||
- continue;
|
||||
- for (vd = 0; vd < max_vds; vd++)
|
||||
- if (!memcmp(first->virt->entries[vd].guid,
|
||||
- vl2->conf.guid, DDF_GUID_LEN))
|
||||
- break;
|
||||
- if (vd == max_vds) {
|
||||
- dprintf("%s: no match for VD config\n", __func__);
|
||||
- return 3;
|
||||
- }
|
||||
- }
|
||||
- /* FIXME should I look at anything else? */
|
||||
-
|
||||
/*
|
||||
At this point we are fairly sure that the meta data matches.
|
||||
But the new disk may contain additional local data.
|
||||
Add it to the super block.
|
||||
*/
|
||||
+ max_vds = be16_to_cpu(first->active->max_vd_entries);
|
||||
+ max_pds = be16_to_cpu(first->phys->used_pdes);
|
||||
for (vl2 = second->conflist; vl2; vl2 = vl2->next) {
|
||||
for (vl1 = first->conflist; vl1; vl1 = vl1->next)
|
||||
if (!memcmp(vl1->conf.guid, vl2->conf.guid,
|
56
0004-DDF-report-seq-counter-as-events.patch
Normal file
56
0004-DDF-report-seq-counter-as-events.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From eba2859f50bc0de6da7938a9ec6cfe4ceef43874 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Wed, 26 Mar 2014 14:19:43 +1100
|
||||
Subject: [PATCH 4/6] DDF: report seq counter as events.
|
||||
|
||||
Also don't treat two devices with different seq numbers as completely
|
||||
unrelated.
|
||||
|
||||
This allows split-brain detection to work properly for ddf.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 11 ++++-------
|
||||
1 file changed, 4 insertions(+), 7 deletions(-)
|
||||
|
||||
--- mdadm-3.3.orig/super-ddf.c
|
||||
+++ mdadm-3.3/super-ddf.c
|
||||
@@ -1929,6 +1929,8 @@ static void getinfo_super_ddf(struct sup
|
||||
info->disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
|
||||
else
|
||||
info->disk.state = 1 << MD_DISK_FAULTY;
|
||||
+
|
||||
+ info->events = be32_to_cpu(ddf->active->seq);
|
||||
} else {
|
||||
info->disk.number = -1;
|
||||
info->disk.raid_disk = -1;
|
||||
@@ -2029,6 +2031,7 @@ static void getinfo_super_ddf_bvd(struct
|
||||
(be16_to_cpu(ddf->phys->entries[info->disk.number].state) & DDF_Online) &&
|
||||
!(be16_to_cpu(ddf->phys->entries[info->disk.number].state) & DDF_Failed))
|
||||
info->disk.state = (1<<MD_DISK_SYNC)|(1<<MD_DISK_ACTIVE);
|
||||
+ info->events = be32_to_cpu(ddf->active->seq);
|
||||
}
|
||||
|
||||
info->container_member = ddf->currentconf->vcnum;
|
||||
@@ -3841,7 +3844,7 @@ static struct mdinfo *container_content_
|
||||
dev->disk.state = (1<<MD_DISK_SYNC)|(1<<MD_DISK_ACTIVE);
|
||||
dev->recovery_start = MaxSector;
|
||||
|
||||
- dev->events = be32_to_cpu(ddf->primary.seq);
|
||||
+ dev->events = be32_to_cpu(ddf->active->seq);
|
||||
dev->data_offset =
|
||||
be64_to_cpu(LBA_OFFSET(ddf, bvd)[iphys]);
|
||||
dev->component_size = be64_to_cpu(bvd->blocks);
|
||||
@@ -3928,12 +3931,6 @@ static int compare_super_ddf(struct supe
|
||||
if (memcmp(first->anchor.guid, second->anchor.guid, DDF_GUID_LEN) != 0)
|
||||
return 2;
|
||||
|
||||
- if (!be32_eq(first->active->seq, second->active->seq)) {
|
||||
- dprintf("%s: sequence number mismatch %u<->%u\n", __func__,
|
||||
- be32_to_cpu(first->active->seq),
|
||||
- be32_to_cpu(second->active->seq));
|
||||
- return 3;
|
||||
- }
|
||||
if (first->max_part != second->max_part ||
|
||||
!be16_eq(first->phys->used_pdes, second->phys->used_pdes) ||
|
||||
!be16_eq(first->virt->populated_vdes,
|
@ -0,0 +1,65 @@
|
||||
From 5a46fcd7f5b1bd1bf190784f112a15f383262af5 Mon Sep 17 00:00:00 2001
|
||||
From: NeilBrown <neilb@suse.de>
|
||||
Date: Wed, 26 Mar 2014 14:26:53 +1100
|
||||
Subject: [PATCH 5/6] DDF: when first activating an array, record any missing
|
||||
devices.
|
||||
|
||||
We must remember they are missing so that if they re-appear we
|
||||
don't get confused.
|
||||
|
||||
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||
---
|
||||
super-ddf.c | 28 ++++++++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
--- mdadm-3.3.orig/super-ddf.c
|
||||
+++ mdadm-3.3/super-ddf.c
|
||||
@@ -511,6 +511,8 @@ static void pr_state(const struct ddf_su
|
||||
|
||||
static void _ddf_set_updates_pending(struct ddf_super *ddf, const char *func)
|
||||
{
|
||||
+ if (ddf->updates_pending)
|
||||
+ return;
|
||||
ddf->updates_pending = 1;
|
||||
ddf->active->seq = cpu_to_be32((be32_to_cpu(ddf->active->seq)+1));
|
||||
pr_state(ddf, func);
|
||||
@@ -4115,6 +4117,31 @@ static int ddf_open_new(struct supertype
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void handle_missing(struct ddf_super *ddf, int inst)
|
||||
+{
|
||||
+ /* This member array is being activated. If any devices
|
||||
+ * are missing they must now be marked as failed.
|
||||
+ */
|
||||
+ struct vd_config *vc;
|
||||
+ unsigned int n_bvd;
|
||||
+ struct vcl *vcl;
|
||||
+ struct dl *dl;
|
||||
+ int n;
|
||||
+
|
||||
+ for (n = 0; ; n++) {
|
||||
+ vc = find_vdcr(ddf, inst, n, &n_bvd, &vcl);
|
||||
+ if (!vc)
|
||||
+ break;
|
||||
+ for (dl = ddf->dlist; dl; dl = dl->next)
|
||||
+ if (be32_eq(dl->disk.refnum, vc->phys_refnum[n_bvd]))
|
||||
+ break;
|
||||
+ if (dl)
|
||||
+ /* Found this disk, so not missing */
|
||||
+ continue;
|
||||
+ vc->phys_refnum[n_bvd] = cpu_to_be32(0);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* The array 'a' is to be marked clean in the metadata.
|
||||
* If '->resync_start' is not ~(unsigned long long)0, then the array is only
|
||||
@@ -4130,6 +4157,7 @@ static int ddf_set_array_state(struct ac
|
||||
int inst = a->info.container_member;
|
||||
int old = ddf->virt->entries[inst].state;
|
||||
if (consistent == 2) {
|
||||
+ handle_missing(ddf, inst);
|
||||
/* Should check if a recovery should be started FIXME */
|
||||
consistent = 1;
|
||||
if (!is_resync_complete(&a->info))
|
@ -1,3 +1,38 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Apr 8 07:38:42 UTC 2014 - nfbrown@suse.com
|
||||
|
||||
- 0001-systemd-various-fixes-for-boot-with-container-arrays.patch
|
||||
various fixes to improve boot-from-DDF or IMSM
|
||||
(bnc#866660)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Apr 2 04:41:53 UTC 2014 - nfbrown@suse.com
|
||||
|
||||
- 0001-DDF-mark-missing-on-assembly-device-properly.patch
|
||||
- 0002-DDF-guard-against-pdnum-being-negative.patch
|
||||
- 0003-DDF-fix-possible-mdmon-crash-when-updating-metadata.patch
|
||||
- 0004-DDF-Don-t-fail-compare_super_ddf-due-to-re-configure.patch
|
||||
More upstream DDF fixes (bnc#866660)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Mar 26 04:00:51 UTC 2014 - nfbrown@suse.com
|
||||
|
||||
- 0001-mdmon-.service-Change-type-of-process-start-up-to-fo.patch
|
||||
- 0003-Work-around-architectures-having-statfs.f_type-defin.patch
|
||||
- 0004-DDF-report-seq-counter-as-events.patch
|
||||
- 0005-DDF-when-first-activating-an-array-record-any-missin.patch
|
||||
Two fixes for DDF (bnc#866660) and a couple of other upstream fixes
|
||||
just for good measure.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Mar 4 22:48:20 UTC 2014 - nfbrown@suse.com
|
||||
|
||||
- 0001-Assemble-allow-load_devices-to-change-the-st-which-i.patch
|
||||
0002-Assemble-re-arrange-freeing-of-tst-in-load_devices.patch
|
||||
0003-Assemble-change-load_devices-to-return-most_recent-s.patch
|
||||
Allow RAID5 to be assembled even when firs device listed recently
|
||||
failed (bnc#865221)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 22 23:45:34 UTC 2014 - nfbrown@suse.com
|
||||
|
||||
|
@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
# We need to ensure all md array with external metadata
|
||||
# (e.g. IMSM) are clean before completing the shutdown.
|
||||
/sbin/mdadm --wait-clean --scan
|
38
mdadm.spec
38
mdadm.spec
@ -40,7 +40,6 @@ Source2: sysconfig.mdadm
|
||||
Source5: mkinitrd-setup.sh
|
||||
Source6: mkinitrd-boot.sh
|
||||
Source7: mdadm.cron
|
||||
Source8: mdadm.shutdown
|
||||
Source9: systemd-mdadm-last-resort@.timer
|
||||
Source10: systemd-mdadm-last-resort@.service
|
||||
# PATCH-FIX-UPSTREAM config-set-auto_seen-after-processing-the-auto-line.patch upstream-bugfix nfbrown@suse.de
|
||||
@ -99,6 +98,30 @@ Patch26: mdmon-don-t-complain-about-notifying-parent-when-the.patch
|
||||
Patch27: systemd-mdmon-set-IMSM_NO_PLATFORM-1.patch
|
||||
# PATCH-FIX-UPSTREAM mdmon-.service-remove-over-ride-of-Standard-IO.patch nfbrown@suse.de
|
||||
Patch28: mdmon-.service-remove-over-ride-of-Standard-IO.patch
|
||||
# PATCH-FIX-UPSTREAM 0001-Assemble-allow-load_devices-to-change-the-st-which-i.patch bnc#865221 nfbrown@suse.de
|
||||
Patch32: 0001-Assemble-allow-load_devices-to-change-the-st-which-i.patch
|
||||
# PATCH-FIX-UPSTREAM 0002-Assemble-re-arrange-freeing-of-tst-in-load_devices.patch bnc#865221 nfbrown@suse.de
|
||||
Patch33: 0002-Assemble-re-arrange-freeing-of-tst-in-load_devices.patch
|
||||
# PATCH-FIX-UPSTREAM 0003-Assemble-change-load_devices-to-return-most_recent-s.patch bnc#865221 nfbrown@suse.de
|
||||
Patch34: 0003-Assemble-change-load_devices-to-return-most_recent-s.patch
|
||||
# PATCH-FIX-UPSTREAM 0001-mdmon-.service-Change-type-of-process-start-up-to-fo.patch nfbrown@suse.de
|
||||
Patch35: 0001-mdmon-.service-Change-type-of-process-start-up-to-fo.patch
|
||||
# PATCH-FIX-UPSTREAM 0003-Work-around-architectures-having-statfs.f_type-defin.patch nfbrown@suse.de
|
||||
Patch36: 0003-Work-around-architectures-having-statfs.f_type-defin.patch
|
||||
# PATCH-FIX-UPSTREAM 0004-DDF-report-seq-counter-as-events.patch bnc#866660 nfbrown@suse.de
|
||||
Patch37: 0004-DDF-report-seq-counter-as-events.patch
|
||||
# PATCH-FIX-UPSTREAM 0005-DDF-when-first-activating-an-array-record-any-missin.patch bnc#866660 nfbrown@suse.de
|
||||
Patch38: 0005-DDF-when-first-activating-an-array-record-any-missin.patch
|
||||
# PATCH-FIX-UPSTREAM 0001-DDF-mark-missing-on-assembly-device-properly.patch bnc#866660 nfbrown@suse.de
|
||||
Patch39: 0001-DDF-mark-missing-on-assembly-device-properly.patch
|
||||
# PATCH-FIX-UPSTREAM 0002-DDF-guard-against-pdnum-being-negative.patch bnc#866660 nfbrown@suse.de
|
||||
Patch40: 0002-DDF-guard-against-pdnum-being-negative.patch
|
||||
# PATCH-FIX-UPSTREAM 0003-DDF-fix-possible-mdmon-crash-when-updating-metadata.patch bnc#866660 nfbrown@suse.de
|
||||
Patch41: 0003-DDF-fix-possible-mdmon-crash-when-updating-metadata.patch
|
||||
# PATCH-FIX-UPSTREAM 0004-DDF-Don-t-fail-compare_super_ddf-due-to-re-configure.patch bnc#866660 nfbrown@suse.de
|
||||
Patch42: 0004-DDF-Don-t-fail-compare_super_ddf-due-to-re-configure.patch
|
||||
# PATCH-FIX-UPSTREAM 0001-systemd-various-fixes-for-boot-with-container-arrays.patch bnc#866660 nfbrown@suse.de
|
||||
Patch43: 0001-systemd-various-fixes-for-boot-with-container-arrays.patch
|
||||
|
||||
%define _udevdir %(pkg-config --variable=udevdir udev)
|
||||
%define _systemdshutdowndir %{_unitdir}/../system-shutdown
|
||||
@ -138,6 +161,18 @@ programs but with a very different interface.
|
||||
%patch26 -p1
|
||||
%patch27 -p1
|
||||
%patch28 -p1
|
||||
%patch32 -p1
|
||||
%patch33 -p1
|
||||
%patch34 -p1
|
||||
%patch35 -p1
|
||||
%patch36 -p1
|
||||
%patch37 -p1
|
||||
%patch38 -p1
|
||||
%patch39 -p1
|
||||
%patch40 -p1
|
||||
%patch41 -p1
|
||||
%patch42 -p1
|
||||
%patch43 -p1
|
||||
|
||||
%build
|
||||
make %{?_smp_mflags} CC="%__cc" CXFLAGS="$RPM_OPT_FLAGS -Wno-error" SUSE=yes
|
||||
@ -157,7 +192,6 @@ install -d %{buildroot}/etc/cron.daily
|
||||
install -m 755 %{S:7} %{buildroot}/etc/cron.daily/mdadm
|
||||
install -m 644 %{S:2} %{buildroot}%{_var}/adm/fillup-templates/
|
||||
install -d %{buildroot}%{_systemdshutdowndir}
|
||||
install -m 755 %{S:8} %{buildroot}%{_systemdshutdowndir}/mdadm.shutdown
|
||||
install -m 644 %{S:9} %{buildroot}%{_unitdir}/mdadm-last-resort@.timer
|
||||
install -m 644 %{S:10} %{buildroot}%{_unitdir}/mdadm-last-resort@.service
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user