Fixes up iprconfig -c dump to show more details about the IOA. Also fixes an issue where we could end up treating a RAID array as an adapter resource which resulted in strange looking iprconfig menus and possible iprinit failures.
Signed-off-by: Brian King <brk...@linux.vnet.ibm.com> --- iprconfig.c | 68 ++++++++++++++++++++++++++++++------------------------------ iprlib.c | 18 +++++++-------- iprlib.h | 10 ++++++++ 3 files changed, 53 insertions(+), 43 deletions(-) diff -puN iprconfig.c~iprutils_dump_ioa_fixup iprconfig.c --- iprutils.patched/iprconfig.c~iprutils_dump_ioa_fixup 2016-10-25 13:48:50.292996424 -0500 +++ iprutils.patched-bjking1/iprconfig.c 2016-10-25 13:48:50.307996362 -0500 @@ -1804,7 +1804,7 @@ int main_menu(i_container *i_con) for_each_ioa(ioa) { for (j = 0; j < ioa->num_devices; j++) { scsi_dev_data = ioa->dev[j].scsi_dev_data; - if (!scsi_dev_data || scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(&ioa->dev[j])) continue; verify_device(&ioa->dev[j]); } @@ -2820,7 +2820,7 @@ int device_details(i_container *i_con) if ((rc = device_details_get_device(i_con, &dev))) return rc; - if (dev->scsi_dev_data && dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) { + if (ipr_is_ioa(dev)) { n_screen = &n_adapter_details; body = ioa_details(body, dev); } else if (ipr_is_volume_set(dev)) { @@ -11775,7 +11775,7 @@ static int update_ucode(struct ipr_dev * time_screen_driver(&n_download_ucode_in_progress, time, 0); } while (done == 0); } else { - if (dev->scsi_dev_data && dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(dev)) ipr_update_ioa_fw(dev->ioa, fw_image, 1); else ipr_update_disk_fw(dev, fw_image, 1); @@ -11909,7 +11909,7 @@ int process_choose_ucode(struct ipr_dev if (!dev->scsi_dev_data) return 67 | EXIT_FLAG; - if (dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(dev)) rc = get_ioa_firmware_image_list(dev->ioa, &list); else if (dev->scsi_dev_data->type == TYPE_ENCLOSURE || dev->scsi_dev_data->type == TYPE_PROCESSOR) rc = get_ses_firmware_image_list(dev, &list); @@ -11923,8 +11923,7 @@ int process_choose_ucode(struct ipr_dev ipr_get_fw_version(dev, release_level); - if (dev->scsi_dev_data && - dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) { + if (ipr_is_ioa(dev)) { sprintf(buffer, _("Adapter to download: %-8s %-16s\n"), dev->scsi_dev_data->vendor_id, dev->scsi_dev_data->product_id); @@ -12899,7 +12898,7 @@ static void get_status(struct ipr_dev *d int initialization_in_progress = 0; struct ipr_res_redundancy_info info; - if (scsi_dev_data && scsi_dev_data->type == IPR_TYPE_ADAPTER && dev == &ioa->ioa) { + if (ipr_is_ioa(dev)) { if (!scsi_dev_data->online) sprintf(buf, "Offline"); else if (ioa->ioa_dead) @@ -13456,7 +13455,7 @@ char *__print_device(struct ipr_dev *dev if (res_path) { if (ioa->sis64) if (serial_num == 1) { - if (scsi_dev_data && scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(dev)) loc_len = sprintf(body + len, "%s/%-28d", ioa->pci_address, ioa->host_num); else { ipr_format_res_path(dev->res_path[ra].res_path_bytes, res_path_name, IPR_MAX_RES_PATH_LEN); @@ -13471,7 +13470,7 @@ char *__print_device(struct ipr_dev *dev scsi_dev_data->res_path : "<unknown>"); else /*32bit*/ if (serial_num == 1) { - if (scsi_dev_data && scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(dev)) loc_len = sprintf(body + len, "%s/%-29d:", ioa->pci_address, ioa->host_num); else loc_len = sprintf(body + len, "%s/%d", ioa->pci_address, ioa->host_num); @@ -13490,7 +13489,7 @@ char *__print_device(struct ipr_dev *dev } } - if (scsi_dev_data && scsi_dev_data->type == IPR_TYPE_ADAPTER && dev == &ioa->ioa) { + if (ipr_is_ioa(dev)) { if (serial_num == 1 ) { if (!res_path || !ioa->sis64) { for (i = 0; i < 28-loc_len; i++) @@ -14632,7 +14631,7 @@ static int query_raid_create(char **args return -EINVAL; } - if (&dev->ioa->ioa != dev) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "Device is not an IOA\n"); return -EINVAL; } @@ -14680,7 +14679,7 @@ static int query_raid_delete(char **args return -EINVAL; } - if (&dev->ioa->ioa != dev) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "Device is not an IOA\n"); return -EINVAL; } @@ -15410,7 +15409,7 @@ static int set_log_level_cmd(char **args return -EINVAL; } - if (&dev->ioa->ioa != dev) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "Device is not an IOA\n"); return -EINVAL; } @@ -15709,7 +15708,7 @@ static int update_ucode_cmd(char **args, return -EINVAL; } - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) return update_ioa_ucode(dev->ioa, args[1]); else return update_dev_ucode(dev, args[1]); @@ -15742,7 +15741,7 @@ static int update_all_ucodes(char **args if (!lfw || lfw->version <= get_fw_version(dev)) continue; - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) rc = update_ioa_ucode(dev->ioa, lfw->file); else rc = update_dev_ucode(dev, lfw->file); @@ -16001,7 +16000,7 @@ static int query_path_status(char **args printf("%s\n%s\n", status_hdr[2], status_sep[2]); - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) printf_ioa_path_status(dev->ioa); else printf_path_status(dev); @@ -16432,7 +16431,7 @@ static int query_log_level(char **args, return -EINVAL; } - if (&dev->ioa->ioa != dev) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "Device is not an IOA\n"); return -EINVAL; } @@ -16549,7 +16548,7 @@ static int query_ucode_level(char **args return -EINVAL; } - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) printf("%08X\n", get_fw_version(dev)); else { level = get_fw_version(dev); @@ -17130,7 +17129,7 @@ static int query_ioa_asym_access_mode(ch fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -17229,9 +17228,7 @@ static void show_dev_details(struct ipr_ { char *body = NULL; - if (dev->scsi_dev_data && - dev->scsi_dev_data->type == IPR_TYPE_ADAPTER && - dev == &dev->ioa->ioa) + if (ipr_is_ioa(dev)) body = ioa_details(body, dev); else if (ipr_is_volume_set(dev) || ipr_is_array(dev)) body = vset_array_details(body, dev); @@ -17698,7 +17695,7 @@ static int check_and_set_active_active(c fprintf(stderr, "Cannot find %s\n", dev_name); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", dev_name); return -EINVAL; } @@ -18053,7 +18050,7 @@ static int query_location(char **args, i get_drive_phy_loc(dev->ioa); if (!ipr_is_volume_set(dev)){ - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) fprintf(stdout, "%s\n", dev->ioa->physical_location); else fprintf(stdout, "%s\n", dev->physical_location); @@ -18091,7 +18088,7 @@ static int query_ioa_caching(char **args fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -18138,7 +18135,7 @@ static int set_ioa_caching(char **args, fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -18189,7 +18186,7 @@ static int set_array_rebuild_verify(char fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -18248,7 +18245,7 @@ static int query_array_rebuild_verify(ch fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -18285,7 +18282,7 @@ static int set_array_rebuild_rate(char** fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -18349,7 +18346,7 @@ static int query_array_rebuild_rate(char fprintf(stderr, "Cannot find %s\n", args[0]); return -EINVAL; } - if (dev != &dev->ioa->ioa) { + if (!ipr_is_ioa(dev)) { fprintf(stderr, "%s is not an IOA.\n", args[0]); return -EINVAL; } @@ -18650,7 +18647,7 @@ int enclosures_fork(i_container *i_con) input = temp_i_con->field_data; if (strcmp(input, "3") == 0) { - if (ses->scsi_dev_data && ses->scsi_dev_data->type == IPR_TYPE_ADAPTER && ses == &ses->ioa->ioa) + if (ipr_is_ioa(ses)) return RC_89_Invalid_Dev_For_Resume; if (ses->active_suspend == IOA_DEV_PORT_UNKNOWN) @@ -18662,7 +18659,7 @@ int enclosures_fork(i_container *i_con) ses->is_resume_cand = 1; resume_flag = 1; } else if (strcmp(input, "2") == 0) { - if (ses->scsi_dev_data && ses->scsi_dev_data->type == IPR_TYPE_ADAPTER && ses == &ses->ioa->ioa) + if (ipr_is_ioa(ses)) return RC_88_Invalid_Dev_For_Suspend; if (ses->active_suspend == IOA_DEV_PORT_UNKNOWN) @@ -18779,7 +18776,7 @@ static int suspend_disk_enclosure(char * ses = find_dev(args[0]); get_ses_ioport_status(ses); - if (ses->scsi_dev_data && ses->scsi_dev_data->type == IPR_TYPE_ADAPTER && ses == &ses->ioa->ioa) { + if (ipr_is_ioa(ses)) { fprintf(stderr,"Incorrect device type specified. Please specify a valid SAS device to suspend.\n"); return 1; } @@ -18832,7 +18829,7 @@ static int resume_disk_enclosure(char ** ses = find_dev(args[0]); get_ses_ioport_status(ses); - if (ses->scsi_dev_data && ses->scsi_dev_data->type == IPR_TYPE_ADAPTER && ses == &ses->ioa->ioa) { + if (ipr_is_ioa(ses)) { fprintf(stderr,"Incorrect device type specified. Please specify a valid SAS device to resume.\n"); return 1; } @@ -19037,6 +19034,9 @@ static int dump (char **args, int num_ar printf("\n === Running show-details ===\n"); for_each_ioa(ioa){ + printf("IOA %s:\n", ioa->ioa.gen_name); + show_dev_details(&ioa->ioa); + for_each_dev(ioa, dev){ printf("Device %s:\n", dev->gen_name); show_dev_details(dev); diff -puN iprlib.c~iprutils_dump_ioa_fixup iprlib.c --- iprutils.patched/iprlib.c~iprutils_dump_ioa_fixup 2016-10-25 13:48:50.295996412 -0500 +++ iprutils.patched-bjking1/iprlib.c 2016-10-25 13:48:50.310996349 -0500 @@ -6627,9 +6627,12 @@ void check_current_config(bool allow_reb if (scsi_dev_data->host != ioa->host_num) continue; + if (ioa->ioa.scsi_dev_data == scsi_dev_data) + continue; + if (scsi_dev_data->type == TYPE_DISK || scsi_dev_data->type == IPR_TYPE_AF_DISK || - scsi_dev_data->type == IPR_TYPE_ADAPTER || + scsi_dev_data->type == IPR_TYPE_ARRAY || scsi_dev_data->type == TYPE_ENCLOSURE || scsi_dev_data->type == TYPE_ROM || scsi_dev_data->type == TYPE_TAPE || @@ -6703,9 +6706,6 @@ void check_current_config(bool allow_reb __ipr_test_unit_ready(&ioa->dev[device_count], &sense_data); device_count++; - } else if (scsi_dev_data->type == IPR_TYPE_ADAPTER) { - ioa->ioa.ioa = ioa; - ioa->ioa.scsi_dev_data = scsi_dev_data; } } @@ -8586,7 +8586,7 @@ u32 get_fw_version(struct ipr_dev *dev) return 0; } - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) return get_ioa_fw_version(dev->ioa); return get_dev_fw_version(dev); @@ -8939,7 +8939,7 @@ struct ipr_fw_images *get_latest_fw_imag if (!dev) return NULL; - if (dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(dev)) get_ioa_firmware_image_list(dev->ioa, &fw); else if (ipr_is_ses(dev)) get_ses_firmware_image_list(dev, &fw); @@ -8969,7 +8969,7 @@ int get_latest_fw_image_version(struct i if (!dev) return -ENODEV; - if (dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) + if (ipr_is_ioa(dev)) get_ioa_firmware_image_list(dev->ioa, &fw); else if (ipr_is_ses(dev)) get_ses_firmware_image_list(dev, &fw); @@ -9845,7 +9845,7 @@ int ipr_init_dev(struct ipr_dev *dev) init_af_dev(dev); break; case IPR_TYPE_ADAPTER: - if (&dev->ioa->ioa == dev) + if (ipr_is_ioa(dev)) init_ioa_dev(dev); break; case TYPE_ENCLOSURE: @@ -9877,7 +9877,7 @@ int ipr_init_new_dev(struct ipr_dev *dev wait_for_dev(dev->dev_name); break; case IPR_TYPE_ADAPTER: - if (&dev->ioa->ioa != dev) + if (!ipr_is_ioa(dev)) break; case IPR_TYPE_AF_DISK: wait_for_dev(dev->gen_name); diff -puN iprlib.h~iprutils_dump_ioa_fixup iprlib.h --- iprutils.patched/iprlib.h~iprutils_dump_ioa_fixup 2016-10-25 13:48:50.299996395 -0500 +++ iprutils.patched-bjking1/iprlib.h 2016-10-25 13:48:50.312996341 -0500 @@ -203,6 +203,7 @@ typedef uint64_t u64; #define IPR_XLATE_DEV_FMT_RC(rc) ((((rc) & 127) == 51) ? -EIO : 0) #define IPR_TYPE_AF_DISK 0xC #define IPR_TYPE_ADAPTER 0x1f +#define IPR_TYPE_ARRAY 0x1f #define IPR_TYPE_EMPTY_SLOT 0xff #define IPR_ACTIVE_OPTIMIZED 0x0 @@ -3003,6 +3004,15 @@ static inline int ipr_is_array_record(in return 1; else return 0; +} + +static inline int ipr_is_ioa(struct ipr_dev *device) +{ + if (device->ioa && device->ioa->ioa.scsi_dev_data && + device->scsi_dev_data == device->ioa->ioa.scsi_dev_data) + return 1; + else + return 0; } static inline int ipr_is_af_dasd_device(struct ipr_dev *device) _ ------------------------------------------------------------------------------ The Command Line: Reinvented for Modern Developers Did the resurgence of CLI tooling catch you by surprise? Reconnect with the command line and become more productive. Learn the new .NET and ASP.NET CLI. Get your free copy! http://sdm.link/telerik _______________________________________________ Iprdd-devel mailing list Iprdd-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iprdd-devel