monitor: protect against CONFIG_LBD=n

md/resync_start reports different terminal values depending on kernel
configuration (~0UL versus ~0ULL).  Make detection of the
resync-complete state more robust by comparing against array size.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-09-28 12:12:06 -07:00
parent 14e8215b1b
commit 593add1b56
3 changed files with 15 additions and 4 deletions

11
mdmon.h
View File

@ -59,3 +59,14 @@ struct mdstat_ent *mdstat_read(int hold, int start);
extern int exit_now, manager_ready;
extern int mon_tid, mgr_tid;
extern int monitor_loop_cnt;
/* helper routine to determine resync completion since MaxSector is a
* moving target
*/
static inline int is_resync_complete(struct active_array *a)
{
if (a->resync_start >= a->info.component_size)
return 1;
return 0;
}

View File

@ -2748,7 +2748,7 @@ static int ddf_set_array_state(struct active_array *a, int consistent)
if (consistent == 2) {
/* Should check if a recovery should be started FIXME */
consistent = 1;
if (a->resync_start != ~0ULL)
if (!is_resync_complete(a))
consistent = 0;
}
if (consistent)
@ -2760,7 +2760,7 @@ static int ddf_set_array_state(struct active_array *a, int consistent)
old = ddf->virt->entries[inst].init_state;
ddf->virt->entries[inst].init_state &= ~DDF_initstate_mask;
if (a->resync_start == ~0ULL)
if (is_resync_complete(a))
ddf->virt->entries[inst].init_state |= DDF_init_full;
else if (a->resync_start == 0)
ddf->virt->entries[inst].init_state |= DDF_init_not;

View File

@ -2474,12 +2474,12 @@ static int imsm_set_array_state(struct active_array *a, int consistent)
__u8 map_state = imsm_check_degraded(super, dev, failed);
if (consistent == 2 &&
(a->resync_start != ~0ULL ||
(!is_resync_complete(a) ||
map_state != IMSM_T_STATE_NORMAL ||
dev->vol.migr_state))
consistent = 0;
if (a->resync_start == ~0ULL) {
if (is_resync_complete(a)) {
/* complete intialization / resync,
* recovery is completed in ->set_disk
*/