}
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;
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;
int devnum;
unsigned long long sync_pos;
+ unsigned long long resync_start;
};
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)
{
* 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.
*
*
*
* 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 &&