[SCSI] ibmvfc: Log link up/down events
By default, ibmvfc does not log any async events in order to avoid flooding the log with them. Improve on this by logging by default events that are not likely to flood the log, such as link up/down. Having these events in the log will improve the ability to debug issues with ibmvfc. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
e6a4202aa9
commit
d99e5f488a
|
@ -2501,41 +2501,66 @@ static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
|
||||||
LEAVE;
|
LEAVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct {
|
static const struct ibmvfc_async_desc ae_desc [] = {
|
||||||
enum ibmvfc_async_event ae;
|
{ IBMVFC_AE_ELS_PLOGI, "PLOGI", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
|
||||||
const char *desc;
|
{ IBMVFC_AE_ELS_LOGO, "LOGO", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
|
||||||
} ae_desc [] = {
|
{ IBMVFC_AE_ELS_PRLO, "PRLO", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
|
||||||
{ IBMVFC_AE_ELS_PLOGI, "PLOGI" },
|
{ IBMVFC_AE_SCN_NPORT, "N-Port SCN", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
|
||||||
{ IBMVFC_AE_ELS_LOGO, "LOGO" },
|
{ IBMVFC_AE_SCN_GROUP, "Group SCN", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
|
||||||
{ IBMVFC_AE_ELS_PRLO, "PRLO" },
|
{ IBMVFC_AE_SCN_DOMAIN, "Domain SCN", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_SCN_NPORT, "N-Port SCN" },
|
{ IBMVFC_AE_SCN_FABRIC, "Fabric SCN", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_SCN_GROUP, "Group SCN" },
|
{ IBMVFC_AE_LINK_UP, "Link Up", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_SCN_DOMAIN, "Domain SCN" },
|
{ IBMVFC_AE_LINK_DOWN, "Link Down", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_SCN_FABRIC, "Fabric SCN" },
|
{ IBMVFC_AE_LINK_DEAD, "Link Dead", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_LINK_UP, "Link Up" },
|
{ IBMVFC_AE_HALT, "Halt", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_LINK_DOWN, "Link Down" },
|
{ IBMVFC_AE_RESUME, "Resume", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_LINK_DEAD, "Link Dead" },
|
{ IBMVFC_AE_ADAPTER_FAILED, "Adapter Failed", IBMVFC_DEFAULT_LOG_LEVEL },
|
||||||
{ IBMVFC_AE_HALT, "Halt" },
|
|
||||||
{ IBMVFC_AE_RESUME, "Resume" },
|
|
||||||
{ IBMVFC_AE_ADAPTER_FAILED, "Adapter Failed" },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *unknown_ae = "Unknown async";
|
static const struct ibmvfc_async_desc unknown_ae = {
|
||||||
|
0, "Unknown async", IBMVFC_DEFAULT_LOG_LEVEL
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ibmvfc_get_ae_desc - Get text description for async event
|
* ibmvfc_get_ae_desc - Get text description for async event
|
||||||
* @ae: async event
|
* @ae: async event
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
static const char *ibmvfc_get_ae_desc(u64 ae)
|
static const struct ibmvfc_async_desc *ibmvfc_get_ae_desc(u64 ae)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(ae_desc); i++)
|
for (i = 0; i < ARRAY_SIZE(ae_desc); i++)
|
||||||
if (ae_desc[i].ae == ae)
|
if (ae_desc[i].ae == ae)
|
||||||
return ae_desc[i].desc;
|
return &ae_desc[i];
|
||||||
|
|
||||||
return unknown_ae;
|
return &unknown_ae;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
enum ibmvfc_ae_link_state state;
|
||||||
|
const char *desc;
|
||||||
|
} link_desc [] = {
|
||||||
|
{ IBMVFC_AE_LS_LINK_UP, " link up" },
|
||||||
|
{ IBMVFC_AE_LS_LINK_BOUNCED, " link bounced" },
|
||||||
|
{ IBMVFC_AE_LS_LINK_DOWN, " link down" },
|
||||||
|
{ IBMVFC_AE_LS_LINK_DEAD, " link dead" },
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ibmvfc_get_link_state - Get text description for link state
|
||||||
|
* @state: link state
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
static const char *ibmvfc_get_link_state(enum ibmvfc_ae_link_state state)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(link_desc); i++)
|
||||||
|
if (link_desc[i].state == state)
|
||||||
|
return link_desc[i].desc;
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2547,11 +2572,12 @@ static const char *ibmvfc_get_ae_desc(u64 ae)
|
||||||
static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
|
static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
|
||||||
struct ibmvfc_host *vhost)
|
struct ibmvfc_host *vhost)
|
||||||
{
|
{
|
||||||
const char *desc = ibmvfc_get_ae_desc(crq->event);
|
const struct ibmvfc_async_desc *desc = ibmvfc_get_ae_desc(crq->event);
|
||||||
struct ibmvfc_target *tgt;
|
struct ibmvfc_target *tgt;
|
||||||
|
|
||||||
ibmvfc_log(vhost, 3, "%s event received. scsi_id: %llx, wwpn: %llx,"
|
ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx,"
|
||||||
" node_name: %llx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name);
|
" node_name: %llx%s\n", desc->desc, crq->scsi_id, crq->wwpn, crq->node_name,
|
||||||
|
ibmvfc_get_link_state(crq->link_state));
|
||||||
|
|
||||||
switch (crq->event) {
|
switch (crq->event) {
|
||||||
case IBMVFC_AE_RESUME:
|
case IBMVFC_AE_RESUME:
|
||||||
|
|
|
@ -541,6 +541,12 @@ enum ibmvfc_async_event {
|
||||||
IBMVFC_AE_ADAPTER_FAILED = 0x1000,
|
IBMVFC_AE_ADAPTER_FAILED = 0x1000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ibmvfc_async_desc {
|
||||||
|
enum ibmvfc_async_event ae;
|
||||||
|
const char *desc;
|
||||||
|
int log_level;
|
||||||
|
};
|
||||||
|
|
||||||
struct ibmvfc_crq {
|
struct ibmvfc_crq {
|
||||||
volatile u8 valid;
|
volatile u8 valid;
|
||||||
volatile u8 format;
|
volatile u8 format;
|
||||||
|
|
Loading…
Reference in a new issue