From bcfcda764d10ff15e67161d1f0ea08af1f13f7d9 Mon Sep 17 00:00:00 2001 From: Brian King Date: Tue, 25 Oct 2016 13:55:20 -0500 Subject: [PATCH] iprutils: Fix iprconfig dump option to log full IOA details 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 --- iprconfig.c | 68 ++++++++++++++++++++++++++--------------------------- iprlib.c | 18 +++++++------- iprlib.h | 10 ++++++++ 3 files changed, 53 insertions(+), 43 deletions(-) diff --git a/iprconfig.c b/iprconfig.c index e993e6c..15963f7 100644 --- a/iprconfig.c +++ b/iprconfig.c @@ -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 *dev, struct ipr_fw_images *fw_image) 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 *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 *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 *dev, char *buf, int percent, int path_sta 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, char *body, char *option, 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, char *body, char *option, scsi_dev_data->res_path : ""); 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, char *body, char *option, } } - 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, int num_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, int num_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, int num_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, int num_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, int num_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, int num_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, int num_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, int num_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(char **args, int num_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; } @@ -17229,9 +17228,7 @@ static void show_dev_details(struct ipr_dev *dev) { 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(char *dev_name, int mode) 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, int num_args) 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, int num_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, int num_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 **args, int num_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; } @@ -18248,7 +18245,7 @@ static int query_array_rebuild_verify(char **args, int num_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; } @@ -18285,7 +18282,7 @@ static int set_array_rebuild_rate(char**args, int num_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; } @@ -18349,7 +18346,7 @@ static int query_array_rebuild_rate(char**args, int num_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; } @@ -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 **args, int num_args) 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 **args, int num_args) 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_args) 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 --git a/iprlib.c b/iprlib.c index f0f7998..e8ea60f 100644 --- a/iprlib.c +++ b/iprlib.c @@ -6627,9 +6627,12 @@ void check_current_config(bool allow_rebuild_refresh) 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_rebuild_refresh) __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_image(struct ipr_dev *dev) 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 ipr_dev *dev) 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 --git a/iprlib.h b/iprlib.h index af26a60..27f32eb 100644 --- a/iprlib.h +++ b/iprlib.h @@ -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 @@ -3005,6 +3006,15 @@ static inline int ipr_is_array_record(int record_id) 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) { if ((device->qac_entry != NULL) &&