diff options
Diffstat (limited to 'super-intel.c')
-rw-r--r-- | super-intel.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/super-intel.c b/super-intel.c index f0377b8..159ae4a 100644 --- a/super-intel.c +++ b/super-intel.c @@ -654,7 +654,7 @@ static __u64 blocks_per_migr_unit(struct imsm_dev *dev); static void print_imsm_dev(struct imsm_dev *dev, char *uuid, int disk_idx) { __u64 sz; - int slot; + int slot, i; struct imsm_map *map = get_imsm_map(dev, 0); __u32 ord; @@ -663,6 +663,12 @@ static void print_imsm_dev(struct imsm_dev *dev, char *uuid, int disk_idx) printf(" UUID : %s\n", uuid); printf(" RAID Level : %d\n", get_imsm_raid_level(map)); printf(" Members : %d\n", map->num_members); + printf(" Slots : ["); + for (i = 0; i < map->num_members; i++) { + ord = get_imsm_ord_tbl_ent(dev, i); + printf("%s", ord & IMSM_ORD_REBUILD ? "_" : "U"); + } + printf("]\n"); slot = get_imsm_disk_slot(map, disk_idx); if (slot >= 0) { ord = get_imsm_ord_tbl_ent(dev, slot); @@ -4055,6 +4061,16 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, return 0; } +static int default_chunk_imsm(struct supertype *st) +{ + struct intel_super *super = st->sb; + + if (!super->orom) + return 0; + + return imsm_orom_default_chunk(super->orom); +} + static void handle_missing(struct intel_super *super, struct imsm_dev *dev); static int kill_subarray_imsm(struct supertype *st) @@ -4570,6 +4586,7 @@ static int imsm_set_array_state(struct active_array *a, int consistent) dprintf("imsm: mark resync done\n"); end_migration(dev, map_state); super->updates_pending++; + a->last_checkpoint = 0; } } else if (!is_resyncing(dev) && !failed) { /* mark the start of the init process if nothing is failed */ @@ -4583,14 +4600,11 @@ static int imsm_set_array_state(struct active_array *a, int consistent) /* check if we can update curr_migr_unit from resync_start, recovery_start */ blocks_per_unit = blocks_per_migr_unit(dev); - if (blocks_per_unit && failed <= 1) { + if (blocks_per_unit) { __u32 units32; __u64 units; - if (migr_type(dev) == MIGR_REBUILD) - units = min_recovery_start(&a->info) / blocks_per_unit; - else - units = a->info.resync_start / blocks_per_unit; + units = a->last_checkpoint / blocks_per_unit; units32 = units; /* check that we did not overflow 32-bits, and that @@ -4662,17 +4676,20 @@ static void imsm_set_disk(struct active_array *a, int n, int state) map = get_imsm_map(dev, 0); map->failed_disk_num = ~0; super->updates_pending++; + a->last_checkpoint = 0; } else if (map_state == IMSM_T_STATE_DEGRADED && map->map_state != map_state && !dev->vol.migr_state) { dprintf("imsm: mark degraded\n"); map->map_state = map_state; super->updates_pending++; + a->last_checkpoint = 0; } else if (map_state == IMSM_T_STATE_FAILED && map->map_state != map_state) { dprintf("imsm: mark failed\n"); end_migration(dev, map_state); super->updates_pending++; + a->last_checkpoint = 0; } } @@ -5486,6 +5503,7 @@ struct superswitch super_imsm = { .brief_detail_super = brief_detail_super_imsm, .write_init_super = write_init_super_imsm, .validate_geometry = validate_geometry_imsm, + .default_chunk = default_chunk_imsm, .add_to_super = add_to_super_imsm, .detail_platform = detail_platform_imsm, .kill_subarray = kill_subarray_imsm, |