imsm: cleanup migration definitions and usage

imsm_set_array_state need not look at the map_state when failed==0

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-11-07 15:57:31 -07:00
parent 5115ca67fd
commit e3bba0e010
1 changed files with 18 additions and 12 deletions

View File

@ -61,8 +61,8 @@ struct imsm_map {
__u8 map_state; /* Normal, Uninitialized, Degraded, Failed */
#define IMSM_T_STATE_NORMAL 0
#define IMSM_T_STATE_UNINITIALIZED 1
#define IMSM_T_STATE_DEGRADED 2 /* FIXME: is this correct? */
#define IMSM_T_STATE_FAILED 3 /* FIXME: is this correct? */
#define IMSM_T_STATE_DEGRADED 2
#define IMSM_T_STATE_FAILED 3
__u8 raid_level;
#define IMSM_T_RAID0 0
#define IMSM_T_RAID1 1
@ -80,6 +80,11 @@ struct imsm_vol {
__u32 curr_migr_unit;
__u32 reserved;
__u8 migr_state; /* Normal or Migrating */
#define MIGR_INIT 0
#define MIGR_REBUILD 1
#define MIGR_VERIFY 2 /* analagous to echo check > sync_action */
#define MIGR_GEN_MIGR 3
#define MIGR_STATE_CHANGE 4
__u8 migr_type; /* Initializing, Rebuilding, ... */
__u8 dirty;
__u8 fill[1];
@ -1178,11 +1183,11 @@ static void imsm_copy_dev(struct imsm_dev *dest, struct imsm_dev *src)
*
* Migration is indicated by one of the following states
* 1/ Idle (migr_state=0 map0state=normal||unitialized||degraded||failed)
* 2/ Initialize (migr_state=1 migr_type=0 map0state=normal
* 2/ Initialize (migr_state=1 migr_type=MIGR_INIT map0state=normal
* map1state=unitialized)
* 3/ Verify (Resync) (migr_state=1 migr_type=1 map0state=normal
* 3/ Verify (Resync) (migr_state=1 migr_type=MIGR_REBUILD map0state=normal
* map1state=normal)
* 4/ Rebuild (migr_state=1 migr_type=1 map0state=normal
* 4/ Rebuild (migr_state=1 migr_type=MIGR_REBUILD map0state=normal
* map1state=degraded)
*/
static void migrate(struct imsm_dev *dev, __u8 to_state, int rebuild_resync)
@ -1731,7 +1736,7 @@ static int init_super_imsm_volume(struct supertype *st, mdu_array_info_t *info,
dev->reserved_blocks = __cpu_to_le32(0);
vol = &dev->vol;
vol->migr_state = 0;
vol->migr_type = 0;
vol->migr_type = MIGR_INIT;
vol->dirty = 0;
vol->curr_migr_unit = 0;
for (i = 0; i < idx; i++) {
@ -2564,7 +2569,7 @@ static int is_resyncing(struct imsm_dev *dev)
if (!dev->vol.migr_state)
return 0;
if (dev->vol.migr_type == 0)
if (dev->vol.migr_type == MIGR_INIT)
return 1;
migr_map = get_imsm_map(dev, 1);
@ -2582,7 +2587,7 @@ static int is_rebuilding(struct imsm_dev *dev)
if (!dev->vol.migr_state)
return 0;
if (dev->vol.migr_type == 0)
if (dev->vol.migr_type != MIGR_REBUILD)
return 0;
migr_map = get_imsm_map(dev, 1);
@ -2648,9 +2653,10 @@ static int imsm_set_array_state(struct active_array *a, int consistent)
} else if (!is_resyncing(dev) && !failed) {
/* mark the start of the init process if nothing is failed */
dprintf("imsm: mark resync start (%llu)\n", a->resync_start);
map->map_state = map_state;
migrate(dev, IMSM_T_STATE_NORMAL,
map->map_state == IMSM_T_STATE_NORMAL);
if (map->map_state == IMSM_T_STATE_NORMAL)
migrate(dev, IMSM_T_STATE_NORMAL, MIGR_REBUILD);
else
migrate(dev, IMSM_T_STATE_NORMAL, MIGR_INIT);
super->updates_pending++;
}
@ -3127,7 +3133,7 @@ static void imsm_process_update(struct supertype *st,
/* mark rebuild */
to_state = imsm_check_degraded(super, dev, failed);
map->map_state = IMSM_T_STATE_DEGRADED;
migrate(dev, to_state, 1);
migrate(dev, to_state, MIGR_REBUILD);
migr_map = get_imsm_map(dev, 1);
set_imsm_ord_tbl_ent(map, u->slot, dl->index);
set_imsm_ord_tbl_ent(migr_map, u->slot, dl->index | IMSM_ORD_REBUILD);