659
675
/* A device can have 2 maps if it is in the middle of a migration.
660
676
* If second_map is:
661
* 0 - we return the first map
662
* 1 - we return the second map if it exists, else NULL
663
* -1 - we return the second map if it exists, else the first
677
* MAP_0 - we return the first map
678
* MAP_1 - we return the second map if it exists, else NULL
679
* MAP_X - we return the second map if it exists, else the first
665
681
struct imsm_map *map = &dev->vol.map[0];
667
if (second_map == 1 && !dev->vol.migr_state)
669
else if (second_map == 1 ||
670
(second_map < 0 && dev->vol.migr_state)) {
673
return ptr + sizeof_imsm_map(map);
682
struct imsm_map *map2 = NULL;
684
if (dev->vol.migr_state)
685
map2 = (void *)map + sizeof_imsm_map(map);
687
switch (second_map) {
921
957
return (disk->status & FAILED_DISK) == FAILED_DISK;
960
/* try to determine how much space is reserved for metadata from
961
* the last get_extents() entry on the smallest active disk,
962
* otherwise fallback to the default
964
static __u32 imsm_min_reserved_sectors(struct intel_super *super)
968
__u32 min_active, remainder;
969
__u32 rv = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
970
struct dl *dl, *dl_min = NULL;
976
for (dl = super->disks; dl; dl = dl->next) {
979
if (dl->disk.total_blocks < min_active || min_active == 0) {
981
min_active = dl->disk.total_blocks;
987
/* find last lba used by subarrays on the smallest active disk */
988
e = get_extents(super, dl_min);
991
for (i = 0; e[i].size; i++)
994
remainder = min_active - e[i].start;
997
/* to give priority to recovery we should not require full
998
IMSM_RESERVED_SECTORS from the spare */
999
rv = MPB_SECTOR_CNT + NUM_BLOCKS_DIRTY_STRIPE_REGION;
1001
/* if real reservation is smaller use that value */
1002
return (remainder < rv) ? remainder : rv;
924
1005
/* Return minimum size of a spare that can be used in this array*/
925
1006
static unsigned long long min_acceptable_spare_size_imsm(struct supertype *st)
1045
1130
printf("idle\n");
1046
1131
printf(" Map State : %s", map_state_str[map->map_state]);
1047
1132
if (dev->vol.migr_state) {
1048
struct imsm_map *map = get_imsm_map(dev, 1);
1133
struct imsm_map *map = get_imsm_map(dev, MAP_1);
1050
1135
printf(" <-- %s", map_state_str[map->map_state]);
1051
printf("\n Checkpoint : %u (%llu)",
1052
__le32_to_cpu(dev->vol.curr_migr_unit),
1053
(unsigned long long)blocks_per_migr_unit(super, dev));
1136
printf("\n Checkpoint : %u ",
1137
__le32_to_cpu(dev->vol.curr_migr_unit));
1138
if ((is_gen_migration(dev)) && ((slot > 1) || (slot < 0)))
1141
printf("(%llu)", (unsigned long long)
1142
blocks_per_migr_unit(super, dev));
1056
1145
printf(" Dirty State : %s\n", dev->vol.dirty ? "dirty" : "clean");
1059
static void print_imsm_disk(struct imsm_super *mpb, int index, __u32 reserved)
1148
static void print_imsm_disk(struct imsm_disk *disk, int index, __u32 reserved)
1061
struct imsm_disk *disk = __get_imsm_disk(mpb, index);
1062
1150
char str[MAX_RAID_SERIAL_LEN + 1];
1065
if (index < 0 || !disk)
1153
if (index < -1 || !disk)
1069
1157
snprintf(str, MAX_RAID_SERIAL_LEN + 1, "%s", disk->serial);
1070
printf(" Disk%02d Serial : %s\n", index, str);
1159
printf(" Disk%02d Serial : %s\n", index, str);
1161
printf(" Disk Serial : %s\n", str);
1071
1162
printf(" State :%s%s%s\n", is_spare(disk) ? " spare" : "",
1072
1163
is_configured(disk) ? " active" : "",
1073
1164
is_failed(disk) ? " failed" : "");
1273
1373
for (i = 0; i < mpb->num_disks; i++) {
1274
1374
if (i == super->disks->index)
1276
print_imsm_disk(mpb, i, reserved);
1278
for (dl = super->disks ; dl; dl = dl->next) {
1279
struct imsm_disk *disk;
1280
char str[MAX_RAID_SERIAL_LEN + 1];
1288
snprintf(str, MAX_RAID_SERIAL_LEN + 1, "%s", disk->serial);
1289
printf(" Disk Serial : %s\n", str);
1290
printf(" State :%s%s%s\n", is_spare(disk) ? " spare" : "",
1291
is_configured(disk) ? " active" : "",
1292
is_failed(disk) ? " failed" : "");
1293
printf(" Id : %08x\n", __le32_to_cpu(disk->scsi_id));
1294
sz = __le32_to_cpu(disk->total_blocks) - reserved;
1295
printf(" Usable Size : %llu%s\n", (unsigned long long)sz,
1296
human_size(sz * 512));
1376
print_imsm_disk(__get_imsm_disk(mpb, i), i, reserved);
1379
for (dl = super->disks; dl; dl = dl->next)
1380
if (dl->index == -1)
1381
print_imsm_disk(&dl->disk, -1, reserved);
1299
1383
examine_migr_rec_imsm(super);
2031
2130
int retval = -1;
2132
struct imsm_dev *dev;
2133
struct imsm_map *map = NULL;
2136
/* find map under migration */
2137
dev = imsm_get_device_during_migration(super);
2138
/* nothing to load,no migration in progress?
2142
map = get_imsm_map(dev, MAP_0);
2035
2145
for (sd = info->devs ; sd ; sd = sd->next) {
2146
/* skip spare and failed disks
2148
if (sd->disk.raid_disk < 0)
2036
2150
/* read only from one of the first two slots */
2037
if ((sd->disk.raid_disk > 1) ||
2038
(sd->disk.raid_disk < 0))
2152
slot = get_imsm_disk_slot(map,
2153
sd->disk.raid_disk);
2154
if ((map == NULL) || (slot > 1) || (slot < 0))
2040
2157
sprintf(nm, "%d:%d", sd->disk.major, sd->disk.minor);
2041
2158
fd = dev_open(nm, O_RDONLY);
2132
2255
struct imsm_update_general_migration_checkpoint *u;
2256
struct imsm_dev *dev;
2257
struct imsm_map *map = NULL;
2259
/* find map under migration */
2260
dev = imsm_get_device_during_migration(super);
2261
/* if no migration, write buffer anyway to clear migr_record
2262
* on disk based on first available device
2265
dev = get_imsm_dev(super, super->current_vol < 0 ? 0 :
2266
super->current_vol);
2268
map = get_imsm_map(dev, MAP_0);
2134
2270
for (sd = super->disks ; sd ; sd = sd->next) {
2273
/* skip failed and spare devices */
2135
2276
/* write to 2 first slots only */
2136
if ((sd->index < 0) || (sd->index > 1))
2278
slot = get_imsm_disk_slot(map, sd->index);
2279
if ((map == NULL) || (slot > 1) || (slot < 0))
2138
2282
sprintf(nm, "%d:%d", sd->major, sd->minor);
2139
2283
fd = dev_open(nm, O_RDWR);
2142
2286
get_dev_size(fd, NULL, &dsize);
2143
if (lseek64(fd, dsize - 512, SEEK_SET) < 0) {
2287
if (lseek64(fd, dsize - MIGR_REC_POSITION, SEEK_SET) < 0) {
2144
2288
fprintf(stderr,
2145
2289
Name ": Cannot seek to anchor block: %s\n",
2146
2290
strerror(errno));
2149
if (write(fd, super->migr_rec_buf, 512) != 512) {
2293
if (write(fd, super->migr_rec_buf, MIGR_REC_BUF_SIZE) !=
2294
MIGR_REC_BUF_SIZE) {
2150
2295
fprintf(stderr,
2151
2296
Name ": Cannot write migr record block: %s\n",
2152
2297
strerror(errno));
2185
2330
#endif /* MDASSEMBLE */
2332
/* spare/missing disks activations are not allowe when
2333
* array/container performs reshape operation, because
2334
* all arrays in container works on the same disks set
2336
int imsm_reshape_blocks_arrays_changes(struct intel_super *super)
2339
struct intel_dev *i_dev;
2340
struct imsm_dev *dev;
2342
/* check whole container
2344
for (i_dev = super->devlist; i_dev; i_dev = i_dev->next) {
2346
if (is_gen_migration(dev)) {
2347
/* No repair during any migration in container
2187
2356
static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info, char *dmap)
2189
2358
struct intel_super *super = st->sb;
2190
2359
struct migr_record *migr_rec = super->migr_rec;
2191
2360
struct imsm_dev *dev = get_imsm_dev(super, super->current_vol);
2192
struct imsm_map *map = get_imsm_map(dev, 0);
2193
struct imsm_map *prev_map = get_imsm_map(dev, 1);
2361
struct imsm_map *map = get_imsm_map(dev, MAP_0);
2362
struct imsm_map *prev_map = get_imsm_map(dev, MAP_1);
2194
2363
struct imsm_map *map_to_analyse = map;
2385
static __u8 imsm_check_degraded(struct intel_super *super, struct imsm_dev *dev, int failed);
2386
static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev);
2561
static __u8 imsm_check_degraded(struct intel_super *super, struct imsm_dev *dev,
2562
int failed, int look_in_map);
2564
static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev,
2569
static void manage_second_map(struct intel_super *super, struct imsm_dev *dev)
2571
if (is_gen_migration(dev)) {
2574
struct imsm_map *map2 = get_imsm_map(dev, MAP_1);
2576
failed = imsm_count_failed(super, dev, MAP_1);
2577
map_state = imsm_check_degraded(super, dev, failed, MAP_1);
2578
if (map2->map_state != map_state) {
2579
map2->map_state = map_state;
2580
super->updates_pending++;
2388
2586
static struct imsm_disk *get_imsm_missing(struct intel_super *super, __u8 index)
2443
2642
struct imsm_map *map;
2446
failed = imsm_count_failed(super, dev);
2447
state = imsm_check_degraded(super, dev, failed);
2448
map = get_imsm_map(dev, dev->vol.migr_state);
2645
failed = imsm_count_failed(super, dev, MAP_0);
2646
state = imsm_check_degraded(super, dev, failed, MAP_0);
2647
map = get_imsm_map(dev, MAP_0);
2450
2649
/* any newly missing disks?
2451
2650
* (catches single-degraded vs double-degraded)
2453
2652
for (j = 0; j < map->num_members; j++) {
2454
__u32 ord = get_imsm_ord_tbl_ent(dev, i, -1);
2653
__u32 ord = get_imsm_ord_tbl_ent(dev, j, MAP_0);
2455
2654
__u32 idx = ord_to_idx(ord);
2457
2656
if (!(ord & IMSM_ORD_REBUILD) &&
2593
2792
mpb = super->anchor;
2595
if (strcmp(update, "uuid") == 0 && uuid_set && !info->update_private)
2597
else if (strcmp(update, "uuid") == 0 && uuid_set && info->update_private) {
2598
mpb->orig_family_num = *((__u32 *) info->update_private);
2600
} else if (strcmp(update, "uuid") == 0) {
2601
__u32 *new_family = malloc(sizeof(*new_family));
2603
/* update orig_family_number with the incoming random
2604
* data, report the new effective uuid, and store the
2605
* new orig_family_num for future updates.
2794
if (strcmp(update, "uuid") == 0) {
2795
/* We take this to mean that the family_num should be updated.
2796
* However that is much smaller than the uuid so we cannot really
2797
* allow an explicit uuid to be given. And it is hard to reliably
2799
* So if !uuid_set we know the current uuid is random and just used
2800
* the first 'int' and copy it to the other 3 positions.
2801
* Otherwise we require the 4 'int's to be the same as would be the
2802
* case if we are using a random uuid. So an explicit uuid will be
2803
* accepted as long as all for ints are the same... which shouldn't hurt
2608
memcpy(&mpb->orig_family_num, info->uuid, sizeof(__u32));
2609
uuid_from_super_imsm(st, info->uuid);
2610
*new_family = mpb->orig_family_num;
2611
info->update_private = new_family;
2806
info->uuid[1] = info->uuid[2] = info->uuid[3] = info->uuid[0];
2809
if (info->uuid[0] != info->uuid[1] ||
2810
info->uuid[1] != info->uuid[2] ||
2811
info->uuid[2] != info->uuid[3])
2817
mpb->orig_family_num = info->uuid[0];
2614
2818
} else if (strcmp(update, "assemble") == 0)
3017
3223
* FIXME add support for raid-level-migration
3019
for (i = 0; i < prev->num_members; i++)
3020
for (j = 0; j < map->num_members; j++)
3021
/* during online capacity expansion
3022
* disks position can be changed if takeover is used
3024
if (ord_to_idx(map->disk_ord_tbl[j]) ==
3025
ord_to_idx(prev->disk_ord_tbl[i])) {
3026
map->disk_ord_tbl[j] |= prev->disk_ord_tbl[i];
3225
if ((map_state != map->map_state) && (is_gen_migration(dev) == 0) &&
3226
(prev->map_state != IMSM_T_STATE_UNINITIALIZED)) {
3227
/* when final map state is other than expected
3228
* merge maps (not for migration)
3232
for (i = 0; i < prev->num_members; i++)
3233
for (j = 0; j < map->num_members; j++)
3234
/* during online capacity expansion
3235
* disks position can be changed
3236
* if takeover is used
3238
if (ord_to_idx(map->disk_ord_tbl[j]) ==
3239
ord_to_idx(prev->disk_ord_tbl[i])) {
3240
map->disk_ord_tbl[j] |=
3241
prev->disk_ord_tbl[i];
3244
failed = imsm_count_failed(super, dev, MAP_0);
3245
map_state = imsm_check_degraded(super, dev, failed, MAP_0);
3030
3248
dev->vol.migr_state = 0;
3031
dev->vol.migr_type = 0;
3249
set_migr_type(dev, 0);
3032
3250
dev->vol.curr_migr_unit = 0;
3033
3251
map->map_state = map_state;
4128
4351
memset(mpb_new + size_old, 0, size_round - size_old);
4130
4353
super->current_vol = idx;
4131
/* when creating the first raid device in this container set num_disks
4132
* to zero, i.e. delete this spare and add raid member devices in
4133
* add_to_super_imsm_volume()
4355
/* handle 'failed_disks' by either:
4356
* a) create dummy disk entries in the table if this the first
4357
* volume in the array. We add them here as this is the only
4358
* opportunity to add them. add_to_super_imsm_volume()
4359
* handles the non-failed disks and continues incrementing
4361
* b) validate that 'failed_disks' matches the current number
4362
* of missing disks if the container is populated
4135
if (super->current_vol == 0)
4364
if (super->current_vol == 0) {
4136
4365
mpb->num_disks = 0;
4366
for (i = 0; i < info->failed_disks; i++) {
4367
struct imsm_disk *disk;
4370
disk = __get_imsm_disk(mpb, i);
4371
disk->status = CONFIGURED_DISK | FAILED_DISK;
4372
disk->scsi_id = __cpu_to_le32(~(__u32)0);
4373
snprintf((char *) disk->serial, MAX_RAID_SERIAL_LEN,
4376
find_missing(super);
4381
for (d = super->missing; d; d = d->next)
4383
if (info->failed_disks > missing) {
4384
fprintf(stderr, Name": unable to add 'missing' disk to container\n");
4138
4389
if (!check_name(super, name, 0))
4322
4577
/* Check the device has not already been added */
4323
4578
slot = get_imsm_disk_slot(map, dl->index);
4324
4579
if (slot >= 0 &&
4325
(get_imsm_ord_tbl_ent(dev, slot, -1) & IMSM_ORD_REBUILD) == 0) {
4580
(get_imsm_ord_tbl_ent(dev, slot, MAP_X) & IMSM_ORD_REBUILD) == 0) {
4326
4581
fprintf(stderr, Name ": %s has been included in this array twice\n",
4330
set_imsm_ord_tbl_ent(map, dk->number, dl->index);
4585
set_imsm_ord_tbl_ent(map, dk->raid_disk, dl->index);
4331
4586
dl->disk.status = CONFIGURED_DISK;
4588
/* update size of 'missing' disks to be at least as large as the
4589
* largest acitve member (we only have dummy missing disks when
4590
* creating the first volume)
4592
if (super->current_vol == 0) {
4593
for (df = super->missing; df; df = df->next) {
4594
if (dl->disk.total_blocks > df->disk.total_blocks)
4595
df->disk.total_blocks = dl->disk.total_blocks;
4596
_disk = __get_imsm_disk(mpb, df->index);
4601
/* refresh unset/failed slots to point to valid 'missing' entries */
4602
for (df = super->missing; df; df = df->next)
4603
for (slot = 0; slot < mpb->num_disks; slot++) {
4604
__u32 ord = get_imsm_ord_tbl_ent(dev, slot, MAP_X);
4606
if ((ord & IMSM_ORD_REBUILD) == 0)
4608
set_imsm_ord_tbl_ent(map, slot, df->index | IMSM_ORD_REBUILD);
4609
if (is_gen_migration(dev)) {
4610
struct imsm_map *map2 = get_imsm_map(dev,
4612
int slot2 = get_imsm_disk_slot(map2, df->index);
4613
if ((slot2 < map2->num_members) &&
4615
__u32 ord2 = get_imsm_ord_tbl_ent(dev,
4618
if ((unsigned)df->index ==
4620
set_imsm_ord_tbl_ent(map2,
4626
dprintf("set slot:%d to missing disk:%d\n", slot, df->index);
4333
4630
/* if we are creating the first raid device update the family number */
4334
4631
if (super->current_vol == 0) {
4336
4633
struct imsm_dev *_dev = __get_imsm_dev(mpb, 0);
4337
struct imsm_disk *_disk = __get_imsm_disk(mpb, dl->index);
4635
_disk = __get_imsm_disk(mpb, dl->index);
4339
4636
if (!_dev || !_disk) {
4340
4637
fprintf(stderr, Name ": BUG mpb setup error\n");
4347
4644
mpb->family_num = __cpu_to_le32(sum);
4348
4645
mpb->orig_family_num = mpb->family_num;
4647
super->current_disk = dl;
4652
* Function marks disk as spare and restores disk serial
4653
* in case it was previously marked as failed by takeover operation
4655
* -1 : critical error
4656
* 0 : disk is marked as spare but serial is not set
4659
int mark_spare(struct dl *disk)
4661
__u8 serial[MAX_RAID_SERIAL_LEN];
4668
if (!imsm_read_serial(disk->fd, NULL, serial)) {
4669
/* Restore disk serial number, because takeover marks disk
4670
* as failed and adds to serial ':0' before it becomes
4673
serialcpy(disk->serial, serial);
4674
serialcpy(disk->disk.serial, serial);
4677
disk->disk.status = SPARE_DISK;
4355
4683
static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
4356
4684
int fd, char *devname)
5242
static int imsm_default_chunk(const struct imsm_orom *orom)
5244
/* up to 512 if the plaform supports it, otherwise the platform max.
5245
* 128 if no platform detected
5247
int fs = max(7, orom ? fls(orom->sss) : 0);
5249
return min(512, (1 << fs));
4916
5252
#define pr_vrb(fmt, arg...) (void) (verbose && fprintf(stderr, Name fmt, ##arg))
4918
* validate volume parameters with OROM/EFI capabilities
4921
5254
validate_geometry_imsm_orom(struct intel_super *super, int level, int layout,
4922
5255
int raiddisks, int *chunk, int verbose)
4927
/* validate container capabilities */
4928
if (super->orom && raiddisks > super->orom->tds) {
4930
fprintf(stderr, Name ": %d exceeds maximum number of"
4931
" platform supported disks: %d\n",
4932
raiddisks, super->orom->tds);
5257
/* check/set platform and metadata limits/defaults */
5258
if (super->orom && raiddisks > super->orom->dpa) {
5259
pr_vrb(": platform supports a maximum of %d disks per array\n",
4936
5264
/* capabilities of OROM tested - copied from validate_geometry_imsm_volume */
4937
if (super->orom && (!is_raid_level_supported(super->orom, level,
5265
if (!is_raid_level_supported(super->orom, level, raiddisks)) {
4939
5266
pr_vrb(": platform does not support raid%d with %d disk%s\n",
4940
5267
level, raiddisks, raiddisks > 1 ? "s" : "");
4943
if (super->orom && level != 1) {
4944
if (chunk && (*chunk == 0 || *chunk == UnSet))
4945
*chunk = imsm_orom_default_chunk(super->orom);
4946
else if (chunk && !imsm_orom_has_chunk(super->orom, *chunk)) {
4947
pr_vrb(": platform does not support a chunk size of: "
5271
if (chunk && (*chunk == 0 || *chunk == UnSet))
5272
*chunk = imsm_default_chunk(super->orom);
5274
if (super->orom && chunk && !imsm_orom_has_chunk(super->orom, *chunk)) {
5275
pr_vrb(": platform does not support a chunk size of: "
4952
5280
if (layout != imsm_level_to_layout(level)) {
4953
5281
if (level == 5)
4954
5282
pr_vrb(": imsm raid 5 only supports the left-asymmetric layout\n");
5515
5885
struct imsm_super *mpb = super->anchor;
5516
5886
struct mdinfo *rest = NULL;
5517
5887
unsigned int i;
5520
5890
int spare_disks = 0;
5522
5892
/* do not assemble arrays when not all attributes are supported */
5523
5893
if (imsm_check_attributes(mpb->attributes) == 0) {
5524
fprintf(stderr, Name ": IMSM metadata loading not allowed "
5525
"due to attributes incompatibility.\n");
5895
fprintf(stderr, Name ": Unsupported attributes in IMSM metadata."
5896
"Arrays activation is blocked.\n");
5529
5899
/* check for bad blocks */
5530
if (imsm_bbm_log_size(super->anchor))
5900
if (imsm_bbm_log_size(super->anchor)) {
5901
fprintf(stderr, Name ": BBM log found in IMSM metadata."
5902
"Arrays activation is blocked.\n");
5533
5907
/* count spare devices, not used in maps
5946
this = malloc(sizeof(*this));
5948
fprintf(stderr, Name ": failed to allocate %zu bytes\n",
5953
super->current_vol = i;
5954
getinfo_super_imsm_volume(st, this, NULL);
5569
5957
chunk = __le16_to_cpu(map->blocks_per_strip) >> 1;
5958
/* mdadm does not support all metadata features- set the bit in all arrays state */
5571
5959
if (!validate_geometry_imsm_orom(super,
5572
5960
get_imsm_raid_level(map), /* RAID level */
5573
5961
imsm_level_to_layout(get_imsm_raid_level(map)),
5574
5962
map->num_members, /* raid disks */
5576
5964
1 /* verbose */)) {
5577
fprintf(stderr, Name ": RAID gemetry validation failed. "
5578
"Cannot proceed with the action(s).\n");
5581
#endif /* MDASSEMBLE */
5582
this = malloc(sizeof(*this));
5584
fprintf(stderr, Name ": failed to allocate %zu bytes\n",
5589
super->current_vol = i;
5590
getinfo_super_imsm_volume(st, this, NULL);
5965
fprintf(stderr, Name ": IMSM RAID geometry validation"
5966
" failed. Array %s activation is blocked.\n",
5968
this->array.state |=
5969
(1<<MD_SB_BLOCK_CONTAINER_RESHAPE) |
5970
(1<<MD_SB_BLOCK_VOLUME);
5974
/* if array has bad blocks, set suitable bit in all arrays state */
5976
this->array.state |=
5977
(1<<MD_SB_BLOCK_CONTAINER_RESHAPE) |
5978
(1<<MD_SB_BLOCK_VOLUME);
5592
5980
for (slot = 0 ; slot < map->num_members; slot++) {
5593
5981
unsigned long long recovery_start;
5594
5982
struct mdinfo *info_d;
5751
6138
return map->map_state;
5754
static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev)
6141
static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev,
5757
6145
int failed = 0;
5758
6146
struct imsm_disk *disk;
5759
struct imsm_map *map = get_imsm_map(dev, 0);
5760
struct imsm_map *prev = get_imsm_map(dev, dev->vol.migr_state);
6147
struct imsm_map *map = get_imsm_map(dev, MAP_0);
6148
struct imsm_map *prev = get_imsm_map(dev, MAP_1);
6149
struct imsm_map *map_for_loop;
5764
6154
/* at the beginning of migration we set IMSM_ORD_REBUILD on
5765
6155
* disks that are being rebuilt. New failures are recorded to
5766
6156
* map[0]. So we look through all the disks we started with and
5767
6157
* see if any failures are still present, or if any new ones
5770
* FIXME add support for online capacity expansion and
5771
* raid-level-migration
5773
for (i = 0; i < prev->num_members; i++) {
5774
ord = __le32_to_cpu(prev->disk_ord_tbl[i]);
5775
ord |= __le32_to_cpu(map->disk_ord_tbl[i]);
5776
idx = ord_to_idx(ord);
5778
disk = get_imsm_disk(super, idx);
5779
if (!disk || is_failed(disk) || ord & IMSM_ORD_REBUILD)
6161
if (prev && (map->num_members < prev->num_members))
6162
map_for_loop = prev;
6164
for (i = 0; i < map_for_loop->num_members; i++) {
6166
/* when MAP_X is passed both maps failures are counted
6169
((look_in_map == MAP_1) || (look_in_map == MAP_X)) &&
6170
(i < prev->num_members)) {
6171
ord = __le32_to_cpu(prev->disk_ord_tbl[i]);
6172
idx_1 = ord_to_idx(ord);
6174
disk = get_imsm_disk(super, idx_1);
6175
if (!disk || is_failed(disk) || ord & IMSM_ORD_REBUILD)
6178
if (((look_in_map == MAP_0) || (look_in_map == MAP_X)) &&
6179
(i < map->num_members)) {
6180
ord = __le32_to_cpu(map->disk_ord_tbl[i]);
6181
idx = ord_to_idx(ord);
6184
disk = get_imsm_disk(super, idx);
6185
if (!disk || is_failed(disk) ||
6186
ord & IMSM_ORD_REBUILD)
5842
6253
if (is_failed(disk) && (ord & IMSM_ORD_REBUILD))
6256
memcpy(buf, disk->serial, MAX_RAID_SERIAL_LEN);
6257
buf[MAX_RAID_SERIAL_LEN] = '\000';
6259
if ((len = strlen(buf)) >= MAX_RAID_SERIAL_LEN)
6260
shift = len - MAX_RAID_SERIAL_LEN + 1;
6261
strncpy((char *)disk->serial, &buf[shift], MAX_RAID_SERIAL_LEN);
5845
6263
disk->status |= FAILED_DISK;
5846
6264
set_imsm_ord_tbl_ent(map, slot, idx | IMSM_ORD_REBUILD);
6265
/* mark failures in second map if second map exists and this disk
6267
* This is valid for migration, initialization and rebuild
6269
if (dev->vol.migr_state) {
6270
struct imsm_map *map2 = get_imsm_map(dev, MAP_1);
6271
int slot2 = get_imsm_disk_slot(map2, idx);
6273
if ((slot2 < map2->num_members) &&
6275
set_imsm_ord_tbl_ent(map2, slot2,
6276
idx | IMSM_ORD_REBUILD);
5847
6278
if (map->failed_disk_num == 0xff)
5848
6279
map->failed_disk_num = slot;
5863
6294
static void handle_missing(struct intel_super *super, struct imsm_dev *dev)
5869
6298
if (!super->missing)
5871
failed = imsm_count_failed(super, dev);
5872
map_state = imsm_check_degraded(super, dev, failed);
5874
6301
dprintf("imsm: mark missing\n");
5875
end_migration(dev, map_state);
6302
/* end process for initialization and rebuild only
6304
if (is_gen_migration(dev) == 0) {
6308
failed = imsm_count_failed(super, dev, MAP_0);
6309
map_state = imsm_check_degraded(super, dev, failed, MAP_0);
6311
end_migration(dev, super, map_state);
5876
6313
for (dl = super->missing; dl; dl = dl->next)
5877
6314
mark_missing(dev, &dl->disk, dl->index);
5878
6315
super->updates_pending++;
6140
6580
/* check if in_sync */
6141
6581
if (state & DS_INSYNC && ord & IMSM_ORD_REBUILD && is_rebuilding(dev)) {
6142
struct imsm_map *migr_map = get_imsm_map(dev, 1);
6582
struct imsm_map *migr_map = get_imsm_map(dev, MAP_1);
6144
6584
set_imsm_ord_tbl_ent(migr_map, n, ord_to_idx(ord));
6145
6585
super->updates_pending++;
6148
failed = imsm_count_failed(super, dev);
6149
map_state = imsm_check_degraded(super, dev, failed);
6588
failed = imsm_count_failed(super, dev, MAP_0);
6589
map_state = imsm_check_degraded(super, dev, failed, MAP_0);
6151
6591
/* check if recovery complete, newly degraded, or failed */
6152
if (map_state == IMSM_T_STATE_NORMAL && is_rebuilding(dev)) {
6153
end_migration(dev, map_state);
6154
map = get_imsm_map(dev, 0);
6155
map->failed_disk_num = ~0;
6156
super->updates_pending++;
6157
a->last_checkpoint = 0;
6158
} else if (map_state == IMSM_T_STATE_DEGRADED &&
6159
map->map_state != map_state &&
6160
!dev->vol.migr_state) {
6161
dprintf("imsm: mark degraded\n");
6162
map->map_state = map_state;
6163
super->updates_pending++;
6164
a->last_checkpoint = 0;
6165
} else if (map_state == IMSM_T_STATE_FAILED &&
6166
map->map_state != map_state) {
6167
dprintf("imsm: mark failed\n");
6168
end_migration(dev, map_state);
6169
super->updates_pending++;
6170
a->last_checkpoint = 0;
6171
} else if (is_gen_migration(dev)) {
6172
dprintf("imsm: Detected General Migration in state: ");
6173
if (map_state == IMSM_T_STATE_NORMAL) {
6174
end_migration(dev, map_state);
6175
map = get_imsm_map(dev, 0);
6176
map->failed_disk_num = ~0;
6177
dprintf("normal\n");
6179
if (map_state == IMSM_T_STATE_DEGRADED) {
6180
printf("degraded\n");
6181
end_migration(dev, map_state);
6183
dprintf("failed\n");
6185
map->map_state = map_state;
6187
super->updates_pending++;
6592
dprintf("imsm: Detected transition to state ");
6593
switch (map_state) {
6594
case IMSM_T_STATE_NORMAL: /* transition to normal state */
6595
dprintf("normal: ");
6596
if (is_rebuilding(dev)) {
6597
dprintf("while rebuilding");
6598
end_migration(dev, super, map_state);
6599
map = get_imsm_map(dev, MAP_0);
6600
map->failed_disk_num = ~0;
6601
super->updates_pending++;
6602
a->last_checkpoint = 0;
6605
if (is_gen_migration(dev)) {
6606
dprintf("while general migration");
6607
if (a->last_checkpoint >= a->info.component_size)
6608
end_migration(dev, super, map_state);
6610
map->map_state = map_state;
6611
map = get_imsm_map(dev, MAP_0);
6612
map->failed_disk_num = ~0;
6613
super->updates_pending++;
6617
case IMSM_T_STATE_DEGRADED: /* transition to degraded state */
6618
dprintf("degraded: ");
6619
if ((map->map_state != map_state) &&
6620
!dev->vol.migr_state) {
6621
dprintf("mark degraded");
6622
map->map_state = map_state;
6623
super->updates_pending++;
6624
a->last_checkpoint = 0;
6627
if (is_rebuilding(dev)) {
6628
dprintf("while rebuilding.");
6629
if (map->map_state != map_state) {
6630
dprintf(" Map state change");
6631
end_migration(dev, super, map_state);
6632
super->updates_pending++;
6636
if (is_gen_migration(dev)) {
6637
dprintf("while general migration");
6638
if (a->last_checkpoint >= a->info.component_size)
6639
end_migration(dev, super, map_state);
6641
map->map_state = map_state;
6642
manage_second_map(super, dev);
6644
super->updates_pending++;
6647
if (is_initializing(dev)) {
6648
dprintf("while initialization.");
6649
map->map_state = map_state;
6650
super->updates_pending++;
6654
case IMSM_T_STATE_FAILED: /* transition to failed state */
6655
dprintf("failed: ");
6656
if (is_gen_migration(dev)) {
6657
dprintf("while general migration");
6658
map->map_state = map_state;
6659
super->updates_pending++;
6662
if (map->map_state != map_state) {
6663
dprintf("mark failed");
6664
end_migration(dev, super, map_state);
6665
super->updates_pending++;
6666
a->last_checkpoint = 0;
6671
dprintf("state %i\n", map_state);
6191
6677
static int store_imsm_mpb(int fd, struct imsm_super *mpb)
6587
7078
static int disks_overlap(struct intel_super *super, int idx, struct imsm_update_create_array *u)
6589
7080
struct imsm_dev *dev = get_imsm_dev(super, idx);
6590
struct imsm_map *map = get_imsm_map(dev, 0);
6591
struct imsm_map *new_map = get_imsm_map(&u->dev, 0);
7081
struct imsm_map *map = get_imsm_map(dev, MAP_0);
7082
struct imsm_map *new_map = get_imsm_map(&u->dev, MAP_0);
6592
7083
struct disk_info *inf = get_disk_info(u);
6593
7084
struct imsm_disk *disk;
6597
7088
for (i = 0; i < map->num_members; i++) {
6598
disk = get_imsm_disk(super, get_imsm_disk_idx(dev, i, -1));
7089
disk = get_imsm_disk(super, get_imsm_disk_idx(dev, i, MAP_X));
6599
7090
for (j = 0; j < new_map->num_members; j++)
6600
7091
if (serialcmp(disk->serial, inf[j].serial) == 0)
6805
7296
return ret_val;
7299
static int apply_update_activate_spare(struct imsm_update_activate_spare *u,
7300
struct intel_super *super,
7301
struct active_array *active_array)
7303
struct imsm_super *mpb = super->anchor;
7304
struct imsm_dev *dev = get_imsm_dev(super, u->array);
7305
struct imsm_map *map = get_imsm_map(dev, MAP_0);
7306
struct imsm_map *migr_map;
7307
struct active_array *a;
7308
struct imsm_disk *disk;
7315
int second_map_created = 0;
7317
for (; u; u = u->next) {
7318
victim = get_imsm_disk_idx(dev, u->slot, MAP_X);
7323
for (dl = super->disks; dl; dl = dl->next)
7328
fprintf(stderr, "error: imsm_activate_spare passed "
7329
"an unknown disk (index: %d)\n",
7334
/* count failures (excluding rebuilds and the victim)
7335
* to determine map[0] state
7338
for (i = 0; i < map->num_members; i++) {
7341
disk = get_imsm_disk(super,
7342
get_imsm_disk_idx(dev, i, MAP_X));
7343
if (!disk || is_failed(disk))
7347
/* adding a pristine spare, assign a new index */
7348
if (dl->index < 0) {
7349
dl->index = super->anchor->num_disks;
7350
super->anchor->num_disks++;
7353
disk->status |= CONFIGURED_DISK;
7354
disk->status &= ~SPARE_DISK;
7357
to_state = imsm_check_degraded(super, dev, failed, MAP_0);
7358
if (!second_map_created) {
7359
second_map_created = 1;
7360
map->map_state = IMSM_T_STATE_DEGRADED;
7361
migrate(dev, super, to_state, MIGR_REBUILD);
7363
map->map_state = to_state;
7364
migr_map = get_imsm_map(dev, MAP_1);
7365
set_imsm_ord_tbl_ent(map, u->slot, dl->index);
7366
set_imsm_ord_tbl_ent(migr_map, u->slot,
7367
dl->index | IMSM_ORD_REBUILD);
7369
/* update the family_num to mark a new container
7370
* generation, being careful to record the existing
7371
* family_num in orig_family_num to clean up after
7372
* earlier mdadm versions that neglected to set it.
7374
if (mpb->orig_family_num == 0)
7375
mpb->orig_family_num = mpb->family_num;
7376
mpb->family_num += super->random;
7378
/* count arrays using the victim in the metadata */
7380
for (a = active_array; a ; a = a->next) {
7381
dev = get_imsm_dev(super, a->info.container_member);
7382
map = get_imsm_map(dev, MAP_0);
7384
if (get_imsm_disk_slot(map, victim) >= 0)
7388
/* delete the victim if it is no longer being
7394
/* We know that 'manager' isn't touching anything,
7395
* so it is safe to delete
7397
for (dlp = &super->disks; *dlp; dlp = &(*dlp)->next)
7398
if ((*dlp)->index == victim)
7401
/* victim may be on the missing list */
7403
for (dlp = &super->missing; *dlp;
7404
dlp = &(*dlp)->next)
7405
if ((*dlp)->index == victim)
7407
imsm_delete(super, dlp, victim);
6809
7414
static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
6810
7415
struct intel_super *super,
7101
7706
case update_activate_spare: {
7102
7707
struct imsm_update_activate_spare *u = (void *) update->buf;
7103
struct imsm_dev *dev = get_imsm_dev(super, u->array);
7104
struct imsm_map *map = get_imsm_map(dev, 0);
7105
struct imsm_map *migr_map;
7106
struct active_array *a;
7107
struct imsm_disk *disk;
7112
int victim = get_imsm_disk_idx(dev, u->slot, -1);
7115
for (dl = super->disks; dl; dl = dl->next)
7120
fprintf(stderr, "error: imsm_activate_spare passed "
7121
"an unknown disk (index: %d)\n",
7126
super->updates_pending++;
7127
/* count failures (excluding rebuilds and the victim)
7128
* to determine map[0] state
7131
for (i = 0; i < map->num_members; i++) {
7134
disk = get_imsm_disk(super,
7135
get_imsm_disk_idx(dev, i, -1));
7136
if (!disk || is_failed(disk))
7140
/* adding a pristine spare, assign a new index */
7141
if (dl->index < 0) {
7142
dl->index = super->anchor->num_disks;
7143
super->anchor->num_disks++;
7146
disk->status |= CONFIGURED_DISK;
7147
disk->status &= ~SPARE_DISK;
7150
to_state = imsm_check_degraded(super, dev, failed);
7151
map->map_state = IMSM_T_STATE_DEGRADED;
7152
migrate(dev, super, to_state, MIGR_REBUILD);
7153
migr_map = get_imsm_map(dev, 1);
7154
set_imsm_ord_tbl_ent(map, u->slot, dl->index);
7155
set_imsm_ord_tbl_ent(migr_map, u->slot, dl->index | IMSM_ORD_REBUILD);
7157
/* update the family_num to mark a new container
7158
* generation, being careful to record the existing
7159
* family_num in orig_family_num to clean up after
7160
* earlier mdadm versions that neglected to set it.
7162
if (mpb->orig_family_num == 0)
7163
mpb->orig_family_num = mpb->family_num;
7164
mpb->family_num += super->random;
7166
/* count arrays using the victim in the metadata */
7168
for (a = st->arrays; a ; a = a->next) {
7169
dev = get_imsm_dev(super, a->info.container_member);
7170
map = get_imsm_map(dev, 0);
7172
if (get_imsm_disk_slot(map, victim) >= 0)
7176
/* delete the victim if it is no longer being
7182
/* We know that 'manager' isn't touching anything,
7183
* so it is safe to delete
7185
for (dlp = &super->disks; *dlp; dlp = &(*dlp)->next)
7186
if ((*dlp)->index == victim)
7189
/* victim may be on the missing list */
7191
for (dlp = &super->missing; *dlp; dlp = &(*dlp)->next)
7192
if ((*dlp)->index == victim)
7194
imsm_delete(super, dlp, victim);
7708
if (apply_update_activate_spare(u, super, st->arrays))
7709
super->updates_pending++;
7198
7712
case update_create_array: {
7673
8187
for (i = 0; i < mpb->num_raid_devs; i++) {
7674
8188
dev = get_imsm_dev(super, i);
7675
map = get_imsm_map(dev, 0);
8189
map = get_imsm_map(dev, MAP_0);
7676
8190
num_members = map->num_members;
7677
8191
for (j = 0; j < num_members; j++) {
7678
8192
/* update ord entries being careful not to propagate
7679
8193
* ord-flags to the first map
7681
ord = get_imsm_ord_tbl_ent(dev, j, -1);
8195
ord = get_imsm_ord_tbl_ent(dev, j, MAP_X);
7683
8197
if (ord_to_idx(ord) <= index)
7686
map = get_imsm_map(dev, 0);
8200
map = get_imsm_map(dev, MAP_0);
7687
8201
set_imsm_ord_tbl_ent(map, j, ord_to_idx(ord - 1));
7688
map = get_imsm_map(dev, 1);
8202
map = get_imsm_map(dev, MAP_1);
7690
8204
set_imsm_ord_tbl_ent(map, j, ord - 1);
7703
8217
#endif /* MDASSEMBLE */
8219
static void close_targets(int *targets, int new_disks)
8226
for (i = 0; i < new_disks; i++) {
8227
if (targets[i] >= 0) {
8234
static int imsm_get_allowed_degradation(int level, int raid_disks,
8235
struct intel_super *super,
8236
struct imsm_dev *dev)
8241
struct imsm_map *map;
8244
ret_val = raid_disks/2;
8245
/* check map if all disks pairs not failed
8248
map = get_imsm_map(dev, MAP_0);
8249
for (i = 0; i < ret_val; i++) {
8250
int degradation = 0;
8251
if (get_imsm_disk(super, i) == NULL)
8253
if (get_imsm_disk(super, i + 1) == NULL)
8255
if (degradation == 2)
8258
map = get_imsm_map(dev, MAP_1);
8259
/* if there is no second map
8260
* result can be returned
8264
/* check degradation in second map
8266
for (i = 0; i < ret_val; i++) {
8267
int degradation = 0;
8268
if (get_imsm_disk(super, i) == NULL)
8270
if (get_imsm_disk(super, i + 1) == NULL)
8272
if (degradation == 2)
7704
8287
/*******************************************************************************
7705
8288
* Function: open_backup_targets
7706
8289
* Description: Function opens file descriptors for all devices given in