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 <brking@linux.vnet.ibm.com>
This commit is contained in:
Brian King 2016-10-25 13:55:20 -05:00
commit bcfcda764d
3 changed files with 53 additions and 43 deletions

View file

@ -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 : "<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, 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);

View file

@ -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);

View file

@ -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) &&