Lines Matching +full:i +full:- +full:drive
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
16 * 3. Neither the name of the author nor the names of any co-contributors
88 * leak the fd on purpose since this application is not long-running.
125 snprintf(path, sizeof(path), "%s%s", _PATH_DEV, disk->devname); in mpt_lock_physdisk()
129 warn("Unable to lock disk %s", disk->devname); in mpt_lock_physdisk()
141 int i; in mpt_lookup_standalone_disk() local
151 for (i = 0; i < ndisks; i++) { in mpt_lookup_standalone_disk()
152 if (disks[i].bus == (U8)bus && in mpt_lookup_standalone_disk()
153 disks[i].target == (U8)id) { in mpt_lookup_standalone_disk()
154 *index = i; in mpt_lookup_standalone_disk()
163 for (i = 0; i < ndisks; i++) { in mpt_lookup_standalone_disk()
164 if (strcmp(name, disks[i].devname) == 0) { in mpt_lookup_standalone_disk()
165 *index = i; in mpt_lookup_standalone_disk()
196 config_page->Header.PageType = MPI_CONFIG_PAGETYPE_RAID_PHYSDISK; in mpt_create_physdisk()
197 config_page->Header.PageNumber = 0; in mpt_create_physdisk()
198 config_page->Header.PageLength = sizeof(CONFIG_PAGE_RAID_PHYS_DISK_0) / in mpt_create_physdisk()
200 config_page->PhysDiskIOC = 0; /* XXX */ in mpt_create_physdisk()
201 config_page->PhysDiskBus = disk->bus; in mpt_create_physdisk()
202 config_page->PhysDiskID = disk->target; in mpt_create_physdisk()
235 int ch, error, fd, i; in clear_config() local
253 vol = ioc2->RaidVolume; in clear_config()
254 for (i = 0; i < ioc2->NumActiveVolumes; vol++, i++) { in clear_config()
255 if (mpt_lock_volume(vol->VolumeBus, vol->VolumeID) < 0) { in clear_config()
257 mpt_volume_name(vol->VolumeBus, vol->VolumeID)); in clear_config()
276 vol = ioc2->RaidVolume; in clear_config()
277 for (i = 0; i < ioc2->NumActiveVolumes; vol++, i++) { in clear_config()
279 vol->VolumeBus, vol->VolumeID, 0, in clear_config()
285 mpt_volume_name(vol->VolumeBus, vol->VolumeID)); in clear_config()
294 spare = ioc5->HotSpare; in clear_config()
295 for (i = 0; i < ioc5->NumHotSpares; spare++, i++) in clear_config()
296 if (mpt_delete_physdisk(fd, spare->PhysDiskNum) < 0) in clear_config()
298 spare->PhysDiskNum); in clear_config()
305 warn("Failed to fetch drive list"); in clear_config()
307 disk = ioc3->PhysDisk; in clear_config()
308 for (i = 0; i < ioc3->NumPhysDisks; disk++, i++) in clear_config()
309 if (mpt_delete_physdisk(fd, disk->PhysDiskNum) < 0) in clear_config()
311 disk->PhysDiskNum); in clear_config()
316 error = mpt_rescan_bus(-1, -1); in clear_config()
332 { "raid-0", RT_RAID0 },
334 { "raid-1", RT_RAID1 },
337 { "raid-1e", RT_RAID1E },
359 /* Parse a comma-separated list of drives for a volume. */
367 int count, error, i; in parse_volume() local
375 warnx("Invalid drive list '%s'", volume_str); in parse_volume()
406 /* Validate each drive. */ in parse_volume()
407 info->drives = calloc(count, sizeof(struct drive_info)); in parse_volume()
408 info->drive_count = count; in parse_volume()
409 for (dinfo = info->drives; (cp = strsep(&volume_str, ",")) != NULL; in parse_volume()
411 /* If this drive is already a RAID phys just fetch the info. */ in parse_volume()
412 error = mpt_lookup_drive(state->list, cp, &PhysDiskNum); in parse_volume()
414 dinfo->info = mpt_pd_info(fd, PhysDiskNum, NULL); in parse_volume()
415 if (dinfo->info == NULL) in parse_volume()
421 if (mpt_lookup_standalone_disk(cp, state->sdisks, in parse_volume()
422 state->nsdisks, &i) < 0) { in parse_volume()
424 warn("Unable to lookup drive %s", cp); in parse_volume()
427 dinfo->sdisk = &state->sdisks[i]; in parse_volume()
430 if (mpt_lock_physdisk(dinfo->sdisk) < 0) in parse_volume()
446 int error, i; in add_drives() local
448 for (i = 0, dinfo = info->drives; i < info->drive_count; in add_drives()
449 i++, dinfo++) { in add_drives()
450 if (dinfo->info == NULL) { in add_drives()
451 if (mpt_create_physdisk(fd, dinfo->sdisk, in add_drives()
456 dinfo->sdisk->devname); in add_drives()
460 printf("Added drive %s with PhysDiskNum %u\n", in add_drives()
461 dinfo->sdisk->devname, PhysDiskNum); in add_drives()
463 dinfo->info = mpt_pd_info(fd, PhysDiskNum, NULL); in add_drives()
464 if (dinfo->info == NULL) in add_drives()
479 int i; in find_next_volume() local
483 state->target_id++; in find_next_volume()
486 for (i = 0; i < state->nsdisks; i++) in find_next_volume()
487 if (state->sdisks[i].target == state->target_id) in find_next_volume()
489 for (i = 0; i < state->list->ndrives; i++) in find_next_volume()
490 if (state->list->drives[i]->PhysDiskID == state->target_id) in find_next_volume()
494 vol = state->ioc2->RaidVolume; in find_next_volume()
495 for (i = 0; i < state->ioc2->NumActiveVolumes; vol++, i++) in find_next_volume()
496 if (vol->VolumeID == state->target_id) in find_next_volume()
499 return (state->target_id); in find_next_volume()
514 int error, i; in build_volume() local
529 sizeof(RAID_VOL0_PHYS_DISK) * (info->drive_count - 1); in build_volume()
535 vol->Header.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME; in build_volume()
536 vol->Header.PageNumber = 0; in build_volume()
537 vol->Header.PageLength = page_size / 4; in build_volume()
540 vol->VolumeID = find_next_volume(state); in build_volume()
541 vol->VolumeBus = 0; in build_volume()
542 vol->VolumeIOC = 0; /* XXX */ in build_volume()
543 vol->VolumeStatus.Flags = MPI_RAIDVOL0_STATUS_FLAG_ENABLED; in build_volume()
544 vol->VolumeStatus.State = MPI_RAIDVOL0_STATUS_STATE_OPTIMAL; in build_volume()
545 vol->VolumeSettings.Settings = MPI_RAIDVOL0_SETTING_USE_DEFAULTS; in build_volume()
546 vol->VolumeSettings.HotSparePool = MPI_RAID_HOT_SPARE_POOL_0; in build_volume()
547 vol->NumPhysDisks = info->drive_count; in build_volume()
549 /* Find the smallest drive. */ in build_volume()
550 MinLBA = info->drives[0].info->MaxLBA; in build_volume()
551 for (i = 1; i < info->drive_count; i++) in build_volume()
552 if (info->drives[i].info->MaxLBA < MinLBA) in build_volume()
553 MinLBA = info->drives[i].info->MaxLBA; in build_volume()
560 MinLBA -= (512 * 1024 * 1024) / 512; in build_volume()
564 vol->VolumeType = MPI_RAID_VOL_TYPE_IS; in build_volume()
565 vol->StripeSize = stripe_size / 512; in build_volume()
566 MaxLBA = (uint64_t)MinLBA * info->drive_count; in build_volume()
569 vol->VolumeType = MPI_RAID_VOL_TYPE_IM; in build_volume()
570 MaxLBA = (uint64_t)MinLBA * (info->drive_count / 2); in build_volume()
573 vol->VolumeType = MPI_RAID_VOL_TYPE_IME; in build_volume()
574 vol->StripeSize = stripe_size / 512; in build_volume()
575 MaxLBA = (uint64_t)MinLBA * info->drive_count / 2; in build_volume()
583 * If the controller doesn't support 64-bit addressing and the in build_volume()
588 !(state->ioc2->CapabilitiesFlags & in build_volume()
594 vol->MaxLBA = MaxLBA; in build_volume()
595 vol->MaxLBAHigh = MaxLBA >> 32; in build_volume()
598 for (i = 0, dinfo = info->drives, rdisk = vol->PhysDisk; in build_volume()
599 i < info->drive_count; i++, dinfo++, rdisk++) { in build_volume()
601 printf("Adding drive %u (%u:%u) to volume %u:%u\n", in build_volume()
602 dinfo->info->PhysDiskNum, dinfo->info->PhysDiskBus, in build_volume()
603 dinfo->info->PhysDiskID, vol->VolumeBus, in build_volume()
604 vol->VolumeID); in build_volume()
606 if (i == 0) in build_volume()
607 rdisk->PhysDiskMap = in build_volume()
610 rdisk->PhysDiskMap = in build_volume()
613 rdisk->PhysDiskMap = i; in build_volume()
614 rdisk->PhysDiskNum = dinfo->info->PhysDiskNum; in build_volume()
627 int ch, error, fd, i, quick, raid_type, verbose; in create_volume() local
645 raid_type = -1; in create_volume()
646 for (i = 0; raid_type_table[i].name != NULL; i++) in create_volume()
647 if (strcasecmp(raid_type_table[i].name, av[1]) == 0) { in create_volume()
648 raid_type = raid_type_table[i].raid_type; in create_volume()
652 if (raid_type == -1) { in create_volume()
667 while ((ch = getopt(ac, av, "dqs:v")) != -1) { in create_volume()
694 ac -= optind; in create_volume()
718 /* Parse the drive list. */ in create_volume()
720 warnx("Exactly one drive list is required"); in create_volume()
760 error = mpt_raid_action(fd, MPI_RAID_ACTION_CREATE_VOLUME, vol->VolumeBus, in create_volume()
761 vol->VolumeID, 0, quick ? MPI_RAID_ACTION_ADATA_DO_NOT_SYNC : 0, in create_volume()
762 vol, vol->Header.PageLength * 4, NULL, NULL, 0, NULL, NULL, 1); in create_volume()
774 error = mpt_rescan_bus(vol->VolumeBus, vol->VolumeID); in create_volume()
828 error = mpt_rescan_bus(-1, -1); in delete_volume()
842 int error, i, j, new_pool, pool_count[7]; in find_volume_spare_pool() local
858 if ((info->VolumeSettings.HotSparePool & ~MPI_RAID_HOT_SPARE_POOL_0) != in find_volume_spare_pool()
860 *pool = 1 << (ffs(info->VolumeSettings.HotSparePool & in find_volume_spare_pool()
861 ~MPI_RAID_HOT_SPARE_POOL_0) - 1); in find_volume_spare_pool()
878 vol = ioc2->RaidVolume; in find_volume_spare_pool()
879 for (i = 0; i < ioc2->NumActiveVolumes; vol++, i++) { in find_volume_spare_pool()
880 info = mpt_vol_info(fd, vol->VolumeBus, vol->VolumeID, NULL); in find_volume_spare_pool()
884 if (info->VolumeSettings.HotSparePool & (1 << (j + 1))) in find_volume_spare_pool()
892 for (i = 1; i < 7; i++) in find_volume_spare_pool()
893 if (pool_count[i] < pool_count[new_pool]) in find_volume_spare_pool()
894 new_pool = i; in find_volume_spare_pool()
901 info->VolumeSettings.HotSparePool |= (1 << new_pool); in find_volume_spare_pool()
903 VolumeBus, VolumeID, 0, *(U32 *)&info->VolumeSettings, NULL, 0, in find_volume_spare_pool()
924 int error, fd, i, nsdisks, pool; in add_spare() local
927 warnx("add spare: drive required"); in add_spare()
965 if (mpt_lookup_standalone_disk(av[1], sdisks, nsdisks, &i) < in add_spare()
968 warn("Unable to lookup drive %s", av[1]); in add_spare()
974 if (mpt_lock_physdisk(&sdisks[i]) < 0) { in add_spare()
980 if (mpt_create_physdisk(fd, &sdisks[i], &PhysDiskNum) < 0) { in add_spare()
994 warn("Failed to fetch drive info"); in add_spare()
999 info->PhysDiskSettings.HotSparePool = pool; in add_spare()
1001 0, PhysDiskNum, *(U32 *)&info->PhysDiskSettings, NULL, 0, NULL, in add_spare()
1025 warnx("remove spare: drive required"); in remove_spare()
1044 warn("Failed to find drive %s", av[1]); in remove_spare()
1054 warn("Failed to fetch drive info"); in remove_spare()
1059 if (info->PhysDiskSettings.HotSparePool == 0) { in remove_spare()
1060 warnx("Drive %u is not a hot spare", PhysDiskNum); in remove_spare()
1074 error = mpt_rescan_bus(info->PhysDiskBus, info->PhysDiskID); in remove_spare()
1091 int error, fd, i, ndisks; in pd_create() local
1095 warnx("pd create: drive required"); in pd_create()
1112 if (mpt_lookup_standalone_disk(av[1], disks, ndisks, &i) < 0) { in pd_create()
1114 warn("Unable to lookup drive"); in pd_create()
1118 if (mpt_lock_physdisk(&disks[i]) < 0) in pd_create()
1121 if (mpt_create_physdisk(fd, &disks[i], &PhysDiskNum) < 0) { in pd_create()
1128 printf("Added drive %s with PhysDiskNum %u\n", av[1], PhysDiskNum); in pd_create()
1145 warnx("pd delete: drive required"); in pd_delete()
1162 warn("Failed to find drive %s", av[1]); in pd_delete()
1170 warn("Failed to fetch drive info"); in pd_delete()
1180 error = mpt_rescan_bus(info->PhysDiskBus, info->PhysDiskID); in pd_delete()
1194 int i; in dump_config() local
1199 vol->Header.PageType, vol->Header.PageNumber, in dump_config()
1200 vol->Header.PageLength, vol->Header.PageLength * 4, in dump_config()
1201 vol->Header.PageVersion); in dump_config()
1202 printf(" Address: %d:%d IOC %d\n", vol->VolumeBus, vol->VolumeID, in dump_config()
1203 vol->VolumeIOC); in dump_config()
1204 printf(" Type: %d (%s)\n", vol->VolumeType, in dump_config()
1205 mpt_raid_level(vol->VolumeType)); in dump_config()
1207 mpt_volstate(vol->VolumeStatus.State), vol->VolumeStatus.Flags); in dump_config()
1209 vol->VolumeSettings.Settings, vol->VolumeSettings.HotSparePool); in dump_config()
1210 printf(" MaxLBA: %ju\n", (uintmax_t)vol->MaxLBAHigh << 32 | in dump_config()
1211 vol->MaxLBA); in dump_config()
1212 printf(" Stripe Size: %ld\n", (long)vol->StripeSize * 512); in dump_config()
1213 printf(" %d Disks:\n", vol->NumPhysDisks); in dump_config()
1215 for (i = 0; i < vol->NumPhysDisks; i++) in dump_config()
1216 printf(" Disk %d: Num 0x%02x Map 0x%02x\n", i, in dump_config()
1217 vol->PhysDisk[i].PhysDiskNum, vol->PhysDisk[i].PhysDiskMap); in dump_config()