]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Add scaffolding for handling md/dev-XXX/recovery_start
authorDan Williams <dan.j.williams@intel.com>
Mon, 21 Dec 2009 17:06:14 +0000 (10:06 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 21 Dec 2009 17:06:14 +0000 (10:06 -0700)
Prepare the code to handle saving a recovery checkpoint.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
managemon.c
mdadm.h
monitor.c

index e77f045073702590bb153094995ddd58d4d2331c..e3350778b9fcb0381b052588c8afac62221492fe 100644 (file)
@@ -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;
diff --git a/mdadm.h b/mdadm.h
index c7f864bba4485a80239a85b85dd9e04834a982ca..7b755408c290450a791bf21cef767d1142d1a3db 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -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
index a8e0af369bb4cad5fc2fd2145578da8d296cfdb6..58752a85c8428aa37c4babf7045e2d32376ecd95 100644 (file)
--- a/monitor.c
+++ b/monitor.c
@@ -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 &&