start resync when transitioning from initial readonly state

From: Dan Williams <dan.j.williams@intel.com>

mdadm handles setting resync_start, monitor uses this value to determine
whether to set the 'active' or 'readauto' state.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-05-15 16:48:39 +10:00 committed by Neil Brown
parent 549e9569c6
commit c052ba301b
3 changed files with 27 additions and 7 deletions

View File

@ -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;

View File

@ -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;
};

View File

@ -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 &&