summaryrefslogtreecommitdiff
path: root/managemon.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-08-01 15:45:17 +1000
committerNeilBrown <neilb@suse.de>2013-08-01 15:54:24 +1000
commit2ef219630b7e1baa72fce420b6bc41cf8071c5e8 (patch)
treeb8ba4082b1997dd505b0dc01b44fed3b65995b74 /managemon.c
parent273989b93a3185c0e4d54f0d1bc404248a92d157 (diff)
mdmon: clear safe_mode_delay on shutdown
When we receive a signal, set the safemode delay to v.small so that we can ge clean arrays and exit quickly Signed-off-by: NeilBrown <neilb@suse.de>o
Diffstat (limited to 'managemon.c')
-rw-r--r--managemon.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/managemon.c b/managemon.c
index 40c863f1..6cd93e51 100644
--- a/managemon.c
+++ b/managemon.c
@@ -492,6 +492,11 @@ static void manage_member(struct mdstat_ent *mdstat,
if (a->container == NULL)
return;
+ if (sigterm && a->info.safe_mode_delay > 1) {
+ sysfs_set_safemode(&a->info, 1);
+ a->info.safe_mode_delay = 1;
+ }
+
/* We don't check the array while any update is pending, as it
* might container a change (such as a spare assignment) which
* could affect our decisions.
@@ -646,7 +651,8 @@ static void manage_new(struct mdstat_ent *mdstat,
mdi = sysfs_read(-1, mdstat->devnm,
GET_LEVEL|GET_CHUNK|GET_DISKS|GET_COMPONENT|
- GET_DEGRADED|GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE);
+ GET_DEGRADED|GET_SAFEMODE|
+ GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE);
if (!mdi)
return;
@@ -692,6 +698,16 @@ static void manage_new(struct mdstat_ent *mdstat,
dprintf("%s: inst: %d action: %d state: %d\n", __func__, atoi(inst),
new->action_fd, new->info.state_fd);
+ if (sigterm)
+ new->info.safe_mode_delay = 1;
+ else if (mdi->safe_mode_delay >= 50)
+ /* Normal start, mdadm set this. */
+ new->info.safe_mode_delay = mdi->safe_mode_delay;
+ else
+ /* Restart, just pick a number */
+ new->info.safe_mode_delay = 5000;
+ sysfs_set_safemode(&new->info, new->info.safe_mode_delay);
+
/* reshape_position is set by mdadm in sysfs
* read this information for new arrays only (empty victim)
*/