static struct fc_host_statistics * zfcp_scsi_get_fc_host_stats(struct Scsi_Host *host) { struct zfcp_adapter *adapter; struct fc_host_statistics *fc_stats; struct fsf_qtcb_bottom_port *data; int ret; adapter = (struct zfcp_adapter *)host->hostdata[0]; fc_stats = zfcp_scsi_init_fc_host_stats(adapter); if (!fc_stats) return NULL; data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) return NULL; ret = zfcp_fsf_exchange_port_data_sync(adapter->qdio, data); if (ret) { kfree(data); return NULL; } if (adapter->stats_reset && ((jiffies/HZ - adapter->stats_reset) < data->seconds_since_last_reset)) zfcp_scsi_adjust_fc_host_stats(fc_stats, data, adapter->stats_reset_data); else zfcp_scsi_set_fc_host_stats(fc_stats, data); kfree(data); return fc_stats; }
static void zfcp_reset_fc_host_stats(struct Scsi_Host *shost) { struct zfcp_adapter *adapter; struct fsf_qtcb_bottom_port *data; int ret; adapter = (struct zfcp_adapter *)shost->hostdata[0]; data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) return; ret = zfcp_fsf_exchange_port_data_sync(adapter->qdio, data); if (ret) kfree(data); else { adapter->stats_reset = jiffies/HZ; kfree(adapter->stats_reset_data); adapter->stats_reset_data = data; } }
static ssize_t zfcp_sysfs_adapter_util_show(struct device *dev, struct device_attribute *attr, char *buf) { struct Scsi_Host *scsi_host = dev_to_shost(dev); struct fsf_qtcb_bottom_port *qtcb_port; struct zfcp_adapter *adapter; int retval; adapter = (struct zfcp_adapter *) scsi_host->hostdata[0]; if (!(adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)) return -EOPNOTSUPP; qtcb_port = kzalloc(sizeof(struct fsf_qtcb_bottom_port), GFP_KERNEL); if (!qtcb_port) return -ENOMEM; retval = zfcp_fsf_exchange_port_data_sync(adapter->qdio, qtcb_port); if (!retval) retval = sprintf(buf, "%u %u %u\n", qtcb_port->cp_util, qtcb_port->cb_util, qtcb_port->a_util); kfree(qtcb_port); return retval; }