Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: [SCSI] ibmvscsi: Fix oops when an interrupt is pending during probe [SCSI] zfcp: Update status read mempool [SCSI] zfcp: Do not wait for SBALs on stopped queue [SCSI] zfcp: Fix check whether unchained ct_els is possible [SCSI] ipr: fix resource path display and formatting
This commit is contained in:
commit
2fa82e1f10
|
@ -714,6 +714,14 @@ static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *act)
|
||||||
if (zfcp_erp_adapter_strategy_open_fsf_xport(act) == ZFCP_ERP_FAILED)
|
if (zfcp_erp_adapter_strategy_open_fsf_xport(act) == ZFCP_ERP_FAILED)
|
||||||
return ZFCP_ERP_FAILED;
|
return ZFCP_ERP_FAILED;
|
||||||
|
|
||||||
|
if (mempool_resize(act->adapter->pool.status_read_data,
|
||||||
|
act->adapter->stat_read_buf_num, GFP_KERNEL))
|
||||||
|
return ZFCP_ERP_FAILED;
|
||||||
|
|
||||||
|
if (mempool_resize(act->adapter->pool.status_read_req,
|
||||||
|
act->adapter->stat_read_buf_num, GFP_KERNEL))
|
||||||
|
return ZFCP_ERP_FAILED;
|
||||||
|
|
||||||
atomic_set(&act->adapter->stat_miss, act->adapter->stat_read_buf_num);
|
atomic_set(&act->adapter->stat_miss, act->adapter->stat_read_buf_num);
|
||||||
if (zfcp_status_read_refill(act->adapter))
|
if (zfcp_status_read_refill(act->adapter))
|
||||||
return ZFCP_ERP_FAILED;
|
return ZFCP_ERP_FAILED;
|
||||||
|
|
|
@ -496,7 +496,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
|
||||||
|
|
||||||
adapter->hydra_version = bottom->adapter_type;
|
adapter->hydra_version = bottom->adapter_type;
|
||||||
adapter->timer_ticks = bottom->timer_interval;
|
adapter->timer_ticks = bottom->timer_interval;
|
||||||
adapter->stat_read_buf_num = max(bottom->status_read_buf_num, (u16)16);
|
adapter->stat_read_buf_num = max(bottom->status_read_buf_num,
|
||||||
|
(u16)FSF_STATUS_READS_RECOM);
|
||||||
|
|
||||||
if (fc_host_permanent_port_name(shost) == -1)
|
if (fc_host_permanent_port_name(shost) == -1)
|
||||||
fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
|
fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
|
||||||
|
@ -719,11 +720,6 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio,
|
||||||
zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype,
|
zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype,
|
||||||
req->qtcb, sizeof(struct fsf_qtcb));
|
req->qtcb, sizeof(struct fsf_qtcb));
|
||||||
|
|
||||||
if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) {
|
|
||||||
zfcp_fsf_req_free(req);
|
|
||||||
return ERR_PTR(-EIO);
|
|
||||||
}
|
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -981,7 +977,7 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* use single, unchained SBAL if it can hold the request */
|
/* use single, unchained SBAL if it can hold the request */
|
||||||
if (zfcp_qdio_sg_one_sbale(sg_req) || zfcp_qdio_sg_one_sbale(sg_resp)) {
|
if (zfcp_qdio_sg_one_sbale(sg_req) && zfcp_qdio_sg_one_sbale(sg_resp)) {
|
||||||
zfcp_fsf_setup_ct_els_unchained(adapter->qdio, &req->qdio_req,
|
zfcp_fsf_setup_ct_els_unchained(adapter->qdio, &req->qdio_req,
|
||||||
sg_req, sg_resp);
|
sg_req, sg_resp);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -251,7 +251,8 @@ static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio)
|
||||||
struct zfcp_qdio_queue *req_q = &qdio->req_q;
|
struct zfcp_qdio_queue *req_q = &qdio->req_q;
|
||||||
|
|
||||||
spin_lock_bh(&qdio->req_q_lock);
|
spin_lock_bh(&qdio->req_q_lock);
|
||||||
if (atomic_read(&req_q->count))
|
if (atomic_read(&req_q->count) ||
|
||||||
|
!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
|
||||||
return 1;
|
return 1;
|
||||||
spin_unlock_bh(&qdio->req_q_lock);
|
spin_unlock_bh(&qdio->req_q_lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -274,8 +275,13 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
|
||||||
spin_unlock_bh(&qdio->req_q_lock);
|
spin_unlock_bh(&qdio->req_q_lock);
|
||||||
ret = wait_event_interruptible_timeout(qdio->req_q_wq,
|
ret = wait_event_interruptible_timeout(qdio->req_q_wq,
|
||||||
zfcp_qdio_sbal_check(qdio), 5 * HZ);
|
zfcp_qdio_sbal_check(qdio), 5 * HZ);
|
||||||
|
|
||||||
|
if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
atomic_inc(&qdio->req_q_full);
|
atomic_inc(&qdio->req_q_full);
|
||||||
/* assume hanging outbound queue, try queue recovery */
|
/* assume hanging outbound queue, try queue recovery */
|
||||||
|
@ -375,6 +381,8 @@ void zfcp_qdio_close(struct zfcp_qdio *qdio)
|
||||||
atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status);
|
atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status);
|
||||||
spin_unlock_bh(&qdio->req_q_lock);
|
spin_unlock_bh(&qdio->req_q_lock);
|
||||||
|
|
||||||
|
wake_up(&qdio->req_q_wq);
|
||||||
|
|
||||||
qdio_shutdown(qdio->adapter->ccw_device,
|
qdio_shutdown(qdio->adapter->ccw_device,
|
||||||
QDIO_FLAG_CLEANUP_USING_CLEAR);
|
QDIO_FLAG_CLEANUP_USING_CLEAR);
|
||||||
|
|
||||||
|
|
|
@ -277,6 +277,12 @@ static int rpavscsi_init_crq_queue(struct crq_queue *queue,
|
||||||
goto reg_crq_failed;
|
goto reg_crq_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
queue->cur = 0;
|
||||||
|
spin_lock_init(&queue->lock);
|
||||||
|
|
||||||
|
tasklet_init(&hostdata->srp_task, (void *)rpavscsi_task,
|
||||||
|
(unsigned long)hostdata);
|
||||||
|
|
||||||
if (request_irq(vdev->irq,
|
if (request_irq(vdev->irq,
|
||||||
rpavscsi_handle_event,
|
rpavscsi_handle_event,
|
||||||
0, "ibmvscsi", (void *)hostdata) != 0) {
|
0, "ibmvscsi", (void *)hostdata) != 0) {
|
||||||
|
@ -291,15 +297,10 @@ static int rpavscsi_init_crq_queue(struct crq_queue *queue,
|
||||||
goto req_irq_failed;
|
goto req_irq_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
queue->cur = 0;
|
|
||||||
spin_lock_init(&queue->lock);
|
|
||||||
|
|
||||||
tasklet_init(&hostdata->srp_task, (void *)rpavscsi_task,
|
|
||||||
(unsigned long)hostdata);
|
|
||||||
|
|
||||||
return retrc;
|
return retrc;
|
||||||
|
|
||||||
req_irq_failed:
|
req_irq_failed:
|
||||||
|
tasklet_kill(&hostdata->srp_task);
|
||||||
do {
|
do {
|
||||||
rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
|
rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
|
||||||
} while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
|
} while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
|
||||||
|
|
|
@ -1129,20 +1129,22 @@ static int ipr_is_same_device(struct ipr_resource_entry *res,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ipr_format_resource_path - Format the resource path for printing.
|
* ipr_format_res_path - Format the resource path for printing.
|
||||||
* @res_path: resource path
|
* @res_path: resource path
|
||||||
* @buf: buffer
|
* @buf: buffer
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* pointer to buffer
|
* pointer to buffer
|
||||||
**/
|
**/
|
||||||
static char *ipr_format_resource_path(u8 *res_path, char *buffer)
|
static char *ipr_format_res_path(u8 *res_path, char *buffer, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
char *p = buffer;
|
||||||
|
|
||||||
sprintf(buffer, "%02X", res_path[0]);
|
res_path[0] = '\0';
|
||||||
for (i=1; res_path[i] != 0xff; i++)
|
p += snprintf(p, buffer + len - p, "%02X", res_path[0]);
|
||||||
sprintf(buffer, "%s-%02X", buffer, res_path[i]);
|
for (i = 1; res_path[i] != 0xff && ((i * 3) < len); i++)
|
||||||
|
p += snprintf(p, buffer + len - p, "-%02X", res_path[i]);
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
@ -1187,7 +1189,8 @@ static void ipr_update_res_entry(struct ipr_resource_entry *res,
|
||||||
|
|
||||||
if (res->sdev && new_path)
|
if (res->sdev && new_path)
|
||||||
sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n",
|
sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n",
|
||||||
ipr_format_resource_path(&res->res_path[0], &buffer[0]));
|
ipr_format_res_path(res->res_path, buffer,
|
||||||
|
sizeof(buffer)));
|
||||||
} else {
|
} else {
|
||||||
res->flags = cfgtew->u.cfgte->flags;
|
res->flags = cfgtew->u.cfgte->flags;
|
||||||
if (res->flags & IPR_IS_IOA_RESOURCE)
|
if (res->flags & IPR_IS_IOA_RESOURCE)
|
||||||
|
@ -1573,7 +1576,8 @@ static void ipr_log_sis64_config_error(struct ipr_ioa_cfg *ioa_cfg,
|
||||||
ipr_err_separator;
|
ipr_err_separator;
|
||||||
|
|
||||||
ipr_err("Device %d : %s", i + 1,
|
ipr_err("Device %d : %s", i + 1,
|
||||||
ipr_format_resource_path(&dev_entry->res_path[0], &buffer[0]));
|
ipr_format_res_path(dev_entry->res_path, buffer,
|
||||||
|
sizeof(buffer)));
|
||||||
ipr_log_ext_vpd(&dev_entry->vpd);
|
ipr_log_ext_vpd(&dev_entry->vpd);
|
||||||
|
|
||||||
ipr_err("-----New Device Information-----\n");
|
ipr_err("-----New Device Information-----\n");
|
||||||
|
@ -1919,13 +1923,14 @@ static void ipr_log64_fabric_path(struct ipr_hostrcb *hostrcb,
|
||||||
|
|
||||||
ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s\n",
|
ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s\n",
|
||||||
path_active_desc[i].desc, path_state_desc[j].desc,
|
path_active_desc[i].desc, path_state_desc[j].desc,
|
||||||
ipr_format_resource_path(&fabric->res_path[0], &buffer[0]));
|
ipr_format_res_path(fabric->res_path, buffer,
|
||||||
|
sizeof(buffer)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ipr_err("Path state=%02X Resource Path=%s\n", path_state,
|
ipr_err("Path state=%02X Resource Path=%s\n", path_state,
|
||||||
ipr_format_resource_path(&fabric->res_path[0], &buffer[0]));
|
ipr_format_res_path(fabric->res_path, buffer, sizeof(buffer)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
|
@ -2066,7 +2071,8 @@ 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",
|
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,
|
path_status_desc[j].desc, path_type_desc[i].desc,
|
||||||
ipr_format_resource_path(&cfg->res_path[0], &buffer[0]),
|
ipr_format_res_path(cfg->res_path, buffer,
|
||||||
|
sizeof(buffer)),
|
||||||
link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
|
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;
|
return;
|
||||||
|
@ -2074,7 +2080,7 @@ static void ipr_log64_path_elem(struct ipr_hostrcb *hostrcb,
|
||||||
}
|
}
|
||||||
ipr_hcam_err(hostrcb, "Path element=%02X: Resource Path=%s, Link rate=%s "
|
ipr_hcam_err(hostrcb, "Path element=%02X: Resource Path=%s, Link rate=%s "
|
||||||
"WWN=%08X%08X\n", cfg->type_status,
|
"WWN=%08X%08X\n", cfg->type_status,
|
||||||
ipr_format_resource_path(&cfg->res_path[0], &buffer[0]),
|
ipr_format_res_path(cfg->res_path, buffer, sizeof(buffer)),
|
||||||
link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
|
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]));
|
||||||
}
|
}
|
||||||
|
@ -2139,7 +2145,7 @@ static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg,
|
||||||
|
|
||||||
ipr_err("RAID %s Array Configuration: %s\n",
|
ipr_err("RAID %s Array Configuration: %s\n",
|
||||||
error->protection_level,
|
error->protection_level,
|
||||||
ipr_format_resource_path(&error->last_res_path[0], &buffer[0]));
|
ipr_format_res_path(error->last_res_path, buffer, sizeof(buffer)));
|
||||||
|
|
||||||
ipr_err_separator;
|
ipr_err_separator;
|
||||||
|
|
||||||
|
@ -2160,9 +2166,11 @@ static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg,
|
||||||
ipr_err("Array Member %d:\n", i);
|
ipr_err("Array Member %d:\n", i);
|
||||||
ipr_log_ext_vpd(&array_entry->vpd);
|
ipr_log_ext_vpd(&array_entry->vpd);
|
||||||
ipr_err("Current Location: %s",
|
ipr_err("Current Location: %s",
|
||||||
ipr_format_resource_path(&array_entry->res_path[0], &buffer[0]));
|
ipr_format_res_path(array_entry->res_path, buffer,
|
||||||
|
sizeof(buffer)));
|
||||||
ipr_err("Expected Location: %s",
|
ipr_err("Expected Location: %s",
|
||||||
ipr_format_resource_path(&array_entry->expected_res_path[0], &buffer[0]));
|
ipr_format_res_path(array_entry->expected_res_path,
|
||||||
|
buffer, sizeof(buffer)));
|
||||||
|
|
||||||
ipr_err_separator;
|
ipr_err_separator;
|
||||||
}
|
}
|
||||||
|
@ -4079,7 +4087,8 @@ static struct device_attribute ipr_adapter_handle_attr = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ipr_show_resource_path - Show the resource path for this device.
|
* ipr_show_resource_path - Show the resource path or the resource address for
|
||||||
|
* this device.
|
||||||
* @dev: device struct
|
* @dev: device struct
|
||||||
* @buf: buffer
|
* @buf: buffer
|
||||||
*
|
*
|
||||||
|
@ -4097,9 +4106,14 @@ static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribut
|
||||||
|
|
||||||
spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
|
spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
|
||||||
res = (struct ipr_resource_entry *)sdev->hostdata;
|
res = (struct ipr_resource_entry *)sdev->hostdata;
|
||||||
if (res)
|
if (res && ioa_cfg->sis64)
|
||||||
len = snprintf(buf, PAGE_SIZE, "%s\n",
|
len = snprintf(buf, PAGE_SIZE, "%s\n",
|
||||||
ipr_format_resource_path(&res->res_path[0], &buffer[0]));
|
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,
|
||||||
|
res->bus, res->target, res->lun);
|
||||||
|
|
||||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
@ -4351,7 +4365,8 @@ static int ipr_slave_configure(struct scsi_device *sdev)
|
||||||
scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
|
scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
|
||||||
if (ioa_cfg->sis64)
|
if (ioa_cfg->sis64)
|
||||||
sdev_printk(KERN_INFO, sdev, "Resource path: %s\n",
|
sdev_printk(KERN_INFO, sdev, "Resource path: %s\n",
|
||||||
ipr_format_resource_path(&res->res_path[0], &buffer[0]));
|
ipr_format_res_path(res->res_path, buffer,
|
||||||
|
sizeof(buffer)));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||||
|
|
|
@ -1684,8 +1684,9 @@ struct ipr_ucode_image_header {
|
||||||
if (ipr_is_device(hostrcb)) { \
|
if (ipr_is_device(hostrcb)) { \
|
||||||
if ((hostrcb)->ioa_cfg->sis64) { \
|
if ((hostrcb)->ioa_cfg->sis64) { \
|
||||||
printk(KERN_ERR IPR_NAME ": %s: " fmt, \
|
printk(KERN_ERR IPR_NAME ": %s: " fmt, \
|
||||||
ipr_format_resource_path(&hostrcb->hcam.u.error64.fd_res_path[0], \
|
ipr_format_res_path(hostrcb->hcam.u.error64.fd_res_path, \
|
||||||
&hostrcb->rp_buffer[0]), \
|
hostrcb->rp_buffer, \
|
||||||
|
sizeof(hostrcb->rp_buffer)), \
|
||||||
__VA_ARGS__); \
|
__VA_ARGS__); \
|
||||||
} else { \
|
} else { \
|
||||||
ipr_ra_err((hostrcb)->ioa_cfg, \
|
ipr_ra_err((hostrcb)->ioa_cfg, \
|
||||||
|
|
Loading…
Reference in New Issue