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:
parent
b841ac8371
commit
bcfcda764d
3 changed files with 53 additions and 43 deletions
68
iprconfig.c
68
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 : "<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);
|
||||
|
|
|
|||
18
iprlib.c
18
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);
|
||||
|
|
|
|||
10
iprlib.h
10
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) &&
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue