[SCSI] ipr: Improved dual adapter errors
Formats ipr dual adapter errors so that they are more compact. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
22d2e402d1
commit
8cf093e275
1 changed files with 72 additions and 6 deletions
|
@ -952,6 +952,53 @@ static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* strip_and_pad_whitespace - Strip and pad trailing whitespace.
|
||||||
|
* @i: index into buffer
|
||||||
|
* @buf: string to modify
|
||||||
|
*
|
||||||
|
* This function will strip all trailing whitespace, pad the end
|
||||||
|
* of the string with a single space, and NULL terminate the string.
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* new length of string
|
||||||
|
**/
|
||||||
|
static int strip_and_pad_whitespace(int i, char *buf)
|
||||||
|
{
|
||||||
|
while (i && buf[i] == ' ')
|
||||||
|
i--;
|
||||||
|
buf[i+1] = ' ';
|
||||||
|
buf[i+2] = '\0';
|
||||||
|
return i + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ipr_log_vpd_compact - Log the passed extended VPD compactly.
|
||||||
|
* @prefix: string to print at start of printk
|
||||||
|
* @hostrcb: hostrcb pointer
|
||||||
|
* @vpd: vendor/product id/sn struct
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* none
|
||||||
|
**/
|
||||||
|
static void ipr_log_vpd_compact(char *prefix, struct ipr_hostrcb *hostrcb,
|
||||||
|
struct ipr_vpd *vpd)
|
||||||
|
{
|
||||||
|
char buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN + IPR_SERIAL_NUM_LEN + 3];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN);
|
||||||
|
i = strip_and_pad_whitespace(IPR_VENDOR_ID_LEN - 1, buffer);
|
||||||
|
|
||||||
|
memcpy(&buffer[i], vpd->vpids.product_id, IPR_PROD_ID_LEN);
|
||||||
|
i = strip_and_pad_whitespace(i + IPR_PROD_ID_LEN - 1, buffer);
|
||||||
|
|
||||||
|
memcpy(&buffer[i], vpd->sn, IPR_SERIAL_NUM_LEN);
|
||||||
|
buffer[IPR_SERIAL_NUM_LEN + i] = '\0';
|
||||||
|
|
||||||
|
ipr_hcam_err(hostrcb, "%s VPID/SN: %s\n", prefix, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ipr_log_vpd - Log the passed VPD to the error log.
|
* ipr_log_vpd - Log the passed VPD to the error log.
|
||||||
* @vpd: vendor/product id/sn struct
|
* @vpd: vendor/product id/sn struct
|
||||||
|
@ -975,6 +1022,23 @@ static void ipr_log_vpd(struct ipr_vpd *vpd)
|
||||||
ipr_err(" Serial Number: %s\n", buffer);
|
ipr_err(" Serial Number: %s\n", buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ipr_log_ext_vpd_compact - Log the passed extended VPD compactly.
|
||||||
|
* @prefix: string to print at start of printk
|
||||||
|
* @hostrcb: hostrcb pointer
|
||||||
|
* @vpd: vendor/product id/sn/wwn struct
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* none
|
||||||
|
**/
|
||||||
|
static void ipr_log_ext_vpd_compact(char *prefix, struct ipr_hostrcb *hostrcb,
|
||||||
|
struct ipr_ext_vpd *vpd)
|
||||||
|
{
|
||||||
|
ipr_log_vpd_compact(prefix, hostrcb, &vpd->vpd);
|
||||||
|
ipr_hcam_err(hostrcb, "%s WWN: %08X%08X\n", prefix,
|
||||||
|
be32_to_cpu(vpd->wwid[0]), be32_to_cpu(vpd->wwid[1]));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ipr_log_ext_vpd - Log the passed extended VPD to the error log.
|
* ipr_log_ext_vpd - Log the passed extended VPD to the error log.
|
||||||
* @vpd: vendor/product id/sn/wwn struct
|
* @vpd: vendor/product id/sn/wwn struct
|
||||||
|
@ -1289,10 +1353,11 @@ static void ipr_log_enhanced_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg,
|
||||||
|
|
||||||
error = &hostrcb->hcam.u.error.u.type_17_error;
|
error = &hostrcb->hcam.u.error.u.type_17_error;
|
||||||
error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
|
error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
|
||||||
|
strstrip(error->failure_reason);
|
||||||
|
|
||||||
ipr_err("%s\n", error->failure_reason);
|
ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n", error->failure_reason,
|
||||||
ipr_err("Remote Adapter VPD:\n");
|
be32_to_cpu(hostrcb->hcam.u.error.prc));
|
||||||
ipr_log_ext_vpd(&error->vpd);
|
ipr_log_ext_vpd_compact("Remote IOA", hostrcb, &error->vpd);
|
||||||
ipr_log_hex_data(ioa_cfg, error->data,
|
ipr_log_hex_data(ioa_cfg, error->data,
|
||||||
be32_to_cpu(hostrcb->hcam.length) -
|
be32_to_cpu(hostrcb->hcam.length) -
|
||||||
(offsetof(struct ipr_hostrcb_error, u) +
|
(offsetof(struct ipr_hostrcb_error, u) +
|
||||||
|
@ -1314,10 +1379,11 @@ static void ipr_log_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg,
|
||||||
|
|
||||||
error = &hostrcb->hcam.u.error.u.type_07_error;
|
error = &hostrcb->hcam.u.error.u.type_07_error;
|
||||||
error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
|
error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
|
||||||
|
strstrip(error->failure_reason);
|
||||||
|
|
||||||
ipr_err("%s\n", error->failure_reason);
|
ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n", error->failure_reason,
|
||||||
ipr_err("Remote Adapter VPD:\n");
|
be32_to_cpu(hostrcb->hcam.u.error.prc));
|
||||||
ipr_log_vpd(&error->vpd);
|
ipr_log_vpd_compact("Remote IOA", hostrcb, &error->vpd);
|
||||||
ipr_log_hex_data(ioa_cfg, error->data,
|
ipr_log_hex_data(ioa_cfg, error->data,
|
||||||
be32_to_cpu(hostrcb->hcam.length) -
|
be32_to_cpu(hostrcb->hcam.length) -
|
||||||
(offsetof(struct ipr_hostrcb_error, u) +
|
(offsetof(struct ipr_hostrcb_error, u) +
|
||||||
|
|
Loading…
Add table
Reference in a new issue