diff options
-rw-r--r-- | managemon.c | 7 | ||||
-rw-r--r-- | mdadm.h | 6 | ||||
-rw-r--r-- | monitor.c | 4 |
3 files changed, 14 insertions, 3 deletions
diff --git a/managemon.c b/managemon.c index e77f0450..e3350778 100644 --- a/managemon.c +++ b/managemon.c @@ -112,8 +112,10 @@ static void close_aa(struct active_array *aa) { struct mdinfo *d; - for (d = aa->info.devs; d; d = d->next) + for (d = aa->info.devs; d; d = d->next) { + close(d->recovery_fd); close(d->state_fd); + } close(aa->action_fd); close(aa->info.state_fd); @@ -517,6 +519,9 @@ static void manage_new(struct mdstat_ent *mdstat, newd->state_fd = sysfs_open(new->devnum, newd->sys_name, "state"); + newd->recovery_fd = sysfs_open(new->devnum, + newd->sys_name, + "recovery_start"); newd->prev_state = read_dev_state(newd->state_fd); newd->curr_state = newd->prev_state; @@ -146,7 +146,10 @@ struct mdinfo { */ int reshape_active; unsigned long long reshape_progress; - unsigned long long resync_start; + union { + unsigned long long resync_start; /* per-array resync position */ + unsigned long long recovery_start; /* per-device rebuild position */ + }; unsigned long safe_mode_delay; /* ms delay to mark clean */ int new_level, delta_disks, new_layout, new_chunk; int errors; @@ -168,6 +171,7 @@ struct mdinfo { struct mdinfo *next; /* Device info for mdmon: */ + int recovery_fd; int state_fd; #define DS_FAULTY 1 #define DS_INSYNC 2 @@ -208,8 +208,10 @@ static int read_and_act(struct active_array *a) a->info.resync_start = read_resync_start(a->resync_start_fd); for (mdi = a->info.devs; mdi ; mdi = mdi->next) { mdi->next_state = 0; - if (mdi->state_fd >= 0) + if (mdi->state_fd >= 0) { + mdi->recovery_start = read_resync_start(mdi->recovery_fd); mdi->curr_state = read_dev_state(mdi->state_fd); + } } if (a->curr_state <= inactive && |