diff options
-rw-r--r-- | managemon.c | 1 | ||||
-rw-r--r-- | mdmon.h | 2 | ||||
-rw-r--r-- | monitor.c | 31 |
3 files changed, 27 insertions, 7 deletions
diff --git a/managemon.c b/managemon.c index ee4ee2b9..14e7184b 100644 --- a/managemon.c +++ b/managemon.c @@ -232,6 +232,7 @@ static void manage_new(struct mdstat_ent *mdstat, } new->action_fd = sysfs_open(new->devnum, NULL, "sync_action"); new->info.state_fd = sysfs_open(new->devnum, NULL, "array_state"); + new->resync_start_fd = sysfs_open(new->devnum, NULL, "resync_start"); new->sync_pos_fd = sysfs_open(new->devnum, NULL, "sync_completed"); new->sync_pos = 0; @@ -12,6 +12,7 @@ struct active_array { int action_fd; int sync_pos_fd; + int resync_start_fd; enum array_state prev_state, curr_state, next_state; enum sync_action prev_action, curr_action, next_action; @@ -19,6 +20,7 @@ struct active_array { int devnum; unsigned long long sync_pos; + unsigned long long resync_start; }; @@ -64,6 +64,19 @@ static int get_sync_pos(struct active_array *a) return 1; } +static int get_resync_start(struct active_array *a) +{ + char buf[30]; + int n; + + n = read_attr(buf, 30, a->resync_start_fd); + if (n <= 0) + return n; + + a->resync_start = strtoull(buf, NULL, 10); + + return 1; +} static int attr_match(const char *attr, const char *str) { @@ -191,12 +204,10 @@ int read_dev_state(int fd) * Start recovery. * * deal with resync - * This only happens on finding a new array.... - * Maybe this is done by mdadm before passing the array to us? - * - * If array is 'clean' but metadata is 'dirty', start a resync - * and mark array as 'dirty'. - * + * This only happens on finding a new array... mdadm will have set + * 'resync_start' to the correct value. If 'resync_start' indicates that an + * resync needs to occur set the array to the 'active' state rather than the + * initial read-auto state. * * * @@ -252,7 +263,13 @@ static int read_and_act(struct active_array *a) * read-auto is OK. FIXME what if we really want * readonly ??? */ - a->next_state = read_auto; + get_resync_start(a); + if (a->resync_start == ~0ULL) + a->next_state = read_auto; /* array is clean */ + else { + a->container->ss->mark_dirty(a); + a->next_state = active; + } } if (a->curr_action == idle && |