scsi: zfcp: implicitly refresh config-data diagnostics when reading sysfs
Adds implicit updates of cached diagnostics via Exchange Config Data when reading sysfs attributes interfacing them. Right now this only affects the new B2B-Credit diagnostic attribute. This uses the same mechanism previously also used for cached diagnostics of Exchange Port Data. Link: https://lore.kernel.org/r/60a94f55f2630b74b468fed5f39880208abb2679.1572018132.git.bblock@linux.ibm.com Reviewed-by: Steffen Maier <maier@linux.ibm.com> Signed-off-by: Benjamin Block <bblock@linux.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
5a2876f0d1
commit
8a72db70b5
@ -176,6 +176,36 @@ int zfcp_diag_update_port_data_buffer(struct zfcp_adapter *const adapter)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zfcp_diag_update_config_data_buffer() - Implementation of
|
||||||
|
* &typedef zfcp_diag_update_buffer_func
|
||||||
|
* to collect and update Config Data.
|
||||||
|
* @adapter: Adapter to collect Config Data from.
|
||||||
|
*
|
||||||
|
* This call is SYNCHRONOUS ! It blocks till the respective command has
|
||||||
|
* finished completely, or has failed in some way.
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* * 0 - Successfully retrieved new Diagnostics and Updated the buffer;
|
||||||
|
* this also includes cases where data was retrieved, but
|
||||||
|
* incomplete; you'll have to check the flag ``incomplete``
|
||||||
|
* of &struct zfcp_diag_header.
|
||||||
|
* * see zfcp_fsf_exchange_config_data_sync() for possible error-codes (
|
||||||
|
* excluding -EAGAIN)
|
||||||
|
*/
|
||||||
|
int zfcp_diag_update_config_data_buffer(struct zfcp_adapter *const adapter)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = zfcp_fsf_exchange_config_data_sync(adapter->qdio, NULL);
|
||||||
|
if (rc == -EAGAIN)
|
||||||
|
rc = 0; /* signaling incomplete via struct zfcp_diag_header */
|
||||||
|
|
||||||
|
/* buffer-data was updated in zfcp_fsf_exchange_config_data_handler() */
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static int __zfcp_diag_update_buffer(struct zfcp_adapter *const adapter,
|
static int __zfcp_diag_update_buffer(struct zfcp_adapter *const adapter,
|
||||||
struct zfcp_diag_header *const hdr,
|
struct zfcp_diag_header *const hdr,
|
||||||
zfcp_diag_update_buffer_func buffer_update,
|
zfcp_diag_update_buffer_func buffer_update,
|
||||||
|
@ -77,6 +77,7 @@ void zfcp_diag_update_xdata(struct zfcp_diag_header *const hdr,
|
|||||||
*/
|
*/
|
||||||
typedef int (*zfcp_diag_update_buffer_func)(struct zfcp_adapter *const adapter);
|
typedef int (*zfcp_diag_update_buffer_func)(struct zfcp_adapter *const adapter);
|
||||||
|
|
||||||
|
int zfcp_diag_update_config_data_buffer(struct zfcp_adapter *const adapter);
|
||||||
int zfcp_diag_update_port_data_buffer(struct zfcp_adapter *const adapter);
|
int zfcp_diag_update_port_data_buffer(struct zfcp_adapter *const adapter);
|
||||||
int zfcp_diag_update_buffer_limited(struct zfcp_adapter *const adapter,
|
int zfcp_diag_update_buffer_limited(struct zfcp_adapter *const adapter,
|
||||||
struct zfcp_diag_header *const hdr,
|
struct zfcp_diag_header *const hdr,
|
||||||
|
@ -687,6 +687,11 @@ static ssize_t zfcp_sysfs_adapter_diag_b2b_credit_show(
|
|||||||
|
|
||||||
diag_hdr = &adapter->diagnostics->config_data.header;
|
diag_hdr = &adapter->diagnostics->config_data.header;
|
||||||
|
|
||||||
|
rc = zfcp_diag_update_buffer_limited(
|
||||||
|
adapter, diag_hdr, zfcp_diag_update_config_data_buffer);
|
||||||
|
if (rc != 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
spin_lock_irqsave(&diag_hdr->access_lock, flags);
|
spin_lock_irqsave(&diag_hdr->access_lock, flags);
|
||||||
/* nport_serv_param doesn't contain the ELS_Command code */
|
/* nport_serv_param doesn't contain the ELS_Command code */
|
||||||
nsp = (struct fc_els_flogi *)((unsigned long)
|
nsp = (struct fc_els_flogi *)((unsigned long)
|
||||||
|
Loading…
Reference in New Issue
Block a user