Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3b3b407 authored by Brian King's avatar Brian King Committed by James Bottomley
Browse files

[SCSI] ipr: Resource path error logging cleanup



The resource path as displayed by the ipr driver is the
location string identifying a location on the SAS fabric.
This patch adds the SCSI host number such that error logs
can be more easily correlated in multiple adapter configurations.

Signed-off-by: default avatarBrian King <brking@linux.vnet.ibm.com>
Signed-off-by: default avatarWen Xiong <wenxiong@linux.vnet.ibm.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent a2e49cb2
Loading
Loading
Loading
Loading
+53 −25
Original line number Diff line number Diff line
@@ -1166,14 +1166,15 @@ static int ipr_is_same_device(struct ipr_resource_entry *res,
}

/**
 * ipr_format_res_path - Format the resource path for printing.
 * __ipr_format_res_path - Format the resource path for printing.
 * @res_path:	resource path
 * @buf:	buffer
 * @len:	length of buffer provided
 *
 * Return value:
 * 	pointer to buffer
 **/
static char *ipr_format_res_path(u8 *res_path, char *buffer, int len)
static char *__ipr_format_res_path(u8 *res_path, char *buffer, int len)
{
	int i;
	char *p = buffer;
@@ -1186,6 +1187,27 @@ static char *ipr_format_res_path(u8 *res_path, char *buffer, int len)
	return buffer;
}

/**
 * ipr_format_res_path - Format the resource path for printing.
 * @ioa_cfg:	ioa config struct
 * @res_path:	resource path
 * @buf:	buffer
 * @len:	length of buffer provided
 *
 * Return value:
 *	pointer to buffer
 **/
static char *ipr_format_res_path(struct ipr_ioa_cfg *ioa_cfg,
				 u8 *res_path, char *buffer, int len)
{
	char *p = buffer;

	*p = '\0';
	p += snprintf(p, buffer + len - p, "%d/", ioa_cfg->host->host_no);
	__ipr_format_res_path(res_path, p, len - (buffer - p));
	return buffer;
}

/**
 * ipr_update_res_entry - Update the resource entry.
 * @res:	resource entry struct
@@ -1226,8 +1248,8 @@ static void ipr_update_res_entry(struct ipr_resource_entry *res,

		if (res->sdev && new_path)
			sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n",
				    ipr_format_res_path(res->res_path, buffer,
							sizeof(buffer)));
				    ipr_format_res_path(res->ioa_cfg,
					res->res_path, buffer, sizeof(buffer)));
	} else {
		res->flags = cfgtew->u.cfgte->flags;
		if (res->flags & IPR_IS_IOA_RESOURCE)
@@ -1613,8 +1635,8 @@ static void ipr_log_sis64_config_error(struct ipr_ioa_cfg *ioa_cfg,
		ipr_err_separator;

		ipr_err("Device %d : %s", i + 1,
			 ipr_format_res_path(dev_entry->res_path, buffer,
					     sizeof(buffer)));
			__ipr_format_res_path(dev_entry->res_path,
					      buffer, sizeof(buffer)));
		ipr_log_ext_vpd(&dev_entry->vpd);

		ipr_err("-----New Device Information-----\n");
@@ -1960,14 +1982,16 @@ static void ipr_log64_fabric_path(struct ipr_hostrcb *hostrcb,

			ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s\n",
				     path_active_desc[i].desc, path_state_desc[j].desc,
				     ipr_format_res_path(fabric->res_path, buffer,
							 sizeof(buffer)));
				     ipr_format_res_path(hostrcb->ioa_cfg,
						fabric->res_path,
						buffer, sizeof(buffer)));
			return;
		}
	}

	ipr_err("Path state=%02X Resource Path=%s\n", path_state,
		ipr_format_res_path(fabric->res_path, buffer, sizeof(buffer)));
		ipr_format_res_path(hostrcb->ioa_cfg, fabric->res_path,
				    buffer, sizeof(buffer)));
}

static const struct {
@@ -2108,16 +2132,18 @@ static void ipr_log64_path_elem(struct ipr_hostrcb *hostrcb,

			ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s, Link rate=%s, WWN=%08X%08X\n",
				     path_status_desc[j].desc, path_type_desc[i].desc,
				     ipr_format_res_path(cfg->res_path, buffer,
							 sizeof(buffer)),
				     ipr_format_res_path(hostrcb->ioa_cfg,
					cfg->res_path, buffer, sizeof(buffer)),
					link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
				     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
					be32_to_cpu(cfg->wwid[0]),
					be32_to_cpu(cfg->wwid[1]));
			return;
		}
	}
	ipr_hcam_err(hostrcb, "Path element=%02X: Resource Path=%s, Link rate=%s "
		     "WWN=%08X%08X\n", cfg->type_status,
		     ipr_format_res_path(cfg->res_path, buffer, sizeof(buffer)),
		     ipr_format_res_path(hostrcb->ioa_cfg,
			cfg->res_path, buffer, sizeof(buffer)),
			link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
			be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
}
@@ -2182,7 +2208,8 @@ static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg,

	ipr_err("RAID %s Array Configuration: %s\n",
		error->protection_level,
		ipr_format_res_path(error->last_res_path, buffer, sizeof(buffer)));
		ipr_format_res_path(ioa_cfg, error->last_res_path,
			buffer, sizeof(buffer)));

	ipr_err_separator;

@@ -2203,10 +2230,11 @@ static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg,
		ipr_err("Array Member %d:\n", i);
		ipr_log_ext_vpd(&array_entry->vpd);
		ipr_err("Current Location: %s\n",
			 ipr_format_res_path(array_entry->res_path, buffer,
					     sizeof(buffer)));
			 ipr_format_res_path(ioa_cfg, array_entry->res_path,
				buffer, sizeof(buffer)));
		ipr_err("Expected Location: %s\n",
			 ipr_format_res_path(array_entry->expected_res_path,
			 ipr_format_res_path(ioa_cfg,
				array_entry->expected_res_path,
				buffer, sizeof(buffer)));

		ipr_err_separator;
@@ -4227,7 +4255,7 @@ static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribut
	res = (struct ipr_resource_entry *)sdev->hostdata;
	if (res && ioa_cfg->sis64)
		len = snprintf(buf, PAGE_SIZE, "%s\n",
			       ipr_format_res_path(res->res_path, buffer,
			       __ipr_format_res_path(res->res_path, buffer,
						     sizeof(buffer)));
	else if (res)
		len = snprintf(buf, PAGE_SIZE, "%d:%d:%d:%d\n", ioa_cfg->host->host_no,
@@ -4556,8 +4584,8 @@ static int ipr_slave_configure(struct scsi_device *sdev)
			scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
		if (ioa_cfg->sis64)
			sdev_printk(KERN_INFO, sdev, "Resource path: %s\n",
				    ipr_format_res_path(res->res_path, buffer,
							sizeof(buffer)));
				    ipr_format_res_path(ioa_cfg,
				res->res_path, buffer, sizeof(buffer)));
		return 0;
	}
	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+3 −2
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ struct ipr_config_table_entry64 {
	__be64 dev_id;
	__be64 lun;
	__be64 lun_wwn[2];
#define IPR_MAX_RES_PATH_LENGTH		24
#define IPR_MAX_RES_PATH_LENGTH		48
	__be64 res_path;
	struct ipr_std_inq_data std_inq_data;
	u8 reserved2[4];
@@ -1722,7 +1722,8 @@ struct ipr_ucode_image_header {
	if (ipr_is_device(hostrcb)) {					\
		if ((hostrcb)->ioa_cfg->sis64) {			\
			printk(KERN_ERR IPR_NAME ": %s: " fmt, 		\
				ipr_format_res_path(hostrcb->hcam.u.error64.fd_res_path, \
				ipr_format_res_path(hostrcb->ioa_cfg,	\
					hostrcb->hcam.u.error64.fd_res_path, \
					hostrcb->rp_buffer,		\
					sizeof(hostrcb->rp_buffer)),	\
				__VA_ARGS__);				\