]> git.ipfire.org Git - thirdparty/mdadm.git/blob - super-intel.c
Check all member devices in enough_fd
[thirdparty/mdadm.git] / super-intel.c
1 /*
2 * mdadm - Intel(R) Matrix Storage Manager Support
3 *
4 * Copyright (C) 2002-2008 Intel Corporation
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #define HAVE_STDINT_H 1
21 #include "mdadm.h"
22 #include "mdmon.h"
23 #include "sha1.h"
24 #include "platform-intel.h"
25 #include <values.h>
26 #include <scsi/sg.h>
27 #include <ctype.h>
28 #include <dirent.h>
29
30 /* MPB == Metadata Parameter Block */
31 #define MPB_SIGNATURE "Intel Raid ISM Cfg Sig. "
32 #define MPB_SIG_LEN (strlen(MPB_SIGNATURE))
33 #define MPB_VERSION_RAID0 "1.0.00"
34 #define MPB_VERSION_RAID1 "1.1.00"
35 #define MPB_VERSION_MANY_VOLUMES_PER_ARRAY "1.2.00"
36 #define MPB_VERSION_3OR4_DISK_ARRAY "1.2.01"
37 #define MPB_VERSION_RAID5 "1.2.02"
38 #define MPB_VERSION_5OR6_DISK_ARRAY "1.2.04"
39 #define MPB_VERSION_CNG "1.2.06"
40 #define MPB_VERSION_ATTRIBS "1.3.00"
41 #define MAX_SIGNATURE_LENGTH 32
42 #define MAX_RAID_SERIAL_LEN 16
43
44 #define MPB_ATTRIB_CHECKSUM_VERIFY __cpu_to_le32(0x80000000)
45 #define MPB_ATTRIB_PM __cpu_to_le32(0x40000000)
46 #define MPB_ATTRIB_2TB __cpu_to_le32(0x20000000)
47 #define MPB_ATTRIB_RAID0 __cpu_to_le32(0x00000001)
48 #define MPB_ATTRIB_RAID1 __cpu_to_le32(0x00000002)
49 #define MPB_ATTRIB_RAID10 __cpu_to_le32(0x00000004)
50 #define MPB_ATTRIB_RAID1E __cpu_to_le32(0x00000008)
51 #define MPB_ATTRIB_RAID5 __cpu_to_le32(0x00000010)
52 #define MPB_ATTRIB_RAIDCNG __cpu_to_le32(0x00000020)
53
54 #define MPB_SECTOR_CNT 418
55 #define IMSM_RESERVED_SECTORS 4096
56 #define SECT_PER_MB_SHIFT 11
57
58 /* Disk configuration info. */
59 #define IMSM_MAX_DEVICES 255
60 struct imsm_disk {
61 __u8 serial[MAX_RAID_SERIAL_LEN];/* 0xD8 - 0xE7 ascii serial number */
62 __u32 total_blocks; /* 0xE8 - 0xEB total blocks */
63 __u32 scsi_id; /* 0xEC - 0xEF scsi ID */
64 #define SPARE_DISK __cpu_to_le32(0x01) /* Spare */
65 #define CONFIGURED_DISK __cpu_to_le32(0x02) /* Member of some RaidDev */
66 #define FAILED_DISK __cpu_to_le32(0x04) /* Permanent failure */
67 __u32 status; /* 0xF0 - 0xF3 */
68 __u32 owner_cfg_num; /* which config 0,1,2... owns this disk */
69 #define IMSM_DISK_FILLERS 4
70 __u32 filler[IMSM_DISK_FILLERS]; /* 0xF4 - 0x107 MPB_DISK_FILLERS for future expansion */
71 };
72
73 /* RAID map configuration infos. */
74 struct imsm_map {
75 __u32 pba_of_lba0; /* start address of partition */
76 __u32 blocks_per_member;/* blocks per member */
77 __u32 num_data_stripes; /* number of data stripes */
78 __u16 blocks_per_strip;
79 __u8 map_state; /* Normal, Uninitialized, Degraded, Failed */
80 #define IMSM_T_STATE_NORMAL 0
81 #define IMSM_T_STATE_UNINITIALIZED 1
82 #define IMSM_T_STATE_DEGRADED 2
83 #define IMSM_T_STATE_FAILED 3
84 __u8 raid_level;
85 #define IMSM_T_RAID0 0
86 #define IMSM_T_RAID1 1
87 #define IMSM_T_RAID5 5 /* since metadata version 1.2.02 ? */
88 __u8 num_members; /* number of member disks */
89 __u8 num_domains; /* number of parity domains */
90 __u8 failed_disk_num; /* valid only when state is degraded */
91 __u8 ddf;
92 __u32 filler[7]; /* expansion area */
93 #define IMSM_ORD_REBUILD (1 << 24)
94 __u32 disk_ord_tbl[1]; /* disk_ord_tbl[num_members],
95 * top byte contains some flags
96 */
97 } __attribute__ ((packed));
98
99 struct imsm_vol {
100 __u32 curr_migr_unit;
101 __u32 checkpoint_id; /* id to access curr_migr_unit */
102 __u8 migr_state; /* Normal or Migrating */
103 #define MIGR_INIT 0
104 #define MIGR_REBUILD 1
105 #define MIGR_VERIFY 2 /* analagous to echo check > sync_action */
106 #define MIGR_GEN_MIGR 3
107 #define MIGR_STATE_CHANGE 4
108 #define MIGR_REPAIR 5
109 __u8 migr_type; /* Initializing, Rebuilding, ... */
110 __u8 dirty;
111 __u8 fs_state; /* fast-sync state for CnG (0xff == disabled) */
112 __u16 verify_errors; /* number of mismatches */
113 __u16 bad_blocks; /* number of bad blocks during verify */
114 __u32 filler[4];
115 struct imsm_map map[1];
116 /* here comes another one if migr_state */
117 } __attribute__ ((packed));
118
119 struct imsm_dev {
120 __u8 volume[MAX_RAID_SERIAL_LEN];
121 __u32 size_low;
122 __u32 size_high;
123 #define DEV_BOOTABLE __cpu_to_le32(0x01)
124 #define DEV_BOOT_DEVICE __cpu_to_le32(0x02)
125 #define DEV_READ_COALESCING __cpu_to_le32(0x04)
126 #define DEV_WRITE_COALESCING __cpu_to_le32(0x08)
127 #define DEV_LAST_SHUTDOWN_DIRTY __cpu_to_le32(0x10)
128 #define DEV_HIDDEN_AT_BOOT __cpu_to_le32(0x20)
129 #define DEV_CURRENTLY_HIDDEN __cpu_to_le32(0x40)
130 #define DEV_VERIFY_AND_FIX __cpu_to_le32(0x80)
131 #define DEV_MAP_STATE_UNINIT __cpu_to_le32(0x100)
132 #define DEV_NO_AUTO_RECOVERY __cpu_to_le32(0x200)
133 #define DEV_CLONE_N_GO __cpu_to_le32(0x400)
134 #define DEV_CLONE_MAN_SYNC __cpu_to_le32(0x800)
135 #define DEV_CNG_MASTER_DISK_NUM __cpu_to_le32(0x1000)
136 __u32 status; /* Persistent RaidDev status */
137 __u32 reserved_blocks; /* Reserved blocks at beginning of volume */
138 __u8 migr_priority;
139 __u8 num_sub_vols;
140 __u8 tid;
141 __u8 cng_master_disk;
142 __u16 cache_policy;
143 __u8 cng_state;
144 __u8 cng_sub_state;
145 #define IMSM_DEV_FILLERS 10
146 __u32 filler[IMSM_DEV_FILLERS];
147 struct imsm_vol vol;
148 } __attribute__ ((packed));
149
150 struct imsm_super {
151 __u8 sig[MAX_SIGNATURE_LENGTH]; /* 0x00 - 0x1F */
152 __u32 check_sum; /* 0x20 - 0x23 MPB Checksum */
153 __u32 mpb_size; /* 0x24 - 0x27 Size of MPB */
154 __u32 family_num; /* 0x28 - 0x2B Checksum from first time this config was written */
155 __u32 generation_num; /* 0x2C - 0x2F Incremented each time this array's MPB is written */
156 __u32 error_log_size; /* 0x30 - 0x33 in bytes */
157 __u32 attributes; /* 0x34 - 0x37 */
158 __u8 num_disks; /* 0x38 Number of configured disks */
159 __u8 num_raid_devs; /* 0x39 Number of configured volumes */
160 __u8 error_log_pos; /* 0x3A */
161 __u8 fill[1]; /* 0x3B */
162 __u32 cache_size; /* 0x3c - 0x40 in mb */
163 __u32 orig_family_num; /* 0x40 - 0x43 original family num */
164 __u32 pwr_cycle_count; /* 0x44 - 0x47 simulated power cycle count for array */
165 __u32 bbm_log_size; /* 0x48 - 0x4B - size of bad Block Mgmt Log in bytes */
166 #define IMSM_FILLERS 35
167 __u32 filler[IMSM_FILLERS]; /* 0x4C - 0xD7 RAID_MPB_FILLERS */
168 struct imsm_disk disk[1]; /* 0xD8 diskTbl[numDisks] */
169 /* here comes imsm_dev[num_raid_devs] */
170 /* here comes BBM logs */
171 } __attribute__ ((packed));
172
173 #define BBM_LOG_MAX_ENTRIES 254
174
175 struct bbm_log_entry {
176 __u64 defective_block_start;
177 #define UNREADABLE 0xFFFFFFFF
178 __u32 spare_block_offset;
179 __u16 remapped_marked_count;
180 __u16 disk_ordinal;
181 } __attribute__ ((__packed__));
182
183 struct bbm_log {
184 __u32 signature; /* 0xABADB10C */
185 __u32 entry_count;
186 __u32 reserved_spare_block_count; /* 0 */
187 __u32 reserved; /* 0xFFFF */
188 __u64 first_spare_lba;
189 struct bbm_log_entry mapped_block_entries[BBM_LOG_MAX_ENTRIES];
190 } __attribute__ ((__packed__));
191
192
193 #ifndef MDASSEMBLE
194 static char *map_state_str[] = { "normal", "uninitialized", "degraded", "failed" };
195 #endif
196
197 static __u8 migr_type(struct imsm_dev *dev)
198 {
199 if (dev->vol.migr_type == MIGR_VERIFY &&
200 dev->status & DEV_VERIFY_AND_FIX)
201 return MIGR_REPAIR;
202 else
203 return dev->vol.migr_type;
204 }
205
206 static void set_migr_type(struct imsm_dev *dev, __u8 migr_type)
207 {
208 /* for compatibility with older oroms convert MIGR_REPAIR, into
209 * MIGR_VERIFY w/ DEV_VERIFY_AND_FIX status
210 */
211 if (migr_type == MIGR_REPAIR) {
212 dev->vol.migr_type = MIGR_VERIFY;
213 dev->status |= DEV_VERIFY_AND_FIX;
214 } else {
215 dev->vol.migr_type = migr_type;
216 dev->status &= ~DEV_VERIFY_AND_FIX;
217 }
218 }
219
220 static unsigned int sector_count(__u32 bytes)
221 {
222 return ((bytes + (512-1)) & (~(512-1))) / 512;
223 }
224
225 static unsigned int mpb_sectors(struct imsm_super *mpb)
226 {
227 return sector_count(__le32_to_cpu(mpb->mpb_size));
228 }
229
230 struct intel_dev {
231 struct imsm_dev *dev;
232 struct intel_dev *next;
233 unsigned index;
234 };
235
236 struct intel_hba {
237 enum sys_dev_type type;
238 char *path;
239 char *pci_id;
240 struct intel_hba *next;
241 };
242
243 enum action {
244 DISK_REMOVE = 1,
245 DISK_ADD
246 };
247 /* internal representation of IMSM metadata */
248 struct intel_super {
249 union {
250 void *buf; /* O_DIRECT buffer for reading/writing metadata */
251 struct imsm_super *anchor; /* immovable parameters */
252 };
253 size_t len; /* size of the 'buf' allocation */
254 void *next_buf; /* for realloc'ing buf from the manager */
255 size_t next_len;
256 int updates_pending; /* count of pending updates for mdmon */
257 int current_vol; /* index of raid device undergoing creation */
258 __u32 create_offset; /* common start for 'current_vol' */
259 __u32 random; /* random data for seeding new family numbers */
260 struct intel_dev *devlist;
261 struct dl {
262 struct dl *next;
263 int index;
264 __u8 serial[MAX_RAID_SERIAL_LEN];
265 int major, minor;
266 char *devname;
267 struct imsm_disk disk;
268 int fd;
269 int extent_cnt;
270 struct extent *e; /* for determining freespace @ create */
271 int raiddisk; /* slot to fill in autolayout */
272 enum action action;
273 } *disks;
274 struct dl *disk_mgmt_list; /* list of disks to add/remove while mdmon
275 active */
276 struct dl *missing; /* disks removed while we weren't looking */
277 struct bbm_log *bbm_log;
278 struct intel_hba *hba; /* device path of the raid controller for this metadata */
279 const struct imsm_orom *orom; /* platform firmware support */
280 struct intel_super *next; /* (temp) list for disambiguating family_num */
281 };
282
283 struct intel_disk {
284 struct imsm_disk disk;
285 #define IMSM_UNKNOWN_OWNER (-1)
286 int owner;
287 struct intel_disk *next;
288 };
289
290 struct extent {
291 unsigned long long start, size;
292 };
293
294 /* definitions of reshape process types */
295 enum imsm_reshape_type {
296 CH_TAKEOVER,
297 CH_MIGRATION,
298 };
299
300 /* definition of messages passed to imsm_process_update */
301 enum imsm_update_type {
302 update_activate_spare,
303 update_create_array,
304 update_kill_array,
305 update_rename_array,
306 update_add_remove_disk,
307 update_reshape_container_disks,
308 update_reshape_migration,
309 update_takeover
310 };
311
312 struct imsm_update_activate_spare {
313 enum imsm_update_type type;
314 struct dl *dl;
315 int slot;
316 int array;
317 struct imsm_update_activate_spare *next;
318 };
319
320 struct geo_params {
321 int dev_id;
322 char *dev_name;
323 long long size;
324 int level;
325 int layout;
326 int chunksize;
327 int raid_disks;
328 };
329
330 enum takeover_direction {
331 R10_TO_R0,
332 R0_TO_R10
333 };
334 struct imsm_update_takeover {
335 enum imsm_update_type type;
336 int subarray;
337 enum takeover_direction direction;
338 };
339
340 struct imsm_update_reshape {
341 enum imsm_update_type type;
342 int old_raid_disks;
343 int new_raid_disks;
344
345 int new_disks[1]; /* new_raid_disks - old_raid_disks makedev number */
346 };
347
348 struct imsm_update_reshape_migration {
349 enum imsm_update_type type;
350 int old_raid_disks;
351 int new_raid_disks;
352 /* fields for array migration changes
353 */
354 int subdev;
355 int new_level;
356 int new_layout;
357 int new_chunksize;
358
359 int new_disks[1]; /* new_raid_disks - old_raid_disks makedev number */
360 };
361
362 struct disk_info {
363 __u8 serial[MAX_RAID_SERIAL_LEN];
364 };
365
366 struct imsm_update_create_array {
367 enum imsm_update_type type;
368 int dev_idx;
369 struct imsm_dev dev;
370 };
371
372 struct imsm_update_kill_array {
373 enum imsm_update_type type;
374 int dev_idx;
375 };
376
377 struct imsm_update_rename_array {
378 enum imsm_update_type type;
379 __u8 name[MAX_RAID_SERIAL_LEN];
380 int dev_idx;
381 };
382
383 struct imsm_update_add_remove_disk {
384 enum imsm_update_type type;
385 };
386
387
388 static const char *_sys_dev_type[] = {
389 [SYS_DEV_UNKNOWN] = "Unknown",
390 [SYS_DEV_SAS] = "SAS",
391 [SYS_DEV_SATA] = "SATA"
392 };
393
394 const char *get_sys_dev_type(enum sys_dev_type type)
395 {
396 if (type >= SYS_DEV_MAX)
397 type = SYS_DEV_UNKNOWN;
398
399 return _sys_dev_type[type];
400 }
401
402 static struct intel_hba * alloc_intel_hba(struct sys_dev *device)
403 {
404 struct intel_hba *result = malloc(sizeof(*result));
405 if (result) {
406 result->type = device->type;
407 result->path = strdup(device->path);
408 result->next = NULL;
409 if (result->path && (result->pci_id = strrchr(result->path, '/')) != NULL)
410 result->pci_id++;
411 }
412 return result;
413 }
414
415 static struct intel_hba * find_intel_hba(struct intel_hba *hba, struct sys_dev *device)
416 {
417 struct intel_hba *result=NULL;
418 for (result = hba; result; result = result->next) {
419 if (result->type == device->type && strcmp(result->path, device->path) == 0)
420 break;
421 }
422 return result;
423 }
424
425 static int attach_hba_to_super(struct intel_super *super, struct sys_dev *device)
426 {
427 struct intel_hba *hba;
428
429 /* check if disk attached to Intel HBA */
430 hba = find_intel_hba(super->hba, device);
431 if (hba != NULL)
432 return 1;
433 /* Check if HBA is already attached to super */
434 if (super->hba == NULL) {
435 super->hba = alloc_intel_hba(device);
436 return 1;
437 }
438
439 hba = super->hba;
440 /* Intel metadata allows for all disks attached to the same type HBA.
441 * Do not sypport odf HBA types mixing
442 */
443 if (device->type != hba->type)
444 return 2;
445
446 while (hba->next)
447 hba = hba->next;
448
449 hba->next = alloc_intel_hba(device);
450 return 1;
451 }
452
453 static struct sys_dev* find_disk_attached_hba(int fd, const char *devname)
454 {
455 struct sys_dev *list, *elem, *prev;
456 char *disk_path;
457
458 if ((list = find_intel_devices()) == NULL)
459 return 0;
460
461 if (fd < 0)
462 disk_path = (char *) devname;
463 else
464 disk_path = diskfd_to_devpath(fd);
465
466 if (!disk_path) {
467 free_sys_dev(&list);
468 return 0;
469 }
470
471 for (prev = NULL, elem = list; elem; prev = elem, elem = elem->next) {
472 if (path_attached_to_hba(disk_path, elem->path)) {
473 if (prev == NULL)
474 list = list->next;
475 else
476 prev->next = elem->next;
477 elem->next = NULL;
478 if (disk_path != devname)
479 free(disk_path);
480 free_sys_dev(&list);
481 return elem;
482 }
483 }
484 if (disk_path != devname)
485 free(disk_path);
486 free_sys_dev(&list);
487
488 return NULL;
489 }
490
491
492 static int find_intel_hba_capability(int fd, struct intel_super *super,
493 char *devname);
494
495 static struct supertype *match_metadata_desc_imsm(char *arg)
496 {
497 struct supertype *st;
498
499 if (strcmp(arg, "imsm") != 0 &&
500 strcmp(arg, "default") != 0
501 )
502 return NULL;
503
504 st = malloc(sizeof(*st));
505 if (!st)
506 return NULL;
507 memset(st, 0, sizeof(*st));
508 st->container_dev = NoMdDev;
509 st->ss = &super_imsm;
510 st->max_devs = IMSM_MAX_DEVICES;
511 st->minor_version = 0;
512 st->sb = NULL;
513 return st;
514 }
515
516 #ifndef MDASSEMBLE
517 static __u8 *get_imsm_version(struct imsm_super *mpb)
518 {
519 return &mpb->sig[MPB_SIG_LEN];
520 }
521 #endif
522
523 /* retrieve a disk directly from the anchor when the anchor is known to be
524 * up-to-date, currently only at load time
525 */
526 static struct imsm_disk *__get_imsm_disk(struct imsm_super *mpb, __u8 index)
527 {
528 if (index >= mpb->num_disks)
529 return NULL;
530 return &mpb->disk[index];
531 }
532
533 /* retrieve the disk description based on a index of the disk
534 * in the sub-array
535 */
536 static struct dl *get_imsm_dl_disk(struct intel_super *super, __u8 index)
537 {
538 struct dl *d;
539
540 for (d = super->disks; d; d = d->next)
541 if (d->index == index)
542 return d;
543
544 return NULL;
545 }
546 /* retrieve a disk from the parsed metadata */
547 static struct imsm_disk *get_imsm_disk(struct intel_super *super, __u8 index)
548 {
549 struct dl *dl;
550
551 dl = get_imsm_dl_disk(super, index);
552 if (dl)
553 return &dl->disk;
554
555 return NULL;
556 }
557
558 /* generate a checksum directly from the anchor when the anchor is known to be
559 * up-to-date, currently only at load or write_super after coalescing
560 */
561 static __u32 __gen_imsm_checksum(struct imsm_super *mpb)
562 {
563 __u32 end = mpb->mpb_size / sizeof(end);
564 __u32 *p = (__u32 *) mpb;
565 __u32 sum = 0;
566
567 while (end--) {
568 sum += __le32_to_cpu(*p);
569 p++;
570 }
571
572 return sum - __le32_to_cpu(mpb->check_sum);
573 }
574
575 static size_t sizeof_imsm_map(struct imsm_map *map)
576 {
577 return sizeof(struct imsm_map) + sizeof(__u32) * (map->num_members - 1);
578 }
579
580 struct imsm_map *get_imsm_map(struct imsm_dev *dev, int second_map)
581 {
582 /* A device can have 2 maps if it is in the middle of a migration.
583 * If second_map is:
584 * 0 - we return the first map
585 * 1 - we return the second map if it exists, else NULL
586 * -1 - we return the second map if it exists, else the first
587 */
588 struct imsm_map *map = &dev->vol.map[0];
589
590 if (second_map == 1 && !dev->vol.migr_state)
591 return NULL;
592 else if (second_map == 1 ||
593 (second_map < 0 && dev->vol.migr_state)) {
594 void *ptr = map;
595
596 return ptr + sizeof_imsm_map(map);
597 } else
598 return map;
599
600 }
601
602 /* return the size of the device.
603 * migr_state increases the returned size if map[0] were to be duplicated
604 */
605 static size_t sizeof_imsm_dev(struct imsm_dev *dev, int migr_state)
606 {
607 size_t size = sizeof(*dev) - sizeof(struct imsm_map) +
608 sizeof_imsm_map(get_imsm_map(dev, 0));
609
610 /* migrating means an additional map */
611 if (dev->vol.migr_state)
612 size += sizeof_imsm_map(get_imsm_map(dev, 1));
613 else if (migr_state)
614 size += sizeof_imsm_map(get_imsm_map(dev, 0));
615
616 return size;
617 }
618
619 #ifndef MDASSEMBLE
620 /* retrieve disk serial number list from a metadata update */
621 static struct disk_info *get_disk_info(struct imsm_update_create_array *update)
622 {
623 void *u = update;
624 struct disk_info *inf;
625
626 inf = u + sizeof(*update) - sizeof(struct imsm_dev) +
627 sizeof_imsm_dev(&update->dev, 0);
628
629 return inf;
630 }
631 #endif
632
633 static struct imsm_dev *__get_imsm_dev(struct imsm_super *mpb, __u8 index)
634 {
635 int offset;
636 int i;
637 void *_mpb = mpb;
638
639 if (index >= mpb->num_raid_devs)
640 return NULL;
641
642 /* devices start after all disks */
643 offset = ((void *) &mpb->disk[mpb->num_disks]) - _mpb;
644
645 for (i = 0; i <= index; i++)
646 if (i == index)
647 return _mpb + offset;
648 else
649 offset += sizeof_imsm_dev(_mpb + offset, 0);
650
651 return NULL;
652 }
653
654 static struct imsm_dev *get_imsm_dev(struct intel_super *super, __u8 index)
655 {
656 struct intel_dev *dv;
657
658 if (index >= super->anchor->num_raid_devs)
659 return NULL;
660 for (dv = super->devlist; dv; dv = dv->next)
661 if (dv->index == index)
662 return dv->dev;
663 return NULL;
664 }
665
666 /*
667 * for second_map:
668 * == 0 get first map
669 * == 1 get second map
670 * == -1 than get map according to the current migr_state
671 */
672 static __u32 get_imsm_ord_tbl_ent(struct imsm_dev *dev,
673 int slot,
674 int second_map)
675 {
676 struct imsm_map *map;
677
678 map = get_imsm_map(dev, second_map);
679
680 /* top byte identifies disk under rebuild */
681 return __le32_to_cpu(map->disk_ord_tbl[slot]);
682 }
683
684 #define ord_to_idx(ord) (((ord) << 8) >> 8)
685 static __u32 get_imsm_disk_idx(struct imsm_dev *dev, int slot, int second_map)
686 {
687 __u32 ord = get_imsm_ord_tbl_ent(dev, slot, second_map);
688
689 return ord_to_idx(ord);
690 }
691
692 static void set_imsm_ord_tbl_ent(struct imsm_map *map, int slot, __u32 ord)
693 {
694 map->disk_ord_tbl[slot] = __cpu_to_le32(ord);
695 }
696
697 static int get_imsm_disk_slot(struct imsm_map *map, unsigned idx)
698 {
699 int slot;
700 __u32 ord;
701
702 for (slot = 0; slot < map->num_members; slot++) {
703 ord = __le32_to_cpu(map->disk_ord_tbl[slot]);
704 if (ord_to_idx(ord) == idx)
705 return slot;
706 }
707
708 return -1;
709 }
710
711 static int get_imsm_raid_level(struct imsm_map *map)
712 {
713 if (map->raid_level == 1) {
714 if (map->num_members == 2)
715 return 1;
716 else
717 return 10;
718 }
719
720 return map->raid_level;
721 }
722
723 static int cmp_extent(const void *av, const void *bv)
724 {
725 const struct extent *a = av;
726 const struct extent *b = bv;
727 if (a->start < b->start)
728 return -1;
729 if (a->start > b->start)
730 return 1;
731 return 0;
732 }
733
734 static int count_memberships(struct dl *dl, struct intel_super *super)
735 {
736 int memberships = 0;
737 int i;
738
739 for (i = 0; i < super->anchor->num_raid_devs; i++) {
740 struct imsm_dev *dev = get_imsm_dev(super, i);
741 struct imsm_map *map = get_imsm_map(dev, 0);
742
743 if (get_imsm_disk_slot(map, dl->index) >= 0)
744 memberships++;
745 }
746
747 return memberships;
748 }
749
750 static struct extent *get_extents(struct intel_super *super, struct dl *dl)
751 {
752 /* find a list of used extents on the given physical device */
753 struct extent *rv, *e;
754 int i;
755 int memberships = count_memberships(dl, super);
756 __u32 reservation = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
757
758 rv = malloc(sizeof(struct extent) * (memberships + 1));
759 if (!rv)
760 return NULL;
761 e = rv;
762
763 for (i = 0; i < super->anchor->num_raid_devs; i++) {
764 struct imsm_dev *dev = get_imsm_dev(super, i);
765 struct imsm_map *map = get_imsm_map(dev, 0);
766
767 if (get_imsm_disk_slot(map, dl->index) >= 0) {
768 e->start = __le32_to_cpu(map->pba_of_lba0);
769 e->size = __le32_to_cpu(map->blocks_per_member);
770 e++;
771 }
772 }
773 qsort(rv, memberships, sizeof(*rv), cmp_extent);
774
775 /* determine the start of the metadata
776 * when no raid devices are defined use the default
777 * ...otherwise allow the metadata to truncate the value
778 * as is the case with older versions of imsm
779 */
780 if (memberships) {
781 struct extent *last = &rv[memberships - 1];
782 __u32 remainder;
783
784 remainder = __le32_to_cpu(dl->disk.total_blocks) -
785 (last->start + last->size);
786 /* round down to 1k block to satisfy precision of the kernel
787 * 'size' interface
788 */
789 remainder &= ~1UL;
790 /* make sure remainder is still sane */
791 if (remainder < (unsigned)ROUND_UP(super->len, 512) >> 9)
792 remainder = ROUND_UP(super->len, 512) >> 9;
793 if (reservation > remainder)
794 reservation = remainder;
795 }
796 e->start = __le32_to_cpu(dl->disk.total_blocks) - reservation;
797 e->size = 0;
798 return rv;
799 }
800
801 /* try to determine how much space is reserved for metadata from
802 * the last get_extents() entry, otherwise fallback to the
803 * default
804 */
805 static __u32 imsm_reserved_sectors(struct intel_super *super, struct dl *dl)
806 {
807 struct extent *e;
808 int i;
809 __u32 rv;
810
811 /* for spares just return a minimal reservation which will grow
812 * once the spare is picked up by an array
813 */
814 if (dl->index == -1)
815 return MPB_SECTOR_CNT;
816
817 e = get_extents(super, dl);
818 if (!e)
819 return MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
820
821 /* scroll to last entry */
822 for (i = 0; e[i].size; i++)
823 continue;
824
825 rv = __le32_to_cpu(dl->disk.total_blocks) - e[i].start;
826
827 free(e);
828
829 return rv;
830 }
831
832 static int is_spare(struct imsm_disk *disk)
833 {
834 return (disk->status & SPARE_DISK) == SPARE_DISK;
835 }
836
837 static int is_configured(struct imsm_disk *disk)
838 {
839 return (disk->status & CONFIGURED_DISK) == CONFIGURED_DISK;
840 }
841
842 static int is_failed(struct imsm_disk *disk)
843 {
844 return (disk->status & FAILED_DISK) == FAILED_DISK;
845 }
846
847 /* Return minimum size of a spare that can be used in this array*/
848 static unsigned long long min_acceptable_spare_size_imsm(struct supertype *st)
849 {
850 struct intel_super *super = st->sb;
851 struct dl *dl;
852 struct extent *e;
853 int i;
854 unsigned long long rv = 0;
855
856 if (!super)
857 return rv;
858 /* find first active disk in array */
859 dl = super->disks;
860 while (dl && (is_failed(&dl->disk) || dl->index == -1))
861 dl = dl->next;
862 if (!dl)
863 return rv;
864 /* find last lba used by subarrays */
865 e = get_extents(super, dl);
866 if (!e)
867 return rv;
868 for (i = 0; e[i].size; i++)
869 continue;
870 if (i > 0)
871 rv = e[i-1].start + e[i-1].size;
872 free(e);
873 /* add the amount of space needed for metadata */
874 rv = rv + MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
875 return rv * 512;
876 }
877
878 #ifndef MDASSEMBLE
879 static __u64 blocks_per_migr_unit(struct imsm_dev *dev);
880
881 static void print_imsm_dev(struct imsm_dev *dev, char *uuid, int disk_idx)
882 {
883 __u64 sz;
884 int slot, i;
885 struct imsm_map *map = get_imsm_map(dev, 0);
886 struct imsm_map *map2 = get_imsm_map(dev, 1);
887 __u32 ord;
888
889 printf("\n");
890 printf("[%.16s]:\n", dev->volume);
891 printf(" UUID : %s\n", uuid);
892 printf(" RAID Level : %d", get_imsm_raid_level(map));
893 if (map2)
894 printf(" <-- %d", get_imsm_raid_level(map2));
895 printf("\n");
896 printf(" Members : %d", map->num_members);
897 if (map2)
898 printf(" <-- %d", map2->num_members);
899 printf("\n");
900 printf(" Slots : [");
901 for (i = 0; i < map->num_members; i++) {
902 ord = get_imsm_ord_tbl_ent(dev, i, 0);
903 printf("%s", ord & IMSM_ORD_REBUILD ? "_" : "U");
904 }
905 printf("]");
906 if (map2) {
907 printf(" <-- [");
908 for (i = 0; i < map2->num_members; i++) {
909 ord = get_imsm_ord_tbl_ent(dev, i, 1);
910 printf("%s", ord & IMSM_ORD_REBUILD ? "_" : "U");
911 }
912 printf("]");
913 }
914 printf("\n");
915 printf(" Failed disk : ");
916 if (map->failed_disk_num == 0xff)
917 printf("none");
918 else
919 printf("%i", map->failed_disk_num);
920 printf("\n");
921 slot = get_imsm_disk_slot(map, disk_idx);
922 if (slot >= 0) {
923 ord = get_imsm_ord_tbl_ent(dev, slot, -1);
924 printf(" This Slot : %d%s\n", slot,
925 ord & IMSM_ORD_REBUILD ? " (out-of-sync)" : "");
926 } else
927 printf(" This Slot : ?\n");
928 sz = __le32_to_cpu(dev->size_high);
929 sz <<= 32;
930 sz += __le32_to_cpu(dev->size_low);
931 printf(" Array Size : %llu%s\n", (unsigned long long)sz,
932 human_size(sz * 512));
933 sz = __le32_to_cpu(map->blocks_per_member);
934 printf(" Per Dev Size : %llu%s\n", (unsigned long long)sz,
935 human_size(sz * 512));
936 printf(" Sector Offset : %u\n",
937 __le32_to_cpu(map->pba_of_lba0));
938 printf(" Num Stripes : %u\n",
939 __le32_to_cpu(map->num_data_stripes));
940 printf(" Chunk Size : %u KiB",
941 __le16_to_cpu(map->blocks_per_strip) / 2);
942 if (map2)
943 printf(" <-- %u KiB",
944 __le16_to_cpu(map2->blocks_per_strip) / 2);
945 printf("\n");
946 printf(" Reserved : %d\n", __le32_to_cpu(dev->reserved_blocks));
947 printf(" Migrate State : ");
948 if (dev->vol.migr_state) {
949 if (migr_type(dev) == MIGR_INIT)
950 printf("initialize\n");
951 else if (migr_type(dev) == MIGR_REBUILD)
952 printf("rebuild\n");
953 else if (migr_type(dev) == MIGR_VERIFY)
954 printf("check\n");
955 else if (migr_type(dev) == MIGR_GEN_MIGR)
956 printf("general migration\n");
957 else if (migr_type(dev) == MIGR_STATE_CHANGE)
958 printf("state change\n");
959 else if (migr_type(dev) == MIGR_REPAIR)
960 printf("repair\n");
961 else
962 printf("<unknown:%d>\n", migr_type(dev));
963 } else
964 printf("idle\n");
965 printf(" Map State : %s", map_state_str[map->map_state]);
966 if (dev->vol.migr_state) {
967 struct imsm_map *map = get_imsm_map(dev, 1);
968
969 printf(" <-- %s", map_state_str[map->map_state]);
970 printf("\n Checkpoint : %u (%llu)",
971 __le32_to_cpu(dev->vol.curr_migr_unit),
972 (unsigned long long)blocks_per_migr_unit(dev));
973 }
974 printf("\n");
975 printf(" Dirty State : %s\n", dev->vol.dirty ? "dirty" : "clean");
976 }
977
978 static void print_imsm_disk(struct imsm_super *mpb, int index, __u32 reserved)
979 {
980 struct imsm_disk *disk = __get_imsm_disk(mpb, index);
981 char str[MAX_RAID_SERIAL_LEN + 1];
982 __u64 sz;
983
984 if (index < 0 || !disk)
985 return;
986
987 printf("\n");
988 snprintf(str, MAX_RAID_SERIAL_LEN + 1, "%s", disk->serial);
989 printf(" Disk%02d Serial : %s\n", index, str);
990 printf(" State :%s%s%s\n", is_spare(disk) ? " spare" : "",
991 is_configured(disk) ? " active" : "",
992 is_failed(disk) ? " failed" : "");
993 printf(" Id : %08x\n", __le32_to_cpu(disk->scsi_id));
994 sz = __le32_to_cpu(disk->total_blocks) - reserved;
995 printf(" Usable Size : %llu%s\n", (unsigned long long)sz,
996 human_size(sz * 512));
997 }
998
999 static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info, char *map);
1000
1001 static void examine_super_imsm(struct supertype *st, char *homehost)
1002 {
1003 struct intel_super *super = st->sb;
1004 struct imsm_super *mpb = super->anchor;
1005 char str[MAX_SIGNATURE_LENGTH];
1006 int i;
1007 struct mdinfo info;
1008 char nbuf[64];
1009 __u32 sum;
1010 __u32 reserved = imsm_reserved_sectors(super, super->disks);
1011 struct dl *dl;
1012
1013 snprintf(str, MPB_SIG_LEN, "%s", mpb->sig);
1014 printf(" Magic : %s\n", str);
1015 snprintf(str, strlen(MPB_VERSION_RAID0), "%s", get_imsm_version(mpb));
1016 printf(" Version : %s\n", get_imsm_version(mpb));
1017 printf(" Orig Family : %08x\n", __le32_to_cpu(mpb->orig_family_num));
1018 printf(" Family : %08x\n", __le32_to_cpu(mpb->family_num));
1019 printf(" Generation : %08x\n", __le32_to_cpu(mpb->generation_num));
1020 getinfo_super_imsm(st, &info, NULL);
1021 fname_from_uuid(st, &info, nbuf, ':');
1022 printf(" UUID : %s\n", nbuf + 5);
1023 sum = __le32_to_cpu(mpb->check_sum);
1024 printf(" Checksum : %08x %s\n", sum,
1025 __gen_imsm_checksum(mpb) == sum ? "correct" : "incorrect");
1026 printf(" MPB Sectors : %d\n", mpb_sectors(mpb));
1027 printf(" Disks : %d\n", mpb->num_disks);
1028 printf(" RAID Devices : %d\n", mpb->num_raid_devs);
1029 print_imsm_disk(mpb, super->disks->index, reserved);
1030 if (super->bbm_log) {
1031 struct bbm_log *log = super->bbm_log;
1032
1033 printf("\n");
1034 printf("Bad Block Management Log:\n");
1035 printf(" Log Size : %d\n", __le32_to_cpu(mpb->bbm_log_size));
1036 printf(" Signature : %x\n", __le32_to_cpu(log->signature));
1037 printf(" Entry Count : %d\n", __le32_to_cpu(log->entry_count));
1038 printf(" Spare Blocks : %d\n", __le32_to_cpu(log->reserved_spare_block_count));
1039 printf(" First Spare : %llx\n",
1040 (unsigned long long) __le64_to_cpu(log->first_spare_lba));
1041 }
1042 for (i = 0; i < mpb->num_raid_devs; i++) {
1043 struct mdinfo info;
1044 struct imsm_dev *dev = __get_imsm_dev(mpb, i);
1045
1046 super->current_vol = i;
1047 getinfo_super_imsm(st, &info, NULL);
1048 fname_from_uuid(st, &info, nbuf, ':');
1049 print_imsm_dev(dev, nbuf + 5, super->disks->index);
1050 }
1051 for (i = 0; i < mpb->num_disks; i++) {
1052 if (i == super->disks->index)
1053 continue;
1054 print_imsm_disk(mpb, i, reserved);
1055 }
1056 for (dl = super->disks ; dl; dl = dl->next) {
1057 struct imsm_disk *disk;
1058 char str[MAX_RAID_SERIAL_LEN + 1];
1059 __u64 sz;
1060
1061 if (dl->index >= 0)
1062 continue;
1063
1064 disk = &dl->disk;
1065 printf("\n");
1066 snprintf(str, MAX_RAID_SERIAL_LEN + 1, "%s", disk->serial);
1067 printf(" Disk Serial : %s\n", str);
1068 printf(" State :%s%s%s\n", is_spare(disk) ? " spare" : "",
1069 is_configured(disk) ? " active" : "",
1070 is_failed(disk) ? " failed" : "");
1071 printf(" Id : %08x\n", __le32_to_cpu(disk->scsi_id));
1072 sz = __le32_to_cpu(disk->total_blocks) - reserved;
1073 printf(" Usable Size : %llu%s\n", (unsigned long long)sz,
1074 human_size(sz * 512));
1075 }
1076 }
1077
1078 static void brief_examine_super_imsm(struct supertype *st, int verbose)
1079 {
1080 /* We just write a generic IMSM ARRAY entry */
1081 struct mdinfo info;
1082 char nbuf[64];
1083 struct intel_super *super = st->sb;
1084
1085 if (!super->anchor->num_raid_devs) {
1086 printf("ARRAY metadata=imsm\n");
1087 return;
1088 }
1089
1090 getinfo_super_imsm(st, &info, NULL);
1091 fname_from_uuid(st, &info, nbuf, ':');
1092 printf("ARRAY metadata=imsm UUID=%s\n", nbuf + 5);
1093 }
1094
1095 static void brief_examine_subarrays_imsm(struct supertype *st, int verbose)
1096 {
1097 /* We just write a generic IMSM ARRAY entry */
1098 struct mdinfo info;
1099 char nbuf[64];
1100 char nbuf1[64];
1101 struct intel_super *super = st->sb;
1102 int i;
1103
1104 if (!super->anchor->num_raid_devs)
1105 return;
1106
1107 getinfo_super_imsm(st, &info, NULL);
1108 fname_from_uuid(st, &info, nbuf, ':');
1109 for (i = 0; i < super->anchor->num_raid_devs; i++) {
1110 struct imsm_dev *dev = get_imsm_dev(super, i);
1111
1112 super->current_vol = i;
1113 getinfo_super_imsm(st, &info, NULL);
1114 fname_from_uuid(st, &info, nbuf1, ':');
1115 printf("ARRAY /dev/md/%.16s container=%s member=%d UUID=%s\n",
1116 dev->volume, nbuf + 5, i, nbuf1 + 5);
1117 }
1118 }
1119
1120 static void export_examine_super_imsm(struct supertype *st)
1121 {
1122 struct intel_super *super = st->sb;
1123 struct imsm_super *mpb = super->anchor;
1124 struct mdinfo info;
1125 char nbuf[64];
1126
1127 getinfo_super_imsm(st, &info, NULL);
1128 fname_from_uuid(st, &info, nbuf, ':');
1129 printf("MD_METADATA=imsm\n");
1130 printf("MD_LEVEL=container\n");
1131 printf("MD_UUID=%s\n", nbuf+5);
1132 printf("MD_DEVICES=%u\n", mpb->num_disks);
1133 }
1134
1135 static void detail_super_imsm(struct supertype *st, char *homehost)
1136 {
1137 struct mdinfo info;
1138 char nbuf[64];
1139
1140 getinfo_super_imsm(st, &info, NULL);
1141 fname_from_uuid(st, &info, nbuf, ':');
1142 printf("\n UUID : %s\n", nbuf + 5);
1143 }
1144
1145 static void brief_detail_super_imsm(struct supertype *st)
1146 {
1147 struct mdinfo info;
1148 char nbuf[64];
1149 getinfo_super_imsm(st, &info, NULL);
1150 fname_from_uuid(st, &info, nbuf, ':');
1151 printf(" UUID=%s", nbuf + 5);
1152 }
1153
1154 static int imsm_read_serial(int fd, char *devname, __u8 *serial);
1155 static void fd2devname(int fd, char *name);
1156
1157 static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_base, int verbose)
1158 {
1159 /* dump an unsorted list of devices attached to AHCI Intel storage
1160 * controller, as well as non-connected ports
1161 */
1162 int hba_len = strlen(hba_path) + 1;
1163 struct dirent *ent;
1164 DIR *dir;
1165 char *path = NULL;
1166 int err = 0;
1167 unsigned long port_mask = (1 << port_count) - 1;
1168
1169 if (port_count > (int)sizeof(port_mask) * 8) {
1170 if (verbose)
1171 fprintf(stderr, Name ": port_count %d out of range\n", port_count);
1172 return 2;
1173 }
1174
1175 /* scroll through /sys/dev/block looking for devices attached to
1176 * this hba
1177 */
1178 dir = opendir("/sys/dev/block");
1179 for (ent = dir ? readdir(dir) : NULL; ent; ent = readdir(dir)) {
1180 int fd;
1181 char model[64];
1182 char vendor[64];
1183 char buf[1024];
1184 int major, minor;
1185 char *device;
1186 char *c;
1187 int port;
1188 int type;
1189
1190 if (sscanf(ent->d_name, "%d:%d", &major, &minor) != 2)
1191 continue;
1192 path = devt_to_devpath(makedev(major, minor));
1193 if (!path)
1194 continue;
1195 if (!path_attached_to_hba(path, hba_path)) {
1196 free(path);
1197 path = NULL;
1198 continue;
1199 }
1200
1201 /* retrieve the scsi device type */
1202 if (asprintf(&device, "/sys/dev/block/%d:%d/device/xxxxxxx", major, minor) < 0) {
1203 if (verbose)
1204 fprintf(stderr, Name ": failed to allocate 'device'\n");
1205 err = 2;
1206 break;
1207 }
1208 sprintf(device, "/sys/dev/block/%d:%d/device/type", major, minor);
1209 if (load_sys(device, buf) != 0) {
1210 if (verbose)
1211 fprintf(stderr, Name ": failed to read device type for %s\n",
1212 path);
1213 err = 2;
1214 free(device);
1215 break;
1216 }
1217 type = strtoul(buf, NULL, 10);
1218
1219 /* if it's not a disk print the vendor and model */
1220 if (!(type == 0 || type == 7 || type == 14)) {
1221 vendor[0] = '\0';
1222 model[0] = '\0';
1223 sprintf(device, "/sys/dev/block/%d:%d/device/vendor", major, minor);
1224 if (load_sys(device, buf) == 0) {
1225 strncpy(vendor, buf, sizeof(vendor));
1226 vendor[sizeof(vendor) - 1] = '\0';
1227 c = (char *) &vendor[sizeof(vendor) - 1];
1228 while (isspace(*c) || *c == '\0')
1229 *c-- = '\0';
1230
1231 }
1232 sprintf(device, "/sys/dev/block/%d:%d/device/model", major, minor);
1233 if (load_sys(device, buf) == 0) {
1234 strncpy(model, buf, sizeof(model));
1235 model[sizeof(model) - 1] = '\0';
1236 c = (char *) &model[sizeof(model) - 1];
1237 while (isspace(*c) || *c == '\0')
1238 *c-- = '\0';
1239 }
1240
1241 if (vendor[0] && model[0])
1242 sprintf(buf, "%.64s %.64s", vendor, model);
1243 else
1244 switch (type) { /* numbers from hald/linux/device.c */
1245 case 1: sprintf(buf, "tape"); break;
1246 case 2: sprintf(buf, "printer"); break;
1247 case 3: sprintf(buf, "processor"); break;
1248 case 4:
1249 case 5: sprintf(buf, "cdrom"); break;
1250 case 6: sprintf(buf, "scanner"); break;
1251 case 8: sprintf(buf, "media_changer"); break;
1252 case 9: sprintf(buf, "comm"); break;
1253 case 12: sprintf(buf, "raid"); break;
1254 default: sprintf(buf, "unknown");
1255 }
1256 } else
1257 buf[0] = '\0';
1258 free(device);
1259
1260 /* chop device path to 'host%d' and calculate the port number */
1261 c = strchr(&path[hba_len], '/');
1262 if (!c) {
1263 if (verbose)
1264 fprintf(stderr, Name ": %s - invalid path name\n", path + hba_len);
1265 err = 2;
1266 break;
1267 }
1268 *c = '\0';
1269 if (sscanf(&path[hba_len], "host%d", &port) == 1)
1270 port -= host_base;
1271 else {
1272 if (verbose) {
1273 *c = '/'; /* repair the full string */
1274 fprintf(stderr, Name ": failed to determine port number for %s\n",
1275 path);
1276 }
1277 err = 2;
1278 break;
1279 }
1280
1281 /* mark this port as used */
1282 port_mask &= ~(1 << port);
1283
1284 /* print out the device information */
1285 if (buf[0]) {
1286 printf(" Port%d : - non-disk device (%s) -\n", port, buf);
1287 continue;
1288 }
1289
1290 fd = dev_open(ent->d_name, O_RDONLY);
1291 if (fd < 0)
1292 printf(" Port%d : - disk info unavailable -\n", port);
1293 else {
1294 fd2devname(fd, buf);
1295 printf(" Port%d : %s", port, buf);
1296 if (imsm_read_serial(fd, NULL, (__u8 *) buf) == 0)
1297 printf(" (%s)\n", buf);
1298 else
1299 printf("()\n");
1300 }
1301 close(fd);
1302 free(path);
1303 path = NULL;
1304 }
1305 if (path)
1306 free(path);
1307 if (dir)
1308 closedir(dir);
1309 if (err == 0) {
1310 int i;
1311
1312 for (i = 0; i < port_count; i++)
1313 if (port_mask & (1 << i))
1314 printf(" Port%d : - no device attached -\n", i);
1315 }
1316
1317 return err;
1318 }
1319
1320
1321
1322 static void print_found_intel_controllers(struct sys_dev *elem)
1323 {
1324 for (; elem; elem = elem->next) {
1325 fprintf(stderr, Name ": found Intel(R) ");
1326 if (elem->type == SYS_DEV_SATA)
1327 fprintf(stderr, "SATA ");
1328 else if (elem->type == SYS_DEV_SAS)
1329 fprintf(stderr, "SAS ");
1330 fprintf(stderr, "RAID controller");
1331 if (elem->pci_id)
1332 fprintf(stderr, " at %s", elem->pci_id);
1333 fprintf(stderr, ".\n");
1334 }
1335 fflush(stderr);
1336 }
1337
1338 static int ahci_get_port_count(const char *hba_path, int *port_count)
1339 {
1340 struct dirent *ent;
1341 DIR *dir;
1342 int host_base = -1;
1343
1344 *port_count = 0;
1345 if ((dir = opendir(hba_path)) == NULL)
1346 return -1;
1347
1348 for (ent = readdir(dir); ent; ent = readdir(dir)) {
1349 int host;
1350
1351 if (sscanf(ent->d_name, "host%d", &host) != 1)
1352 continue;
1353 if (*port_count == 0)
1354 host_base = host;
1355 else if (host < host_base)
1356 host_base = host;
1357
1358 if (host + 1 > *port_count + host_base)
1359 *port_count = host + 1 - host_base;
1360 }
1361 closedir(dir);
1362 return host_base;
1363 }
1364
1365 static void print_imsm_capability(const struct imsm_orom *orom)
1366 {
1367 printf(" Platform : Intel(R) Matrix Storage Manager\n");
1368 printf(" Version : %d.%d.%d.%d\n", orom->major_ver, orom->minor_ver,
1369 orom->hotfix_ver, orom->build);
1370 printf(" RAID Levels :%s%s%s%s%s\n",
1371 imsm_orom_has_raid0(orom) ? " raid0" : "",
1372 imsm_orom_has_raid1(orom) ? " raid1" : "",
1373 imsm_orom_has_raid1e(orom) ? " raid1e" : "",
1374 imsm_orom_has_raid10(orom) ? " raid10" : "",
1375 imsm_orom_has_raid5(orom) ? " raid5" : "");
1376 printf(" Chunk Sizes :%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
1377 imsm_orom_has_chunk(orom, 2) ? " 2k" : "",
1378 imsm_orom_has_chunk(orom, 4) ? " 4k" : "",
1379 imsm_orom_has_chunk(orom, 8) ? " 8k" : "",
1380 imsm_orom_has_chunk(orom, 16) ? " 16k" : "",
1381 imsm_orom_has_chunk(orom, 32) ? " 32k" : "",
1382 imsm_orom_has_chunk(orom, 64) ? " 64k" : "",
1383 imsm_orom_has_chunk(orom, 128) ? " 128k" : "",
1384 imsm_orom_has_chunk(orom, 256) ? " 256k" : "",
1385 imsm_orom_has_chunk(orom, 512) ? " 512k" : "",
1386 imsm_orom_has_chunk(orom, 1024*1) ? " 1M" : "",
1387 imsm_orom_has_chunk(orom, 1024*2) ? " 2M" : "",
1388 imsm_orom_has_chunk(orom, 1024*4) ? " 4M" : "",
1389 imsm_orom_has_chunk(orom, 1024*8) ? " 8M" : "",
1390 imsm_orom_has_chunk(orom, 1024*16) ? " 16M" : "",
1391 imsm_orom_has_chunk(orom, 1024*32) ? " 32M" : "",
1392 imsm_orom_has_chunk(orom, 1024*64) ? " 64M" : "");
1393 printf(" Max Disks : %d\n", orom->tds);
1394 printf(" Max Volumes : %d\n", orom->vpa);
1395 return;
1396 }
1397
1398 static int detail_platform_imsm(int verbose, int enumerate_only)
1399 {
1400 /* There are two components to imsm platform support, the ahci SATA
1401 * controller and the option-rom. To find the SATA controller we
1402 * simply look in /sys/bus/pci/drivers/ahci to see if an ahci
1403 * controller with the Intel vendor id is present. This approach
1404 * allows mdadm to leverage the kernel's ahci detection logic, with the
1405 * caveat that if ahci.ko is not loaded mdadm will not be able to
1406 * detect platform raid capabilities. The option-rom resides in a
1407 * platform "Adapter ROM". We scan for its signature to retrieve the
1408 * platform capabilities. If raid support is disabled in the BIOS the
1409 * option-rom capability structure will not be available.
1410 */
1411 const struct imsm_orom *orom;
1412 struct sys_dev *list, *hba;
1413 int host_base = 0;
1414 int port_count = 0;
1415 int result=0;
1416
1417 if (enumerate_only) {
1418 if (check_env("IMSM_NO_PLATFORM"))
1419 return 0;
1420 list = find_intel_devices();
1421 if (!list)
1422 return 2;
1423 for (hba = list; hba; hba = hba->next) {
1424 orom = find_imsm_capability(hba->type);
1425 if (!orom) {
1426 result = 2;
1427 break;
1428 }
1429 }
1430 free_sys_dev(&list);
1431 return result;
1432 }
1433
1434 list = find_intel_devices();
1435 if (!list) {
1436 if (verbose)
1437 fprintf(stderr, Name ": no active Intel(R) RAID "
1438 "controller found.\n");
1439 free_sys_dev(&list);
1440 return 2;
1441 } else if (verbose)
1442 print_found_intel_controllers(list);
1443
1444 for (hba = list; hba; hba = hba->next) {
1445 orom = find_imsm_capability(hba->type);
1446 if (!orom)
1447 fprintf(stderr, Name ": imsm capabilities not found for controller: %s (type %s)\n",
1448 hba->path, get_sys_dev_type(hba->type));
1449 else
1450 print_imsm_capability(orom);
1451 }
1452
1453 for (hba = list; hba; hba = hba->next) {
1454 printf(" I/O Controller : %s (%s)\n",
1455 hba->path, get_sys_dev_type(hba->type));
1456
1457 if (hba->type == SYS_DEV_SATA) {
1458 host_base = ahci_get_port_count(hba->path, &port_count);
1459 if (ahci_enumerate_ports(hba->path, port_count, host_base, verbose)) {
1460 if (verbose)
1461 fprintf(stderr, Name ": failed to enumerate "
1462 "ports on SATA controller at %s.", hba->pci_id);
1463 result |= 2;
1464 }
1465 }
1466 }
1467
1468 free_sys_dev(&list);
1469 return result;
1470 }
1471 #endif
1472
1473 static int match_home_imsm(struct supertype *st, char *homehost)
1474 {
1475 /* the imsm metadata format does not specify any host
1476 * identification information. We return -1 since we can never
1477 * confirm nor deny whether a given array is "meant" for this
1478 * host. We rely on compare_super and the 'family_num' fields to
1479 * exclude member disks that do not belong, and we rely on
1480 * mdadm.conf to specify the arrays that should be assembled.
1481 * Auto-assembly may still pick up "foreign" arrays.
1482 */
1483
1484 return -1;
1485 }
1486
1487 static void uuid_from_super_imsm(struct supertype *st, int uuid[4])
1488 {
1489 /* The uuid returned here is used for:
1490 * uuid to put into bitmap file (Create, Grow)
1491 * uuid for backup header when saving critical section (Grow)
1492 * comparing uuids when re-adding a device into an array
1493 * In these cases the uuid required is that of the data-array,
1494 * not the device-set.
1495 * uuid to recognise same set when adding a missing device back
1496 * to an array. This is a uuid for the device-set.
1497 *
1498 * For each of these we can make do with a truncated
1499 * or hashed uuid rather than the original, as long as
1500 * everyone agrees.
1501 * In each case the uuid required is that of the data-array,
1502 * not the device-set.
1503 */
1504 /* imsm does not track uuid's so we synthesis one using sha1 on
1505 * - The signature (Which is constant for all imsm array, but no matter)
1506 * - the orig_family_num of the container
1507 * - the index number of the volume
1508 * - the 'serial' number of the volume.
1509 * Hopefully these are all constant.
1510 */
1511 struct intel_super *super = st->sb;
1512
1513 char buf[20];
1514 struct sha1_ctx ctx;
1515 struct imsm_dev *dev = NULL;
1516 __u32 family_num;
1517
1518 /* some mdadm versions failed to set ->orig_family_num, in which
1519 * case fall back to ->family_num. orig_family_num will be
1520 * fixed up with the first metadata update.
1521 */
1522 family_num = super->anchor->orig_family_num;
1523 if (family_num == 0)
1524 family_num = super->anchor->family_num;
1525 sha1_init_ctx(&ctx);
1526 sha1_process_bytes(super->anchor->sig, MPB_SIG_LEN, &ctx);
1527 sha1_process_bytes(&family_num, sizeof(__u32), &ctx);
1528 if (super->current_vol >= 0)
1529 dev = get_imsm_dev(super, super->current_vol);
1530 if (dev) {
1531 __u32 vol = super->current_vol;
1532 sha1_process_bytes(&vol, sizeof(vol), &ctx);
1533 sha1_process_bytes(dev->volume, MAX_RAID_SERIAL_LEN, &ctx);
1534 }
1535 sha1_finish_ctx(&ctx, buf);
1536 memcpy(uuid, buf, 4*4);
1537 }
1538
1539 #if 0
1540 static void
1541 get_imsm_numerical_version(struct imsm_super *mpb, int *m, int *p)
1542 {
1543 __u8 *v = get_imsm_version(mpb);
1544 __u8 *end = mpb->sig + MAX_SIGNATURE_LENGTH;
1545 char major[] = { 0, 0, 0 };
1546 char minor[] = { 0 ,0, 0 };
1547 char patch[] = { 0, 0, 0 };
1548 char *ver_parse[] = { major, minor, patch };
1549 int i, j;
1550
1551 i = j = 0;
1552 while (*v != '\0' && v < end) {
1553 if (*v != '.' && j < 2)
1554 ver_parse[i][j++] = *v;
1555 else {
1556 i++;
1557 j = 0;
1558 }
1559 v++;
1560 }
1561
1562 *m = strtol(minor, NULL, 0);
1563 *p = strtol(patch, NULL, 0);
1564 }
1565 #endif
1566
1567 static __u32 migr_strip_blocks_resync(struct imsm_dev *dev)
1568 {
1569 /* migr_strip_size when repairing or initializing parity */
1570 struct imsm_map *map = get_imsm_map(dev, 0);
1571 __u32 chunk = __le32_to_cpu(map->blocks_per_strip);
1572
1573 switch (get_imsm_raid_level(map)) {
1574 case 5:
1575 case 10:
1576 return chunk;
1577 default:
1578 return 128*1024 >> 9;
1579 }
1580 }
1581
1582 static __u32 migr_strip_blocks_rebuild(struct imsm_dev *dev)
1583 {
1584 /* migr_strip_size when rebuilding a degraded disk, no idea why
1585 * this is different than migr_strip_size_resync(), but it's good
1586 * to be compatible
1587 */
1588 struct imsm_map *map = get_imsm_map(dev, 1);
1589 __u32 chunk = __le32_to_cpu(map->blocks_per_strip);
1590
1591 switch (get_imsm_raid_level(map)) {
1592 case 1:
1593 case 10:
1594 if (map->num_members % map->num_domains == 0)
1595 return 128*1024 >> 9;
1596 else
1597 return chunk;
1598 case 5:
1599 return max((__u32) 64*1024 >> 9, chunk);
1600 default:
1601 return 128*1024 >> 9;
1602 }
1603 }
1604
1605 static __u32 num_stripes_per_unit_resync(struct imsm_dev *dev)
1606 {
1607 struct imsm_map *lo = get_imsm_map(dev, 0);
1608 struct imsm_map *hi = get_imsm_map(dev, 1);
1609 __u32 lo_chunk = __le32_to_cpu(lo->blocks_per_strip);
1610 __u32 hi_chunk = __le32_to_cpu(hi->blocks_per_strip);
1611
1612 return max((__u32) 1, hi_chunk / lo_chunk);
1613 }
1614
1615 static __u32 num_stripes_per_unit_rebuild(struct imsm_dev *dev)
1616 {
1617 struct imsm_map *lo = get_imsm_map(dev, 0);
1618 int level = get_imsm_raid_level(lo);
1619
1620 if (level == 1 || level == 10) {
1621 struct imsm_map *hi = get_imsm_map(dev, 1);
1622
1623 return hi->num_domains;
1624 } else
1625 return num_stripes_per_unit_resync(dev);
1626 }
1627
1628 static __u8 imsm_num_data_members(struct imsm_dev *dev, int second_map)
1629 {
1630 /* named 'imsm_' because raid0, raid1 and raid10
1631 * counter-intuitively have the same number of data disks
1632 */
1633 struct imsm_map *map = get_imsm_map(dev, second_map);
1634
1635 switch (get_imsm_raid_level(map)) {
1636 case 0:
1637 case 1:
1638 case 10:
1639 return map->num_members;
1640 case 5:
1641 return map->num_members - 1;
1642 default:
1643 dprintf("%s: unsupported raid level\n", __func__);
1644 return 0;
1645 }
1646 }
1647
1648 static __u32 parity_segment_depth(struct imsm_dev *dev)
1649 {
1650 struct imsm_map *map = get_imsm_map(dev, 0);
1651 __u32 chunk = __le32_to_cpu(map->blocks_per_strip);
1652
1653 switch(get_imsm_raid_level(map)) {
1654 case 1:
1655 case 10:
1656 return chunk * map->num_domains;
1657 case 5:
1658 return chunk * map->num_members;
1659 default:
1660 return chunk;
1661 }
1662 }
1663
1664 static __u32 map_migr_block(struct imsm_dev *dev, __u32 block)
1665 {
1666 struct imsm_map *map = get_imsm_map(dev, 1);
1667 __u32 chunk = __le32_to_cpu(map->blocks_per_strip);
1668 __u32 strip = block / chunk;
1669
1670 switch (get_imsm_raid_level(map)) {
1671 case 1:
1672 case 10: {
1673 __u32 vol_strip = (strip * map->num_domains) + 1;
1674 __u32 vol_stripe = vol_strip / map->num_members;
1675
1676 return vol_stripe * chunk + block % chunk;
1677 } case 5: {
1678 __u32 stripe = strip / (map->num_members - 1);
1679
1680 return stripe * chunk + block % chunk;
1681 }
1682 default:
1683 return 0;
1684 }
1685 }
1686
1687 static __u64 blocks_per_migr_unit(struct imsm_dev *dev)
1688 {
1689 /* calculate the conversion factor between per member 'blocks'
1690 * (md/{resync,rebuild}_start) and imsm migration units, return
1691 * 0 for the 'not migrating' and 'unsupported migration' cases
1692 */
1693 if (!dev->vol.migr_state)
1694 return 0;
1695
1696 switch (migr_type(dev)) {
1697 case MIGR_GEN_MIGR:
1698 case MIGR_VERIFY:
1699 case MIGR_REPAIR:
1700 case MIGR_INIT: {
1701 struct imsm_map *map = get_imsm_map(dev, 0);
1702 __u32 stripes_per_unit;
1703 __u32 blocks_per_unit;
1704 __u32 parity_depth;
1705 __u32 migr_chunk;
1706 __u32 block_map;
1707 __u32 block_rel;
1708 __u32 segment;
1709 __u32 stripe;
1710 __u8 disks;
1711
1712 /* yes, this is really the translation of migr_units to
1713 * per-member blocks in the 'resync' case
1714 */
1715 stripes_per_unit = num_stripes_per_unit_resync(dev);
1716 migr_chunk = migr_strip_blocks_resync(dev);
1717 disks = imsm_num_data_members(dev, 0);
1718 blocks_per_unit = stripes_per_unit * migr_chunk * disks;
1719 stripe = __le32_to_cpu(map->blocks_per_strip) * disks;
1720 segment = blocks_per_unit / stripe;
1721 block_rel = blocks_per_unit - segment * stripe;
1722 parity_depth = parity_segment_depth(dev);
1723 block_map = map_migr_block(dev, block_rel);
1724 return block_map + parity_depth * segment;
1725 }
1726 case MIGR_REBUILD: {
1727 __u32 stripes_per_unit;
1728 __u32 migr_chunk;
1729
1730 stripes_per_unit = num_stripes_per_unit_rebuild(dev);
1731 migr_chunk = migr_strip_blocks_rebuild(dev);
1732 return migr_chunk * stripes_per_unit;
1733 }
1734 case MIGR_STATE_CHANGE:
1735 default:
1736 return 0;
1737 }
1738 }
1739
1740 static int imsm_level_to_layout(int level)
1741 {
1742 switch (level) {
1743 case 0:
1744 case 1:
1745 return 0;
1746 case 5:
1747 case 6:
1748 return ALGORITHM_LEFT_ASYMMETRIC;
1749 case 10:
1750 return 0x102;
1751 }
1752 return UnSet;
1753 }
1754
1755 static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info, char *dmap)
1756 {
1757 struct intel_super *super = st->sb;
1758 struct imsm_dev *dev = get_imsm_dev(super, super->current_vol);
1759 struct imsm_map *map = get_imsm_map(dev, 0);
1760 struct imsm_map *prev_map = get_imsm_map(dev, 1);
1761 struct imsm_map *map_to_analyse = map;
1762 struct dl *dl;
1763 char *devname;
1764 unsigned int component_size_alligment;
1765 int map_disks = info->array.raid_disks;
1766
1767 if (prev_map)
1768 map_to_analyse = prev_map;
1769
1770 for (dl = super->disks; dl; dl = dl->next)
1771 if (dl->raiddisk == info->disk.raid_disk)
1772 break;
1773 info->container_member = super->current_vol;
1774 info->array.raid_disks = map->num_members;
1775 info->array.level = get_imsm_raid_level(map_to_analyse);
1776 info->array.layout = imsm_level_to_layout(info->array.level);
1777 info->array.md_minor = -1;
1778 info->array.ctime = 0;
1779 info->array.utime = 0;
1780 info->array.chunk_size =
1781 __le16_to_cpu(map_to_analyse->blocks_per_strip) << 9;
1782 info->array.state = !dev->vol.dirty;
1783 info->custom_array_size = __le32_to_cpu(dev->size_high);
1784 info->custom_array_size <<= 32;
1785 info->custom_array_size |= __le32_to_cpu(dev->size_low);
1786 if (prev_map && map->map_state == prev_map->map_state) {
1787 info->reshape_active = 1;
1788 info->new_level = get_imsm_raid_level(map);
1789 info->new_layout = imsm_level_to_layout(info->new_level);
1790 info->new_chunk = __le16_to_cpu(map->blocks_per_strip) << 9;
1791 info->delta_disks = map->num_members - prev_map->num_members;
1792 if (info->delta_disks) {
1793 /* this needs to be applied to every array
1794 * in the container.
1795 */
1796 info->reshape_active = 2;
1797 }
1798 /* We shape information that we give to md might have to be
1799 * modify to cope with md's requirement for reshaping arrays.
1800 * For example, when reshaping a RAID0, md requires it to be
1801 * presented as a degraded RAID4.
1802 * Also if a RAID0 is migrating to a RAID5 we need to specify
1803 * the array as already being RAID5, but the 'before' layout
1804 * is a RAID4-like layout.
1805 */
1806 switch (info->array.level) {
1807 case 0:
1808 switch(info->new_level) {
1809 case 0:
1810 /* conversion is happening as RAID4 */
1811 info->array.level = 4;
1812 info->array.raid_disks += 1;
1813 break;
1814 case 5:
1815 /* conversion is happening as RAID5 */
1816 info->array.level = 5;
1817 info->array.layout = ALGORITHM_PARITY_N;
1818 info->array.raid_disks += 1;
1819 info->delta_disks -= 1;
1820 break;
1821 default:
1822 /* FIXME error message */
1823 info->array.level = UnSet;
1824 break;
1825 }
1826 break;
1827 }
1828 } else {
1829 info->new_level = UnSet;
1830 info->new_layout = UnSet;
1831 info->new_chunk = info->array.chunk_size;
1832 info->delta_disks = 0;
1833 }
1834 info->disk.major = 0;
1835 info->disk.minor = 0;
1836 if (dl) {
1837 info->disk.major = dl->major;
1838 info->disk.minor = dl->minor;
1839 }
1840
1841 info->data_offset = __le32_to_cpu(map_to_analyse->pba_of_lba0);
1842 info->component_size =
1843 __le32_to_cpu(map_to_analyse->blocks_per_member);
1844
1845 /* check component size aligment
1846 */
1847 component_size_alligment =
1848 info->component_size % (info->array.chunk_size/512);
1849
1850 if (component_size_alligment &&
1851 (info->array.level != 1) && (info->array.level != UnSet)) {
1852 dprintf("imsm: reported component size alligned from %llu ",
1853 info->component_size);
1854 info->component_size -= component_size_alligment;
1855 dprintf("to %llu (%i).\n",
1856 info->component_size, component_size_alligment);
1857 }
1858
1859 memset(info->uuid, 0, sizeof(info->uuid));
1860 info->recovery_start = MaxSector;
1861
1862 info->reshape_progress = 0;
1863 info->resync_start = MaxSector;
1864 if (map_to_analyse->map_state == IMSM_T_STATE_UNINITIALIZED ||
1865 dev->vol.dirty) {
1866 info->resync_start = 0;
1867 }
1868 if (dev->vol.migr_state) {
1869 switch (migr_type(dev)) {
1870 case MIGR_REPAIR:
1871 case MIGR_INIT: {
1872 __u64 blocks_per_unit = blocks_per_migr_unit(dev);
1873 __u64 units = __le32_to_cpu(dev->vol.curr_migr_unit);
1874
1875 info->resync_start = blocks_per_unit * units;
1876 break;
1877 }
1878 case MIGR_GEN_MIGR: {
1879 __u64 blocks_per_unit = blocks_per_migr_unit(dev);
1880 __u64 units = __le32_to_cpu(dev->vol.curr_migr_unit);
1881 unsigned long long array_blocks;
1882 int used_disks;
1883
1884 info->reshape_progress = blocks_per_unit * units;
1885
1886 /* checkpoint is written per disks unit
1887 * recalculate it to reshape position
1888 */
1889 used_disks = imsm_num_data_members(dev, 0);
1890 info->reshape_progress *= used_disks;
1891 dprintf("IMSM: General Migration checkpoint : %llu "
1892 "(%llu) -> read reshape progress : %llu\n",
1893 units, blocks_per_unit, info->reshape_progress);
1894
1895 used_disks = imsm_num_data_members(dev, 1);
1896 if (used_disks > 0) {
1897 array_blocks = map->blocks_per_member *
1898 used_disks;
1899 /* round array size down to closest MB
1900 */
1901 info->custom_array_size = (array_blocks
1902 >> SECT_PER_MB_SHIFT)
1903 << SECT_PER_MB_SHIFT;
1904 }
1905 }
1906 case MIGR_VERIFY:
1907 /* we could emulate the checkpointing of
1908 * 'sync_action=check' migrations, but for now
1909 * we just immediately complete them
1910 */
1911 case MIGR_REBUILD:
1912 /* this is handled by container_content_imsm() */
1913 case MIGR_STATE_CHANGE:
1914 /* FIXME handle other migrations */
1915 default:
1916 /* we are not dirty, so... */
1917 info->resync_start = MaxSector;
1918 }
1919 }
1920
1921 strncpy(info->name, (char *) dev->volume, MAX_RAID_SERIAL_LEN);
1922 info->name[MAX_RAID_SERIAL_LEN] = 0;
1923
1924 info->array.major_version = -1;
1925 info->array.minor_version = -2;
1926 devname = devnum2devname(st->container_dev);
1927 *info->text_version = '\0';
1928 if (devname)
1929 sprintf(info->text_version, "/%s/%d", devname, info->container_member);
1930 free(devname);
1931 info->safe_mode_delay = 4000; /* 4 secs like the Matrix driver */
1932 uuid_from_super_imsm(st, info->uuid);
1933
1934 if (dmap) {
1935 int i, j;
1936 for (i=0; i<map_disks; i++) {
1937 dmap[i] = 0;
1938 if (i < info->array.raid_disks) {
1939 struct imsm_disk *dsk;
1940 j = get_imsm_disk_idx(dev, i, -1);
1941 dsk = get_imsm_disk(super, j);
1942 if (dsk && (dsk->status & CONFIGURED_DISK))
1943 dmap[i] = 1;
1944 }
1945 }
1946 }
1947 }
1948
1949 static __u8 imsm_check_degraded(struct intel_super *super, struct imsm_dev *dev, int failed);
1950 static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev);
1951
1952 static struct imsm_disk *get_imsm_missing(struct intel_super *super, __u8 index)
1953 {
1954 struct dl *d;
1955
1956 for (d = super->missing; d; d = d->next)
1957 if (d->index == index)
1958 return &d->disk;
1959 return NULL;
1960 }
1961
1962 static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info, char *map)
1963 {
1964 struct intel_super *super = st->sb;
1965 struct imsm_disk *disk;
1966 int map_disks = info->array.raid_disks;
1967 int max_enough = -1;
1968 int i;
1969 struct imsm_super *mpb;
1970
1971 if (super->current_vol >= 0) {
1972 getinfo_super_imsm_volume(st, info, map);
1973 return;
1974 }
1975
1976 /* Set raid_disks to zero so that Assemble will always pull in valid
1977 * spares
1978 */
1979 info->array.raid_disks = 0;
1980 info->array.level = LEVEL_CONTAINER;
1981 info->array.layout = 0;
1982 info->array.md_minor = -1;
1983 info->array.ctime = 0; /* N/A for imsm */
1984 info->array.utime = 0;
1985 info->array.chunk_size = 0;
1986
1987 info->disk.major = 0;
1988 info->disk.minor = 0;
1989 info->disk.raid_disk = -1;
1990 info->reshape_active = 0;
1991 info->array.major_version = -1;
1992 info->array.minor_version = -2;
1993 strcpy(info->text_version, "imsm");
1994 info->safe_mode_delay = 0;
1995 info->disk.number = -1;
1996 info->disk.state = 0;
1997 info->name[0] = 0;
1998 info->recovery_start = MaxSector;
1999
2000 /* do we have the all the insync disks that we expect? */
2001 mpb = super->anchor;
2002
2003 for (i = 0; i < mpb->num_raid_devs; i++) {
2004 struct imsm_dev *dev = get_imsm_dev(super, i);
2005 int failed, enough, j, missing = 0;
2006 struct imsm_map *map;
2007 __u8 state;
2008
2009 failed = imsm_count_failed(super, dev);
2010 state = imsm_check_degraded(super, dev, failed);
2011 map = get_imsm_map(dev, dev->vol.migr_state);
2012
2013 /* any newly missing disks?
2014 * (catches single-degraded vs double-degraded)
2015 */
2016 for (j = 0; j < map->num_members; j++) {
2017 __u32 ord = get_imsm_ord_tbl_ent(dev, i, -1);
2018 __u32 idx = ord_to_idx(ord);
2019
2020 if (!(ord & IMSM_ORD_REBUILD) &&
2021 get_imsm_missing(super, idx)) {
2022 missing = 1;
2023 break;
2024 }
2025 }
2026
2027 if (state == IMSM_T_STATE_FAILED)
2028 enough = -1;
2029 else if (state == IMSM_T_STATE_DEGRADED &&
2030 (state != map->map_state || missing))
2031 enough = 0;
2032 else /* we're normal, or already degraded */
2033 enough = 1;
2034
2035 /* in the missing/failed disk case check to see
2036 * if at least one array is runnable
2037 */
2038 max_enough = max(max_enough, enough);
2039 }
2040 dprintf("%s: enough: %d\n", __func__, max_enough);
2041 info->container_enough = max_enough;
2042
2043 if (super->disks) {
2044 __u32 reserved = imsm_reserved_sectors(super, super->disks);
2045
2046 disk = &super->disks->disk;
2047 info->data_offset = __le32_to_cpu(disk->total_blocks) - reserved;
2048 info->component_size = reserved;
2049 info->disk.state = is_configured(disk) ? (1 << MD_DISK_ACTIVE) : 0;
2050 /* we don't change info->disk.raid_disk here because
2051 * this state will be finalized in mdmon after we have
2052 * found the 'most fresh' version of the metadata
2053 */
2054 info->disk.state |= is_failed(disk) ? (1 << MD_DISK_FAULTY) : 0;
2055 info->disk.state |= is_spare(disk) ? 0 : (1 << MD_DISK_SYNC);
2056 }
2057
2058 /* only call uuid_from_super_imsm when this disk is part of a populated container,
2059 * ->compare_super may have updated the 'num_raid_devs' field for spares
2060 */
2061 if (info->disk.state & (1 << MD_DISK_SYNC) || super->anchor->num_raid_devs)
2062 uuid_from_super_imsm(st, info->uuid);
2063 else
2064 memcpy(info->uuid, uuid_zero, sizeof(uuid_zero));
2065
2066 /* I don't know how to compute 'map' on imsm, so use safe default */
2067 if (map) {
2068 int i;
2069 for (i = 0; i < map_disks; i++)
2070 map[i] = 1;
2071 }
2072
2073 }
2074
2075 /* allocates memory and fills disk in mdinfo structure
2076 * for each disk in array */
2077 struct mdinfo *getinfo_super_disks_imsm(struct supertype *st)
2078 {
2079 struct mdinfo *mddev = NULL;
2080 struct intel_super *super = st->sb;
2081 struct imsm_disk *disk;
2082 int count = 0;
2083 struct dl *dl;
2084 if (!super || !super->disks)
2085 return NULL;
2086 dl = super->disks;
2087 mddev = malloc(sizeof(*mddev));
2088 if (!mddev) {
2089 fprintf(stderr, Name ": Failed to allocate memory.\n");
2090 return NULL;
2091 }
2092 memset(mddev, 0, sizeof(*mddev));
2093 while (dl) {
2094 struct mdinfo *tmp;
2095 disk = &dl->disk;
2096 tmp = malloc(sizeof(*tmp));
2097 if (!tmp) {
2098 fprintf(stderr, Name ": Failed to allocate memory.\n");
2099 if (mddev)
2100 sysfs_free(mddev);
2101 return NULL;
2102 }
2103 memset(tmp, 0, sizeof(*tmp));
2104 if (mddev->devs)
2105 tmp->next = mddev->devs;
2106 mddev->devs = tmp;
2107 tmp->disk.number = count++;
2108 tmp->disk.major = dl->major;
2109 tmp->disk.minor = dl->minor;
2110 tmp->disk.state = is_configured(disk) ?
2111 (1 << MD_DISK_ACTIVE) : 0;
2112 tmp->disk.state |= is_failed(disk) ? (1 << MD_DISK_FAULTY) : 0;
2113 tmp->disk.state |= is_spare(disk) ? 0 : (1 << MD_DISK_SYNC);
2114 tmp->disk.raid_disk = -1;
2115 dl = dl->next;
2116 }
2117 return mddev;
2118 }
2119
2120 static int update_super_imsm(struct supertype *st, struct mdinfo *info,
2121 char *update, char *devname, int verbose,
2122 int uuid_set, char *homehost)
2123 {
2124 /* For 'assemble' and 'force' we need to return non-zero if any
2125 * change was made. For others, the return value is ignored.
2126 * Update options are:
2127 * force-one : This device looks a bit old but needs to be included,
2128 * update age info appropriately.
2129 * assemble: clear any 'faulty' flag to allow this device to
2130 * be assembled.
2131 * force-array: Array is degraded but being forced, mark it clean
2132 * if that will be needed to assemble it.
2133 *
2134 * newdev: not used ????
2135 * grow: Array has gained a new device - this is currently for
2136 * linear only
2137 * resync: mark as dirty so a resync will happen.
2138 * name: update the name - preserving the homehost
2139 * uuid: Change the uuid of the array to match watch is given
2140 *
2141 * Following are not relevant for this imsm:
2142 * sparc2.2 : update from old dodgey metadata
2143 * super-minor: change the preferred_minor number
2144 * summaries: update redundant counters.
2145 * homehost: update the recorded homehost
2146 * _reshape_progress: record new reshape_progress position.
2147 */
2148 int rv = 1;
2149 struct intel_super *super = st->sb;
2150 struct imsm_super *mpb;
2151
2152 /* we can only update container info */
2153 if (!super || super->current_vol >= 0 || !super->anchor)
2154 return 1;
2155
2156 mpb = super->anchor;
2157
2158 if (strcmp(update, "uuid") == 0 && uuid_set && !info->update_private)
2159 rv = -1;
2160 else if (strcmp(update, "uuid") == 0 && uuid_set && info->update_private) {
2161 mpb->orig_family_num = *((__u32 *) info->update_private);
2162 rv = 0;
2163 } else if (strcmp(update, "uuid") == 0) {
2164 __u32 *new_family = malloc(sizeof(*new_family));
2165
2166 /* update orig_family_number with the incoming random
2167 * data, report the new effective uuid, and store the
2168 * new orig_family_num for future updates.
2169 */
2170 if (new_family) {
2171 memcpy(&mpb->orig_family_num, info->uuid, sizeof(__u32));
2172 uuid_from_super_imsm(st, info->uuid);
2173 *new_family = mpb->orig_family_num;
2174 info->update_private = new_family;
2175 rv = 0;
2176 }
2177 } else if (strcmp(update, "assemble") == 0)
2178 rv = 0;
2179 else
2180 rv = -1;
2181
2182 /* successful update? recompute checksum */
2183 if (rv == 0)
2184 mpb->check_sum = __le32_to_cpu(__gen_imsm_checksum(mpb));
2185
2186 return rv;
2187 }
2188
2189 static size_t disks_to_mpb_size(int disks)
2190 {
2191 size_t size;
2192
2193 size = sizeof(struct imsm_super);
2194 size += (disks - 1) * sizeof(struct imsm_disk);
2195 size += 2 * sizeof(struct imsm_dev);
2196 /* up to 2 maps per raid device (-2 for imsm_maps in imsm_dev */
2197 size += (4 - 2) * sizeof(struct imsm_map);
2198 /* 4 possible disk_ord_tbl's */
2199 size += 4 * (disks - 1) * sizeof(__u32);
2200
2201 return size;
2202 }
2203
2204 static __u64 avail_size_imsm(struct supertype *st, __u64 devsize)
2205 {
2206 if (devsize < (MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS))
2207 return 0;
2208
2209 return devsize - (MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS);
2210 }
2211
2212 static void free_devlist(struct intel_super *super)
2213 {
2214 struct intel_dev *dv;
2215
2216 while (super->devlist) {
2217 dv = super->devlist->next;
2218 free(super->devlist->dev);
2219 free(super->devlist);
2220 super->devlist = dv;
2221 }
2222 }
2223
2224 static void imsm_copy_dev(struct imsm_dev *dest, struct imsm_dev *src)
2225 {
2226 memcpy(dest, src, sizeof_imsm_dev(src, 0));
2227 }
2228
2229 static int compare_super_imsm(struct supertype *st, struct supertype *tst)
2230 {
2231 /*
2232 * return:
2233 * 0 same, or first was empty, and second was copied
2234 * 1 second had wrong number
2235 * 2 wrong uuid
2236 * 3 wrong other info
2237 */
2238 struct intel_super *first = st->sb;
2239 struct intel_super *sec = tst->sb;
2240
2241 if (!first) {
2242 st->sb = tst->sb;
2243 tst->sb = NULL;
2244 return 0;
2245 }
2246 /* in platform dependent environment test if the disks
2247 * use the same Intel hba
2248 */
2249 if (!check_env("IMSM_NO_PLATFORM")) {
2250 if (!first->hba || !sec->hba ||
2251 (first->hba->type != sec->hba->type)) {
2252 fprintf(stderr,
2253 "HBAs of devices does not match %s != %s\n",
2254 first->hba ? get_sys_dev_type(first->hba->type) : NULL,
2255 sec->hba ? get_sys_dev_type(sec->hba->type) : NULL);
2256 return 3;
2257 }
2258 }
2259
2260 /* if an anchor does not have num_raid_devs set then it is a free
2261 * floating spare
2262 */
2263 if (first->anchor->num_raid_devs > 0 &&
2264 sec->anchor->num_raid_devs > 0) {
2265 /* Determine if these disks might ever have been
2266 * related. Further disambiguation can only take place
2267 * in load_super_imsm_all
2268 */
2269 __u32 first_family = first->anchor->orig_family_num;
2270 __u32 sec_family = sec->anchor->orig_family_num;
2271
2272 if (memcmp(first->anchor->sig, sec->anchor->sig,
2273 MAX_SIGNATURE_LENGTH) != 0)
2274 return 3;
2275
2276 if (first_family == 0)
2277 first_family = first->anchor->family_num;
2278 if (sec_family == 0)
2279 sec_family = sec->anchor->family_num;
2280
2281 if (first_family != sec_family)
2282 return 3;
2283
2284 }
2285
2286
2287 /* if 'first' is a spare promote it to a populated mpb with sec's
2288 * family number
2289 */
2290 if (first->anchor->num_raid_devs == 0 &&
2291 sec->anchor->num_raid_devs > 0) {
2292 int i;
2293 struct intel_dev *dv;
2294 struct imsm_dev *dev;
2295
2296 /* we need to copy raid device info from sec if an allocation
2297 * fails here we don't associate the spare
2298 */
2299 for (i = 0; i < sec->anchor->num_raid_devs; i++) {
2300 dv = malloc(sizeof(*dv));
2301 if (!dv)
2302 break;
2303 dev = malloc(sizeof_imsm_dev(get_imsm_dev(sec, i), 1));
2304 if (!dev) {
2305 free(dv);
2306 break;
2307 }
2308 dv->dev = dev;
2309 dv->index = i;
2310 dv->next = first->devlist;
2311 first->devlist = dv;
2312 }
2313 if (i < sec->anchor->num_raid_devs) {
2314 /* allocation failure */
2315 free_devlist(first);
2316 fprintf(stderr, "imsm: failed to associate spare\n");
2317 return 3;
2318 }
2319 first->anchor->num_raid_devs = sec->anchor->num_raid_devs;
2320 first->anchor->orig_family_num = sec->anchor->orig_family_num;
2321 first->anchor->family_num = sec->anchor->family_num;
2322 memcpy(first->anchor->sig, sec->anchor->sig, MAX_SIGNATURE_LENGTH);
2323 for (i = 0; i < sec->anchor->num_raid_devs; i++)
2324 imsm_copy_dev(get_imsm_dev(first, i), get_imsm_dev(sec, i));
2325 }
2326
2327 return 0;
2328 }
2329
2330 static void fd2devname(int fd, char *name)
2331 {
2332 struct stat st;
2333 char path[256];
2334 char dname[PATH_MAX];
2335 char *nm;
2336 int rv;
2337
2338 name[0] = '\0';
2339 if (fstat(fd, &st) != 0)
2340 return;
2341 sprintf(path, "/sys/dev/block/%d:%d",
2342 major(st.st_rdev), minor(st.st_rdev));
2343
2344 rv = readlink(path, dname, sizeof(dname));
2345 if (rv <= 0)
2346 return;
2347
2348 dname[rv] = '\0';
2349 nm = strrchr(dname, '/');
2350 nm++;
2351 snprintf(name, MAX_RAID_SERIAL_LEN, "/dev/%s", nm);
2352 }
2353
2354 extern int scsi_get_serial(int fd, void *buf, size_t buf_len);
2355
2356 static int imsm_read_serial(int fd, char *devname,
2357 __u8 serial[MAX_RAID_SERIAL_LEN])
2358 {
2359 unsigned char scsi_serial[255];
2360 int rv;
2361 int rsp_len;
2362 int len;
2363 char *dest;
2364 char *src;
2365 char *rsp_buf;
2366 int i;
2367
2368 memset(scsi_serial, 0, sizeof(scsi_serial));
2369
2370 rv = scsi_get_serial(fd, scsi_serial, sizeof(scsi_serial));
2371
2372 if (rv && check_env("IMSM_DEVNAME_AS_SERIAL")) {
2373 memset(serial, 0, MAX_RAID_SERIAL_LEN);
2374 fd2devname(fd, (char *) serial);
2375 return 0;
2376 }
2377
2378 if (rv != 0) {
2379 if (devname)
2380 fprintf(stderr,
2381 Name ": Failed to retrieve serial for %s\n",
2382 devname);
2383 return rv;
2384 }
2385
2386 rsp_len = scsi_serial[3];
2387 if (!rsp_len) {
2388 if (devname)
2389 fprintf(stderr,
2390 Name ": Failed to retrieve serial for %s\n",
2391 devname);
2392 return 2;
2393 }
2394 rsp_buf = (char *) &scsi_serial[4];
2395
2396 /* trim all whitespace and non-printable characters and convert
2397 * ':' to ';'
2398 */
2399 for (i = 0, dest = rsp_buf; i < rsp_len; i++) {
2400 src = &rsp_buf[i];
2401 if (*src > 0x20) {
2402 /* ':' is reserved for use in placeholder serial
2403 * numbers for missing disks
2404 */
2405 if (*src == ':')
2406 *dest++ = ';';
2407 else
2408 *dest++ = *src;
2409 }
2410 }
2411 len = dest - rsp_buf;
2412 dest = rsp_buf;
2413
2414 /* truncate leading characters */
2415 if (len > MAX_RAID_SERIAL_LEN) {
2416 dest += len - MAX_RAID_SERIAL_LEN;
2417 len = MAX_RAID_SERIAL_LEN;
2418 }
2419
2420 memset(serial, 0, MAX_RAID_SERIAL_LEN);
2421 memcpy(serial, dest, len);
2422
2423 return 0;
2424 }
2425
2426 static int serialcmp(__u8 *s1, __u8 *s2)
2427 {
2428 return strncmp((char *) s1, (char *) s2, MAX_RAID_SERIAL_LEN);
2429 }
2430
2431 static void serialcpy(__u8 *dest, __u8 *src)
2432 {
2433 strncpy((char *) dest, (char *) src, MAX_RAID_SERIAL_LEN);
2434 }
2435
2436 #ifndef MDASSEMBLE
2437 static struct dl *serial_to_dl(__u8 *serial, struct intel_super *super)
2438 {
2439 struct dl *dl;
2440
2441 for (dl = super->disks; dl; dl = dl->next)
2442 if (serialcmp(dl->serial, serial) == 0)
2443 break;
2444
2445 return dl;
2446 }
2447 #endif
2448
2449 static struct imsm_disk *
2450 __serial_to_disk(__u8 *serial, struct imsm_super *mpb, int *idx)
2451 {
2452 int i;
2453
2454 for (i = 0; i < mpb->num_disks; i++) {
2455 struct imsm_disk *disk = __get_imsm_disk(mpb, i);
2456
2457 if (serialcmp(disk->serial, serial) == 0) {
2458 if (idx)
2459 *idx = i;
2460 return disk;
2461 }
2462 }
2463
2464 return NULL;
2465 }
2466
2467 static int
2468 load_imsm_disk(int fd, struct intel_super *super, char *devname, int keep_fd)
2469 {
2470 struct imsm_disk *disk;
2471 struct dl *dl;
2472 struct stat stb;
2473 int rv;
2474 char name[40];
2475 __u8 serial[MAX_RAID_SERIAL_LEN];
2476
2477 rv = imsm_read_serial(fd, devname, serial);
2478
2479 if (rv != 0)
2480 return 2;
2481
2482 dl = calloc(1, sizeof(*dl));
2483 if (!dl) {
2484 if (devname)
2485 fprintf(stderr,
2486 Name ": failed to allocate disk buffer for %s\n",
2487 devname);
2488 return 2;
2489 }
2490
2491 fstat(fd, &stb);
2492 dl->major = major(stb.st_rdev);
2493 dl->minor = minor(stb.st_rdev);
2494 dl->next = super->disks;
2495 dl->fd = keep_fd ? fd : -1;
2496 assert(super->disks == NULL);
2497 super->disks = dl;
2498 serialcpy(dl->serial, serial);
2499 dl->index = -2;
2500 dl->e = NULL;
2501 fd2devname(fd, name);
2502 if (devname)
2503 dl->devname = strdup(devname);
2504 else
2505 dl->devname = strdup(name);
2506
2507 /* look up this disk's index in the current anchor */
2508 disk = __serial_to_disk(dl->serial, super->anchor, &dl->index);
2509 if (disk) {
2510 dl->disk = *disk;
2511 /* only set index on disks that are a member of a
2512 * populated contianer, i.e. one with raid_devs
2513 */
2514 if (is_failed(&dl->disk))
2515 dl->index = -2;
2516 else if (is_spare(&dl->disk))
2517 dl->index = -1;
2518 }
2519
2520 return 0;
2521 }
2522
2523 #ifndef MDASSEMBLE
2524 /* When migrating map0 contains the 'destination' state while map1
2525 * contains the current state. When not migrating map0 contains the
2526 * current state. This routine assumes that map[0].map_state is set to
2527 * the current array state before being called.
2528 *
2529 * Migration is indicated by one of the following states
2530 * 1/ Idle (migr_state=0 map0state=normal||unitialized||degraded||failed)
2531 * 2/ Initialize (migr_state=1 migr_type=MIGR_INIT map0state=normal
2532 * map1state=unitialized)
2533 * 3/ Repair (Resync) (migr_state=1 migr_type=MIGR_REPAIR map0state=normal
2534 * map1state=normal)
2535 * 4/ Rebuild (migr_state=1 migr_type=MIGR_REBUILD map0state=normal
2536 * map1state=degraded)
2537 */
2538 static void migrate(struct imsm_dev *dev, __u8 to_state, int migr_type)
2539 {
2540 struct imsm_map *dest;
2541 struct imsm_map *src = get_imsm_map(dev, 0);
2542
2543 dev->vol.migr_state = 1;
2544 set_migr_type(dev, migr_type);
2545 dev->vol.curr_migr_unit = 0;
2546 dest = get_imsm_map(dev, 1);
2547
2548 /* duplicate and then set the target end state in map[0] */
2549 memcpy(dest, src, sizeof_imsm_map(src));
2550 if ((migr_type == MIGR_REBUILD) ||
2551 (migr_type == MIGR_GEN_MIGR)) {
2552 __u32 ord;
2553 int i;
2554
2555 for (i = 0; i < src->num_members; i++) {
2556 ord = __le32_to_cpu(src->disk_ord_tbl[i]);
2557 set_imsm_ord_tbl_ent(src, i, ord_to_idx(ord));
2558 }
2559 }
2560
2561 src->map_state = to_state;
2562 }
2563
2564 static void end_migration(struct imsm_dev *dev, __u8 map_state)
2565 {
2566 struct imsm_map *map = get_imsm_map(dev, 0);
2567 struct imsm_map *prev = get_imsm_map(dev, dev->vol.migr_state);
2568 int i, j;
2569
2570 /* merge any IMSM_ORD_REBUILD bits that were not successfully
2571 * completed in the last migration.
2572 *
2573 * FIXME add support for raid-level-migration
2574 */
2575 for (i = 0; i < prev->num_members; i++)
2576 for (j = 0; j < map->num_members; j++)
2577 /* during online capacity expansion
2578 * disks position can be changed if takeover is used
2579 */
2580 if (ord_to_idx(map->disk_ord_tbl[j]) ==
2581 ord_to_idx(prev->disk_ord_tbl[i])) {
2582 map->disk_ord_tbl[j] |= prev->disk_ord_tbl[i];
2583 break;
2584 }
2585
2586 dev->vol.migr_state = 0;
2587 dev->vol.migr_type = 0;
2588 dev->vol.curr_migr_unit = 0;
2589 map->map_state = map_state;
2590 }
2591 #endif
2592
2593 static int parse_raid_devices(struct intel_super *super)
2594 {
2595 int i;
2596 struct imsm_dev *dev_new;
2597 size_t len, len_migr;
2598 size_t max_len = 0;
2599 size_t space_needed = 0;
2600 struct imsm_super *mpb = super->anchor;
2601
2602 for (i = 0; i < super->anchor->num_raid_devs; i++) {
2603 struct imsm_dev *dev_iter = __get_imsm_dev(super->anchor, i);
2604 struct intel_dev *dv;
2605
2606 len = sizeof_imsm_dev(dev_iter, 0);
2607 len_migr = sizeof_imsm_dev(dev_iter, 1);
2608 if (len_migr > len)
2609 space_needed += len_migr - len;
2610
2611 dv = malloc(sizeof(*dv));
2612 if (!dv)
2613 return 1;
2614 if (max_len < len_migr)
2615 max_len = len_migr;
2616 if (max_len > len_migr)
2617 space_needed += max_len - len_migr;
2618 dev_new = malloc(max_len);
2619 if (!dev_new) {
2620 free(dv);
2621 return 1;
2622 }
2623 imsm_copy_dev(dev_new, dev_iter);
2624 dv->dev = dev_new;
2625 dv->index = i;
2626 dv->next = super->devlist;
2627 super->devlist = dv;
2628 }
2629
2630 /* ensure that super->buf is large enough when all raid devices
2631 * are migrating
2632 */
2633 if (__le32_to_cpu(mpb->mpb_size) + space_needed > super->len) {
2634 void *buf;
2635
2636 len = ROUND_UP(__le32_to_cpu(mpb->mpb_size) + space_needed, 512);
2637 if (posix_memalign(&buf, 512, len) != 0)
2638 return 1;
2639
2640 memcpy(buf, super->buf, super->len);
2641 memset(buf + super->len, 0, len - super->len);
2642 free(super->buf);
2643 super->buf = buf;
2644 super->len = len;
2645 }
2646
2647 return 0;
2648 }
2649
2650 /* retrieve a pointer to the bbm log which starts after all raid devices */
2651 struct bbm_log *__get_imsm_bbm_log(struct imsm_super *mpb)
2652 {
2653 void *ptr = NULL;
2654
2655 if (__le32_to_cpu(mpb->bbm_log_size)) {
2656 ptr = mpb;
2657 ptr += mpb->mpb_size - __le32_to_cpu(mpb->bbm_log_size);
2658 }
2659
2660 return ptr;
2661 }
2662
2663 static void __free_imsm(struct intel_super *super, int free_disks);
2664
2665 /* load_imsm_mpb - read matrix metadata
2666 * allocates super->mpb to be freed by free_imsm
2667 */
2668 static int load_imsm_mpb(int fd, struct intel_super *super, char *devname)
2669 {
2670 unsigned long long dsize;
2671 unsigned long long sectors;
2672 struct stat;
2673 struct imsm_super *anchor;
2674 __u32 check_sum;
2675
2676 get_dev_size(fd, NULL, &dsize);
2677 if (dsize < 1024) {
2678 if (devname)
2679 fprintf(stderr,
2680 Name ": %s: device to small for imsm\n",
2681 devname);
2682 return 1;
2683 }
2684
2685 if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0) {
2686 if (devname)
2687 fprintf(stderr,
2688 Name ": Cannot seek to anchor block on %s: %s\n",
2689 devname, strerror(errno));
2690 return 1;
2691 }
2692
2693 if (posix_memalign((void**)&anchor, 512, 512) != 0) {
2694 if (devname)
2695 fprintf(stderr,
2696 Name ": Failed to allocate imsm anchor buffer"
2697 " on %s\n", devname);
2698 return 1;
2699 }
2700 if (read(fd, anchor, 512) != 512) {
2701 if (devname)
2702 fprintf(stderr,
2703 Name ": Cannot read anchor block on %s: %s\n",
2704 devname, strerror(errno));
2705 free(anchor);
2706 return 1;
2707 }
2708
2709 if (strncmp((char *) anchor->sig, MPB_SIGNATURE, MPB_SIG_LEN) != 0) {
2710 if (devname)
2711 fprintf(stderr,
2712 Name ": no IMSM anchor on %s\n", devname);
2713 free(anchor);
2714 return 2;
2715 }
2716
2717 __free_imsm(super, 0);
2718 /* reload capability and hba */
2719
2720 /* capability and hba must be updated with new super allocation */
2721 find_intel_hba_capability(fd, super, devname);
2722 super->len = ROUND_UP(anchor->mpb_size, 512);
2723 if (posix_memalign(&super->buf, 512, super->len) != 0) {
2724 if (devname)
2725 fprintf(stderr,
2726 Name ": unable to allocate %zu byte mpb buffer\n",
2727 super->len);
2728 free(anchor);
2729 return 2;
2730 }
2731 memcpy(super->buf, anchor, 512);
2732
2733 sectors = mpb_sectors(anchor) - 1;
2734 free(anchor);
2735 if (!sectors) {
2736 check_sum = __gen_imsm_checksum(super->anchor);
2737 if (check_sum != __le32_to_cpu(super->anchor->check_sum)) {
2738 if (devname)
2739 fprintf(stderr,
2740 Name ": IMSM checksum %x != %x on %s\n",
2741 check_sum,
2742 __le32_to_cpu(super->anchor->check_sum),
2743 devname);
2744 return 2;
2745 }
2746
2747 return 0;
2748 }
2749
2750 /* read the extended mpb */
2751 if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0) {
2752 if (devname)
2753 fprintf(stderr,
2754 Name ": Cannot seek to extended mpb on %s: %s\n",
2755 devname, strerror(errno));
2756 return 1;
2757 }
2758
2759 if ((unsigned)read(fd, super->buf + 512, super->len - 512) != super->len - 512) {
2760 if (devname)
2761 fprintf(stderr,
2762 Name ": Cannot read extended mpb on %s: %s\n",
2763 devname, strerror(errno));
2764 return 2;
2765 }
2766
2767 check_sum = __gen_imsm_checksum(super->anchor);
2768 if (check_sum != __le32_to_cpu(super->anchor->check_sum)) {
2769 if (devname)
2770 fprintf(stderr,
2771 Name ": IMSM checksum %x != %x on %s\n",
2772 check_sum, __le32_to_cpu(super->anchor->check_sum),
2773 devname);
2774 return 3;
2775 }
2776
2777 /* FIXME the BBM log is disk specific so we cannot use this global
2778 * buffer for all disks. Ok for now since we only look at the global
2779 * bbm_log_size parameter to gate assembly
2780 */
2781 super->bbm_log = __get_imsm_bbm_log(super->anchor);
2782
2783 return 0;
2784 }
2785
2786 static int
2787 load_and_parse_mpb(int fd, struct intel_super *super, char *devname, int keep_fd)
2788 {
2789 int err;
2790
2791 err = load_imsm_mpb(fd, super, devname);
2792 if (err)
2793 return err;
2794 err = load_imsm_disk(fd, super, devname, keep_fd);
2795 if (err)
2796 return err;
2797 err = parse_raid_devices(super);
2798
2799 return err;
2800 }
2801
2802 static void __free_imsm_disk(struct dl *d)
2803 {
2804 if (d->fd >= 0)
2805 close(d->fd);
2806 if (d->devname)
2807 free(d->devname);
2808 if (d->e)
2809 free(d->e);
2810 free(d);
2811
2812 }
2813
2814 static void free_imsm_disks(struct intel_super *super)
2815 {
2816 struct dl *d;
2817
2818 while (super->disks) {
2819 d = super->disks;
2820 super->disks = d->next;
2821 __free_imsm_disk(d);
2822 }
2823 while (super->disk_mgmt_list) {
2824 d = super->disk_mgmt_list;
2825 super->disk_mgmt_list = d->next;
2826 __free_imsm_disk(d);
2827 }
2828 while (super->missing) {
2829 d = super->missing;
2830 super->missing = d->next;
2831 __free_imsm_disk(d);
2832 }
2833
2834 }
2835
2836 /* free all the pieces hanging off of a super pointer */
2837 static void __free_imsm(struct intel_super *super, int free_disks)
2838 {
2839 struct intel_hba *elem, *next;
2840
2841 if (super->buf) {
2842 free(super->buf);
2843 super->buf = NULL;
2844 }
2845 /* unlink capability description */
2846 super->orom = NULL;
2847 if (free_disks)
2848 free_imsm_disks(super);
2849 free_devlist(super);
2850 elem = super->hba;
2851 while (elem) {
2852 if (elem->path)
2853 free((void *)elem->path);
2854 next = elem->next;
2855 free(elem);
2856 elem = next;
2857 }
2858 super->hba = NULL;
2859 }
2860
2861 static void free_imsm(struct intel_super *super)
2862 {
2863 __free_imsm(super, 1);
2864 free(super);
2865 }
2866
2867 static void free_super_imsm(struct supertype *st)
2868 {
2869 struct intel_super *super = st->sb;
2870
2871 if (!super)
2872 return;
2873
2874 free_imsm(super);
2875 st->sb = NULL;
2876 }
2877
2878 static struct intel_super *alloc_super(void)
2879 {
2880 struct intel_super *super = malloc(sizeof(*super));
2881
2882 if (super) {
2883 memset(super, 0, sizeof(*super));
2884 super->current_vol = -1;
2885 super->create_offset = ~((__u32 ) 0);
2886 }
2887 return super;
2888 }
2889
2890 /*
2891 * find and allocate hba and OROM/EFI based on valid fd of RAID component device
2892 */
2893 static int find_intel_hba_capability(int fd, struct intel_super *super, char *devname)
2894 {
2895 struct sys_dev *hba_name;
2896 int rv = 0;
2897
2898 if ((fd < 0) || check_env("IMSM_NO_PLATFORM")) {
2899 super->orom = NULL;
2900 super->hba = NULL;
2901 return 0;
2902 }
2903 hba_name = find_disk_attached_hba(fd, NULL);
2904 if (!hba_name) {
2905 if (devname)
2906 fprintf(stderr,
2907 Name ": %s is not attached to Intel(R) RAID controller.\n",
2908 devname);
2909 return 1;
2910 }
2911 rv = attach_hba_to_super(super, hba_name);
2912 if (rv == 2) {
2913 if (devname) {
2914 struct intel_hba *hba = super->hba;
2915
2916 fprintf(stderr, Name ": %s is attached to Intel(R) %s RAID "
2917 "controller (%s),\n"
2918 " but the container is assigned to Intel(R) "
2919 "%s RAID controller (",
2920 devname,
2921 hba_name->path,
2922 hba_name->pci_id ? : "Err!",
2923 get_sys_dev_type(hba_name->type));
2924
2925 while (hba) {
2926 fprintf(stderr, "%s", hba->pci_id ? : "Err!");
2927 if (hba->next)
2928 fprintf(stderr, ", ");
2929 hba = hba->next;
2930 }
2931
2932 fprintf(stderr, ").\n"
2933 " Mixing devices attached to different controllers "
2934 "is not allowed.\n");
2935 }
2936 free_sys_dev(&hba_name);
2937 return 2;
2938 }
2939 super->orom = find_imsm_capability(hba_name->type);
2940 free_sys_dev(&hba_name);
2941 if (!super->orom)
2942 return 3;
2943 return 0;
2944 }
2945
2946 #ifndef MDASSEMBLE
2947 /* find_missing - helper routine for load_super_imsm_all that identifies
2948 * disks that have disappeared from the system. This routine relies on
2949 * the mpb being uptodate, which it is at load time.
2950 */
2951 static int find_missing(struct intel_super *super)
2952 {
2953 int i;
2954 struct imsm_super *mpb = super->anchor;
2955 struct dl *dl;
2956 struct imsm_disk *disk;
2957
2958 for (i = 0; i < mpb->num_disks; i++) {
2959 disk = __get_imsm_disk(mpb, i);
2960 dl = serial_to_dl(disk->serial, super);
2961 if (dl)
2962 continue;
2963
2964 dl = malloc(sizeof(*dl));
2965 if (!dl)
2966 return 1;
2967 dl->major = 0;
2968 dl->minor = 0;
2969 dl->fd = -1;
2970 dl->devname = strdup("missing");
2971 dl->index = i;
2972 serialcpy(dl->serial, disk->serial);
2973 dl->disk = *disk;
2974 dl->e = NULL;
2975 dl->next = super->missing;
2976 super->missing = dl;
2977 }
2978
2979 return 0;
2980 }
2981
2982 static struct intel_disk *disk_list_get(__u8 *serial, struct intel_disk *disk_list)
2983 {
2984 struct intel_disk *idisk = disk_list;
2985
2986 while (idisk) {
2987 if (serialcmp(idisk->disk.serial, serial) == 0)
2988 break;
2989 idisk = idisk->next;
2990 }
2991
2992 return idisk;
2993 }
2994
2995 static int __prep_thunderdome(struct intel_super **table, int tbl_size,
2996 struct intel_super *super,
2997 struct intel_disk **disk_list)
2998 {
2999 struct imsm_disk *d = &super->disks->disk;
3000 struct imsm_super *mpb = super->anchor;
3001 int i, j;
3002
3003 for (i = 0; i < tbl_size; i++) {
3004 struct imsm_super *tbl_mpb = table[i]->anchor;
3005 struct imsm_disk *tbl_d = &table[i]->disks->disk;
3006
3007 if (tbl_mpb->family_num == mpb->family_num) {
3008 if (tbl_mpb->check_sum == mpb->check_sum) {
3009 dprintf("%s: mpb from %d:%d matches %d:%d\n",
3010 __func__, super->disks->major,
3011 super->disks->minor,
3012 table[i]->disks->major,
3013 table[i]->disks->minor);
3014 break;
3015 }
3016
3017 if (((is_configured(d) && !is_configured(tbl_d)) ||
3018 is_configured(d) == is_configured(tbl_d)) &&
3019 tbl_mpb->generation_num < mpb->generation_num) {
3020 /* current version of the mpb is a
3021 * better candidate than the one in
3022 * super_table, but copy over "cross
3023 * generational" status
3024 */
3025 struct intel_disk *idisk;
3026
3027 dprintf("%s: mpb from %d:%d replaces %d:%d\n",
3028 __func__, super->disks->major,
3029 super->disks->minor,
3030 table[i]->disks->major,
3031 table[i]->disks->minor);
3032
3033 idisk = disk_list_get(tbl_d->serial, *disk_list);
3034 if (idisk && is_failed(&idisk->disk))
3035 tbl_d->status |= FAILED_DISK;
3036 break;
3037 } else {
3038 struct intel_disk *idisk;
3039 struct imsm_disk *disk;
3040
3041 /* tbl_mpb is more up to date, but copy
3042 * over cross generational status before
3043 * returning
3044 */
3045 disk = __serial_to_disk(d->serial, mpb, NULL);
3046 if (disk && is_failed(disk))
3047 d->status |= FAILED_DISK;
3048
3049 idisk = disk_list_get(d->serial, *disk_list);
3050 if (idisk) {
3051 idisk->owner = i;
3052 if (disk && is_configured(disk))
3053 idisk->disk.status |= CONFIGURED_DISK;
3054 }
3055
3056 dprintf("%s: mpb from %d:%d prefer %d:%d\n",
3057 __func__, super->disks->major,
3058 super->disks->minor,
3059 table[i]->disks->major,
3060 table[i]->disks->minor);
3061
3062 return tbl_size;
3063 }
3064 }
3065 }
3066
3067 if (i >= tbl_size)
3068 table[tbl_size++] = super;
3069 else
3070 table[i] = super;
3071
3072 /* update/extend the merged list of imsm_disk records */
3073 for (j = 0; j < mpb->num_disks; j++) {
3074 struct imsm_disk *disk = __get_imsm_disk(mpb, j);
3075 struct intel_disk *idisk;
3076
3077 idisk = disk_list_get(disk->serial, *disk_list);
3078 if (idisk) {
3079 idisk->disk.status |= disk->status;
3080 if (is_configured(&idisk->disk) ||
3081 is_failed(&idisk->disk))
3082 idisk->disk.status &= ~(SPARE_DISK);
3083 } else {
3084 idisk = calloc(1, sizeof(*idisk));
3085 if (!idisk)
3086 return -1;
3087 idisk->owner = IMSM_UNKNOWN_OWNER;
3088 idisk->disk = *disk;
3089 idisk->next = *disk_list;
3090 *disk_list = idisk;
3091 }
3092
3093 if (serialcmp(idisk->disk.serial, d->serial) == 0)
3094 idisk->owner = i;
3095 }
3096
3097 return tbl_size;
3098 }
3099
3100 static struct intel_super *
3101 validate_members(struct intel_super *super, struct intel_disk *disk_list,
3102 const int owner)
3103 {
3104 struct imsm_super *mpb = super->anchor;
3105 int ok_count = 0;
3106 int i;
3107
3108 for (i = 0; i < mpb->num_disks; i++) {
3109 struct imsm_disk *disk = __get_imsm_disk(mpb, i);
3110 struct intel_disk *idisk;
3111
3112 idisk = disk_list_get(disk->serial, disk_list);
3113 if (idisk) {
3114 if (idisk->owner == owner ||
3115 idisk->owner == IMSM_UNKNOWN_OWNER)
3116 ok_count++;
3117 else
3118 dprintf("%s: '%.16s' owner %d != %d\n",
3119 __func__, disk->serial, idisk->owner,
3120 owner);
3121 } else {
3122 dprintf("%s: unknown disk %x [%d]: %.16s\n",
3123 __func__, __le32_to_cpu(mpb->family_num), i,
3124 disk->serial);
3125 break;
3126 }
3127 }
3128
3129 if (ok_count == mpb->num_disks)
3130 return super;
3131 return NULL;
3132 }
3133
3134 static void show_conflicts(__u32 family_num, struct intel_super *super_list)
3135 {
3136 struct intel_super *s;
3137
3138 for (s = super_list; s; s = s->next) {
3139 if (family_num != s->anchor->family_num)
3140 continue;
3141 fprintf(stderr, "Conflict, offlining family %#x on '%s'\n",
3142 __le32_to_cpu(family_num), s->disks->devname);
3143 }
3144 }
3145
3146 static struct intel_super *
3147 imsm_thunderdome(struct intel_super **super_list, int len)
3148 {
3149 struct intel_super *super_table[len];
3150 struct intel_disk *disk_list = NULL;
3151 struct intel_super *champion, *spare;
3152 struct intel_super *s, **del;
3153 int tbl_size = 0;
3154 int conflict;
3155 int i;
3156
3157 memset(super_table, 0, sizeof(super_table));
3158 for (s = *super_list; s; s = s->next)
3159 tbl_size = __prep_thunderdome(super_table, tbl_size, s, &disk_list);
3160
3161 for (i = 0; i < tbl_size; i++) {
3162 struct imsm_disk *d;
3163 struct intel_disk *idisk;
3164 struct imsm_super *mpb = super_table[i]->anchor;
3165
3166 s = super_table[i];
3167 d = &s->disks->disk;
3168
3169 /* 'd' must appear in merged disk list for its
3170 * configuration to be valid
3171 */
3172 idisk = disk_list_get(d->serial, disk_list);
3173 if (idisk && idisk->owner == i)
3174 s = validate_members(s, disk_list, i);
3175 else
3176 s = NULL;
3177
3178 if (!s)
3179 dprintf("%s: marking family: %#x from %d:%d offline\n",
3180 __func__, mpb->family_num,
3181 super_table[i]->disks->major,
3182 super_table[i]->disks->minor);
3183 super_table[i] = s;
3184 }
3185
3186 /* This is where the mdadm implementation differs from the Windows
3187 * driver which has no strict concept of a container. We can only
3188 * assemble one family from a container, so when returning a prodigal
3189 * array member to this system the code will not be able to disambiguate
3190 * the container contents that should be assembled ("foreign" versus
3191 * "local"). It requires user intervention to set the orig_family_num
3192 * to a new value to establish a new container. The Windows driver in
3193 * this situation fixes up the volume name in place and manages the
3194 * foreign array as an independent entity.
3195 */
3196 s = NULL;
3197 spare = NULL;
3198 conflict = 0;
3199 for (i = 0; i < tbl_size; i++) {
3200 struct intel_super *tbl_ent = super_table[i];
3201 int is_spare = 0;
3202
3203 if (!tbl_ent)
3204 continue;
3205
3206 if (tbl_ent->anchor->num_raid_devs == 0) {
3207 spare = tbl_ent;
3208 is_spare = 1;
3209 }
3210
3211 if (s && !is_spare) {
3212 show_conflicts(tbl_ent->anchor->family_num, *super_list);
3213 conflict++;
3214 } else if (!s && !is_spare)
3215 s = tbl_ent;
3216 }
3217
3218 if (!s)
3219 s = spare;
3220 if (!s) {
3221 champion = NULL;
3222 goto out;
3223 }
3224 champion = s;
3225
3226 if (conflict)
3227 fprintf(stderr, "Chose family %#x on '%s', "
3228 "assemble conflicts to new container with '--update=uuid'\n",
3229 __le32_to_cpu(s->anchor->family_num), s->disks->devname);
3230
3231 /* collect all dl's onto 'champion', and update them to
3232 * champion's version of the status
3233 */
3234 for (s = *super_list; s; s = s->next) {
3235 struct imsm_super *mpb = champion->anchor;
3236 struct dl *dl = s->disks;
3237
3238 if (s == champion)
3239 continue;
3240
3241 for (i = 0; i < mpb->num_disks; i++) {
3242 struct imsm_disk *disk;
3243
3244 disk = __serial_to_disk(dl->serial, mpb, &dl->index);
3245 if (disk) {
3246 dl->disk = *disk;
3247 /* only set index on disks that are a member of
3248 * a populated contianer, i.e. one with
3249 * raid_devs
3250 */
3251 if (is_failed(&dl->disk))
3252 dl->index = -2;
3253 else if (is_spare(&dl->disk))
3254 dl->index = -1;
3255 break;
3256 }
3257 }
3258
3259 if (i >= mpb->num_disks) {
3260 struct intel_disk *idisk;
3261
3262 idisk = disk_list_get(dl->serial, disk_list);
3263 if (idisk && is_spare(&idisk->disk) &&
3264 !is_failed(&idisk->disk) && !is_configured(&idisk->disk))
3265 dl->index = -1;
3266 else {
3267 dl->index = -2;
3268 continue;
3269 }
3270 }
3271
3272 dl->next = champion->disks;
3273 champion->disks = dl;
3274 s->disks = NULL;
3275 }
3276
3277 /* delete 'champion' from super_list */
3278 for (del = super_list; *del; ) {
3279 if (*del == champion) {
3280 *del = (*del)->next;
3281 break;
3282 } else
3283 del = &(*del)->next;
3284 }
3285 champion->next = NULL;
3286
3287 out:
3288 while (disk_list) {
3289 struct intel_disk *idisk = disk_list;
3290
3291 disk_list = disk_list->next;
3292 free(idisk);
3293 }
3294
3295 return champion;
3296 }
3297
3298 static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
3299 char *devname)
3300 {
3301 struct mdinfo *sra;
3302 struct intel_super *super_list = NULL;
3303 struct intel_super *super = NULL;
3304 int devnum = fd2devnum(fd);
3305 struct mdinfo *sd;
3306 int retry;
3307 int err = 0;
3308 int i;
3309
3310 /* check if 'fd' an opened container */
3311 sra = sysfs_read(fd, 0, GET_LEVEL|GET_VERSION|GET_DEVS|GET_STATE);
3312 if (!sra)
3313 return 1;
3314
3315 if (sra->array.major_version != -1 ||
3316 sra->array.minor_version != -2 ||
3317 strcmp(sra->text_version, "imsm") != 0) {
3318 err = 1;
3319 goto error;
3320 }
3321 /* load all mpbs */
3322 for (sd = sra->devs, i = 0; sd; sd = sd->next, i++) {
3323 struct intel_super *s = alloc_super();
3324 char nm[32];
3325 int dfd;
3326 int rv;
3327
3328 err = 1;
3329 if (!s)
3330 goto error;
3331 s->next = super_list;
3332 super_list = s;
3333
3334 err = 2;
3335 sprintf(nm, "%d:%d", sd->disk.major, sd->disk.minor);
3336 dfd = dev_open(nm, O_RDWR);
3337 if (dfd < 0)
3338 goto error;
3339
3340 rv = find_intel_hba_capability(dfd, s, devname);
3341 /* no orom/efi or non-intel hba of the disk */
3342 if (rv != 0)
3343 goto error;
3344
3345 err = load_and_parse_mpb(dfd, s, NULL, 1);
3346
3347 /* retry the load if we might have raced against mdmon */
3348 if (err == 3 && mdmon_running(devnum))
3349 for (retry = 0; retry < 3; retry++) {
3350 usleep(3000);
3351 err = load_and_parse_mpb(dfd, s, NULL, 1);
3352 if (err != 3)
3353 break;
3354 }
3355 if (err)
3356 goto error;
3357 }
3358
3359 /* all mpbs enter, maybe one leaves */
3360 super = imsm_thunderdome(&super_list, i);
3361 if (!super) {
3362 err = 1;
3363 goto error;
3364 }
3365
3366 if (find_missing(super) != 0) {
3367 free_imsm(super);
3368 err = 2;
3369 goto error;
3370 }
3371 err = 0;
3372
3373 error:
3374 while (super_list) {
3375 struct intel_super *s = super_list;
3376
3377 super_list = super_list->next;
3378 free_imsm(s);
3379 }
3380 sysfs_free(sra);
3381
3382 if (err)
3383 return err;
3384
3385 *sbp = super;
3386 st->container_dev = devnum;
3387 if (err == 0 && st->ss == NULL) {
3388 st->ss = &super_imsm;
3389 st->minor_version = 0;
3390 st->max_devs = IMSM_MAX_DEVICES;
3391 }
3392 return 0;
3393 }
3394
3395 static int load_container_imsm(struct supertype *st, int fd, char *devname)
3396 {
3397 return load_super_imsm_all(st, fd, &st->sb, devname);
3398 }
3399 #endif
3400
3401 static int load_super_imsm(struct supertype *st, int fd, char *devname)
3402 {
3403 struct intel_super *super;
3404 int rv;
3405
3406 if (test_partition(fd))
3407 /* IMSM not allowed on partitions */
3408 return 1;
3409
3410 free_super_imsm(st);
3411
3412 super = alloc_super();
3413 if (!super) {
3414 fprintf(stderr,
3415 Name ": malloc of %zu failed.\n",
3416 sizeof(*super));
3417 return 1;
3418 }
3419 /* Load hba and capabilities if they exist.
3420 * But do not preclude loading metadata in case capabilities or hba are
3421 * non-compliant and ignore_hw_compat is set.
3422 */
3423 rv = find_intel_hba_capability(fd, super, devname);
3424 /* no orom/efi or non-intel hba of the disk */
3425 if ((rv != 0) && (st->ignore_hw_compat == 0)) {
3426 if (devname)
3427 fprintf(stderr,
3428 Name ": No OROM/EFI properties for %s\n", devname);
3429 free_imsm(super);
3430 return 2;
3431 }
3432 rv = load_and_parse_mpb(fd, super, devname, 0);
3433
3434 if (rv) {
3435 if (devname)
3436 fprintf(stderr,
3437 Name ": Failed to load all information "
3438 "sections on %s\n", devname);
3439 free_imsm(super);
3440 return rv;
3441 }
3442
3443 st->sb = super;
3444 if (st->ss == NULL) {
3445 st->ss = &super_imsm;
3446 st->minor_version = 0;
3447 st->max_devs = IMSM_MAX_DEVICES;
3448 }
3449 return 0;
3450 }
3451
3452 static __u16 info_to_blocks_per_strip(mdu_array_info_t *info)
3453 {
3454 if (info->level == 1)
3455 return 128;
3456 return info->chunk_size >> 9;
3457 }
3458
3459 static __u32 info_to_num_data_stripes(mdu_array_info_t *info, int num_domains)
3460 {
3461 __u32 num_stripes;
3462
3463 num_stripes = (info->size * 2) / info_to_blocks_per_strip(info);
3464 num_stripes /= num_domains;
3465
3466 return num_stripes;
3467 }
3468
3469 static __u32 info_to_blocks_per_member(mdu_array_info_t *info)
3470 {
3471 if (info->level == 1)
3472 return info->size * 2;
3473 else
3474 return (info->size * 2) & ~(info_to_blocks_per_strip(info) - 1);
3475 }
3476
3477 static void imsm_update_version_info(struct intel_super *super)
3478 {
3479 /* update the version and attributes */
3480 struct imsm_super *mpb = super->anchor;
3481 char *version;
3482 struct imsm_dev *dev;
3483 struct imsm_map *map;
3484 int i;
3485
3486 for (i = 0; i < mpb->num_raid_devs; i++) {
3487 dev = get_imsm_dev(super, i);
3488 map = get_imsm_map(dev, 0);
3489 if (__le32_to_cpu(dev->size_high) > 0)
3490 mpb->attributes |= MPB_ATTRIB_2TB;
3491
3492 /* FIXME detect when an array spans a port multiplier */
3493 #if 0
3494 mpb->attributes |= MPB_ATTRIB_PM;
3495 #endif
3496
3497 if (mpb->num_raid_devs > 1 ||
3498 mpb->attributes != MPB_ATTRIB_CHECKSUM_VERIFY) {
3499 version = MPB_VERSION_ATTRIBS;
3500 switch (get_imsm_raid_level(map)) {
3501 case 0: mpb->attributes |= MPB_ATTRIB_RAID0; break;
3502 case 1: mpb->attributes |= MPB_ATTRIB_RAID1; break;
3503 case 10: mpb->attributes |= MPB_ATTRIB_RAID10; break;
3504 case 5: mpb->attributes |= MPB_ATTRIB_RAID5; break;
3505 }
3506 } else {
3507 if (map->num_members >= 5)
3508 version = MPB_VERSION_5OR6_DISK_ARRAY;
3509 else if (dev->status == DEV_CLONE_N_GO)
3510 version = MPB_VERSION_CNG;
3511 else if (get_imsm_raid_level(map) == 5)
3512 version = MPB_VERSION_RAID5;
3513 else if (map->num_members >= 3)
3514 version = MPB_VERSION_3OR4_DISK_ARRAY;
3515 else if (get_imsm_raid_level(map) == 1)
3516 version = MPB_VERSION_RAID1;
3517 else
3518 version = MPB_VERSION_RAID0;
3519 }
3520 strcpy(((char *) mpb->sig) + strlen(MPB_SIGNATURE), version);
3521 }
3522 }
3523
3524 static int check_name(struct intel_super *super, char *name, int quiet)
3525 {
3526 struct imsm_super *mpb = super->anchor;
3527 char *reason = NULL;
3528 int i;
3529
3530 if (strlen(name) > MAX_RAID_SERIAL_LEN)
3531 reason = "must be 16 characters or less";
3532
3533 for (i = 0; i < mpb->num_raid_devs; i++) {
3534 struct imsm_dev *dev = get_imsm_dev(super, i);
3535
3536 if (strncmp((char *) dev->volume, name, MAX_RAID_SERIAL_LEN) == 0) {
3537 reason = "already exists";
3538 break;
3539 }
3540 }
3541
3542 if (reason && !quiet)
3543 fprintf(stderr, Name ": imsm volume name %s\n", reason);
3544
3545 return !reason;
3546 }
3547
3548 static int init_super_imsm_volume(struct supertype *st, mdu_array_info_t *info,
3549 unsigned long long size, char *name,
3550 char *homehost, int *uuid)
3551 {
3552 /* We are creating a volume inside a pre-existing container.
3553 * so st->sb is already set.
3554 */
3555 struct intel_super *super = st->sb;
3556 struct imsm_super *mpb = super->anchor;
3557 struct intel_dev *dv;
3558 struct imsm_dev *dev;
3559 struct imsm_vol *vol;
3560 struct imsm_map *map;
3561 int idx = mpb->num_raid_devs;
3562 int i;
3563 unsigned long long array_blocks;
3564 size_t size_old, size_new;
3565 __u32 num_data_stripes;
3566
3567 if (super->orom && mpb->num_raid_devs >= super->orom->vpa) {
3568 fprintf(stderr, Name": This imsm-container already has the "
3569 "maximum of %d volumes\n", super->orom->vpa);
3570 return 0;
3571 }
3572
3573 /* ensure the mpb is large enough for the new data */
3574 size_old = __le32_to_cpu(mpb->mpb_size);
3575 size_new = disks_to_mpb_size(info->nr_disks);
3576 if (size_new > size_old) {
3577 void *mpb_new;
3578 size_t size_round = ROUND_UP(size_new, 512);
3579
3580 if (posix_memalign(&mpb_new, 512, size_round) != 0) {
3581 fprintf(stderr, Name": could not allocate new mpb\n");
3582 return 0;
3583 }
3584 memcpy(mpb_new, mpb, size_old);
3585 free(mpb);
3586 mpb = mpb_new;
3587 super->anchor = mpb_new;
3588 mpb->mpb_size = __cpu_to_le32(size_new);
3589 memset(mpb_new + size_old, 0, size_round - size_old);
3590 }
3591 super->current_vol = idx;
3592 /* when creating the first raid device in this container set num_disks
3593 * to zero, i.e. delete this spare and add raid member devices in
3594 * add_to_super_imsm_volume()
3595 */
3596 if (super->current_vol == 0)
3597 mpb->num_disks = 0;
3598
3599 if (!check_name(super, name, 0))
3600 return 0;
3601 dv = malloc(sizeof(*dv));
3602 if (!dv) {
3603 fprintf(stderr, Name ": failed to allocate device list entry\n");
3604 return 0;
3605 }
3606 dev = calloc(1, sizeof(*dev) + sizeof(__u32) * (info->raid_disks - 1));
3607 if (!dev) {
3608 free(dv);
3609 fprintf(stderr, Name": could not allocate raid device\n");
3610 return 0;
3611 }
3612
3613 strncpy((char *) dev->volume, name, MAX_RAID_SERIAL_LEN);
3614 if (info->level == 1)
3615 array_blocks = info_to_blocks_per_member(info);
3616 else
3617 array_blocks = calc_array_size(info->level, info->raid_disks,
3618 info->layout, info->chunk_size,
3619 info->size*2);
3620 /* round array size down to closest MB */
3621 array_blocks = (array_blocks >> SECT_PER_MB_SHIFT) << SECT_PER_MB_SHIFT;
3622
3623 dev->size_low = __cpu_to_le32((__u32) array_blocks);
3624 dev->size_high = __cpu_to_le32((__u32) (array_blocks >> 32));
3625 dev->status = (DEV_READ_COALESCING | DEV_WRITE_COALESCING);
3626 vol = &dev->vol;
3627 vol->migr_state = 0;
3628 set_migr_type(dev, MIGR_INIT);
3629 vol->dirty = 0;
3630 vol->curr_migr_unit = 0;
3631 map = get_imsm_map(dev, 0);
3632 map->pba_of_lba0 = __cpu_to_le32(super->create_offset);
3633 map->blocks_per_member = __cpu_to_le32(info_to_blocks_per_member(info));
3634 map->blocks_per_strip = __cpu_to_le16(info_to_blocks_per_strip(info));
3635 map->failed_disk_num = ~0;
3636 map->map_state = info->level ? IMSM_T_STATE_UNINITIALIZED :
3637 IMSM_T_STATE_NORMAL;
3638 map->ddf = 1;
3639
3640 if (info->level == 1 && info->raid_disks > 2) {
3641 free(dev);
3642 free(dv);
3643 fprintf(stderr, Name": imsm does not support more than 2 disks"
3644 "in a raid1 volume\n");
3645 return 0;
3646 }
3647
3648 map->raid_level = info->level;
3649 if (info->level == 10) {
3650 map->raid_level = 1;
3651 map->num_domains = info->raid_disks / 2;
3652 } else if (info->level == 1)
3653 map->num_domains = info->raid_disks;
3654 else
3655 map->num_domains = 1;
3656
3657 num_data_stripes = info_to_num_data_stripes(info, map->num_domains);
3658 map->num_data_stripes = __cpu_to_le32(num_data_stripes);
3659
3660 map->num_members = info->raid_disks;
3661 for (i = 0; i < map->num_members; i++) {
3662 /* initialized in add_to_super */
3663 set_imsm_ord_tbl_ent(map, i, IMSM_ORD_REBUILD);
3664 }
3665 mpb->num_raid_devs++;
3666
3667 dv->dev = dev;
3668 dv->index = super->current_vol;
3669 dv->next = super->devlist;
3670 super->devlist = dv;
3671
3672 imsm_update_version_info(super);
3673
3674 return 1;
3675 }
3676
3677 static int init_super_imsm(struct supertype *st, mdu_array_info_t *info,
3678 unsigned long long size, char *name,
3679 char *homehost, int *uuid)
3680 {
3681 /* This is primarily called by Create when creating a new array.
3682 * We will then get add_to_super called for each component, and then
3683 * write_init_super called to write it out to each device.
3684 * For IMSM, Create can create on fresh devices or on a pre-existing
3685 * array.
3686 * To create on a pre-existing array a different method will be called.
3687 * This one is just for fresh drives.
3688 */
3689 struct intel_super *super;
3690 struct imsm_super *mpb;
3691 size_t mpb_size;
3692 char *version;
3693
3694 if (st->sb)
3695 return init_super_imsm_volume(st, info, size, name, homehost, uuid);
3696
3697 if (info)
3698 mpb_size = disks_to_mpb_size(info->nr_disks);
3699 else
3700 mpb_size = 512;
3701
3702 super = alloc_super();
3703 if (super && posix_memalign(&super->buf, 512, mpb_size) != 0) {
3704 free(super);
3705 super = NULL;
3706 }
3707 if (!super) {
3708 fprintf(stderr, Name
3709 ": %s could not allocate superblock\n", __func__);
3710 return 0;
3711 }
3712 memset(super->buf, 0, mpb_size);
3713 mpb = super->buf;
3714 mpb->mpb_size = __cpu_to_le32(mpb_size);
3715 st->sb = super;
3716
3717 if (info == NULL) {
3718 /* zeroing superblock */
3719 return 0;
3720 }
3721
3722 mpb->attributes = MPB_ATTRIB_CHECKSUM_VERIFY;
3723
3724 version = (char *) mpb->sig;
3725 strcpy(version, MPB_SIGNATURE);
3726 version += strlen(MPB_SIGNATURE);
3727 strcpy(version, MPB_VERSION_RAID0);
3728
3729 return 1;
3730 }
3731
3732 #ifndef MDASSEMBLE
3733 static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
3734 int fd, char *devname)
3735 {
3736 struct intel_super *super = st->sb;
3737 struct imsm_super *mpb = super->anchor;
3738 struct dl *dl;
3739 struct imsm_dev *dev;
3740 struct imsm_map *map;
3741 int slot;
3742
3743 dev = get_imsm_dev(super, super->current_vol);
3744 map = get_imsm_map(dev, 0);
3745
3746 if (! (dk->state & (1<<MD_DISK_SYNC))) {
3747 fprintf(stderr, Name ": %s: Cannot add spare devices to IMSM volume\n",
3748 devname);
3749 return 1;
3750 }
3751
3752 if (fd == -1) {
3753 /* we're doing autolayout so grab the pre-marked (in
3754 * validate_geometry) raid_disk
3755 */
3756 for (dl = super->disks; dl; dl = dl->next)
3757 if (dl->raiddisk == dk->raid_disk)
3758 break;
3759 } else {
3760 for (dl = super->disks; dl ; dl = dl->next)
3761 if (dl->major == dk->major &&
3762 dl->minor == dk->minor)
3763 break;
3764 }
3765
3766 if (!dl) {
3767 fprintf(stderr, Name ": %s is not a member of the same container\n", devname);
3768 return 1;
3769 }
3770
3771 /* add a pristine spare to the metadata */
3772 if (dl->index < 0) {
3773 dl->index = super->anchor->num_disks;
3774 super->anchor->num_disks++;
3775 }
3776 /* Check the device has not already been added */
3777 slot = get_imsm_disk_slot(map, dl->index);
3778 if (slot >= 0 &&
3779 (get_imsm_ord_tbl_ent(dev, slot, -1) & IMSM_ORD_REBUILD) == 0) {
3780 fprintf(stderr, Name ": %s has been included in this array twice\n",
3781 devname);
3782 return 1;
3783 }
3784 set_imsm_ord_tbl_ent(map, dk->number, dl->index);
3785 dl->disk.status = CONFIGURED_DISK;
3786
3787 /* if we are creating the first raid device update the family number */
3788 if (super->current_vol == 0) {
3789 __u32 sum;
3790 struct imsm_dev *_dev = __get_imsm_dev(mpb, 0);
3791 struct imsm_disk *_disk = __get_imsm_disk(mpb, dl->index);
3792
3793 if (!_dev || !_disk) {
3794 fprintf(stderr, Name ": BUG mpb setup error\n");
3795 return 1;
3796 }
3797 *_dev = *dev;
3798 *_disk = dl->disk;
3799 sum = random32();
3800 sum += __gen_imsm_checksum(mpb);
3801 mpb->family_num = __cpu_to_le32(sum);
3802 mpb->orig_family_num = mpb->family_num;
3803 }
3804
3805 return 0;
3806 }
3807
3808
3809 static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
3810 int fd, char *devname)
3811 {
3812 struct intel_super *super = st->sb;
3813 struct dl *dd;
3814 unsigned long long size;
3815 __u32 id;
3816 int rv;
3817 struct stat stb;
3818
3819 /* If we are on an RAID enabled platform check that the disk is
3820 * attached to the raid controller.
3821 * We do not need to test disks attachment for container based additions,
3822 * they shall be already tested when container was created/assembled.
3823 */
3824 rv = find_intel_hba_capability(fd, super, devname);
3825 /* no orom/efi or non-intel hba of the disk */
3826 if (rv != 0) {
3827 dprintf("capability: %p fd: %d ret: %d\n",
3828 super->orom, fd, rv);
3829 return 1;
3830 }
3831
3832 if (super->current_vol >= 0)
3833 return add_to_super_imsm_volume(st, dk, fd, devname);
3834
3835 fstat(fd, &stb);
3836 dd = malloc(sizeof(*dd));
3837 if (!dd) {
3838 fprintf(stderr,
3839 Name ": malloc failed %s:%d.\n", __func__, __LINE__);
3840 return 1;
3841 }
3842 memset(dd, 0, sizeof(*dd));
3843 dd->major = major(stb.st_rdev);
3844 dd->minor = minor(stb.st_rdev);
3845 dd->index = -1;
3846 dd->devname = devname ? strdup(devname) : NULL;
3847 dd->fd = fd;
3848 dd->e = NULL;
3849 dd->action = DISK_ADD;
3850 rv = imsm_read_serial(fd, devname, dd->serial);
3851 if (rv) {
3852 fprintf(stderr,
3853 Name ": failed to retrieve scsi serial, aborting\n");
3854 free(dd);
3855 abort();
3856 }
3857
3858 get_dev_size(fd, NULL, &size);
3859 size /= 512;
3860 serialcpy(dd->disk.serial, dd->serial);
3861 dd->disk.total_blocks = __cpu_to_le32(size);
3862 dd->disk.status = SPARE_DISK;
3863 if (sysfs_disk_to_scsi_id(fd, &id) == 0)
3864 dd->disk.scsi_id = __cpu_to_le32(id);
3865 else
3866 dd->disk.scsi_id = __cpu_to_le32(0);
3867
3868 if (st->update_tail) {
3869 dd->next = super->disk_mgmt_list;
3870 super->disk_mgmt_list = dd;
3871 } else {
3872 dd->next = super->disks;
3873 super->disks = dd;
3874 super->updates_pending++;
3875 }
3876
3877 return 0;
3878 }
3879
3880
3881 static int remove_from_super_imsm(struct supertype *st, mdu_disk_info_t *dk)
3882 {
3883 struct intel_super *super = st->sb;
3884 struct dl *dd;
3885
3886 /* remove from super works only in mdmon - for communication
3887 * manager - monitor. Check if communication memory buffer
3888 * is prepared.
3889 */
3890 if (!st->update_tail) {
3891 fprintf(stderr,
3892 Name ": %s shall be used in mdmon context only"
3893 "(line %d).\n", __func__, __LINE__);
3894 return 1;
3895 }
3896 dd = malloc(sizeof(*dd));
3897 if (!dd) {
3898 fprintf(stderr,
3899 Name ": malloc failed %s:%d.\n", __func__, __LINE__);
3900 return 1;
3901 }
3902 memset(dd, 0, sizeof(*dd));
3903 dd->major = dk->major;
3904 dd->minor = dk->minor;
3905 dd->index = -1;
3906 dd->fd = -1;
3907 dd->disk.status = SPARE_DISK;
3908 dd->action = DISK_REMOVE;
3909
3910 dd->next = super->disk_mgmt_list;
3911 super->disk_mgmt_list = dd;
3912
3913
3914 return 0;
3915 }
3916
3917 static int store_imsm_mpb(int fd, struct imsm_super *mpb);
3918
3919 static union {
3920 char buf[512];
3921 struct imsm_super anchor;
3922 } spare_record __attribute__ ((aligned(512)));
3923
3924 /* spare records have their own family number and do not have any defined raid
3925 * devices
3926 */
3927 static int write_super_imsm_spares(struct intel_super *super, int doclose)
3928 {
3929 struct imsm_super *mpb = super->anchor;
3930 struct imsm_super *spare = &spare_record.anchor;
3931 __u32 sum;
3932 struct dl *d;
3933
3934 spare->mpb_size = __cpu_to_le32(sizeof(struct imsm_super)),
3935 spare->generation_num = __cpu_to_le32(1UL),
3936 spare->attributes = MPB_ATTRIB_CHECKSUM_VERIFY;
3937 spare->num_disks = 1,
3938 spare->num_raid_devs = 0,
3939 spare->cache_size = mpb->cache_size,
3940 spare->pwr_cycle_count = __cpu_to_le32(1),
3941
3942 snprintf((char *) spare->sig, MAX_SIGNATURE_LENGTH,
3943 MPB_SIGNATURE MPB_VERSION_RAID0);
3944
3945 for (d = super->disks; d; d = d->next) {
3946 if (d->index != -1)
3947 continue;
3948
3949 spare->disk[0] = d->disk;
3950 sum = __gen_imsm_checksum(spare);
3951 spare->family_num = __cpu_to_le32(sum);
3952 spare->orig_family_num = 0;
3953 sum = __gen_imsm_checksum(spare);
3954 spare->check_sum = __cpu_to_le32(sum);
3955
3956 if (store_imsm_mpb(d->fd, spare)) {
3957 fprintf(stderr, "%s: failed for device %d:%d %s\n",
3958 __func__, d->major, d->minor, strerror(errno));
3959 return 1;
3960 }
3961 if (doclose) {
3962 close(d->fd);
3963 d->fd = -1;
3964 }
3965 }
3966
3967 return 0;
3968 }
3969
3970 static int write_super_imsm(struct supertype *st, int doclose)
3971 {
3972 struct intel_super *super = st->sb;
3973 struct imsm_super *mpb = super->anchor;
3974 struct dl *d;
3975 __u32 generation;
3976 __u32 sum;
3977 int spares = 0;
3978 int i;
3979 __u32 mpb_size = sizeof(struct imsm_super) - sizeof(struct imsm_disk);
3980 int num_disks = 0;
3981
3982 /* 'generation' is incremented everytime the metadata is written */
3983 generation = __le32_to_cpu(mpb->generation_num);
3984 generation++;
3985 mpb->generation_num = __cpu_to_le32(generation);
3986
3987 /* fix up cases where previous mdadm releases failed to set
3988 * orig_family_num
3989 */
3990 if (mpb->orig_family_num == 0)
3991 mpb->orig_family_num = mpb->family_num;
3992
3993 for (d = super->disks; d; d = d->next) {
3994 if (d->index == -1)
3995 spares++;
3996 else {
3997 mpb->disk[d->index] = d->disk;
3998 num_disks++;
3999 }
4000 }
4001 for (d = super->missing; d; d = d->next) {
4002 mpb->disk[d->index] = d->disk;
4003 num_disks++;
4004 }
4005 mpb->num_disks = num_disks;
4006 mpb_size += sizeof(struct imsm_disk) * mpb->num_disks;
4007
4008 for (i = 0; i < mpb->num_raid_devs; i++) {
4009 struct imsm_dev *dev = __get_imsm_dev(mpb, i);
4010 struct imsm_dev *dev2 = get_imsm_dev(super, i);
4011 if (dev && dev2) {
4012 imsm_copy_dev(dev, dev2);
4013 mpb_size += sizeof_imsm_dev(dev, 0);
4014 }
4015 }
4016 mpb_size += __le32_to_cpu(mpb->bbm_log_size);
4017 mpb->mpb_size = __cpu_to_le32(mpb_size);
4018
4019 /* recalculate checksum */
4020 sum = __gen_imsm_checksum(mpb);
4021 mpb->check_sum = __cpu_to_le32(sum);
4022
4023 /* write the mpb for disks that compose raid devices */
4024 for (d = super->disks; d ; d = d->next) {
4025 if (d->index < 0)
4026 continue;
4027 if (store_imsm_mpb(d->fd, mpb))
4028 fprintf(stderr, "%s: failed for device %d:%d %s\n",
4029 __func__, d->major, d->minor, strerror(errno));
4030 if (doclose) {
4031 close(d->fd);
4032 d->fd = -1;
4033 }
4034 }
4035
4036 if (spares)
4037 return write_super_imsm_spares(super, doclose);
4038
4039 return 0;
4040 }
4041
4042
4043 static int create_array(struct supertype *st, int dev_idx)
4044 {
4045 size_t len;
4046 struct imsm_update_create_array *u;
4047 struct intel_super *super = st->sb;
4048 struct imsm_dev *dev = get_imsm_dev(super, dev_idx);
4049 struct imsm_map *map = get_imsm_map(dev, 0);
4050 struct disk_info *inf;
4051 struct imsm_disk *disk;
4052 int i;
4053
4054 len = sizeof(*u) - sizeof(*dev) + sizeof_imsm_dev(dev, 0) +
4055 sizeof(*inf) * map->num_members;
4056 u = malloc(len);
4057 if (!u) {
4058 fprintf(stderr, "%s: failed to allocate update buffer\n",
4059 __func__);
4060 return 1;
4061 }
4062
4063 u->type = update_create_array;
4064 u->dev_idx = dev_idx;
4065 imsm_copy_dev(&u->dev, dev);
4066 inf = get_disk_info(u);
4067 for (i = 0; i < map->num_members; i++) {
4068 int idx = get_imsm_disk_idx(dev, i, -1);
4069
4070 disk = get_imsm_disk(super, idx);
4071 serialcpy(inf[i].serial, disk->serial);
4072 }
4073 append_metadata_update(st, u, len);
4074
4075 return 0;
4076 }
4077
4078 static int mgmt_disk(struct supertype *st)
4079 {
4080 struct intel_super *super = st->sb;
4081 size_t len;
4082 struct imsm_update_add_remove_disk *u;
4083
4084 if (!super->disk_mgmt_list)
4085 return 0;
4086
4087 len = sizeof(*u);
4088 u = malloc(len);
4089 if (!u) {
4090 fprintf(stderr, "%s: failed to allocate update buffer\n",
4091 __func__);
4092 return 1;
4093 }
4094
4095 u->type = update_add_remove_disk;
4096 append_metadata_update(st, u, len);
4097
4098 return 0;
4099 }
4100
4101 static int write_init_super_imsm(struct supertype *st)
4102 {
4103 struct intel_super *super = st->sb;
4104 int current_vol = super->current_vol;
4105
4106 /* we are done with current_vol reset it to point st at the container */
4107 super->current_vol = -1;
4108
4109 if (st->update_tail) {
4110 /* queue the recently created array / added disk
4111 * as a metadata update */
4112 int rv;
4113
4114 /* determine if we are creating a volume or adding a disk */
4115 if (current_vol < 0) {
4116 /* in the mgmt (add/remove) disk case we are running
4117 * in mdmon context, so don't close fd's
4118 */
4119 return mgmt_disk(st);
4120 } else
4121 rv = create_array(st, current_vol);
4122
4123 return rv;
4124 } else {
4125 struct dl *d;
4126 for (d = super->disks; d; d = d->next)
4127 Kill(d->devname, NULL, 0, 1, 1);
4128 return write_super_imsm(st, 1);
4129 }
4130 }
4131 #endif
4132
4133 static int store_super_imsm(struct supertype *st, int fd)
4134 {
4135 struct intel_super *super = st->sb;
4136 struct imsm_super *mpb = super ? super->anchor : NULL;
4137
4138 if (!mpb)
4139 return 1;
4140
4141 #ifndef MDASSEMBLE
4142 return store_imsm_mpb(fd, mpb);
4143 #else
4144 return 1;
4145 #endif
4146 }
4147
4148 static int imsm_bbm_log_size(struct imsm_super *mpb)
4149 {
4150 return __le32_to_cpu(mpb->bbm_log_size);
4151 }
4152
4153 #ifndef MDASSEMBLE
4154 static int validate_geometry_imsm_container(struct supertype *st, int level,
4155 int layout, int raiddisks, int chunk,
4156 unsigned long long size, char *dev,
4157 unsigned long long *freesize,
4158 int verbose)
4159 {
4160 int fd;
4161 unsigned long long ldsize;
4162 struct intel_super *super=NULL;
4163 int rv = 0;
4164
4165 if (level != LEVEL_CONTAINER)
4166 return 0;
4167 if (!dev)
4168 return 1;
4169
4170 fd = open(dev, O_RDONLY|O_EXCL, 0);
4171 if (fd < 0) {
4172 if (verbose)
4173 fprintf(stderr, Name ": imsm: Cannot open %s: %s\n",
4174 dev, strerror(errno));
4175 return 0;
4176 }
4177 if (!get_dev_size(fd, dev, &ldsize)) {
4178 close(fd);
4179 return 0;
4180 }
4181
4182 /* capabilities retrieve could be possible
4183 * note that there is no fd for the disks in array.
4184 */
4185 super = alloc_super();
4186 if (!super) {
4187 fprintf(stderr,
4188 Name ": malloc of %zu failed.\n",
4189 sizeof(*super));
4190 close(fd);
4191 return 0;
4192 }
4193
4194 rv = find_intel_hba_capability(fd, super, verbose ? dev : NULL);
4195 if (rv != 0) {
4196 #if DEBUG
4197 char str[256];
4198 fd2devname(fd, str);
4199 dprintf("validate_geometry_imsm_container: fd: %d %s orom: %p rv: %d raiddisk: %d\n",
4200 fd, str, super->orom, rv, raiddisks);
4201 #endif
4202 /* no orom/efi or non-intel hba of the disk */
4203 close(fd);
4204 free_imsm(super);
4205 return 0;
4206 }
4207 close(fd);
4208 if (super->orom && raiddisks > super->orom->tds) {
4209 if (verbose)
4210 fprintf(stderr, Name ": %d exceeds maximum number of"
4211 " platform supported disks: %d\n",
4212 raiddisks, super->orom->tds);
4213
4214 free_imsm(super);
4215 return 0;
4216 }
4217
4218 *freesize = avail_size_imsm(st, ldsize >> 9);
4219 free_imsm(super);
4220
4221 return 1;
4222 }
4223
4224 static unsigned long long find_size(struct extent *e, int *idx, int num_extents)
4225 {
4226 const unsigned long long base_start = e[*idx].start;
4227 unsigned long long end = base_start + e[*idx].size;
4228 int i;
4229
4230 if (base_start == end)
4231 return 0;
4232
4233 *idx = *idx + 1;
4234 for (i = *idx; i < num_extents; i++) {
4235 /* extend overlapping extents */
4236 if (e[i].start >= base_start &&
4237 e[i].start <= end) {
4238 if (e[i].size == 0)
4239 return 0;
4240 if (e[i].start + e[i].size > end)
4241 end = e[i].start + e[i].size;
4242 } else if (e[i].start > end) {
4243 *idx = i;
4244 break;
4245 }
4246 }
4247
4248 return end - base_start;
4249 }
4250
4251 static unsigned long long merge_extents(struct intel_super *super, int sum_extents)
4252 {
4253 /* build a composite disk with all known extents and generate a new
4254 * 'maxsize' given the "all disks in an array must share a common start
4255 * offset" constraint
4256 */
4257 struct extent *e = calloc(sum_extents, sizeof(*e));
4258 struct dl *dl;
4259 int i, j;
4260 int start_extent;
4261 unsigned long long pos;
4262 unsigned long long start = 0;
4263 unsigned long long maxsize;
4264 unsigned long reserve;
4265
4266 if (!e)
4267 return 0;
4268
4269 /* coalesce and sort all extents. also, check to see if we need to
4270 * reserve space between member arrays
4271 */
4272 j = 0;
4273 for (dl = super->disks; dl; dl = dl->next) {
4274 if (!dl->e)
4275 continue;
4276 for (i = 0; i < dl->extent_cnt; i++)
4277 e[j++] = dl->e[i];
4278 }
4279 qsort(e, sum_extents, sizeof(*e), cmp_extent);
4280
4281 /* merge extents */
4282 i = 0;
4283 j = 0;
4284 while (i < sum_extents) {
4285 e[j].start = e[i].start;
4286 e[j].size = find_size(e, &i, sum_extents);
4287 j++;
4288 if (e[j-1].size == 0)
4289 break;
4290 }
4291
4292 pos = 0;
4293 maxsize = 0;
4294 start_extent = 0;
4295 i = 0;
4296 do {
4297 unsigned long long esize;
4298
4299 esize = e[i].start - pos;
4300 if (esize >= maxsize) {
4301 maxsize = esize;
4302 start = pos;
4303 start_extent = i;
4304 }
4305 pos = e[i].start + e[i].size;
4306 i++;
4307 } while (e[i-1].size);
4308 free(e);
4309
4310 if (maxsize == 0)
4311 return 0;
4312
4313 /* FIXME assumes volume at offset 0 is the first volume in a
4314 * container
4315 */
4316 if (start_extent > 0)
4317 reserve = IMSM_RESERVED_SECTORS; /* gap between raid regions */
4318 else
4319 reserve = 0;
4320
4321 if (maxsize < reserve)
4322 return 0;
4323
4324 super->create_offset = ~((__u32) 0);
4325 if (start + reserve > super->create_offset)
4326 return 0; /* start overflows create_offset */
4327 super->create_offset = start + reserve;
4328
4329 return maxsize - reserve;
4330 }
4331
4332 static int is_raid_level_supported(const struct imsm_orom *orom, int level, int raiddisks)
4333 {
4334 if (level < 0 || level == 6 || level == 4)
4335 return 0;
4336
4337 /* if we have an orom prevent invalid raid levels */
4338 if (orom)
4339 switch (level) {
4340 case 0: return imsm_orom_has_raid0(orom);
4341 case 1:
4342 if (raiddisks > 2)
4343 return imsm_orom_has_raid1e(orom);
4344 return imsm_orom_has_raid1(orom) && raiddisks == 2;
4345 case 10: return imsm_orom_has_raid10(orom) && raiddisks == 4;
4346 case 5: return imsm_orom_has_raid5(orom) && raiddisks > 2;
4347 }
4348 else
4349 return 1; /* not on an Intel RAID platform so anything goes */
4350
4351 return 0;
4352 }
4353
4354
4355 #define pr_vrb(fmt, arg...) (void) (verbose && fprintf(stderr, Name fmt, ##arg))
4356 /*
4357 * validate volume parameters with OROM/EFI capabilities
4358 */
4359 static int
4360 validate_geometry_imsm_orom(struct intel_super *super, int level, int layout,
4361 int raiddisks, int *chunk, int verbose)
4362 {
4363 #if DEBUG
4364 verbose = 1;
4365 #endif
4366 /* validate container capabilities */
4367 if (super->orom && raiddisks > super->orom->tds) {
4368 if (verbose)
4369 fprintf(stderr, Name ": %d exceeds maximum number of"
4370 " platform supported disks: %d\n",
4371 raiddisks, super->orom->tds);
4372 return 0;
4373 }
4374
4375 /* capabilities of OROM tested - copied from validate_geometry_imsm_volume */
4376 if (super->orom && (!is_raid_level_supported(super->orom, level,
4377 raiddisks))) {
4378 pr_vrb(": platform does not support raid%d with %d disk%s\n",
4379 level, raiddisks, raiddisks > 1 ? "s" : "");
4380 return 0;
4381 }
4382 if (super->orom && level != 1) {
4383 if (chunk && (*chunk == 0 || *chunk == UnSet))
4384 *chunk = imsm_orom_default_chunk(super->orom);
4385 else if (chunk && !imsm_orom_has_chunk(super->orom, *chunk)) {
4386 pr_vrb(": platform does not support a chunk size of: "
4387 "%d\n", *chunk);
4388 return 0;
4389 }
4390 }
4391 if (layout != imsm_level_to_layout(level)) {
4392 if (level == 5)
4393 pr_vrb(": imsm raid 5 only supports the left-asymmetric layout\n");
4394 else if (level == 10)
4395 pr_vrb(": imsm raid 10 only supports the n2 layout\n");
4396 else
4397 pr_vrb(": imsm unknown layout %#x for this raid level %d\n",
4398 layout, level);
4399 return 0;
4400 }
4401 return 1;
4402 }
4403
4404 /* validate_geometry_imsm_volume - lifted from validate_geometry_ddf_bvd
4405 * FIX ME add ahci details
4406 */
4407 static int validate_geometry_imsm_volume(struct supertype *st, int level,
4408 int layout, int raiddisks, int *chunk,
4409 unsigned long long size, char *dev,
4410 unsigned long long *freesize,
4411 int verbose)
4412 {
4413 struct stat stb;
4414 struct intel_super *super = st->sb;
4415 struct imsm_super *mpb = super->anchor;
4416 struct dl *dl;
4417 unsigned long long pos = 0;
4418 unsigned long long maxsize;
4419 struct extent *e;
4420 int i;
4421
4422 /* We must have the container info already read in. */
4423 if (!super)
4424 return 0;
4425
4426 if (!validate_geometry_imsm_orom(super, level, layout, raiddisks, chunk, verbose)) {
4427 fprintf(stderr, Name ": RAID gemetry validation failed. "
4428 "Cannot proceed with the action(s).\n");
4429 return 0;
4430 }
4431 if (!dev) {
4432 /* General test: make sure there is space for
4433 * 'raiddisks' device extents of size 'size' at a given
4434 * offset
4435 */
4436 unsigned long long minsize = size;
4437 unsigned long long start_offset = MaxSector;
4438 int dcnt = 0;
4439 if (minsize == 0)
4440 minsize = MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS;
4441 for (dl = super->disks; dl ; dl = dl->next) {
4442 int found = 0;
4443
4444 pos = 0;
4445 i = 0;
4446 e = get_extents(super, dl);
4447 if (!e) continue;
4448 do {
4449 unsigned long long esize;
4450 esize = e[i].start - pos;
4451 if (esize >= minsize)
4452 found = 1;
4453 if (found && start_offset == MaxSector) {
4454 start_offset = pos;
4455 break;
4456 } else if (found && pos != start_offset) {
4457 found = 0;
4458 break;
4459 }
4460 pos = e[i].start + e[i].size;
4461 i++;
4462 } while (e[i-1].size);
4463 if (found)
4464 dcnt++;
4465 free(e);
4466 }
4467 if (dcnt < raiddisks) {
4468 if (verbose)
4469 fprintf(stderr, Name ": imsm: Not enough "
4470 "devices with space for this array "
4471 "(%d < %d)\n",
4472 dcnt, raiddisks);
4473 return 0;
4474 }
4475 return 1;
4476 }
4477
4478 /* This device must be a member of the set */
4479 if (stat(dev, &stb) < 0)
4480 return 0;
4481 if ((S_IFMT & stb.st_mode) != S_IFBLK)
4482 return 0;
4483 for (dl = super->disks ; dl ; dl = dl->next) {
4484 if (dl->major == (int)major(stb.st_rdev) &&
4485 dl->minor == (int)minor(stb.st_rdev))
4486 break;
4487 }
4488 if (!dl) {
4489 if (verbose)
4490 fprintf(stderr, Name ": %s is not in the "
4491 "same imsm set\n", dev);
4492 return 0;
4493 } else if (super->orom && dl->index < 0 && mpb->num_raid_devs) {
4494 /* If a volume is present then the current creation attempt
4495 * cannot incorporate new spares because the orom may not
4496 * understand this configuration (all member disks must be
4497 * members of each array in the container).
4498 */
4499 fprintf(stderr, Name ": %s is a spare and a volume"
4500 " is already defined for this container\n", dev);
4501 fprintf(stderr, Name ": The option-rom requires all member"
4502 " disks to be a member of all volumes\n");
4503 return 0;
4504 }
4505
4506 /* retrieve the largest free space block */
4507 e = get_extents(super, dl);
4508 maxsize = 0;
4509 i = 0;
4510 if (e) {
4511 do {
4512 unsigned long long esize;
4513
4514 esize = e[i].start - pos;
4515 if (esize >= maxsize)
4516 maxsize = esize;
4517 pos = e[i].start + e[i].size;
4518 i++;
4519 } while (e[i-1].size);
4520 dl->e = e;
4521 dl->extent_cnt = i;
4522 } else {
4523 if (verbose)
4524 fprintf(stderr, Name ": unable to determine free space for: %s\n",
4525 dev);
4526 return 0;
4527 }
4528 if (maxsize < size) {
4529 if (verbose)
4530 fprintf(stderr, Name ": %s not enough space (%llu < %llu)\n",
4531 dev, maxsize, size);
4532 return 0;
4533 }
4534
4535 /* count total number of extents for merge */
4536 i = 0;
4537 for (dl = super->disks; dl; dl = dl->next)
4538 if (dl->e)
4539 i += dl->extent_cnt;
4540
4541 maxsize = merge_extents(super, i);
4542 if (maxsize < size || maxsize == 0) {
4543 if (verbose)
4544 fprintf(stderr, Name ": not enough space after merge (%llu < %llu)\n",
4545 maxsize, size);
4546 return 0;
4547 }
4548
4549 *freesize = maxsize;
4550
4551 return 1;
4552 }
4553
4554 static int reserve_space(struct supertype *st, int raiddisks,
4555 unsigned long long size, int chunk,
4556 unsigned long long *freesize)
4557 {
4558 struct intel_super *super = st->sb;
4559 struct imsm_super *mpb = super->anchor;
4560 struct dl *dl;
4561 int i;
4562 int extent_cnt;
4563 struct extent *e;
4564 unsigned long long maxsize;
4565 unsigned long long minsize;
4566 int cnt;
4567 int used;
4568
4569 /* find the largest common start free region of the possible disks */
4570 used = 0;
4571 extent_cnt = 0;
4572 cnt = 0;
4573 for (dl = super->disks; dl; dl = dl->next) {
4574 dl->raiddisk = -1;
4575
4576 if (dl->index >= 0)
4577 used++;
4578
4579 /* don't activate new spares if we are orom constrained
4580 * and there is already a volume active in the container
4581 */
4582 if (super->orom && dl->index < 0 && mpb->num_raid_devs)
4583 continue;
4584
4585 e = get_extents(super, dl);
4586 if (!e)
4587 continue;
4588 for (i = 1; e[i-1].size; i++)
4589 ;
4590 dl->e = e;
4591 dl->extent_cnt = i;
4592 extent_cnt += i;
4593 cnt++;
4594 }
4595
4596 maxsize = merge_extents(super, extent_cnt);
4597 minsize = size;
4598 if (size == 0)
4599 /* chunk is in K */
4600 minsize = chunk * 2;
4601
4602 if (cnt < raiddisks ||
4603 (super->orom && used && used != raiddisks) ||
4604 maxsize < minsize ||
4605 maxsize == 0) {
4606 fprintf(stderr, Name ": not enough devices with space to create array.\n");
4607 return 0; /* No enough free spaces large enough */
4608 }
4609
4610 if (size == 0) {
4611 size = maxsize;
4612 if (chunk) {
4613 size /= 2 * chunk;
4614 size *= 2 * chunk;
4615 }
4616 }
4617
4618 cnt = 0;
4619 for (dl = super->disks; dl; dl = dl->next)
4620 if (dl->e)
4621 dl->raiddisk = cnt++;
4622
4623 *freesize = size;
4624
4625 return 1;
4626 }
4627
4628 static int validate_geometry_imsm(struct supertype *st, int level, int layout,
4629 int raiddisks, int *chunk, unsigned long long size,
4630 char *dev, unsigned long long *freesize,
4631 int verbose)
4632 {
4633 int fd, cfd;
4634 struct mdinfo *sra;
4635 int is_member = 0;
4636
4637 /* load capability
4638 * if given unused devices create a container
4639 * if given given devices in a container create a member volume
4640 */
4641 if (level == LEVEL_CONTAINER) {
4642 /* Must be a fresh device to add to a container */
4643 return validate_geometry_imsm_container(st, level, layout,
4644 raiddisks,
4645 chunk?*chunk:0, size,
4646 dev, freesize,
4647 verbose);
4648 }
4649
4650 if (!dev) {
4651 if (st->sb && freesize) {
4652 /* we are being asked to automatically layout a
4653 * new volume based on the current contents of
4654 * the container. If the the parameters can be
4655 * satisfied reserve_space will record the disks,
4656 * start offset, and size of the volume to be
4657 * created. add_to_super and getinfo_super
4658 * detect when autolayout is in progress.
4659 */
4660 if (!validate_geometry_imsm_orom(st->sb, level, layout,
4661 raiddisks, chunk,
4662 verbose))
4663 return 0;
4664 return reserve_space(st, raiddisks, size,
4665 chunk?*chunk:0, freesize);
4666 }
4667 return 1;
4668 }
4669 if (st->sb) {
4670 /* creating in a given container */
4671 return validate_geometry_imsm_volume(st, level, layout,
4672 raiddisks, chunk, size,
4673 dev, freesize, verbose);
4674 }
4675
4676 /* This device needs to be a device in an 'imsm' container */
4677 fd = open(dev, O_RDONLY|O_EXCL, 0);
4678 if (fd >= 0) {
4679 if (verbose)
4680 fprintf(stderr,
4681 Name ": Cannot create this array on device %s\n",
4682 dev);
4683 close(fd);
4684 return 0;
4685 }
4686 if (errno != EBUSY || (fd = open(dev, O_RDONLY, 0)) < 0) {
4687 if (verbose)
4688 fprintf(stderr, Name ": Cannot open %s: %s\n",
4689 dev, strerror(errno));
4690 return 0;
4691 }
4692 /* Well, it is in use by someone, maybe an 'imsm' container. */
4693 cfd = open_container(fd);
4694 close(fd);
4695 if (cfd < 0) {
4696 if (verbose)
4697 fprintf(stderr, Name ": Cannot use %s: It is busy\n",
4698 dev);
4699 return 0;
4700 }
4701 sra = sysfs_read(cfd, 0, GET_VERSION);
4702 if (sra && sra->array.major_version == -1 &&
4703 strcmp(sra->text_version, "imsm") == 0)
4704 is_member = 1;
4705 sysfs_free(sra);
4706 if (is_member) {
4707 /* This is a member of a imsm container. Load the container
4708 * and try to create a volume
4709 */
4710 struct intel_super *super;
4711
4712 if (load_super_imsm_all(st, cfd, (void **) &super, NULL) == 0) {
4713 st->sb = super;
4714 st->container_dev = fd2devnum(cfd);
4715 close(cfd);
4716 return validate_geometry_imsm_volume(st, level, layout,
4717 raiddisks, chunk,
4718 size, dev,
4719 freesize, verbose);
4720 }
4721 }
4722
4723 if (verbose)
4724 fprintf(stderr, Name ": failed container membership check\n");
4725
4726 close(cfd);
4727 return 0;
4728 }
4729
4730 static void default_geometry_imsm(struct supertype *st, int *level, int *layout, int *chunk)
4731 {
4732 struct intel_super *super = st->sb;
4733
4734 if (level && *level == UnSet)
4735 *level = LEVEL_CONTAINER;
4736
4737 if (level && layout && *layout == UnSet)
4738 *layout = imsm_level_to_layout(*level);
4739
4740 if (chunk && (*chunk == UnSet || *chunk == 0) &&
4741 super && super->orom)
4742 *chunk = imsm_orom_default_chunk(super->orom);
4743 }
4744
4745 static void handle_missing(struct intel_super *super, struct imsm_dev *dev);
4746
4747 static int kill_subarray_imsm(struct supertype *st)
4748 {
4749 /* remove the subarray currently referenced by ->current_vol */
4750 __u8 i;
4751 struct intel_dev **dp;
4752 struct intel_super *super = st->sb;
4753 __u8 current_vol = super->current_vol;
4754 struct imsm_super *mpb = super->anchor;
4755
4756 if (super->current_vol < 0)
4757 return 2;
4758 super->current_vol = -1; /* invalidate subarray cursor */
4759
4760 /* block deletions that would change the uuid of active subarrays
4761 *
4762 * FIXME when immutable ids are available, but note that we'll
4763 * also need to fixup the invalidated/active subarray indexes in
4764 * mdstat
4765 */
4766 for (i = 0; i < mpb->num_raid_devs; i++) {
4767 char subarray[4];
4768
4769 if (i < current_vol)
4770 continue;
4771 sprintf(subarray, "%u", i);
4772 if (is_subarray_active(subarray, st->devname)) {
4773 fprintf(stderr,
4774 Name ": deleting subarray-%d would change the UUID of active subarray-%d, aborting\n",
4775 current_vol, i);
4776
4777 return 2;
4778 }
4779 }
4780
4781 if (st->update_tail) {
4782 struct imsm_update_kill_array *u = malloc(sizeof(*u));
4783
4784 if (!u)
4785 return 2;
4786 u->type = update_kill_array;
4787 u->dev_idx = current_vol;
4788 append_metadata_update(st, u, sizeof(*u));
4789
4790 return 0;
4791 }
4792
4793 for (dp = &super->devlist; *dp;)
4794 if ((*dp)->index == current_vol) {
4795 *dp = (*dp)->next;
4796 } else {
4797 handle_missing(super, (*dp)->dev);
4798 if ((*dp)->index > current_vol)
4799 (*dp)->index--;
4800 dp = &(*dp)->next;
4801 }
4802
4803 /* no more raid devices, all active components are now spares,
4804 * but of course failed are still failed
4805 */
4806 if (--mpb->num_raid_devs == 0) {
4807 struct dl *d;
4808
4809 for (d = super->disks; d; d = d->next)
4810 if (d->index > -2) {
4811 d->index = -1;
4812 d->disk.status = SPARE_DISK;
4813 }
4814 }
4815
4816 super->updates_pending++;
4817
4818 return 0;
4819 }
4820
4821 static int update_subarray_imsm(struct supertype *st, char *subarray,
4822 char *update, struct mddev_ident *ident)
4823 {
4824 /* update the subarray currently referenced by ->current_vol */
4825 struct intel_super *super = st->sb;
4826 struct imsm_super *mpb = super->anchor;
4827
4828 if (strcmp(update, "name") == 0) {
4829 char *name = ident->name;
4830 char *ep;
4831 int vol;
4832
4833 if (is_subarray_active(subarray, st->devname)) {
4834 fprintf(stderr,
4835 Name ": Unable to update name of active subarray\n");
4836 return 2;
4837 }
4838
4839 if (!check_name(super, name, 0))
4840 return 2;
4841
4842 vol = strtoul(subarray, &ep, 10);
4843 if (*ep != '\0' || vol >= super->anchor->num_raid_devs)
4844 return 2;
4845
4846 if (st->update_tail) {
4847 struct imsm_update_rename_array *u = malloc(sizeof(*u));
4848
4849 if (!u)
4850 return 2;
4851 u->type = update_rename_array;
4852 u->dev_idx = vol;
4853 snprintf((char *) u->name, MAX_RAID_SERIAL_LEN, "%s", name);
4854 append_metadata_update(st, u, sizeof(*u));
4855 } else {
4856 struct imsm_dev *dev;
4857 int i;
4858
4859 dev = get_imsm_dev(super, vol);
4860 snprintf((char *) dev->volume, MAX_RAID_SERIAL_LEN, "%s", name);
4861 for (i = 0; i < mpb->num_raid_devs; i++) {
4862 dev = get_imsm_dev(super, i);
4863 handle_missing(super, dev);
4864 }
4865 super->updates_pending++;
4866 }
4867 } else
4868 return 2;
4869
4870 return 0;
4871 }
4872
4873 static int is_gen_migration(struct imsm_dev *dev)
4874 {
4875 if (!dev->vol.migr_state)
4876 return 0;
4877
4878 if (migr_type(dev) == MIGR_GEN_MIGR)
4879 return 1;
4880
4881 return 0;
4882 }
4883 #endif /* MDASSEMBLE */
4884
4885 static int is_rebuilding(struct imsm_dev *dev)
4886 {
4887 struct imsm_map *migr_map;
4888
4889 if (!dev->vol.migr_state)
4890 return 0;
4891
4892 if (migr_type(dev) != MIGR_REBUILD)
4893 return 0;
4894
4895 migr_map = get_imsm_map(dev, 1);
4896
4897 if (migr_map->map_state == IMSM_T_STATE_DEGRADED)
4898 return 1;
4899 else
4900 return 0;
4901 }
4902
4903 static void update_recovery_start(struct imsm_dev *dev, struct mdinfo *array)
4904 {
4905 struct mdinfo *rebuild = NULL;
4906 struct mdinfo *d;
4907 __u32 units;
4908
4909 if (!is_rebuilding(dev))
4910 return;
4911
4912 /* Find the rebuild target, but punt on the dual rebuild case */
4913 for (d = array->devs; d; d = d->next)
4914 if (d->recovery_start == 0) {
4915 if (rebuild)
4916 return;
4917 rebuild = d;
4918 }
4919
4920 if (!rebuild) {
4921 /* (?) none of the disks are marked with
4922 * IMSM_ORD_REBUILD, so assume they are missing and the
4923 * disk_ord_tbl was not correctly updated
4924 */
4925 dprintf("%s: failed to locate out-of-sync disk\n", __func__);
4926 return;
4927 }
4928
4929 units = __le32_to_cpu(dev->vol.curr_migr_unit);
4930 rebuild->recovery_start = units * blocks_per_migr_unit(dev);
4931 }
4932
4933
4934 static struct mdinfo *container_content_imsm(struct supertype *st, char *subarray)
4935 {
4936 /* Given a container loaded by load_super_imsm_all,
4937 * extract information about all the arrays into
4938 * an mdinfo tree.
4939 * If 'subarray' is given, just extract info about that array.
4940 *
4941 * For each imsm_dev create an mdinfo, fill it in,
4942 * then look for matching devices in super->disks
4943 * and create appropriate device mdinfo.
4944 */
4945 struct intel_super *super = st->sb;
4946 struct imsm_super *mpb = super->anchor;
4947 struct mdinfo *rest = NULL;
4948 unsigned int i;
4949 int bbm_errors = 0;
4950 struct dl *d;
4951 int spare_disks = 0;
4952
4953 /* check for bad blocks */
4954 if (imsm_bbm_log_size(super->anchor))
4955 bbm_errors = 1;
4956
4957 /* count spare devices, not used in maps
4958 */
4959 for (d = super->disks; d; d = d->next)
4960 if (d->index == -1)
4961 spare_disks++;
4962
4963 for (i = 0; i < mpb->num_raid_devs; i++) {
4964 struct imsm_dev *dev;
4965 struct imsm_map *map;
4966 struct imsm_map *map2;
4967 struct mdinfo *this;
4968 int slot, chunk;
4969 char *ep;
4970
4971 if (subarray &&
4972 (i != strtoul(subarray, &ep, 10) || *ep != '\0'))
4973 continue;
4974
4975 dev = get_imsm_dev(super, i);
4976 map = get_imsm_map(dev, 0);
4977 map2 = get_imsm_map(dev, 1);
4978
4979 /* do not publish arrays that are in the middle of an
4980 * unsupported migration
4981 */
4982 if (dev->vol.migr_state &&
4983 (migr_type(dev) == MIGR_STATE_CHANGE)) {
4984 fprintf(stderr, Name ": cannot assemble volume '%.16s':"
4985 " unsupported migration in progress\n",
4986 dev->volume);
4987 continue;
4988 }
4989 /* do not publish arrays that are not support by controller's
4990 * OROM/EFI
4991 */
4992
4993 chunk = __le16_to_cpu(map->blocks_per_strip) >> 1;
4994 #ifndef MDASSEMBLE
4995 if (!validate_geometry_imsm_orom(super,
4996 get_imsm_raid_level(map), /* RAID level */
4997 imsm_level_to_layout(get_imsm_raid_level(map)),
4998 map->num_members, /* raid disks */
4999 &chunk,
5000 1 /* verbose */)) {
5001 fprintf(stderr, Name ": RAID gemetry validation failed. "
5002 "Cannot proceed with the action(s).\n");
5003 continue;
5004 }
5005 #endif /* MDASSEMBLE */
5006 this = malloc(sizeof(*this));
5007 if (!this) {
5008 fprintf(stderr, Name ": failed to allocate %zu bytes\n",
5009 sizeof(*this));
5010 break;
5011 }
5012 memset(this, 0, sizeof(*this));
5013 this->next = rest;
5014
5015 super->current_vol = i;
5016 getinfo_super_imsm_volume(st, this, NULL);
5017 for (slot = 0 ; slot < map->num_members; slot++) {
5018 unsigned long long recovery_start;
5019 struct mdinfo *info_d;
5020 struct dl *d;
5021 int idx;
5022 int skip;
5023 __u32 ord;
5024
5025 skip = 0;
5026 idx = get_imsm_disk_idx(dev, slot, 0);
5027 ord = get_imsm_ord_tbl_ent(dev, slot, -1);
5028 for (d = super->disks; d ; d = d->next)
5029 if (d->index == idx)
5030 break;
5031
5032 recovery_start = MaxSector;
5033 if (d == NULL)
5034 skip = 1;
5035 if (d && is_failed(&d->disk))
5036 skip = 1;
5037 if (ord & IMSM_ORD_REBUILD)
5038 recovery_start = 0;
5039
5040 /*
5041 * if we skip some disks the array will be assmebled degraded;
5042 * reset resync start to avoid a dirty-degraded
5043 * situation when performing the intial sync
5044 *
5045 * FIXME handle dirty degraded
5046 */
5047 if ((skip || recovery_start == 0) && !dev->vol.dirty)
5048 this->resync_start = MaxSector;
5049 if (skip)
5050 continue;
5051
5052 info_d = calloc(1, sizeof(*info_d));
5053 if (!info_d) {
5054 fprintf(stderr, Name ": failed to allocate disk"
5055 " for volume %.16s\n", dev->volume);
5056 info_d = this->devs;
5057 while (info_d) {
5058 struct mdinfo *d = info_d->next;
5059
5060 free(info_d);
5061 info_d = d;
5062 }
5063 free(this);
5064 this = rest;
5065 break;
5066 }
5067 info_d->next = this->devs;
5068 this->devs = info_d;
5069
5070 info_d->disk.number = d->index;
5071 info_d->disk.major = d->major;
5072 info_d->disk.minor = d->minor;
5073 info_d->disk.raid_disk = slot;
5074 info_d->recovery_start = recovery_start;
5075 if (map2) {
5076 if (slot < map2->num_members)
5077 info_d->disk.state = (1 << MD_DISK_ACTIVE);
5078 else
5079 this->array.spare_disks++;
5080 } else {
5081 if (slot < map->num_members)
5082 info_d->disk.state = (1 << MD_DISK_ACTIVE);
5083 else
5084 this->array.spare_disks++;
5085 }
5086 if (info_d->recovery_start == MaxSector)
5087 this->array.working_disks++;
5088
5089 info_d->events = __le32_to_cpu(mpb->generation_num);
5090 info_d->data_offset = __le32_to_cpu(map->pba_of_lba0);
5091 info_d->component_size = __le32_to_cpu(map->blocks_per_member);
5092 }
5093 /* now that the disk list is up-to-date fixup recovery_start */
5094 update_recovery_start(dev, this);
5095 this->array.spare_disks += spare_disks;
5096 rest = this;
5097 }
5098
5099 /* if array has bad blocks, set suitable bit in array status */
5100 if (bbm_errors)
5101 rest->array.state |= (1<<MD_SB_BBM_ERRORS);
5102
5103 return rest;
5104 }
5105
5106
5107 static __u8 imsm_check_degraded(struct intel_super *super, struct imsm_dev *dev, int failed)
5108 {
5109 struct imsm_map *map = get_imsm_map(dev, 0);
5110
5111 if (!failed)
5112 return map->map_state == IMSM_T_STATE_UNINITIALIZED ?
5113 IMSM_T_STATE_UNINITIALIZED : IMSM_T_STATE_NORMAL;
5114
5115 switch (get_imsm_raid_level(map)) {
5116 case 0:
5117 return IMSM_T_STATE_FAILED;
5118 break;
5119 case 1:
5120 if (failed < map->num_members)
5121 return IMSM_T_STATE_DEGRADED;
5122 else
5123 return IMSM_T_STATE_FAILED;
5124 break;
5125 case 10:
5126 {
5127 /**
5128 * check to see if any mirrors have failed, otherwise we
5129 * are degraded. Even numbered slots are mirrored on
5130 * slot+1
5131 */
5132 int i;
5133 /* gcc -Os complains that this is unused */
5134 int insync = insync;
5135
5136 for (i = 0; i < map->num_members; i++) {
5137 __u32 ord = get_imsm_ord_tbl_ent(dev, i, -1);
5138 int idx = ord_to_idx(ord);
5139 struct imsm_disk *disk;
5140
5141 /* reset the potential in-sync count on even-numbered
5142 * slots. num_copies is always 2 for imsm raid10
5143 */
5144 if ((i & 1) == 0)
5145 insync = 2;
5146
5147 disk = get_imsm_disk(super, idx);
5148 if (!disk || is_failed(disk) || ord & IMSM_ORD_REBUILD)
5149 insync--;
5150
5151 /* no in-sync disks left in this mirror the
5152 * array has failed
5153 */
5154 if (insync == 0)
5155 return IMSM_T_STATE_FAILED;
5156 }
5157
5158 return IMSM_T_STATE_DEGRADED;
5159 }
5160 case 5:
5161 if (failed < 2)
5162 return IMSM_T_STATE_DEGRADED;
5163 else
5164 return IMSM_T_STATE_FAILED;
5165 break;
5166 default:
5167 break;
5168 }
5169
5170 return map->map_state;
5171 }
5172
5173 static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev)
5174 {
5175 int i;
5176 int failed = 0;
5177 struct imsm_disk *disk;
5178 struct imsm_map *map = get_imsm_map(dev, 0);
5179 struct imsm_map *prev = get_imsm_map(dev, dev->vol.migr_state);
5180 __u32 ord;
5181 int idx;
5182
5183 /* at the beginning of migration we set IMSM_ORD_REBUILD on
5184 * disks that are being rebuilt. New failures are recorded to
5185 * map[0]. So we look through all the disks we started with and
5186 * see if any failures are still present, or if any new ones
5187 * have arrived
5188 *
5189 * FIXME add support for online capacity expansion and
5190 * raid-level-migration
5191 */
5192 for (i = 0; i < prev->num_members; i++) {
5193 ord = __le32_to_cpu(prev->disk_ord_tbl[i]);
5194 ord |= __le32_to_cpu(map->disk_ord_tbl[i]);
5195 idx = ord_to_idx(ord);
5196
5197 disk = get_imsm_disk(super, idx);
5198 if (!disk || is_failed(disk) || ord & IMSM_ORD_REBUILD)
5199 failed++;
5200 }
5201
5202 return failed;
5203 }
5204
5205 #ifndef MDASSEMBLE
5206 static int imsm_open_new(struct supertype *c, struct active_array *a,
5207 char *inst)
5208 {
5209 struct intel_super *super = c->sb;
5210 struct imsm_super *mpb = super->anchor;
5211
5212 if (atoi(inst) >= mpb->num_raid_devs) {
5213 fprintf(stderr, "%s: subarry index %d, out of range\n",
5214 __func__, atoi(inst));
5215 return -ENODEV;
5216 }
5217
5218 dprintf("imsm: open_new %s\n", inst);
5219 a->info.container_member = atoi(inst);
5220 return 0;
5221 }
5222
5223 static int is_resyncing(struct imsm_dev *dev)
5224 {
5225 struct imsm_map *migr_map;
5226
5227 if (!dev->vol.migr_state)
5228 return 0;
5229
5230 if (migr_type(dev) == MIGR_INIT ||
5231 migr_type(dev) == MIGR_REPAIR)
5232 return 1;
5233
5234 if (migr_type(dev) == MIGR_GEN_MIGR)
5235 return 0;
5236
5237 migr_map = get_imsm_map(dev, 1);
5238
5239 if ((migr_map->map_state == IMSM_T_STATE_NORMAL) &&
5240 (dev->vol.migr_type != MIGR_GEN_MIGR))
5241 return 1;
5242 else
5243 return 0;
5244 }
5245
5246 /* return true if we recorded new information */
5247 static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx)
5248 {
5249 __u32 ord;
5250 int slot;
5251 struct imsm_map *map;
5252
5253 /* new failures are always set in map[0] */
5254 map = get_imsm_map(dev, 0);
5255
5256 slot = get_imsm_disk_slot(map, idx);
5257 if (slot < 0)
5258 return 0;
5259
5260 ord = __le32_to_cpu(map->disk_ord_tbl[slot]);
5261 if (is_failed(disk) && (ord & IMSM_ORD_REBUILD))
5262 return 0;
5263
5264 disk->status |= FAILED_DISK;
5265 set_imsm_ord_tbl_ent(map, slot, idx | IMSM_ORD_REBUILD);
5266 if (map->failed_disk_num == 0xff)
5267 map->failed_disk_num = slot;
5268 return 1;
5269 }
5270
5271 static void mark_missing(struct imsm_dev *dev, struct imsm_disk *disk, int idx)
5272 {
5273 mark_failure(dev, disk, idx);
5274
5275 if (disk->scsi_id == __cpu_to_le32(~(__u32)0))
5276 return;
5277
5278 disk->scsi_id = __cpu_to_le32(~(__u32)0);
5279 memmove(&disk->serial[0], &disk->serial[1], MAX_RAID_SERIAL_LEN - 1);
5280 }
5281
5282 static void handle_missing(struct intel_super *super, struct imsm_dev *dev)
5283 {
5284 __u8 map_state;
5285 struct dl *dl;
5286 int failed;
5287
5288 if (!super->missing)
5289 return;
5290 failed = imsm_count_failed(super, dev);
5291 map_state = imsm_check_degraded(super, dev, failed);
5292
5293 dprintf("imsm: mark missing\n");
5294 end_migration(dev, map_state);
5295 for (dl = super->missing; dl; dl = dl->next)
5296 mark_missing(dev, &dl->disk, dl->index);
5297 super->updates_pending++;
5298 }
5299
5300 static unsigned long long imsm_set_array_size(struct imsm_dev *dev)
5301 {
5302 int used_disks = imsm_num_data_members(dev, 0);
5303 unsigned long long array_blocks;
5304 struct imsm_map *map;
5305
5306 if (used_disks == 0) {
5307 /* when problems occures
5308 * return current array_blocks value
5309 */
5310 array_blocks = __le32_to_cpu(dev->size_high);
5311 array_blocks = array_blocks << 32;
5312 array_blocks += __le32_to_cpu(dev->size_low);
5313
5314 return array_blocks;
5315 }
5316
5317 /* set array size in metadata
5318 */
5319 map = get_imsm_map(dev, 0);
5320 array_blocks = map->blocks_per_member * used_disks;
5321
5322 /* round array size down to closest MB
5323 */
5324 array_blocks = (array_blocks >> SECT_PER_MB_SHIFT) << SECT_PER_MB_SHIFT;
5325 dev->size_low = __cpu_to_le32((__u32)array_blocks);
5326 dev->size_high = __cpu_to_le32((__u32)(array_blocks >> 32));
5327
5328 return array_blocks;
5329 }
5330
5331 static void imsm_set_disk(struct active_array *a, int n, int state);
5332
5333 static void imsm_progress_container_reshape(struct intel_super *super)
5334 {
5335 /* if no device has a migr_state, but some device has a
5336 * different number of members than the previous device, start
5337 * changing the number of devices in this device to match
5338 * previous.
5339 */
5340 struct imsm_super *mpb = super->anchor;
5341 int prev_disks = -1;
5342 int i;
5343 int copy_map_size;
5344
5345 for (i = 0; i < mpb->num_raid_devs; i++) {
5346 struct imsm_dev *dev = get_imsm_dev(super, i);
5347 struct imsm_map *map = get_imsm_map(dev, 0);
5348 struct imsm_map *map2;
5349 int prev_num_members;
5350
5351 if (dev->vol.migr_state)
5352 return;
5353
5354 if (prev_disks == -1)
5355 prev_disks = map->num_members;
5356 if (prev_disks == map->num_members)
5357 continue;
5358
5359 /* OK, this array needs to enter reshape mode.
5360 * i.e it needs a migr_state
5361 */
5362
5363 copy_map_size = sizeof_imsm_map(map);
5364 prev_num_members = map->num_members;
5365 map->num_members = prev_disks;
5366 dev->vol.migr_state = 1;
5367 dev->vol.curr_migr_unit = 0;
5368 dev->vol.migr_type = MIGR_GEN_MIGR;
5369 for (i = prev_num_members;
5370 i < map->num_members; i++)
5371 set_imsm_ord_tbl_ent(map, i, i);
5372 map2 = get_imsm_map(dev, 1);
5373 /* Copy the current map */
5374 memcpy(map2, map, copy_map_size);
5375 map2->num_members = prev_num_members;
5376
5377 imsm_set_array_size(dev);
5378 super->updates_pending++;
5379 }
5380 }
5381
5382 /* Handle dirty -> clean transititions, resync and reshape. Degraded and rebuild
5383 * states are handled in imsm_set_disk() with one exception, when a
5384 * resync is stopped due to a new failure this routine will set the
5385 * 'degraded' state for the array.
5386 */
5387 static int imsm_set_array_state(struct active_array *a, int consistent)
5388 {
5389 int inst = a->info.container_member;
5390 struct intel_super *super = a->container->sb;
5391 struct imsm_dev *dev = get_imsm_dev(super, inst);
5392 struct imsm_map *map = get_imsm_map(dev, 0);
5393 int failed = imsm_count_failed(super, dev);
5394 __u8 map_state = imsm_check_degraded(super, dev, failed);
5395 __u32 blocks_per_unit;
5396
5397 if (dev->vol.migr_state &&
5398 dev->vol.migr_type == MIGR_GEN_MIGR) {
5399 /* array state change is blocked due to reshape action
5400 * We might need to
5401 * - abort the reshape (if last_checkpoint is 0 and action!= reshape)
5402 * - finish the reshape (if last_checkpoint is big and action != reshape)
5403 * - update curr_migr_unit
5404 */
5405 if (a->curr_action == reshape) {
5406 /* still reshaping, maybe update curr_migr_unit */
5407 goto mark_checkpoint;
5408 } else {
5409 if (a->last_checkpoint == 0 && a->prev_action == reshape) {
5410 /* for some reason we aborted the reshape.
5411 * Better clean up
5412 */
5413 struct imsm_map *map2 = get_imsm_map(dev, 1);
5414 dev->vol.migr_state = 0;
5415 dev->vol.migr_type = 0;
5416 dev->vol.curr_migr_unit = 0;
5417 memcpy(map, map2, sizeof_imsm_map(map2));
5418 super->updates_pending++;
5419 }
5420 if (a->last_checkpoint >= a->info.component_size) {
5421 unsigned long long array_blocks;
5422 int used_disks;
5423 struct mdinfo *mdi;
5424
5425 used_disks = imsm_num_data_members(dev, 0);
5426 if (used_disks > 0) {
5427 array_blocks =
5428 map->blocks_per_member *
5429 used_disks;
5430 /* round array size down to closest MB
5431 */
5432 array_blocks = (array_blocks
5433 >> SECT_PER_MB_SHIFT)
5434 << SECT_PER_MB_SHIFT;
5435 a->info.custom_array_size = array_blocks;
5436 /* encourage manager to update array
5437 * size
5438 */
5439
5440 a->check_reshape = 1;
5441 }
5442 /* finalize online capacity expansion/reshape */
5443 for (mdi = a->info.devs; mdi; mdi = mdi->next)
5444 imsm_set_disk(a,
5445 mdi->disk.raid_disk,
5446 mdi->curr_state);
5447
5448 imsm_progress_container_reshape(super);
5449 }
5450 }
5451 }
5452
5453 /* before we activate this array handle any missing disks */
5454 if (consistent == 2)
5455 handle_missing(super, dev);
5456
5457 if (consistent == 2 &&
5458 (!is_resync_complete(&a->info) ||
5459 map_state != IMSM_T_STATE_NORMAL ||
5460 dev->vol.migr_state))
5461 consistent = 0;
5462
5463 if (is_resync_complete(&a->info)) {
5464 /* complete intialization / resync,
5465 * recovery and interrupted recovery is completed in
5466 * ->set_disk
5467 */
5468 if (is_resyncing(dev)) {
5469 dprintf("imsm: mark resync done\n");
5470 end_migration(dev, map_state);
5471 super->updates_pending++;
5472 a->last_checkpoint = 0;
5473 }
5474 } else if (!is_resyncing(dev) && !failed) {
5475 /* mark the start of the init process if nothing is failed */
5476 dprintf("imsm: mark resync start\n");
5477 if (map->map_state == IMSM_T_STATE_UNINITIALIZED)
5478 migrate(dev, IMSM_T_STATE_NORMAL, MIGR_INIT);
5479 else
5480 migrate(dev, IMSM_T_STATE_NORMAL, MIGR_REPAIR);
5481 super->updates_pending++;
5482 }
5483
5484 mark_checkpoint:
5485 /* check if we can update curr_migr_unit from resync_start, recovery_start */
5486 blocks_per_unit = blocks_per_migr_unit(dev);
5487 if (blocks_per_unit) {
5488 __u32 units32;
5489 __u64 units;
5490
5491 units = a->last_checkpoint / blocks_per_unit;
5492 units32 = units;
5493
5494 /* check that we did not overflow 32-bits, and that
5495 * curr_migr_unit needs updating
5496 */
5497 if (units32 == units &&
5498 units32 != 0 &&
5499 __le32_to_cpu(dev->vol.curr_migr_unit) != units32) {
5500 dprintf("imsm: mark checkpoint (%u)\n", units32);
5501 dev->vol.curr_migr_unit = __cpu_to_le32(units32);
5502 super->updates_pending++;
5503 }
5504 }
5505
5506 /* mark dirty / clean */
5507 if (dev->vol.dirty != !consistent) {
5508 dprintf("imsm: mark '%s'\n", consistent ? "clean" : "dirty");
5509 if (consistent)
5510 dev->vol.dirty = 0;
5511 else
5512 dev->vol.dirty = 1;
5513 super->updates_pending++;
5514 }
5515
5516 return consistent;
5517 }
5518
5519 static void imsm_set_disk(struct active_array *a, int n, int state)
5520 {
5521 int inst = a->info.container_member;
5522 struct intel_super *super = a->container->sb;
5523 struct imsm_dev *dev = get_imsm_dev(super, inst);
5524 struct imsm_map *map = get_imsm_map(dev, 0);
5525 struct imsm_disk *disk;
5526 int failed;
5527 __u32 ord;
5528 __u8 map_state;
5529
5530 if (n > map->num_members)
5531 fprintf(stderr, "imsm: set_disk %d out of range 0..%d\n",
5532 n, map->num_members - 1);
5533
5534 if (n < 0)
5535 return;
5536
5537 dprintf("imsm: set_disk %d:%x\n", n, state);
5538
5539 ord = get_imsm_ord_tbl_ent(dev, n, -1);
5540 disk = get_imsm_disk(super, ord_to_idx(ord));
5541
5542 /* check for new failures */
5543 if (state & DS_FAULTY) {
5544 if (mark_failure(dev, disk, ord_to_idx(ord)))
5545 super->updates_pending++;
5546 }
5547
5548 /* check if in_sync */
5549 if (state & DS_INSYNC && ord & IMSM_ORD_REBUILD && is_rebuilding(dev)) {
5550 struct imsm_map *migr_map = get_imsm_map(dev, 1);
5551
5552 set_imsm_ord_tbl_ent(migr_map, n, ord_to_idx(ord));
5553 super->updates_pending++;
5554 }
5555
5556 failed = imsm_count_failed(super, dev);
5557 map_state = imsm_check_degraded(super, dev, failed);
5558
5559 /* check if recovery complete, newly degraded, or failed */
5560 if (map_state == IMSM_T_STATE_NORMAL && is_rebuilding(dev)) {
5561 end_migration(dev, map_state);
5562 map = get_imsm_map(dev, 0);
5563 map->failed_disk_num = ~0;
5564 super->updates_pending++;
5565 a->last_checkpoint = 0;
5566 } else if (map_state == IMSM_T_STATE_DEGRADED &&
5567 map->map_state != map_state &&
5568 !dev->vol.migr_state) {
5569 dprintf("imsm: mark degraded\n");
5570 map->map_state = map_state;
5571 super->updates_pending++;
5572 a->last_checkpoint = 0;
5573 } else if (map_state == IMSM_T_STATE_FAILED &&
5574 map->map_state != map_state) {
5575 dprintf("imsm: mark failed\n");
5576 end_migration(dev, map_state);
5577 super->updates_pending++;
5578 a->last_checkpoint = 0;
5579 } else if (is_gen_migration(dev)) {
5580 dprintf("imsm: Detected General Migration in state: ");
5581 if (map_state == IMSM_T_STATE_NORMAL) {
5582 end_migration(dev, map_state);
5583 map = get_imsm_map(dev, 0);
5584 map->failed_disk_num = ~0;
5585 dprintf("normal\n");
5586 } else {
5587 if (map_state == IMSM_T_STATE_DEGRADED) {
5588 printf("degraded\n");
5589 end_migration(dev, map_state);
5590 } else {
5591 dprintf("failed\n");
5592 }
5593 map->map_state = map_state;
5594 }
5595 super->updates_pending++;
5596 }
5597 }
5598
5599 static int store_imsm_mpb(int fd, struct imsm_super *mpb)
5600 {
5601 void *buf = mpb;
5602 __u32 mpb_size = __le32_to_cpu(mpb->mpb_size);
5603 unsigned long long dsize;
5604 unsigned long long sectors;
5605
5606 get_dev_size(fd, NULL, &dsize);
5607
5608 if (mpb_size > 512) {
5609 /* -1 to account for anchor */
5610 sectors = mpb_sectors(mpb) - 1;
5611
5612 /* write the extended mpb to the sectors preceeding the anchor */
5613 if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0)
5614 return 1;
5615
5616 if ((unsigned long long)write(fd, buf + 512, 512 * sectors)
5617 != 512 * sectors)
5618 return 1;
5619 }
5620
5621 /* first block is stored on second to last sector of the disk */
5622 if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0)
5623 return 1;
5624
5625 if (write(fd, buf, 512) != 512)
5626 return 1;
5627
5628 return 0;
5629 }
5630
5631 static void imsm_sync_metadata(struct supertype *container)
5632 {
5633 struct intel_super *super = container->sb;
5634
5635 dprintf("sync metadata: %d\n", super->updates_pending);
5636 if (!super->updates_pending)
5637 return;
5638
5639 write_super_imsm(container, 0);
5640
5641 super->updates_pending = 0;
5642 }
5643
5644 static struct dl *imsm_readd(struct intel_super *super, int idx, struct active_array *a)
5645 {
5646 struct imsm_dev *dev = get_imsm_dev(super, a->info.container_member);
5647 int i = get_imsm_disk_idx(dev, idx, -1);
5648 struct dl *dl;
5649
5650 for (dl = super->disks; dl; dl = dl->next)
5651 if (dl->index == i)
5652 break;
5653
5654 if (dl && is_failed(&dl->disk))
5655 dl = NULL;
5656
5657 if (dl)
5658 dprintf("%s: found %x:%x\n", __func__, dl->major, dl->minor);
5659
5660 return dl;
5661 }
5662
5663 static struct dl *imsm_add_spare(struct intel_super *super, int slot,
5664 struct active_array *a, int activate_new,
5665 struct mdinfo *additional_test_list)
5666 {
5667 struct imsm_dev *dev = get_imsm_dev(super, a->info.container_member);
5668 int idx = get_imsm_disk_idx(dev, slot, -1);
5669 struct imsm_super *mpb = super->anchor;
5670 struct imsm_map *map;
5671 unsigned long long pos;
5672 struct mdinfo *d;
5673 struct extent *ex;
5674 int i, j;
5675 int found;
5676 __u32 array_start = 0;
5677 __u32 array_end = 0;
5678 struct dl *dl;
5679 struct mdinfo *test_list;
5680
5681 for (dl = super->disks; dl; dl = dl->next) {
5682 /* If in this array, skip */
5683 for (d = a->info.devs ; d ; d = d->next)
5684 if (d->state_fd >= 0 &&
5685 d->disk.major == dl->major &&
5686 d->disk.minor == dl->minor) {
5687 dprintf("%x:%x already in array\n",
5688 dl->major, dl->minor);
5689 break;
5690 }
5691 if (d)
5692 continue;
5693 test_list = additional_test_list;
5694 while (test_list) {
5695 if (test_list->disk.major == dl->major &&
5696 test_list->disk.minor == dl->minor) {
5697 dprintf("%x:%x already in additional test list\n",
5698 dl->major, dl->minor);
5699 break;
5700 }
5701 test_list = test_list->next;
5702 }
5703 if (test_list)
5704 continue;
5705
5706 /* skip in use or failed drives */
5707 if (is_failed(&dl->disk) || idx == dl->index ||
5708 dl->index == -2) {
5709 dprintf("%x:%x status (failed: %d index: %d)\n",
5710 dl->major, dl->minor, is_failed(&dl->disk), idx);
5711 continue;
5712 }
5713
5714 /* skip pure spares when we are looking for partially
5715 * assimilated drives
5716 */
5717 if (dl->index == -1 && !activate_new)
5718 continue;
5719
5720 /* Does this unused device have the requisite free space?
5721 * It needs to be able to cover all member volumes
5722 */
5723 ex = get_extents(super, dl);
5724 if (!ex) {
5725 dprintf("cannot get extents\n");
5726 continue;
5727 }
5728 for (i = 0; i < mpb->num_raid_devs; i++) {
5729 dev = get_imsm_dev(super, i);
5730 map = get_imsm_map(dev, 0);
5731
5732 /* check if this disk is already a member of
5733 * this array
5734 */
5735 if (get_imsm_disk_slot(map, dl->index) >= 0)
5736 continue;
5737
5738 found = 0;
5739 j = 0;
5740 pos = 0;
5741 array_start = __le32_to_cpu(map->pba_of_lba0);
5742 array_end = array_start +
5743 __le32_to_cpu(map->blocks_per_member) - 1;
5744
5745 do {
5746 /* check that we can start at pba_of_lba0 with
5747 * blocks_per_member of space
5748 */
5749 if (array_start >= pos && array_end < ex[j].start) {
5750 found = 1;
5751 break;
5752 }
5753 pos = ex[j].start + ex[j].size;
5754 j++;
5755 } while (ex[j-1].size);
5756
5757 if (!found)
5758 break;
5759 }
5760
5761 free(ex);
5762 if (i < mpb->num_raid_devs) {
5763 dprintf("%x:%x does not have %u to %u available\n",
5764 dl->major, dl->minor, array_start, array_end);
5765 /* No room */
5766 continue;
5767 }
5768 return dl;
5769 }
5770
5771 return dl;
5772 }
5773
5774
5775 static int imsm_rebuild_allowed(struct supertype *cont, int dev_idx, int failed)
5776 {
5777 struct imsm_dev *dev2;
5778 struct imsm_map *map;
5779 struct dl *idisk;
5780 int slot;
5781 int idx;
5782 __u8 state;
5783
5784 dev2 = get_imsm_dev(cont->sb, dev_idx);
5785 if (dev2) {
5786 state = imsm_check_degraded(cont->sb, dev2, failed);
5787 if (state == IMSM_T_STATE_FAILED) {
5788 map = get_imsm_map(dev2, 0);
5789 if (!map)
5790 return 1;
5791 for (slot = 0; slot < map->num_members; slot++) {
5792 /*
5793 * Check if failed disks are deleted from intel
5794 * disk list or are marked to be deleted
5795 */
5796 idx = get_imsm_disk_idx(dev2, slot, -1);
5797 idisk = get_imsm_dl_disk(cont->sb, idx);
5798 /*
5799 * Do not rebuild the array if failed disks
5800 * from failed sub-array are not removed from
5801 * container.
5802 */
5803 if (idisk &&
5804 is_failed(&idisk->disk) &&
5805 (idisk->action != DISK_REMOVE))
5806 return 0;
5807 }
5808 }
5809 }
5810 return 1;
5811 }
5812
5813 static struct mdinfo *imsm_activate_spare(struct active_array *a,
5814 struct metadata_update **updates)
5815 {
5816 /**
5817 * Find a device with unused free space and use it to replace a
5818 * failed/vacant region in an array. We replace failed regions one a
5819 * array at a time. The result is that a new spare disk will be added
5820 * to the first failed array and after the monitor has finished
5821 * propagating failures the remainder will be consumed.
5822 *
5823 * FIXME add a capability for mdmon to request spares from another
5824 * container.
5825 */
5826
5827 struct intel_super *super = a->container->sb;
5828 int inst = a->info.container_member;
5829 struct imsm_dev *dev = get_imsm_dev(super, inst);
5830 struct imsm_map *map = get_imsm_map(dev, 0);
5831 int failed = a->info.array.raid_disks;
5832 struct mdinfo *rv = NULL;
5833 struct mdinfo *d;
5834 struct mdinfo *di;
5835 struct metadata_update *mu;
5836 struct dl *dl;
5837 struct imsm_update_activate_spare *u;
5838 int num_spares = 0;
5839 int i;
5840 int allowed;
5841
5842 for (d = a->info.devs ; d ; d = d->next) {
5843 if ((d->curr_state & DS_FAULTY) &&
5844 d->state_fd >= 0)
5845 /* wait for Removal to happen */
5846 return NULL;
5847 if (d->state_fd >= 0)
5848 failed--;
5849 }
5850
5851 dprintf("imsm: activate spare: inst=%d failed=%d (%d) level=%d\n",
5852 inst, failed, a->info.array.raid_disks, a->info.array.level);
5853
5854 if (dev->vol.migr_state &&
5855 dev->vol.migr_type == MIGR_GEN_MIGR)
5856 /* No repair during migration */
5857 return NULL;
5858
5859 if (a->info.array.level == 4)
5860 /* No repair for takeovered array
5861 * imsm doesn't support raid4
5862 */
5863 return NULL;
5864
5865 if (imsm_check_degraded(super, dev, failed) != IMSM_T_STATE_DEGRADED)
5866 return NULL;
5867
5868 /*
5869 * If there are any failed disks check state of the other volume.
5870 * Block rebuild if the another one is failed until failed disks
5871 * are removed from container.
5872 */
5873 if (failed) {
5874 dprintf("found failed disks in %s, check if there another"
5875 "failed sub-array.\n",
5876 dev->volume);
5877 /* check if states of the other volumes allow for rebuild */
5878 for (i = 0; i < super->anchor->num_raid_devs; i++) {
5879 if (i != inst) {
5880 allowed = imsm_rebuild_allowed(a->container,
5881 i, failed);
5882 if (!allowed)
5883 return NULL;
5884 }
5885 }
5886 }
5887
5888 /* For each slot, if it is not working, find a spare */
5889 for (i = 0; i < a->info.array.raid_disks; i++) {
5890 for (d = a->info.devs ; d ; d = d->next)
5891 if (d->disk.raid_disk == i)
5892 break;
5893 dprintf("found %d: %p %x\n", i, d, d?d->curr_state:0);
5894 if (d && (d->state_fd >= 0))
5895 continue;
5896
5897 /*
5898 * OK, this device needs recovery. Try to re-add the
5899 * previous occupant of this slot, if this fails see if
5900 * we can continue the assimilation of a spare that was
5901 * partially assimilated, finally try to activate a new
5902 * spare.
5903 */
5904 dl = imsm_readd(super, i, a);
5905 if (!dl)
5906 dl = imsm_add_spare(super, i, a, 0, NULL);
5907 if (!dl)
5908 dl = imsm_add_spare(super, i, a, 1, NULL);
5909 if (!dl)
5910 continue;
5911
5912 /* found a usable disk with enough space */
5913 di = malloc(sizeof(*di));
5914 if (!di)
5915 continue;
5916 memset(di, 0, sizeof(*di));
5917
5918 /* dl->index will be -1 in the case we are activating a
5919 * pristine spare. imsm_process_update() will create a
5920 * new index in this case. Once a disk is found to be
5921 * failed in all member arrays it is kicked from the
5922 * metadata
5923 */
5924 di->disk.number = dl->index;
5925
5926 /* (ab)use di->devs to store a pointer to the device
5927 * we chose
5928 */
5929 di->devs = (struct mdinfo *) dl;
5930
5931 di->disk.raid_disk = i;
5932 di->disk.major = dl->major;
5933 di->disk.minor = dl->minor;
5934 di->disk.state = 0;
5935 di->recovery_start = 0;
5936 di->data_offset = __le32_to_cpu(map->pba_of_lba0);
5937 di->component_size = a->info.component_size;
5938 di->container_member = inst;
5939 super->random = random32();
5940 di->next = rv;
5941 rv = di;
5942 num_spares++;
5943 dprintf("%x:%x to be %d at %llu\n", dl->major, dl->minor,
5944 i, di->data_offset);
5945
5946 break;
5947 }
5948
5949 if (!rv)
5950 /* No spares found */
5951 return rv;
5952 /* Now 'rv' has a list of devices to return.
5953 * Create a metadata_update record to update the
5954 * disk_ord_tbl for the array
5955 */
5956 mu = malloc(sizeof(*mu));
5957 if (mu) {
5958 mu->buf = malloc(sizeof(struct imsm_update_activate_spare) * num_spares);
5959 if (mu->buf == NULL) {
5960 free(mu);
5961 mu = NULL;
5962 }
5963 }
5964 if (!mu) {
5965 while (rv) {
5966 struct mdinfo *n = rv->next;
5967
5968 free(rv);
5969 rv = n;
5970 }
5971 return NULL;
5972 }
5973
5974 mu->space = NULL;
5975 mu->space_list = NULL;
5976 mu->len = sizeof(struct imsm_update_activate_spare) * num_spares;
5977 mu->next = *updates;
5978 u = (struct imsm_update_activate_spare *) mu->buf;
5979
5980 for (di = rv ; di ; di = di->next) {
5981 u->type = update_activate_spare;
5982 u->dl = (struct dl *) di->devs;
5983 di->devs = NULL;
5984 u->slot = di->disk.raid_disk;
5985 u->array = inst;
5986 u->next = u + 1;
5987 u++;
5988 }
5989 (u-1)->next = NULL;
5990 *updates = mu;
5991
5992 return rv;
5993 }
5994
5995 static int disks_overlap(struct intel_super *super, int idx, struct imsm_update_create_array *u)
5996 {
5997 struct imsm_dev *dev = get_imsm_dev(super, idx);
5998 struct imsm_map *map = get_imsm_map(dev, 0);
5999 struct imsm_map *new_map = get_imsm_map(&u->dev, 0);
6000 struct disk_info *inf = get_disk_info(u);
6001 struct imsm_disk *disk;
6002 int i;
6003 int j;
6004
6005 for (i = 0; i < map->num_members; i++) {
6006 disk = get_imsm_disk(super, get_imsm_disk_idx(dev, i, -1));
6007 for (j = 0; j < new_map->num_members; j++)
6008 if (serialcmp(disk->serial, inf[j].serial) == 0)
6009 return 1;
6010 }
6011
6012 return 0;
6013 }
6014
6015
6016 static struct dl *get_disk_super(struct intel_super *super, int major, int minor)
6017 {
6018 struct dl *dl = NULL;
6019 for (dl = super->disks; dl; dl = dl->next)
6020 if ((dl->major == major) && (dl->minor == minor))
6021 return dl;
6022 return NULL;
6023 }
6024
6025 static int remove_disk_super(struct intel_super *super, int major, int minor)
6026 {
6027 struct dl *prev = NULL;
6028 struct dl *dl;
6029
6030 prev = NULL;
6031 for (dl = super->disks; dl; dl = dl->next) {
6032 if ((dl->major == major) && (dl->minor == minor)) {
6033 /* remove */
6034 if (prev)
6035 prev->next = dl->next;
6036 else
6037 super->disks = dl->next;
6038 dl->next = NULL;
6039 __free_imsm_disk(dl);
6040 dprintf("%s: removed %x:%x\n",
6041 __func__, major, minor);
6042 break;
6043 }
6044 prev = dl;
6045 }
6046 return 0;
6047 }
6048
6049 static void imsm_delete(struct intel_super *super, struct dl **dlp, unsigned index);
6050
6051 static int add_remove_disk_update(struct intel_super *super)
6052 {
6053 int check_degraded = 0;
6054 struct dl *disk = NULL;
6055 /* add/remove some spares to/from the metadata/contrainer */
6056 while (super->disk_mgmt_list) {
6057 struct dl *disk_cfg;
6058
6059 disk_cfg = super->disk_mgmt_list;
6060 super->disk_mgmt_list = disk_cfg->next;
6061 disk_cfg->next = NULL;
6062
6063 if (disk_cfg->action == DISK_ADD) {
6064 disk_cfg->next = super->disks;
6065 super->disks = disk_cfg;
6066 check_degraded = 1;
6067 dprintf("%s: added %x:%x\n",
6068 __func__, disk_cfg->major,
6069 disk_cfg->minor);
6070 } else if (disk_cfg->action == DISK_REMOVE) {
6071 dprintf("Disk remove action processed: %x.%x\n",
6072 disk_cfg->major, disk_cfg->minor);
6073 disk = get_disk_super(super,
6074 disk_cfg->major,
6075 disk_cfg->minor);
6076 if (disk) {
6077 /* store action status */
6078 disk->action = DISK_REMOVE;
6079 /* remove spare disks only */
6080 if (disk->index == -1) {
6081 remove_disk_super(super,
6082 disk_cfg->major,
6083 disk_cfg->minor);
6084 }
6085 }
6086 /* release allocate disk structure */
6087 __free_imsm_disk(disk_cfg);
6088 }
6089 }
6090 return check_degraded;
6091 }
6092
6093
6094 static int apply_reshape_migration_update(struct imsm_update_reshape_migration *u,
6095 struct intel_super *super,
6096 void ***space_list)
6097 {
6098 struct intel_dev *id;
6099 void **tofree = NULL;
6100 int ret_val = 0;
6101
6102 dprintf("apply_reshape_migration_update()\n");
6103 if ((u->subdev < 0) ||
6104 (u->subdev > 1)) {
6105 dprintf("imsm: Error: Wrong subdev: %i\n", u->subdev);
6106 return ret_val;
6107 }
6108 if ((space_list == NULL) || (*space_list == NULL)) {
6109 dprintf("imsm: Error: Memory is not allocated\n");
6110 return ret_val;
6111 }
6112
6113 for (id = super->devlist ; id; id = id->next) {
6114 if (id->index == (unsigned)u->subdev) {
6115 struct imsm_dev *dev = get_imsm_dev(super, u->subdev);
6116 struct imsm_map *map;
6117 struct imsm_dev *new_dev =
6118 (struct imsm_dev *)*space_list;
6119 struct imsm_map *migr_map = get_imsm_map(dev, 1);
6120 int to_state;
6121 struct dl *new_disk;
6122
6123 if (new_dev == NULL)
6124 return ret_val;
6125 *space_list = **space_list;
6126 memcpy(new_dev, dev, sizeof_imsm_dev(dev, 0));
6127 map = get_imsm_map(new_dev, 0);
6128 if (migr_map) {
6129 dprintf("imsm: Error: migration in progress");
6130 return ret_val;
6131 }
6132
6133 to_state = map->map_state;
6134 if ((u->new_level == 5) && (map->raid_level == 0)) {
6135 map->num_members++;
6136 /* this should not happen */
6137 if (u->new_disks[0] < 0) {
6138 map->failed_disk_num =
6139 map->num_members - 1;
6140 to_state = IMSM_T_STATE_DEGRADED;
6141 } else
6142 to_state = IMSM_T_STATE_NORMAL;
6143 }
6144 migrate(new_dev, to_state, MIGR_GEN_MIGR);
6145 if (u->new_level > -1)
6146 map->raid_level = u->new_level;
6147 migr_map = get_imsm_map(new_dev, 1);
6148 if ((u->new_level == 5) &&
6149 (migr_map->raid_level == 0)) {
6150 int ord = map->num_members - 1;
6151 migr_map->num_members--;
6152 if (u->new_disks[0] < 0)
6153 ord |= IMSM_ORD_REBUILD;
6154 set_imsm_ord_tbl_ent(map,
6155 map->num_members - 1,
6156 ord);
6157 }
6158 id->dev = new_dev;
6159 tofree = (void **)dev;
6160
6161 /* update chunk size
6162 */
6163 if (u->new_chunksize > 0)
6164 map->blocks_per_strip =
6165 __cpu_to_le16(u->new_chunksize * 2);
6166
6167 /* add disk
6168 */
6169 if ((u->new_level != 5) ||
6170 (migr_map->raid_level != 0) ||
6171 (migr_map->raid_level == map->raid_level))
6172 goto skip_disk_add;
6173
6174 if (u->new_disks[0] >= 0) {
6175 /* use passes spare
6176 */
6177 new_disk = get_disk_super(super,
6178 major(u->new_disks[0]),
6179 minor(u->new_disks[0]));
6180 dprintf("imsm: new disk for reshape is: %i:%i "
6181 "(%p, index = %i)\n",
6182 major(u->new_disks[0]),
6183 minor(u->new_disks[0]),
6184 new_disk, new_disk->index);
6185 if (new_disk == NULL)
6186 goto error_disk_add;
6187
6188 new_disk->index = map->num_members - 1;
6189 /* slot to fill in autolayout
6190 */
6191 new_disk->raiddisk = new_disk->index;
6192 new_disk->disk.status |= CONFIGURED_DISK;
6193 new_disk->disk.status &= ~SPARE_DISK;
6194 } else
6195 goto error_disk_add;
6196
6197 skip_disk_add:
6198 *tofree = *space_list;
6199 /* calculate new size
6200 */
6201 imsm_set_array_size(new_dev);
6202
6203 ret_val = 1;
6204 }
6205 }
6206
6207 if (tofree)
6208 *space_list = tofree;
6209 return ret_val;
6210
6211 error_disk_add:
6212 dprintf("Error: imsm: Cannot find disk.\n");
6213 return ret_val;
6214 }
6215
6216
6217 static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
6218 struct intel_super *super,
6219 void ***space_list)
6220 {
6221 struct dl *new_disk;
6222 struct intel_dev *id;
6223 int i;
6224 int delta_disks = u->new_raid_disks - u->old_raid_disks;
6225 int disk_count = u->old_raid_disks;
6226 void **tofree = NULL;
6227 int devices_to_reshape = 1;
6228 struct imsm_super *mpb = super->anchor;
6229 int ret_val = 0;
6230 unsigned int dev_id;
6231
6232 dprintf("imsm: apply_reshape_container_disks_update()\n");
6233
6234 /* enable spares to use in array */
6235 for (i = 0; i < delta_disks; i++) {
6236 new_disk = get_disk_super(super,
6237 major(u->new_disks[i]),
6238 minor(u->new_disks[i]));
6239 dprintf("imsm: new disk for reshape is: %i:%i "
6240 "(%p, index = %i)\n",
6241 major(u->new_disks[i]), minor(u->new_disks[i]),
6242 new_disk, new_disk->index);
6243 if ((new_disk == NULL) ||
6244 ((new_disk->index >= 0) &&
6245 (new_disk->index < u->old_raid_disks)))
6246 goto update_reshape_exit;
6247 new_disk->index = disk_count++;
6248 /* slot to fill in autolayout
6249 */
6250 new_disk->raiddisk = new_disk->index;
6251 new_disk->disk.status |=
6252 CONFIGURED_DISK;
6253 new_disk->disk.status &= ~SPARE_DISK;
6254 }
6255
6256 dprintf("imsm: volume set mpb->num_raid_devs = %i\n",
6257 mpb->num_raid_devs);
6258 /* manage changes in volume
6259 */
6260 for (dev_id = 0; dev_id < mpb->num_raid_devs; dev_id++) {
6261 void **sp = *space_list;
6262 struct imsm_dev *newdev;
6263 struct imsm_map *newmap, *oldmap;
6264
6265 for (id = super->devlist ; id; id = id->next) {
6266 if (id->index == dev_id)
6267 break;
6268 }
6269 if (id == NULL)
6270 break;
6271 if (!sp)
6272 continue;
6273 *space_list = *sp;
6274 newdev = (void*)sp;
6275 /* Copy the dev, but not (all of) the map */
6276 memcpy(newdev, id->dev, sizeof(*newdev));
6277 oldmap = get_imsm_map(id->dev, 0);
6278 newmap = get_imsm_map(newdev, 0);
6279 /* Copy the current map */
6280 memcpy(newmap, oldmap, sizeof_imsm_map(oldmap));
6281 /* update one device only
6282 */
6283 if (devices_to_reshape) {
6284 dprintf("imsm: modifying subdev: %i\n",
6285 id->index);
6286 devices_to_reshape--;
6287 newdev->vol.migr_state = 1;
6288 newdev->vol.curr_migr_unit = 0;
6289 newdev->vol.migr_type = MIGR_GEN_MIGR;
6290 newmap->num_members = u->new_raid_disks;
6291 for (i = 0; i < delta_disks; i++) {
6292 set_imsm_ord_tbl_ent(newmap,
6293 u->old_raid_disks + i,
6294 u->old_raid_disks + i);
6295 }
6296 /* New map is correct, now need to save old map
6297 */
6298 newmap = get_imsm_map(newdev, 1);
6299 memcpy(newmap, oldmap, sizeof_imsm_map(oldmap));
6300
6301 imsm_set_array_size(newdev);
6302 }
6303
6304 sp = (void **)id->dev;
6305 id->dev = newdev;
6306 *sp = tofree;
6307 tofree = sp;
6308 }
6309 if (tofree)
6310 *space_list = tofree;
6311 ret_val = 1;
6312
6313 update_reshape_exit:
6314
6315 return ret_val;
6316 }
6317
6318 static int apply_takeover_update(struct imsm_update_takeover *u,
6319 struct intel_super *super,
6320 void ***space_list)
6321 {
6322 struct imsm_dev *dev = NULL;
6323 struct intel_dev *dv;
6324 struct imsm_dev *dev_new;
6325 struct imsm_map *map;
6326 struct dl *dm, *du;
6327 int i;
6328
6329 for (dv = super->devlist; dv; dv = dv->next)
6330 if (dv->index == (unsigned int)u->subarray) {
6331 dev = dv->dev;
6332 break;
6333 }
6334
6335 if (dev == NULL)
6336 return 0;
6337
6338 map = get_imsm_map(dev, 0);
6339
6340 if (u->direction == R10_TO_R0) {
6341 /* Number of failed disks must be half of initial disk number */
6342 if (imsm_count_failed(super, dev) != (map->num_members / 2))
6343 return 0;
6344
6345 /* iterate through devices to mark removed disks as spare */
6346 for (dm = super->disks; dm; dm = dm->next) {
6347 if (dm->disk.status & FAILED_DISK) {
6348 int idx = dm->index;
6349 /* update indexes on the disk list */
6350 /* FIXME this loop-with-the-loop looks wrong, I'm not convinced
6351 the index values will end up being correct.... NB */
6352 for (du = super->disks; du; du = du->next)
6353 if (du->index > idx)
6354 du->index--;
6355 /* mark as spare disk */
6356 dm->disk.status = SPARE_DISK;
6357 dm->index = -1;
6358 }
6359 }
6360 /* update map */
6361 map->num_members = map->num_members / 2;
6362 map->map_state = IMSM_T_STATE_NORMAL;
6363 map->num_domains = 1;
6364 map->raid_level = 0;
6365 map->failed_disk_num = -1;
6366 }
6367
6368 if (u->direction == R0_TO_R10) {
6369 void **space;
6370 /* update slots in current disk list */
6371 for (dm = super->disks; dm; dm = dm->next) {
6372 if (dm->index >= 0)
6373 dm->index *= 2;
6374 }
6375 /* create new *missing* disks */
6376 for (i = 0; i < map->num_members; i++) {
6377 space = *space_list;
6378 if (!space)
6379 continue;
6380 *space_list = *space;
6381 du = (void *)space;
6382 memcpy(du, super->disks, sizeof(*du));
6383 du->fd = -1;
6384 du->minor = 0;
6385 du->major = 0;
6386 du->index = (i * 2) + 1;
6387 sprintf((char *)du->disk.serial,
6388 " MISSING_%d", du->index);
6389 sprintf((char *)du->serial,
6390 "MISSING_%d", du->index);
6391 du->next = super->missing;
6392 super->missing = du;
6393 }
6394 /* create new dev and map */
6395 space = *space_list;
6396 if (!space)
6397 return 0;
6398 *space_list = *space;
6399 dev_new = (void *)space;
6400 memcpy(dev_new, dev, sizeof(*dev));
6401 /* update new map */
6402 map = get_imsm_map(dev_new, 0);
6403 map->num_members = map->num_members * 2;
6404 map->map_state = IMSM_T_STATE_DEGRADED;
6405 map->num_domains = 2;
6406 map->raid_level = 1;
6407 /* replace dev<->dev_new */
6408 dv->dev = dev_new;
6409 }
6410 /* update disk order table */
6411 for (du = super->disks; du; du = du->next)
6412 if (du->index >= 0)
6413 set_imsm_ord_tbl_ent(map, du->index, du->index);
6414 for (du = super->missing; du; du = du->next)
6415 if (du->index >= 0) {
6416 set_imsm_ord_tbl_ent(map, du->index, du->index);
6417 mark_missing(dev_new, &du->disk, du->index);
6418 }
6419
6420 return 1;
6421 }
6422
6423 static void imsm_process_update(struct supertype *st,
6424 struct metadata_update *update)
6425 {
6426 /**
6427 * crack open the metadata_update envelope to find the update record
6428 * update can be one of:
6429 * update_reshape_container_disks - all the arrays in the container
6430 * are being reshaped to have more devices. We need to mark
6431 * the arrays for general migration and convert selected spares
6432 * into active devices.
6433 * update_activate_spare - a spare device has replaced a failed
6434 * device in an array, update the disk_ord_tbl. If this disk is
6435 * present in all member arrays then also clear the SPARE_DISK
6436 * flag
6437 * update_create_array
6438 * update_kill_array
6439 * update_rename_array
6440 * update_add_remove_disk
6441 */
6442 struct intel_super *super = st->sb;
6443 struct imsm_super *mpb;
6444 enum imsm_update_type type = *(enum imsm_update_type *) update->buf;
6445
6446 /* update requires a larger buf but the allocation failed */
6447 if (super->next_len && !super->next_buf) {
6448 super->next_len = 0;
6449 return;
6450 }
6451
6452 if (super->next_buf) {
6453 memcpy(super->next_buf, super->buf, super->len);
6454 free(super->buf);
6455 super->len = super->next_len;
6456 super->buf = super->next_buf;
6457
6458 super->next_len = 0;
6459 super->next_buf = NULL;
6460 }
6461
6462 mpb = super->anchor;
6463
6464 switch (type) {
6465 case update_takeover: {
6466 struct imsm_update_takeover *u = (void *)update->buf;
6467 if (apply_takeover_update(u, super, &update->space_list)) {
6468 imsm_update_version_info(super);
6469 super->updates_pending++;
6470 }
6471 break;
6472 }
6473
6474 case update_reshape_container_disks: {
6475 struct imsm_update_reshape *u = (void *)update->buf;
6476 if (apply_reshape_container_disks_update(
6477 u, super, &update->space_list))
6478 super->updates_pending++;
6479 break;
6480 }
6481 case update_reshape_migration: {
6482 struct imsm_update_reshape_migration *u = (void *)update->buf;
6483 if (apply_reshape_migration_update(
6484 u, super, &update->space_list))
6485 super->updates_pending++;
6486 break;
6487 }
6488 case update_activate_spare: {
6489 struct imsm_update_activate_spare *u = (void *) update->buf;
6490 struct imsm_dev *dev = get_imsm_dev(super, u->array);
6491 struct imsm_map *map = get_imsm_map(dev, 0);
6492 struct imsm_map *migr_map;
6493 struct active_array *a;
6494 struct imsm_disk *disk;
6495 __u8 to_state;
6496 struct dl *dl;
6497 unsigned int found;
6498 int failed;
6499 int victim = get_imsm_disk_idx(dev, u->slot, -1);
6500 int i;
6501
6502 for (dl = super->disks; dl; dl = dl->next)
6503 if (dl == u->dl)
6504 break;
6505
6506 if (!dl) {
6507 fprintf(stderr, "error: imsm_activate_spare passed "
6508 "an unknown disk (index: %d)\n",
6509 u->dl->index);
6510 return;
6511 }
6512
6513 super->updates_pending++;
6514 /* count failures (excluding rebuilds and the victim)
6515 * to determine map[0] state
6516 */
6517 failed = 0;
6518 for (i = 0; i < map->num_members; i++) {
6519 if (i == u->slot)
6520 continue;
6521 disk = get_imsm_disk(super,
6522 get_imsm_disk_idx(dev, i, -1));
6523 if (!disk || is_failed(disk))
6524 failed++;
6525 }
6526
6527 /* adding a pristine spare, assign a new index */
6528 if (dl->index < 0) {
6529 dl->index = super->anchor->num_disks;
6530 super->anchor->num_disks++;
6531 }
6532 disk = &dl->disk;
6533 disk->status |= CONFIGURED_DISK;
6534 disk->status &= ~SPARE_DISK;
6535
6536 /* mark rebuild */
6537 to_state = imsm_check_degraded(super, dev, failed);
6538 map->map_state = IMSM_T_STATE_DEGRADED;
6539 migrate(dev, to_state, MIGR_REBUILD);
6540 migr_map = get_imsm_map(dev, 1);
6541 set_imsm_ord_tbl_ent(map, u->slot, dl->index);
6542 set_imsm_ord_tbl_ent(migr_map, u->slot, dl->index | IMSM_ORD_REBUILD);
6543
6544 /* update the family_num to mark a new container
6545 * generation, being careful to record the existing
6546 * family_num in orig_family_num to clean up after
6547 * earlier mdadm versions that neglected to set it.
6548 */
6549 if (mpb->orig_family_num == 0)
6550 mpb->orig_family_num = mpb->family_num;
6551 mpb->family_num += super->random;
6552
6553 /* count arrays using the victim in the metadata */
6554 found = 0;
6555 for (a = st->arrays; a ; a = a->next) {
6556 dev = get_imsm_dev(super, a->info.container_member);
6557 map = get_imsm_map(dev, 0);
6558
6559 if (get_imsm_disk_slot(map, victim) >= 0)
6560 found++;
6561 }
6562
6563 /* delete the victim if it is no longer being
6564 * utilized anywhere
6565 */
6566 if (!found) {
6567 struct dl **dlp;
6568
6569 /* We know that 'manager' isn't touching anything,
6570 * so it is safe to delete
6571 */
6572 for (dlp = &super->disks; *dlp; dlp = &(*dlp)->next)
6573 if ((*dlp)->index == victim)
6574 break;
6575
6576 /* victim may be on the missing list */
6577 if (!*dlp)
6578 for (dlp = &super->missing; *dlp; dlp = &(*dlp)->next)
6579 if ((*dlp)->index == victim)
6580 break;
6581 imsm_delete(super, dlp, victim);
6582 }
6583 break;
6584 }
6585 case update_create_array: {
6586 /* someone wants to create a new array, we need to be aware of
6587 * a few races/collisions:
6588 * 1/ 'Create' called by two separate instances of mdadm
6589 * 2/ 'Create' versus 'activate_spare': mdadm has chosen
6590 * devices that have since been assimilated via
6591 * activate_spare.
6592 * In the event this update can not be carried out mdadm will
6593 * (FIX ME) notice that its update did not take hold.
6594 */
6595 struct imsm_update_create_array *u = (void *) update->buf;
6596 struct intel_dev *dv;
6597 struct imsm_dev *dev;
6598 struct imsm_map *map, *new_map;
6599 unsigned long long start, end;
6600 unsigned long long new_start, new_end;
6601 int i;
6602 struct disk_info *inf;
6603 struct dl *dl;
6604
6605 /* handle racing creates: first come first serve */
6606 if (u->dev_idx < mpb->num_raid_devs) {
6607 dprintf("%s: subarray %d already defined\n",
6608 __func__, u->dev_idx);
6609 goto create_error;
6610 }
6611
6612 /* check update is next in sequence */
6613 if (u->dev_idx != mpb->num_raid_devs) {
6614 dprintf("%s: can not create array %d expected index %d\n",
6615 __func__, u->dev_idx, mpb->num_raid_devs);
6616 goto create_error;
6617 }
6618
6619 new_map = get_imsm_map(&u->dev, 0);
6620 new_start = __le32_to_cpu(new_map->pba_of_lba0);
6621 new_end = new_start + __le32_to_cpu(new_map->blocks_per_member);
6622 inf = get_disk_info(u);
6623
6624 /* handle activate_spare versus create race:
6625 * check to make sure that overlapping arrays do not include
6626 * overalpping disks
6627 */
6628 for (i = 0; i < mpb->num_raid_devs; i++) {
6629 dev = get_imsm_dev(super, i);
6630 map = get_imsm_map(dev, 0);
6631 start = __le32_to_cpu(map->pba_of_lba0);
6632 end = start + __le32_to_cpu(map->blocks_per_member);
6633 if ((new_start >= start && new_start <= end) ||
6634 (start >= new_start && start <= new_end))
6635 /* overlap */;
6636 else
6637 continue;
6638
6639 if (disks_overlap(super, i, u)) {
6640 dprintf("%s: arrays overlap\n", __func__);
6641 goto create_error;
6642 }
6643 }
6644
6645 /* check that prepare update was successful */
6646 if (!update->space) {
6647 dprintf("%s: prepare update failed\n", __func__);
6648 goto create_error;
6649 }
6650
6651 /* check that all disks are still active before committing
6652 * changes. FIXME: could we instead handle this by creating a
6653 * degraded array? That's probably not what the user expects,
6654 * so better to drop this update on the floor.
6655 */
6656 for (i = 0; i < new_map->num_members; i++) {
6657 dl = serial_to_dl(inf[i].serial, super);
6658 if (!dl) {
6659 dprintf("%s: disk disappeared\n", __func__);
6660 goto create_error;
6661 }
6662 }
6663
6664 super->updates_pending++;
6665
6666 /* convert spares to members and fixup ord_tbl */
6667 for (i = 0; i < new_map->num_members; i++) {
6668 dl = serial_to_dl(inf[i].serial, super);
6669 if (dl->index == -1) {
6670 dl->index = mpb->num_disks;
6671 mpb->num_disks++;
6672 dl->disk.status |= CONFIGURED_DISK;
6673 dl->disk.status &= ~SPARE_DISK;
6674 }
6675 set_imsm_ord_tbl_ent(new_map, i, dl->index);
6676 }
6677
6678 dv = update->space;
6679 dev = dv->dev;
6680 update->space = NULL;
6681 imsm_copy_dev(dev, &u->dev);
6682 dv->index = u->dev_idx;
6683 dv->next = super->devlist;
6684 super->devlist = dv;
6685 mpb->num_raid_devs++;
6686
6687 imsm_update_version_info(super);
6688 break;
6689 create_error:
6690 /* mdmon knows how to release update->space, but not
6691 * ((struct intel_dev *) update->space)->dev
6692 */
6693 if (update->space) {
6694 dv = update->space;
6695 free(dv->dev);
6696 }
6697 break;
6698 }
6699 case update_kill_array: {
6700 struct imsm_update_kill_array *u = (void *) update->buf;
6701 int victim = u->dev_idx;
6702 struct active_array *a;
6703 struct intel_dev **dp;
6704 struct imsm_dev *dev;
6705
6706 /* sanity check that we are not affecting the uuid of
6707 * active arrays, or deleting an active array
6708 *
6709 * FIXME when immutable ids are available, but note that
6710 * we'll also need to fixup the invalidated/active
6711 * subarray indexes in mdstat
6712 */
6713 for (a = st->arrays; a; a = a->next)
6714 if (a->info.container_member >= victim)
6715 break;
6716 /* by definition if mdmon is running at least one array
6717 * is active in the container, so checking
6718 * mpb->num_raid_devs is just extra paranoia
6719 */
6720 dev = get_imsm_dev(super, victim);
6721 if (a || !dev || mpb->num_raid_devs == 1) {
6722 dprintf("failed to delete subarray-%d\n", victim);
6723 break;
6724 }
6725
6726 for (dp = &super->devlist; *dp;)
6727 if ((*dp)->index == (unsigned)super->current_vol) {
6728 *dp = (*dp)->next;
6729 } else {
6730 if ((*dp)->index > (unsigned)victim)
6731 (*dp)->index--;
6732 dp = &(*dp)->next;
6733 }
6734 mpb->num_raid_devs--;
6735 super->updates_pending++;
6736 break;
6737 }
6738 case update_rename_array: {
6739 struct imsm_update_rename_array *u = (void *) update->buf;
6740 char name[MAX_RAID_SERIAL_LEN+1];
6741 int target = u->dev_idx;
6742 struct active_array *a;
6743 struct imsm_dev *dev;
6744
6745 /* sanity check that we are not affecting the uuid of
6746 * an active array
6747 */
6748 snprintf(name, MAX_RAID_SERIAL_LEN, "%s", (char *) u->name);
6749 name[MAX_RAID_SERIAL_LEN] = '\0';
6750 for (a = st->arrays; a; a = a->next)
6751 if (a->info.container_member == target)
6752 break;
6753 dev = get_imsm_dev(super, u->dev_idx);
6754 if (a || !dev || !check_name(super, name, 1)) {
6755 dprintf("failed to rename subarray-%d\n", target);
6756 break;
6757 }
6758
6759 snprintf((char *) dev->volume, MAX_RAID_SERIAL_LEN, "%s", name);
6760 super->updates_pending++;
6761 break;
6762 }
6763 case update_add_remove_disk: {
6764 /* we may be able to repair some arrays if disks are
6765 * being added, check teh status of add_remove_disk
6766 * if discs has been added.
6767 */
6768 if (add_remove_disk_update(super)) {
6769 struct active_array *a;
6770
6771 super->updates_pending++;
6772 for (a = st->arrays; a; a = a->next)
6773 a->check_degraded = 1;
6774 }
6775 break;
6776 }
6777 default:
6778 fprintf(stderr, "error: unsuported process update type:"
6779 "(type: %d)\n", type);
6780 }
6781 }
6782
6783 static struct mdinfo *get_spares_for_grow(struct supertype *st);
6784
6785 static void imsm_prepare_update(struct supertype *st,
6786 struct metadata_update *update)
6787 {
6788 /**
6789 * Allocate space to hold new disk entries, raid-device entries or a new
6790 * mpb if necessary. The manager synchronously waits for updates to
6791 * complete in the monitor, so new mpb buffers allocated here can be
6792 * integrated by the monitor thread without worrying about live pointers
6793 * in the manager thread.
6794 */
6795 enum imsm_update_type type = *(enum imsm_update_type *) update->buf;
6796 struct intel_super *super = st->sb;
6797 struct imsm_super *mpb = super->anchor;
6798 size_t buf_len;
6799 size_t len = 0;
6800
6801 switch (type) {
6802 case update_takeover: {
6803 struct imsm_update_takeover *u = (void *)update->buf;
6804 if (u->direction == R0_TO_R10) {
6805 void **tail = (void **)&update->space_list;
6806 struct imsm_dev *dev = get_imsm_dev(super, u->subarray);
6807 struct imsm_map *map = get_imsm_map(dev, 0);
6808 int num_members = map->num_members;
6809 void *space;
6810 int size, i;
6811 int err = 0;
6812 /* allocate memory for added disks */
6813 for (i = 0; i < num_members; i++) {
6814 size = sizeof(struct dl);
6815 space = malloc(size);
6816 if (!space) {
6817 err++;
6818 break;
6819 }
6820 *tail = space;
6821 tail = space;
6822 *tail = NULL;
6823 }
6824 /* allocate memory for new device */
6825 size = sizeof_imsm_dev(super->devlist->dev, 0) +
6826 (num_members * sizeof(__u32));
6827 space = malloc(size);
6828 if (!space)
6829 err++;
6830 else {
6831 *tail = space;
6832 tail = space;
6833 *tail = NULL;
6834 }
6835 if (!err) {
6836 len = disks_to_mpb_size(num_members * 2);
6837 } else {
6838 /* if allocation didn't success, free buffer */
6839 while (update->space_list) {
6840 void **sp = update->space_list;
6841 update->space_list = *sp;
6842 free(sp);
6843 }
6844 }
6845 }
6846
6847 break;
6848 }
6849 case update_reshape_container_disks: {
6850 /* Every raid device in the container is about to
6851 * gain some more devices, and we will enter a
6852 * reconfiguration.
6853 * So each 'imsm_map' will be bigger, and the imsm_vol
6854 * will now hold 2 of them.
6855 * Thus we need new 'struct imsm_dev' allocations sized
6856 * as sizeof_imsm_dev but with more devices in both maps.
6857 */
6858 struct imsm_update_reshape *u = (void *)update->buf;
6859 struct intel_dev *dl;
6860 void **space_tail = (void**)&update->space_list;
6861
6862 dprintf("imsm: imsm_prepare_update() for update_reshape\n");
6863
6864 for (dl = super->devlist; dl; dl = dl->next) {
6865 int size = sizeof_imsm_dev(dl->dev, 1);
6866 void *s;
6867 if (u->new_raid_disks > u->old_raid_disks)
6868 size += sizeof(__u32)*2*
6869 (u->new_raid_disks - u->old_raid_disks);
6870 s = malloc(size);
6871 if (!s)
6872 break;
6873 *space_tail = s;
6874 space_tail = s;
6875 *space_tail = NULL;
6876 }
6877
6878 len = disks_to_mpb_size(u->new_raid_disks);
6879 dprintf("New anchor length is %llu\n", (unsigned long long)len);
6880 break;
6881 }
6882 case update_reshape_migration: {
6883 /* for migration level 0->5 we need to add disks
6884 * so the same as for container operation we will copy
6885 * device to the bigger location.
6886 * in memory prepared device and new disk area are prepared
6887 * for usage in process update
6888 */
6889 struct imsm_update_reshape_migration *u = (void *)update->buf;
6890 struct intel_dev *id;
6891 void **space_tail = (void **)&update->space_list;
6892 int size;
6893 void *s;
6894 int current_level = -1;
6895
6896 dprintf("imsm: imsm_prepare_update() for update_reshape\n");
6897
6898 /* add space for bigger array in update
6899 */
6900 for (id = super->devlist; id; id = id->next) {
6901 if (id->index == (unsigned)u->subdev) {
6902 size = sizeof_imsm_dev(id->dev, 1);
6903 if (u->new_raid_disks > u->old_raid_disks)
6904 size += sizeof(__u32)*2*
6905 (u->new_raid_disks - u->old_raid_disks);
6906 s = malloc(size);
6907 if (!s)
6908 break;
6909 *space_tail = s;
6910 space_tail = s;
6911 *space_tail = NULL;
6912 break;
6913 }
6914 }
6915 if (update->space_list == NULL)
6916 break;
6917
6918 /* add space for disk in update
6919 */
6920 size = sizeof(struct dl);
6921 s = malloc(size);
6922 if (!s) {
6923 free(update->space_list);
6924 update->space_list = NULL;
6925 break;
6926 }
6927 *space_tail = s;
6928 space_tail = s;
6929 *space_tail = NULL;
6930
6931 /* add spare device to update
6932 */
6933 for (id = super->devlist ; id; id = id->next)
6934 if (id->index == (unsigned)u->subdev) {
6935 struct imsm_dev *dev;
6936 struct imsm_map *map;
6937
6938 dev = get_imsm_dev(super, u->subdev);
6939 map = get_imsm_map(dev, 0);
6940 current_level = map->raid_level;
6941 break;
6942 }
6943 if ((u->new_level == 5) && (u->new_level != current_level)) {
6944 struct mdinfo *spares;
6945
6946 spares = get_spares_for_grow(st);
6947 if (spares) {
6948 struct dl *dl;
6949 struct mdinfo *dev;
6950
6951 dev = spares->devs;
6952 if (dev) {
6953 u->new_disks[0] =
6954 makedev(dev->disk.major,
6955 dev->disk.minor);
6956 dl = get_disk_super(super,
6957 dev->disk.major,
6958 dev->disk.minor);
6959 dl->index = u->old_raid_disks;
6960 dev = dev->next;
6961 }
6962 sysfs_free(spares);
6963 }
6964 }
6965 len = disks_to_mpb_size(u->new_raid_disks);
6966 dprintf("New anchor length is %llu\n", (unsigned long long)len);
6967 break;
6968 }
6969 case update_create_array: {
6970 struct imsm_update_create_array *u = (void *) update->buf;
6971 struct intel_dev *dv;
6972 struct imsm_dev *dev = &u->dev;
6973 struct imsm_map *map = get_imsm_map(dev, 0);
6974 struct dl *dl;
6975 struct disk_info *inf;
6976 int i;
6977 int activate = 0;
6978
6979 inf = get_disk_info(u);
6980 len = sizeof_imsm_dev(dev, 1);
6981 /* allocate a new super->devlist entry */
6982 dv = malloc(sizeof(*dv));
6983 if (dv) {
6984 dv->dev = malloc(len);
6985 if (dv->dev)
6986 update->space = dv;
6987 else {
6988 free(dv);
6989 update->space = NULL;
6990 }
6991 }
6992
6993 /* count how many spares will be converted to members */
6994 for (i = 0; i < map->num_members; i++) {
6995 dl = serial_to_dl(inf[i].serial, super);
6996 if (!dl) {
6997 /* hmm maybe it failed?, nothing we can do about
6998 * it here
6999 */
7000 continue;
7001 }
7002 if (count_memberships(dl, super) == 0)
7003 activate++;
7004 }
7005 len += activate * sizeof(struct imsm_disk);
7006 break;
7007 default:
7008 break;
7009 }
7010 }
7011
7012 /* check if we need a larger metadata buffer */
7013 if (super->next_buf)
7014 buf_len = super->next_len;
7015 else
7016 buf_len = super->len;
7017
7018 if (__le32_to_cpu(mpb->mpb_size) + len > buf_len) {
7019 /* ok we need a larger buf than what is currently allocated
7020 * if this allocation fails process_update will notice that
7021 * ->next_len is set and ->next_buf is NULL
7022 */
7023 buf_len = ROUND_UP(__le32_to_cpu(mpb->mpb_size) + len, 512);
7024 if (super->next_buf)
7025 free(super->next_buf);
7026
7027 super->next_len = buf_len;
7028 if (posix_memalign(&super->next_buf, 512, buf_len) == 0)
7029 memset(super->next_buf, 0, buf_len);
7030 else
7031 super->next_buf = NULL;
7032 }
7033 }
7034
7035 /* must be called while manager is quiesced */
7036 static void imsm_delete(struct intel_super *super, struct dl **dlp, unsigned index)
7037 {
7038 struct imsm_super *mpb = super->anchor;
7039 struct dl *iter;
7040 struct imsm_dev *dev;
7041 struct imsm_map *map;
7042 int i, j, num_members;
7043 __u32 ord;
7044
7045 dprintf("%s: deleting device[%d] from imsm_super\n",
7046 __func__, index);
7047
7048 /* shift all indexes down one */
7049 for (iter = super->disks; iter; iter = iter->next)
7050 if (iter->index > (int)index)
7051 iter->index--;
7052 for (iter = super->missing; iter; iter = iter->next)
7053 if (iter->index > (int)index)
7054 iter->index--;
7055
7056 for (i = 0; i < mpb->num_raid_devs; i++) {
7057 dev = get_imsm_dev(super, i);
7058 map = get_imsm_map(dev, 0);
7059 num_members = map->num_members;
7060 for (j = 0; j < num_members; j++) {
7061 /* update ord entries being careful not to propagate
7062 * ord-flags to the first map
7063 */
7064 ord = get_imsm_ord_tbl_ent(dev, j, -1);
7065
7066 if (ord_to_idx(ord) <= index)
7067 continue;
7068
7069 map = get_imsm_map(dev, 0);
7070 set_imsm_ord_tbl_ent(map, j, ord_to_idx(ord - 1));
7071 map = get_imsm_map(dev, 1);
7072 if (map)
7073 set_imsm_ord_tbl_ent(map, j, ord - 1);
7074 }
7075 }
7076
7077 mpb->num_disks--;
7078 super->updates_pending++;
7079 if (*dlp) {
7080 struct dl *dl = *dlp;
7081
7082 *dlp = (*dlp)->next;
7083 __free_imsm_disk(dl);
7084 }
7085 }
7086
7087 static char disk_by_path[] = "/dev/disk/by-path/";
7088
7089 static const char *imsm_get_disk_controller_domain(const char *path)
7090 {
7091 char disk_path[PATH_MAX];
7092 char *drv=NULL;
7093 struct stat st;
7094
7095 strncpy(disk_path, disk_by_path, PATH_MAX - 1);
7096 strncat(disk_path, path, PATH_MAX - strlen(disk_path) - 1);
7097 if (stat(disk_path, &st) == 0) {
7098 struct sys_dev* hba;
7099 char *path=NULL;
7100
7101 path = devt_to_devpath(st.st_rdev);
7102 if (path == NULL)
7103 return "unknown";
7104 hba = find_disk_attached_hba(-1, path);
7105 if (hba && hba->type == SYS_DEV_SAS)
7106 drv = "isci";
7107 else if (hba && hba->type == SYS_DEV_SATA)
7108 drv = "ahci";
7109 else
7110 drv = "unknown";
7111 dprintf("path: %s hba: %s attached: %s\n",
7112 path, (hba) ? hba->path : "NULL", drv);
7113 free(path);
7114 if (hba)
7115 free_sys_dev(&hba);
7116 }
7117 return drv;
7118 }
7119
7120 static int imsm_find_array_minor_by_subdev(int subdev, int container, int *minor)
7121 {
7122 char subdev_name[20];
7123 struct mdstat_ent *mdstat;
7124
7125 sprintf(subdev_name, "%d", subdev);
7126 mdstat = mdstat_by_subdev(subdev_name, container);
7127 if (!mdstat)
7128 return -1;
7129
7130 *minor = mdstat->devnum;
7131 free_mdstat(mdstat);
7132 return 0;
7133 }
7134
7135 static int imsm_reshape_is_allowed_on_container(struct supertype *st,
7136 struct geo_params *geo,
7137 int *old_raid_disks)
7138 {
7139 /* currently we only support increasing the number of devices
7140 * for a container. This increases the number of device for each
7141 * member array. They must all be RAID0 or RAID5.
7142 */
7143 int ret_val = 0;
7144 struct mdinfo *info, *member;
7145 int devices_that_can_grow = 0;
7146
7147 dprintf("imsm: imsm_reshape_is_allowed_on_container(ENTER): "
7148 "st->devnum = (%i)\n",
7149 st->devnum);
7150
7151 if (geo->size != -1 ||
7152 geo->level != UnSet ||
7153 geo->layout != UnSet ||
7154 geo->chunksize != 0 ||
7155 geo->raid_disks == UnSet) {
7156 dprintf("imsm: Container operation is allowed for "
7157 "raid disks number change only.\n");
7158 return ret_val;
7159 }
7160
7161 info = container_content_imsm(st, NULL);
7162 for (member = info; member; member = member->next) {
7163 int result;
7164 int minor;
7165
7166 dprintf("imsm: checking device_num: %i\n",
7167 member->container_member);
7168
7169 if (geo->raid_disks <= member->array.raid_disks) {
7170 /* we work on container for Online Capacity Expansion
7171 * only so raid_disks has to grow
7172 */
7173 dprintf("imsm: for container operation raid disks "
7174 "increase is required\n");
7175 break;
7176 }
7177
7178 if ((info->array.level != 0) &&
7179 (info->array.level != 5)) {
7180 /* we cannot use this container with other raid level
7181 */
7182 dprintf("imsm: for container operation wrong"
7183 " raid level (%i) detected\n",
7184 info->array.level);
7185 break;
7186 } else {
7187 /* check for platform support
7188 * for this raid level configuration
7189 */
7190 struct intel_super *super = st->sb;
7191 if (!is_raid_level_supported(super->orom,
7192 member->array.level,
7193 geo->raid_disks)) {
7194 dprintf("platform does not support raid%d with"
7195 " %d disk%s\n",
7196 info->array.level,
7197 geo->raid_disks,
7198 geo->raid_disks > 1 ? "s" : "");
7199 break;
7200 }
7201 /* check if component size is aligned to chunk size
7202 */
7203 if (info->component_size %
7204 (info->array.chunk_size/512)) {
7205 dprintf("Component size is not aligned to "
7206 "chunk size\n");
7207 break;
7208 }
7209 }
7210
7211 if (*old_raid_disks &&
7212 info->array.raid_disks != *old_raid_disks)
7213 break;
7214 *old_raid_disks = info->array.raid_disks;
7215
7216 /* All raid5 and raid0 volumes in container
7217 * have to be ready for Online Capacity Expansion
7218 * so they need to be assembled. We have already
7219 * checked that no recovery etc is happening.
7220 */
7221 result = imsm_find_array_minor_by_subdev(member->container_member,
7222 st->container_dev,
7223 &minor);
7224 if (result < 0) {
7225 dprintf("imsm: cannot find array\n");
7226 break;
7227 }
7228 devices_that_can_grow++;
7229 }
7230 sysfs_free(info);
7231 if (!member && devices_that_can_grow)
7232 ret_val = 1;
7233
7234 if (ret_val)
7235 dprintf("\tContainer operation allowed\n");
7236 else
7237 dprintf("\tError: %i\n", ret_val);
7238
7239 return ret_val;
7240 }
7241
7242 /* Function: get_spares_for_grow
7243 * Description: Allocates memory and creates list of spare devices
7244 * avaliable in container. Checks if spare drive size is acceptable.
7245 * Parameters: Pointer to the supertype structure
7246 * Returns: Pointer to the list of spare devices (mdinfo structure) on success,
7247 * NULL if fail
7248 */
7249 static struct mdinfo *get_spares_for_grow(struct supertype *st)
7250 {
7251 unsigned long long min_size = min_acceptable_spare_size_imsm(st);
7252 return container_choose_spares(st, min_size, NULL, NULL, NULL, 0);
7253 }
7254
7255 /******************************************************************************
7256 * function: imsm_create_metadata_update_for_reshape
7257 * Function creates update for whole IMSM container.
7258 *
7259 ******************************************************************************/
7260 static int imsm_create_metadata_update_for_reshape(
7261 struct supertype *st,
7262 struct geo_params *geo,
7263 int old_raid_disks,
7264 struct imsm_update_reshape **updatep)
7265 {
7266 struct intel_super *super = st->sb;
7267 struct imsm_super *mpb = super->anchor;
7268 int update_memory_size = 0;
7269 struct imsm_update_reshape *u = NULL;
7270 struct mdinfo *spares = NULL;
7271 int i;
7272 int delta_disks = 0;
7273 struct mdinfo *dev;
7274
7275 dprintf("imsm_update_metadata_for_reshape(enter) raid_disks = %i\n",
7276 geo->raid_disks);
7277
7278 delta_disks = geo->raid_disks - old_raid_disks;
7279
7280 /* size of all update data without anchor */
7281 update_memory_size = sizeof(struct imsm_update_reshape);
7282
7283 /* now add space for spare disks that we need to add. */
7284 update_memory_size += sizeof(u->new_disks[0]) * (delta_disks - 1);
7285
7286 u = calloc(1, update_memory_size);
7287 if (u == NULL) {
7288 dprintf("error: "
7289 "cannot get memory for imsm_update_reshape update\n");
7290 return 0;
7291 }
7292 u->type = update_reshape_container_disks;
7293 u->old_raid_disks = old_raid_disks;
7294 u->new_raid_disks = geo->raid_disks;
7295
7296 /* now get spare disks list
7297 */
7298 spares = get_spares_for_grow(st);
7299
7300 if (spares == NULL
7301 || delta_disks > spares->array.spare_disks) {
7302 fprintf(stderr, Name ": imsm: ERROR: Cannot get spare devices "
7303 "for %s.\n", geo->dev_name);
7304 goto abort;
7305 }
7306
7307 /* we have got spares
7308 * update disk list in imsm_disk list table in anchor
7309 */
7310 dprintf("imsm: %i spares are available.\n\n",
7311 spares->array.spare_disks);
7312
7313 dev = spares->devs;
7314 for (i = 0; i < delta_disks; i++) {
7315 struct dl *dl;
7316
7317 if (dev == NULL)
7318 break;
7319 u->new_disks[i] = makedev(dev->disk.major,
7320 dev->disk.minor);
7321 dl = get_disk_super(super, dev->disk.major, dev->disk.minor);
7322 dl->index = mpb->num_disks;
7323 mpb->num_disks++;
7324 dev = dev->next;
7325 }
7326
7327 abort:
7328 /* free spares
7329 */
7330 sysfs_free(spares);
7331
7332 dprintf("imsm: reshape update preparation :");
7333 if (i == delta_disks) {
7334 dprintf(" OK\n");
7335 *updatep = u;
7336 return update_memory_size;
7337 }
7338 free(u);
7339 dprintf(" Error\n");
7340
7341 return 0;
7342 }
7343
7344 /******************************************************************************
7345 * function: imsm_create_metadata_update_for_migration()
7346 * Creates update for IMSM array.
7347 *
7348 ******************************************************************************/
7349 static int imsm_create_metadata_update_for_migration(
7350 struct supertype *st,
7351 struct geo_params *geo,
7352 struct imsm_update_reshape_migration **updatep)
7353 {
7354 struct intel_super *super = st->sb;
7355 int update_memory_size = 0;
7356 struct imsm_update_reshape_migration *u = NULL;
7357 struct imsm_dev *dev;
7358 int previous_level = -1;
7359
7360 dprintf("imsm_create_metadata_update_for_migration(enter)"
7361 " New Level = %i\n", geo->level);
7362
7363 /* size of all update data without anchor */
7364 update_memory_size = sizeof(struct imsm_update_reshape_migration);
7365
7366 u = calloc(1, update_memory_size);
7367 if (u == NULL) {
7368 dprintf("error: cannot get memory for "
7369 "imsm_create_metadata_update_for_migration\n");
7370 return 0;
7371 }
7372 u->type = update_reshape_migration;
7373 u->subdev = super->current_vol;
7374 u->new_level = geo->level;
7375 u->new_layout = geo->layout;
7376 u->new_raid_disks = u->old_raid_disks = geo->raid_disks;
7377 u->new_disks[0] = -1;
7378 u->new_chunksize = -1;
7379
7380 dev = get_imsm_dev(super, u->subdev);
7381 if (dev) {
7382 struct imsm_map *map;
7383
7384 map = get_imsm_map(dev, 0);
7385 if (map) {
7386 int current_chunk_size =
7387 __le16_to_cpu(map->blocks_per_strip) / 2;
7388
7389 if (geo->chunksize != current_chunk_size) {
7390 u->new_chunksize = geo->chunksize / 1024;
7391 dprintf("imsm: "
7392 "chunk size change from %i to %i\n",
7393 current_chunk_size, u->new_chunksize);
7394 }
7395 previous_level = map->raid_level;
7396 }
7397 }
7398 if ((geo->level == 5) && (previous_level == 0)) {
7399 struct mdinfo *spares = NULL;
7400
7401 u->new_raid_disks++;
7402 spares = get_spares_for_grow(st);
7403 if ((spares == NULL) || (spares->array.spare_disks < 1)) {
7404 free(u);
7405 sysfs_free(spares);
7406 update_memory_size = 0;
7407 dprintf("error: cannot get spare device "
7408 "for requested migration");
7409 return 0;
7410 }
7411 sysfs_free(spares);
7412 }
7413 dprintf("imsm: reshape update preparation : OK\n");
7414 *updatep = u;
7415
7416 return update_memory_size;
7417 }
7418
7419 static void imsm_update_metadata_locally(struct supertype *st,
7420 void *buf, int len)
7421 {
7422 struct metadata_update mu;
7423
7424 mu.buf = buf;
7425 mu.len = len;
7426 mu.space = NULL;
7427 mu.space_list = NULL;
7428 mu.next = NULL;
7429 imsm_prepare_update(st, &mu);
7430 imsm_process_update(st, &mu);
7431
7432 while (mu.space_list) {
7433 void **space = mu.space_list;
7434 mu.space_list = *space;
7435 free(space);
7436 }
7437 }
7438
7439 /***************************************************************************
7440 * Function: imsm_analyze_change
7441 * Description: Function analyze change for single volume
7442 * and validate if transition is supported
7443 * Parameters: Geometry parameters, supertype structure
7444 * Returns: Operation type code on success, -1 if fail
7445 ****************************************************************************/
7446 enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
7447 struct geo_params *geo)
7448 {
7449 struct mdinfo info;
7450 int change = -1;
7451 int check_devs = 0;
7452 int chunk;
7453
7454 getinfo_super_imsm_volume(st, &info, NULL);
7455
7456 if ((geo->level != info.array.level) &&
7457 (geo->level >= 0) &&
7458 (geo->level != UnSet)) {
7459 switch (info.array.level) {
7460 case 0:
7461 if (geo->level == 5) {
7462 change = CH_MIGRATION;
7463 check_devs = 1;
7464 }
7465 if (geo->level == 10) {
7466 change = CH_TAKEOVER;
7467 check_devs = 1;
7468 }
7469 break;
7470 case 1:
7471 if (geo->level == 0) {
7472 change = CH_TAKEOVER;
7473 check_devs = 1;
7474 }
7475 break;
7476 case 10:
7477 if (geo->level == 0) {
7478 change = CH_TAKEOVER;
7479 check_devs = 1;
7480 }
7481 break;
7482 }
7483 if (change == -1) {
7484 fprintf(stderr,
7485 Name " Error. Level Migration from %d to %d "
7486 "not supported!\n",
7487 info.array.level, geo->level);
7488 goto analyse_change_exit;
7489 }
7490 } else
7491 geo->level = info.array.level;
7492
7493 if ((geo->layout != info.array.layout)
7494 && ((geo->layout != UnSet) && (geo->layout != -1))) {
7495 change = CH_MIGRATION;
7496 if ((info.array.layout == 0)
7497 && (info.array.level == 5)
7498 && (geo->layout == 5)) {
7499 /* reshape 5 -> 4 */
7500 } else if ((info.array.layout == 5)
7501 && (info.array.level == 5)
7502 && (geo->layout == 0)) {
7503 /* reshape 4 -> 5 */
7504 geo->layout = 0;
7505 geo->level = 5;
7506 } else {
7507 fprintf(stderr,
7508 Name " Error. Layout Migration from %d to %d "
7509 "not supported!\n",
7510 info.array.layout, geo->layout);
7511 change = -1;
7512 goto analyse_change_exit;
7513 }
7514 } else
7515 geo->layout = info.array.layout;
7516
7517 if ((geo->chunksize > 0) && (geo->chunksize != UnSet)
7518 && (geo->chunksize != info.array.chunk_size))
7519 change = CH_MIGRATION;
7520 else
7521 geo->chunksize = info.array.chunk_size;
7522
7523 chunk = geo->chunksize / 1024;
7524 if (!validate_geometry_imsm(st,
7525 geo->level,
7526 geo->layout,
7527 geo->raid_disks,
7528 &chunk,
7529 geo->size,
7530 0, 0, 1))
7531 change = -1;
7532
7533 if (check_devs) {
7534 struct intel_super *super = st->sb;
7535 struct imsm_super *mpb = super->anchor;
7536
7537 if (mpb->num_raid_devs > 1) {
7538 fprintf(stderr,
7539 Name " Error. Cannot perform operation on %s"
7540 "- for this operation it MUST be single "
7541 "array in container\n",
7542 geo->dev_name);
7543 change = -1;
7544 }
7545 }
7546
7547 analyse_change_exit:
7548
7549 return change;
7550 }
7551
7552 int imsm_takeover(struct supertype *st, struct geo_params *geo)
7553 {
7554 struct intel_super *super = st->sb;
7555 struct imsm_update_takeover *u;
7556
7557 u = malloc(sizeof(struct imsm_update_takeover));
7558 if (u == NULL)
7559 return 1;
7560
7561 u->type = update_takeover;
7562 u->subarray = super->current_vol;
7563
7564 /* 10->0 transition */
7565 if (geo->level == 0)
7566 u->direction = R10_TO_R0;
7567
7568 /* 0->10 transition */
7569 if (geo->level == 10)
7570 u->direction = R0_TO_R10;
7571
7572 /* update metadata locally */
7573 imsm_update_metadata_locally(st, u,
7574 sizeof(struct imsm_update_takeover));
7575 /* and possibly remotely */
7576 if (st->update_tail)
7577 append_metadata_update(st, u,
7578 sizeof(struct imsm_update_takeover));
7579 else
7580 free(u);
7581
7582 return 0;
7583 }
7584
7585 static int warn_user_about_risk(void)
7586 {
7587 int rv = 0;
7588
7589 fprintf(stderr,
7590 "\nThis is an experimental feature. Data on the RAID volume(s) "
7591 "can be lost!!!\n\n"
7592 "To continue command execution please make sure that\n"
7593 "the grow process will not be interrupted. Use safe power\n"
7594 "supply to avoid unexpected system reboot. Make sure that\n"
7595 "reshaped container is not assembled automatically during\n"
7596 "system boot.\n"
7597 "If reshape is interrupted, assemble array manually\n"
7598 "using e.g. '-Ac' option and up to date mdadm.conf file.\n"
7599 "Assembly in scan mode is not possible in such case.\n"
7600 "Growing container with boot array is not possible.\n"
7601 "If boot array reshape is interrupted, whole file system\n"
7602 "can be lost.\n\n");
7603 rv = ask("Do you want to continue? ");
7604 fprintf(stderr, "\n");
7605
7606 return rv;
7607 }
7608
7609 static int imsm_reshape_super(struct supertype *st, long long size, int level,
7610 int layout, int chunksize, int raid_disks,
7611 int delta_disks, char *backup, char *dev,
7612 int verbose)
7613 {
7614 int ret_val = 1;
7615 struct geo_params geo;
7616
7617 dprintf("imsm: reshape_super called.\n");
7618
7619 memset(&geo, 0, sizeof(struct geo_params));
7620
7621 geo.dev_name = dev;
7622 geo.dev_id = st->devnum;
7623 geo.size = size;
7624 geo.level = level;
7625 geo.layout = layout;
7626 geo.chunksize = chunksize;
7627 geo.raid_disks = raid_disks;
7628 if (delta_disks != UnSet)
7629 geo.raid_disks += delta_disks;
7630
7631 dprintf("\tfor level : %i\n", geo.level);
7632 dprintf("\tfor raid_disks : %i\n", geo.raid_disks);
7633
7634 if (experimental() == 0)
7635 return ret_val;
7636
7637 if (st->container_dev == st->devnum) {
7638 /* On container level we can only increase number of devices. */
7639 dprintf("imsm: info: Container operation\n");
7640 int old_raid_disks = 0;
7641
7642 /* this warning will be removed when imsm checkpointing
7643 * will be implemented, and restoring from check-point
7644 * operation will be transparent for reboot process
7645 */
7646 if (warn_user_about_risk() == 0)
7647 return ret_val;
7648
7649 if (imsm_reshape_is_allowed_on_container(
7650 st, &geo, &old_raid_disks)) {
7651 struct imsm_update_reshape *u = NULL;
7652 int len;
7653
7654 len = imsm_create_metadata_update_for_reshape(
7655 st, &geo, old_raid_disks, &u);
7656
7657 if (len <= 0) {
7658 dprintf("imsm: Cannot prepare update\n");
7659 goto exit_imsm_reshape_super;
7660 }
7661
7662 ret_val = 0;
7663 /* update metadata locally */
7664 imsm_update_metadata_locally(st, u, len);
7665 /* and possibly remotely */
7666 if (st->update_tail)
7667 append_metadata_update(st, u, len);
7668 else
7669 free(u);
7670
7671 } else {
7672 fprintf(stderr, Name ": (imsm) Operation "
7673 "is not allowed on this container\n");
7674 }
7675 } else {
7676 /* On volume level we support following operations
7677 * - takeover: raid10 -> raid0; raid0 -> raid10
7678 * - chunk size migration
7679 * - migration: raid5 -> raid0; raid0 -> raid5
7680 */
7681 struct intel_super *super = st->sb;
7682 struct intel_dev *dev = super->devlist;
7683 int change, devnum;
7684 dprintf("imsm: info: Volume operation\n");
7685 /* find requested device */
7686 while (dev) {
7687 imsm_find_array_minor_by_subdev(dev->index, st->container_dev, &devnum);
7688 if (devnum == geo.dev_id)
7689 break;
7690 dev = dev->next;
7691 }
7692 if (dev == NULL) {
7693 fprintf(stderr, Name " Cannot find %s (%i) subarray\n",
7694 geo.dev_name, geo.dev_id);
7695 goto exit_imsm_reshape_super;
7696 }
7697 super->current_vol = dev->index;
7698 change = imsm_analyze_change(st, &geo);
7699 switch (change) {
7700 case CH_TAKEOVER:
7701 ret_val = imsm_takeover(st, &geo);
7702 break;
7703 case CH_MIGRATION: {
7704 struct imsm_update_reshape_migration *u = NULL;
7705 int len =
7706 imsm_create_metadata_update_for_migration(
7707 st, &geo, &u);
7708 if (len < 1) {
7709 dprintf("imsm: "
7710 "Cannot prepare update\n");
7711 break;
7712 }
7713 ret_val = 0;
7714 /* update metadata locally */
7715 imsm_update_metadata_locally(st, u, len);
7716 /* and possibly remotely */
7717 if (st->update_tail)
7718 append_metadata_update(st, u, len);
7719 else
7720 free(u);
7721 }
7722 break;
7723 default:
7724 ret_val = 1;
7725 }
7726 }
7727
7728 exit_imsm_reshape_super:
7729 dprintf("imsm: reshape_super Exit code = %i\n", ret_val);
7730 return ret_val;
7731 }
7732
7733 static int imsm_manage_reshape(
7734 int afd, struct mdinfo *sra, struct reshape *reshape,
7735 struct supertype *st, unsigned long stripes,
7736 int *fds, unsigned long long *offsets,
7737 int dests, int *destfd, unsigned long long *destoffsets)
7738 {
7739 /* Just use child_monitor for now */
7740 return child_monitor(
7741 afd, sra, reshape, st, stripes,
7742 fds, offsets, dests, destfd, destoffsets);
7743 }
7744 #endif /* MDASSEMBLE */
7745
7746 struct superswitch super_imsm = {
7747 #ifndef MDASSEMBLE
7748 .examine_super = examine_super_imsm,
7749 .brief_examine_super = brief_examine_super_imsm,
7750 .brief_examine_subarrays = brief_examine_subarrays_imsm,
7751 .export_examine_super = export_examine_super_imsm,
7752 .detail_super = detail_super_imsm,
7753 .brief_detail_super = brief_detail_super_imsm,
7754 .write_init_super = write_init_super_imsm,
7755 .validate_geometry = validate_geometry_imsm,
7756 .add_to_super = add_to_super_imsm,
7757 .remove_from_super = remove_from_super_imsm,
7758 .detail_platform = detail_platform_imsm,
7759 .kill_subarray = kill_subarray_imsm,
7760 .update_subarray = update_subarray_imsm,
7761 .load_container = load_container_imsm,
7762 .default_geometry = default_geometry_imsm,
7763 .get_disk_controller_domain = imsm_get_disk_controller_domain,
7764 .reshape_super = imsm_reshape_super,
7765 .manage_reshape = imsm_manage_reshape,
7766 #endif
7767 .match_home = match_home_imsm,
7768 .uuid_from_super= uuid_from_super_imsm,
7769 .getinfo_super = getinfo_super_imsm,
7770 .getinfo_super_disks = getinfo_super_disks_imsm,
7771 .update_super = update_super_imsm,
7772
7773 .avail_size = avail_size_imsm,
7774 .min_acceptable_spare_size = min_acceptable_spare_size_imsm,
7775
7776 .compare_super = compare_super_imsm,
7777
7778 .load_super = load_super_imsm,
7779 .init_super = init_super_imsm,
7780 .store_super = store_super_imsm,
7781 .free_super = free_super_imsm,
7782 .match_metadata_desc = match_metadata_desc_imsm,
7783 .container_content = container_content_imsm,
7784
7785 .external = 1,
7786 .name = "imsm",
7787
7788 #ifndef MDASSEMBLE
7789 /* for mdmon */
7790 .open_new = imsm_open_new,
7791 .set_array_state= imsm_set_array_state,
7792 .set_disk = imsm_set_disk,
7793 .sync_metadata = imsm_sync_metadata,
7794 .activate_spare = imsm_activate_spare,
7795 .process_update = imsm_process_update,
7796 .prepare_update = imsm_prepare_update,
7797 #endif /* MDASSEMBLE */
7798 };