Merge branch '5.12/scsi-fixes' into 5.13/scsi-staging
Pull 5.12/scsi-fixes into the 5.13 SCSI tree to provide a baseline for some UFS changes that would otherwise cause conflicts during the merge. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Коммит
556666bce1
|
@ -19165,7 +19165,7 @@ S: Maintained
|
|||
F: drivers/infiniband/hw/vmw_pvrdma/
|
||||
|
||||
VMware PVSCSI driver
|
||||
M: Jim Gill <jgill@vmware.com>
|
||||
M: Vishal Bhakta <vbhakta@vmware.com>
|
||||
M: VMware PV-Drivers <pv-drivers@vmware.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/bsg-lib.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/vio.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
|
@ -158,6 +159,9 @@ static void ibmvfc_npiv_logout(struct ibmvfc_host *);
|
|||
static void ibmvfc_tgt_implicit_logout_and_del(struct ibmvfc_target *);
|
||||
static void ibmvfc_tgt_move_login(struct ibmvfc_target *);
|
||||
|
||||
static void ibmvfc_release_sub_crqs(struct ibmvfc_host *);
|
||||
static void ibmvfc_init_sub_crqs(struct ibmvfc_host *);
|
||||
|
||||
static const char *unknown_error = "unknown error";
|
||||
|
||||
static long h_reg_sub_crq(unsigned long unit_address, unsigned long ioba,
|
||||
|
@ -901,6 +905,9 @@ static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
|
|||
{
|
||||
int rc = 0;
|
||||
struct vio_dev *vdev = to_vio_dev(vhost->dev);
|
||||
unsigned long flags;
|
||||
|
||||
ibmvfc_release_sub_crqs(vhost);
|
||||
|
||||
/* Re-enable the CRQ */
|
||||
do {
|
||||
|
@ -912,6 +919,15 @@ static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
|
|||
if (rc)
|
||||
dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc);
|
||||
|
||||
spin_lock_irqsave(vhost->host->host_lock, flags);
|
||||
spin_lock(vhost->crq.q_lock);
|
||||
vhost->do_enquiry = 1;
|
||||
vhost->using_channels = 0;
|
||||
spin_unlock(vhost->crq.q_lock);
|
||||
spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
||||
|
||||
ibmvfc_init_sub_crqs(vhost);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -928,8 +944,8 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
|
|||
unsigned long flags;
|
||||
struct vio_dev *vdev = to_vio_dev(vhost->dev);
|
||||
struct ibmvfc_queue *crq = &vhost->crq;
|
||||
struct ibmvfc_queue *scrq;
|
||||
int i;
|
||||
|
||||
ibmvfc_release_sub_crqs(vhost);
|
||||
|
||||
/* Close the CRQ */
|
||||
do {
|
||||
|
@ -949,16 +965,6 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
|
|||
memset(crq->msgs.crq, 0, PAGE_SIZE);
|
||||
crq->cur = 0;
|
||||
|
||||
if (vhost->scsi_scrqs.scrqs) {
|
||||
for (i = 0; i < nr_scsi_hw_queues; i++) {
|
||||
scrq = &vhost->scsi_scrqs.scrqs[i];
|
||||
spin_lock(scrq->q_lock);
|
||||
memset(scrq->msgs.scrq, 0, PAGE_SIZE);
|
||||
scrq->cur = 0;
|
||||
spin_unlock(scrq->q_lock);
|
||||
}
|
||||
}
|
||||
|
||||
/* And re-open it again */
|
||||
rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
|
||||
crq->msg_token, PAGE_SIZE);
|
||||
|
@ -968,9 +974,12 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
|
|||
dev_warn(vhost->dev, "Partner adapter not ready\n");
|
||||
else if (rc != 0)
|
||||
dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc);
|
||||
|
||||
spin_unlock(vhost->crq.q_lock);
|
||||
spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
||||
|
||||
ibmvfc_init_sub_crqs(vhost);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -2365,6 +2374,24 @@ static int ibmvfc_match_lun(struct ibmvfc_event *evt, void *device)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ibmvfc_event_is_free - Check if event is free or not
|
||||
* @evt: ibmvfc event struct
|
||||
*
|
||||
* Returns:
|
||||
* true / false
|
||||
**/
|
||||
static bool ibmvfc_event_is_free(struct ibmvfc_event *evt)
|
||||
{
|
||||
struct ibmvfc_event *loop_evt;
|
||||
|
||||
list_for_each_entry(loop_evt, &evt->queue->free, queue_list)
|
||||
if (loop_evt == evt)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* ibmvfc_wait_for_ops - Wait for ops to complete
|
||||
* @vhost: ibmvfc host struct
|
||||
|
@ -2379,35 +2406,58 @@ static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device,
|
|||
{
|
||||
struct ibmvfc_event *evt;
|
||||
DECLARE_COMPLETION_ONSTACK(comp);
|
||||
int wait;
|
||||
int wait, i, q_index, q_size;
|
||||
unsigned long flags;
|
||||
signed long timeout = IBMVFC_ABORT_WAIT_TIMEOUT * HZ;
|
||||
struct ibmvfc_queue *queues;
|
||||
|
||||
ENTER;
|
||||
if (vhost->mq_enabled && vhost->using_channels) {
|
||||
queues = vhost->scsi_scrqs.scrqs;
|
||||
q_size = vhost->scsi_scrqs.active_queues;
|
||||
} else {
|
||||
queues = &vhost->crq;
|
||||
q_size = 1;
|
||||
}
|
||||
|
||||
do {
|
||||
wait = 0;
|
||||
spin_lock_irqsave(&vhost->crq.l_lock, flags);
|
||||
list_for_each_entry(evt, &vhost->crq.sent, queue_list) {
|
||||
if (match(evt, device)) {
|
||||
evt->eh_comp = ∁
|
||||
wait++;
|
||||
spin_lock_irqsave(vhost->host->host_lock, flags);
|
||||
for (q_index = 0; q_index < q_size; q_index++) {
|
||||
spin_lock(&queues[q_index].l_lock);
|
||||
for (i = 0; i < queues[q_index].evt_pool.size; i++) {
|
||||
evt = &queues[q_index].evt_pool.events[i];
|
||||
if (!ibmvfc_event_is_free(evt)) {
|
||||
if (match(evt, device)) {
|
||||
evt->eh_comp = ∁
|
||||
wait++;
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&queues[q_index].l_lock);
|
||||
}
|
||||
spin_unlock_irqrestore(&vhost->crq.l_lock, flags);
|
||||
spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
||||
|
||||
if (wait) {
|
||||
timeout = wait_for_completion_timeout(&comp, timeout);
|
||||
|
||||
if (!timeout) {
|
||||
wait = 0;
|
||||
spin_lock_irqsave(&vhost->crq.l_lock, flags);
|
||||
list_for_each_entry(evt, &vhost->crq.sent, queue_list) {
|
||||
if (match(evt, device)) {
|
||||
evt->eh_comp = NULL;
|
||||
wait++;
|
||||
spin_lock_irqsave(vhost->host->host_lock, flags);
|
||||
for (q_index = 0; q_index < q_size; q_index++) {
|
||||
spin_lock(&queues[q_index].l_lock);
|
||||
for (i = 0; i < queues[q_index].evt_pool.size; i++) {
|
||||
evt = &queues[q_index].evt_pool.events[i];
|
||||
if (!ibmvfc_event_is_free(evt)) {
|
||||
if (match(evt, device)) {
|
||||
evt->eh_comp = NULL;
|
||||
wait++;
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&queues[q_index].l_lock);
|
||||
}
|
||||
spin_unlock_irqrestore(&vhost->crq.l_lock, flags);
|
||||
spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
||||
if (wait)
|
||||
dev_err(vhost->dev, "Timed out waiting for aborted commands\n");
|
||||
LEAVE;
|
||||
|
@ -5649,7 +5699,8 @@ static int ibmvfc_register_scsi_channel(struct ibmvfc_host *vhost,
|
|||
rc = h_reg_sub_crq(vdev->unit_address, scrq->msg_token, PAGE_SIZE,
|
||||
&scrq->cookie, &scrq->hw_irq);
|
||||
|
||||
if (rc) {
|
||||
/* H_CLOSED indicates successful register, but no CRQ partner */
|
||||
if (rc && rc != H_CLOSED) {
|
||||
dev_warn(dev, "Error registering sub-crq: %d\n", rc);
|
||||
if (rc == H_PARAMETER)
|
||||
dev_warn_once(dev, "Firmware may not support MQ\n");
|
||||
|
@ -5682,8 +5733,8 @@ static int ibmvfc_register_scsi_channel(struct ibmvfc_host *vhost,
|
|||
|
||||
irq_failed:
|
||||
do {
|
||||
plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, scrq->cookie);
|
||||
} while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
|
||||
rc = plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, scrq->cookie);
|
||||
} while (rtas_busy_delay(rc));
|
||||
reg_failed:
|
||||
ibmvfc_free_queue(vhost, scrq);
|
||||
LEAVE;
|
||||
|
@ -5701,6 +5752,7 @@ static void ibmvfc_deregister_scsi_channel(struct ibmvfc_host *vhost, int index)
|
|||
|
||||
free_irq(scrq->irq, scrq);
|
||||
irq_dispose_mapping(scrq->irq);
|
||||
scrq->irq = 0;
|
||||
|
||||
do {
|
||||
rc = plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address,
|
||||
|
@ -5714,17 +5766,21 @@ static void ibmvfc_deregister_scsi_channel(struct ibmvfc_host *vhost, int index)
|
|||
LEAVE;
|
||||
}
|
||||
|
||||
static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
|
||||
static void ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
ENTER;
|
||||
if (!vhost->mq_enabled)
|
||||
return;
|
||||
|
||||
vhost->scsi_scrqs.scrqs = kcalloc(nr_scsi_hw_queues,
|
||||
sizeof(*vhost->scsi_scrqs.scrqs),
|
||||
GFP_KERNEL);
|
||||
if (!vhost->scsi_scrqs.scrqs)
|
||||
return -1;
|
||||
if (!vhost->scsi_scrqs.scrqs) {
|
||||
vhost->do_enquiry = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_scsi_hw_queues; i++) {
|
||||
if (ibmvfc_register_scsi_channel(vhost, i)) {
|
||||
|
@ -5733,13 +5789,12 @@ static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
|
|||
kfree(vhost->scsi_scrqs.scrqs);
|
||||
vhost->scsi_scrqs.scrqs = NULL;
|
||||
vhost->scsi_scrqs.active_queues = 0;
|
||||
LEAVE;
|
||||
return -1;
|
||||
vhost->do_enquiry = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LEAVE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ibmvfc_release_sub_crqs(struct ibmvfc_host *vhost)
|
||||
|
@ -5777,6 +5832,8 @@ static void ibmvfc_free_mem(struct ibmvfc_host *vhost)
|
|||
vhost->disc_buf_dma);
|
||||
dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf),
|
||||
vhost->login_buf, vhost->login_buf_dma);
|
||||
dma_free_coherent(vhost->dev, sizeof(*vhost->channel_setup_buf),
|
||||
vhost->channel_setup_buf, vhost->channel_setup_dma);
|
||||
dma_pool_destroy(vhost->sg_pool);
|
||||
ibmvfc_free_queue(vhost, async_q);
|
||||
LEAVE;
|
||||
|
@ -6006,11 +6063,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
|
|||
goto remove_shost;
|
||||
}
|
||||
|
||||
if (vhost->mq_enabled) {
|
||||
rc = ibmvfc_init_sub_crqs(vhost);
|
||||
if (rc)
|
||||
dev_warn(dev, "Failed to allocate Sub-CRQs. rc=%d\n", rc);
|
||||
}
|
||||
ibmvfc_init_sub_crqs(vhost);
|
||||
|
||||
if (shost_to_fc_host(shost)->rqst_q)
|
||||
blk_queue_max_segments(shost_to_fc_host(shost)->rqst_q, 1);
|
||||
|
|
|
@ -2424,7 +2424,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
|||
memset(dstbuf, 0, 33);
|
||||
size = (nbytes < 32) ? nbytes : 32;
|
||||
if (copy_from_user(dstbuf, buf, size))
|
||||
return 0;
|
||||
return -EFAULT;
|
||||
|
||||
if (dent == phba->debug_InjErrLBA) {
|
||||
if ((dstbuf[0] == 'o') && (dstbuf[1] == 'f') &&
|
||||
|
@ -2433,7 +2433,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
|
|||
}
|
||||
|
||||
if ((tmp == 0) && (kstrtoull(dstbuf, 0, &tmp)))
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
if (dent == phba->debug_writeGuard)
|
||||
phba->lpfc_injerr_wgrd_cnt = (uint32_t)tmp;
|
||||
|
|
|
@ -7960,14 +7960,18 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
|
|||
ioc->pend_os_device_add_sz++;
|
||||
ioc->pend_os_device_add = kzalloc(ioc->pend_os_device_add_sz,
|
||||
GFP_KERNEL);
|
||||
if (!ioc->pend_os_device_add)
|
||||
if (!ioc->pend_os_device_add) {
|
||||
r = -ENOMEM;
|
||||
goto out_free_resources;
|
||||
}
|
||||
|
||||
ioc->device_remove_in_progress_sz = ioc->pend_os_device_add_sz;
|
||||
ioc->device_remove_in_progress =
|
||||
kzalloc(ioc->device_remove_in_progress_sz, GFP_KERNEL);
|
||||
if (!ioc->device_remove_in_progress)
|
||||
if (!ioc->device_remove_in_progress) {
|
||||
r = -ENOMEM;
|
||||
goto out_free_resources;
|
||||
}
|
||||
|
||||
ioc->fwfault_debug = mpt3sas_fwfault_debug;
|
||||
|
||||
|
|
|
@ -413,7 +413,7 @@ mpt3sas_get_port_by_id(struct MPT3SAS_ADAPTER *ioc,
|
|||
* And add this object to port_table_list.
|
||||
*/
|
||||
if (!ioc->multipath_on_hba) {
|
||||
port = kzalloc(sizeof(struct hba_port), GFP_KERNEL);
|
||||
port = kzalloc(sizeof(struct hba_port), GFP_ATOMIC);
|
||||
if (!port)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -2271,12 +2271,12 @@ static void myrs_cleanup(struct myrs_hba *cs)
|
|||
if (cs->mmio_base) {
|
||||
cs->disable_intr(cs);
|
||||
iounmap(cs->mmio_base);
|
||||
cs->mmio_base = NULL;
|
||||
}
|
||||
if (cs->irq)
|
||||
free_irq(cs->irq, cs);
|
||||
if (cs->io_addr)
|
||||
release_region(cs->io_addr, 0x80);
|
||||
iounmap(cs->mmio_base);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
pci_disable_device(pdev);
|
||||
scsi_host_put(cs->host);
|
||||
|
|
|
@ -1673,6 +1673,7 @@ static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
|
|||
if (!qedi->global_queues[i]) {
|
||||
QEDI_ERR(&qedi->dbg_ctx,
|
||||
"Unable to allocation global queue %d.\n", i);
|
||||
status = -ENOMEM;
|
||||
goto mem_alloc_failure;
|
||||
}
|
||||
|
||||
|
|
|
@ -3227,8 +3227,7 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
|
|||
if (!qpair->fw_started || (cmd->reset_count != qpair->chip_reset) ||
|
||||
(cmd->sess && cmd->sess->deleted)) {
|
||||
cmd->state = QLA_TGT_STATE_PROCESSED;
|
||||
res = 0;
|
||||
goto free;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ql_dbg_qp(ql_dbg_tgt, qpair, 0xe018,
|
||||
|
@ -3239,8 +3238,9 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
|
|||
|
||||
res = qlt_pre_xmit_response(cmd, &prm, xmit_type, scsi_status,
|
||||
&full_req_cnt);
|
||||
if (unlikely(res != 0))
|
||||
goto free;
|
||||
if (unlikely(res != 0)) {
|
||||
return res;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(qpair->qp_lock_ptr, flags);
|
||||
|
||||
|
@ -3260,8 +3260,7 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
|
|||
vha->flags.online, qla2x00_reset_active(vha),
|
||||
cmd->reset_count, qpair->chip_reset);
|
||||
spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
|
||||
res = 0;
|
||||
goto free;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Does F/W have an IOCBs for this request */
|
||||
|
@ -3364,8 +3363,6 @@ out_unmap_unlock:
|
|||
qlt_unmap_sg(vha, cmd);
|
||||
spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
|
||||
|
||||
free:
|
||||
vha->hw->tgt.tgt_ops->free_cmd(cmd);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL(qlt_xmit_response);
|
||||
|
|
|
@ -116,7 +116,6 @@
|
|||
(min(1270, ((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD_24XX + \
|
||||
QLA_TGT_DATASEGS_PER_CONT_24XX*((ql) - 1)) : 0))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha)) \
|
||||
? le16_to_cpu((iocb)->u.isp2x.target.extended) \
|
||||
|
@ -244,6 +243,7 @@ struct ctio_to_2xxx {
|
|||
#ifndef CTIO_RET_TYPE
|
||||
#define CTIO_RET_TYPE 0x17 /* CTIO return entry */
|
||||
#define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */
|
||||
#endif
|
||||
|
||||
struct fcp_hdr {
|
||||
uint8_t r_ctl;
|
||||
|
|
|
@ -653,7 +653,6 @@ static int tcm_qla2xxx_queue_data_in(struct se_cmd *se_cmd)
|
|||
{
|
||||
struct qla_tgt_cmd *cmd = container_of(se_cmd,
|
||||
struct qla_tgt_cmd, se_cmd);
|
||||
struct scsi_qla_host *vha = cmd->vha;
|
||||
|
||||
if (cmd->aborted) {
|
||||
/* Cmd can loop during Q-full. tcm_qla2xxx_aborted_task
|
||||
|
@ -666,7 +665,6 @@ static int tcm_qla2xxx_queue_data_in(struct se_cmd *se_cmd)
|
|||
cmd->se_cmd.transport_state,
|
||||
cmd->se_cmd.t_state,
|
||||
cmd->se_cmd.se_cmd_flags);
|
||||
vha->hw->tgt.tgt_ops->free_cmd(cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -694,7 +692,6 @@ static int tcm_qla2xxx_queue_status(struct se_cmd *se_cmd)
|
|||
{
|
||||
struct qla_tgt_cmd *cmd = container_of(se_cmd,
|
||||
struct qla_tgt_cmd, se_cmd);
|
||||
struct scsi_qla_host *vha = cmd->vha;
|
||||
int xmit_type = QLA_TGT_XMIT_STATUS;
|
||||
|
||||
if (cmd->aborted) {
|
||||
|
@ -708,7 +705,6 @@ static int tcm_qla2xxx_queue_status(struct se_cmd *se_cmd)
|
|||
cmd, kref_read(&cmd->se_cmd.cmd_kref),
|
||||
cmd->se_cmd.transport_state, cmd->se_cmd.t_state,
|
||||
cmd->se_cmd.se_cmd_flags);
|
||||
vha->hw->tgt.tgt_ops->free_cmd(cmd);
|
||||
return 0;
|
||||
}
|
||||
cmd->bufflen = se_cmd->data_length;
|
||||
|
|
|
@ -2471,6 +2471,7 @@ static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag)
|
|||
*/
|
||||
mutex_lock(&conn_mutex);
|
||||
conn->transport->stop_conn(conn, flag);
|
||||
conn->state = ISCSI_CONN_DOWN;
|
||||
mutex_unlock(&conn_mutex);
|
||||
|
||||
}
|
||||
|
@ -2894,6 +2895,13 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
|
|||
default:
|
||||
err = transport->set_param(conn, ev->u.set_param.param,
|
||||
data, ev->u.set_param.len);
|
||||
if ((conn->state == ISCSI_CONN_BOUND) ||
|
||||
(conn->state == ISCSI_CONN_UP)) {
|
||||
err = transport->set_param(conn, ev->u.set_param.param,
|
||||
data, ev->u.set_param.len);
|
||||
} else {
|
||||
return -ENOTCONN;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
|
@ -2953,6 +2961,7 @@ static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,
|
|||
mutex_lock(&conn->ep_mutex);
|
||||
conn->ep = NULL;
|
||||
mutex_unlock(&conn->ep_mutex);
|
||||
conn->state = ISCSI_CONN_DOWN;
|
||||
}
|
||||
|
||||
transport->ep_disconnect(ep);
|
||||
|
@ -3713,6 +3722,8 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
|
|||
ev->r.retcode = transport->bind_conn(session, conn,
|
||||
ev->u.b_conn.transport_eph,
|
||||
ev->u.b_conn.is_leading);
|
||||
if (!ev->r.retcode)
|
||||
conn->state = ISCSI_CONN_BOUND;
|
||||
mutex_unlock(&conn_mutex);
|
||||
|
||||
if (ev->r.retcode || !transport->ep_connect)
|
||||
|
@ -3944,7 +3955,8 @@ iscsi_conn_attr(local_ipaddr, ISCSI_PARAM_LOCAL_IPADDR);
|
|||
static const char *const connection_state_names[] = {
|
||||
[ISCSI_CONN_UP] = "up",
|
||||
[ISCSI_CONN_DOWN] = "down",
|
||||
[ISCSI_CONN_FAILED] = "failed"
|
||||
[ISCSI_CONN_FAILED] = "failed",
|
||||
[ISCSI_CONN_BOUND] = "bound"
|
||||
};
|
||||
|
||||
static ssize_t show_conn_state(struct device *dev,
|
||||
|
|
|
@ -280,27 +280,28 @@ static int sd_zbc_update_wp_offset_cb(struct blk_zone *zone, unsigned int idx,
|
|||
static void sd_zbc_update_wp_offset_workfn(struct work_struct *work)
|
||||
{
|
||||
struct scsi_disk *sdkp;
|
||||
unsigned long flags;
|
||||
unsigned int zno;
|
||||
int ret;
|
||||
|
||||
sdkp = container_of(work, struct scsi_disk, zone_wp_offset_work);
|
||||
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
for (zno = 0; zno < sdkp->nr_zones; zno++) {
|
||||
if (sdkp->zones_wp_offset[zno] != SD_ZBC_UPDATING_WP_OFST)
|
||||
continue;
|
||||
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
ret = sd_zbc_do_report_zones(sdkp, sdkp->zone_wp_update_buf,
|
||||
SD_BUF_SIZE,
|
||||
zno * sdkp->zone_blocks, true);
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
if (!ret)
|
||||
sd_zbc_parse_report(sdkp, sdkp->zone_wp_update_buf + 64,
|
||||
zno, sd_zbc_update_wp_offset_cb,
|
||||
sdkp);
|
||||
}
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
|
||||
scsi_device_put(sdkp->device);
|
||||
}
|
||||
|
@ -324,6 +325,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
|
|||
struct request *rq = cmd->request;
|
||||
struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
|
||||
unsigned int wp_offset, zno = blk_rq_zone_no(rq);
|
||||
unsigned long flags;
|
||||
blk_status_t ret;
|
||||
|
||||
ret = sd_zbc_cmnd_checks(cmd);
|
||||
|
@ -337,7 +339,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
|
|||
if (!blk_req_zone_write_trylock(rq))
|
||||
return BLK_STS_ZONE_RESOURCE;
|
||||
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
wp_offset = sdkp->zones_wp_offset[zno];
|
||||
switch (wp_offset) {
|
||||
case SD_ZBC_INVALID_WP_OFST:
|
||||
|
@ -366,7 +368,7 @@ blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba,
|
|||
|
||||
*lba += wp_offset;
|
||||
}
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
if (ret)
|
||||
blk_req_zone_write_unlock(rq);
|
||||
return ret;
|
||||
|
@ -445,6 +447,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
|
|||
struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
|
||||
unsigned int zno = blk_rq_zone_no(rq);
|
||||
enum req_opf op = req_op(rq);
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* If we got an error for a command that needs updating the write
|
||||
|
@ -452,7 +455,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
|
|||
* invalid to force an update from disk the next time a zone append
|
||||
* command is issued.
|
||||
*/
|
||||
spin_lock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_lock_irqsave(&sdkp->zones_wp_offset_lock, flags);
|
||||
|
||||
if (result && op != REQ_OP_ZONE_RESET_ALL) {
|
||||
if (op == REQ_OP_ZONE_APPEND) {
|
||||
|
@ -496,7 +499,7 @@ static unsigned int sd_zbc_zone_wp_update(struct scsi_cmnd *cmd,
|
|||
}
|
||||
|
||||
unlock_wp_offset:
|
||||
spin_unlock_bh(&sdkp->zones_wp_offset_lock);
|
||||
spin_unlock_irqrestore(&sdkp->zones_wp_offset_lock, flags);
|
||||
|
||||
return good_bytes;
|
||||
}
|
||||
|
|
|
@ -1269,8 +1269,8 @@ static int st_open(struct inode *inode, struct file *filp)
|
|||
spin_lock(&st_use_lock);
|
||||
if (STp->in_use) {
|
||||
spin_unlock(&st_use_lock);
|
||||
scsi_tape_put(STp);
|
||||
DEBC_printk(STp, "Device already in use.\n");
|
||||
scsi_tape_put(STp);
|
||||
return (-EBUSY);
|
||||
}
|
||||
|
||||
|
|
|
@ -911,7 +911,7 @@ static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
|
|||
if (!hba->vreg_info.vccq2 || !hba->vreg_info.vcc)
|
||||
return;
|
||||
|
||||
if (lpm & !hba->vreg_info.vcc->enabled)
|
||||
if (lpm && !hba->vreg_info.vcc->enabled)
|
||||
regulator_set_mode(hba->vreg_info.vccq2->reg,
|
||||
REGULATOR_MODE_IDLE);
|
||||
else if (!lpm)
|
||||
|
|
|
@ -253,12 +253,17 @@ static int ufs_qcom_host_reset(struct ufs_hba *hba)
|
|||
{
|
||||
int ret = 0;
|
||||
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
|
||||
bool reenable_intr = false;
|
||||
|
||||
if (!host->core_reset) {
|
||||
dev_warn(hba->dev, "%s: reset control not set\n", __func__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
reenable_intr = hba->is_irq_enabled;
|
||||
disable_irq(hba->irq);
|
||||
hba->is_irq_enabled = false;
|
||||
|
||||
ret = reset_control_assert(host->core_reset);
|
||||
if (ret) {
|
||||
dev_err(hba->dev, "%s: core_reset assert failed, err = %d\n",
|
||||
|
@ -280,6 +285,11 @@ static int ufs_qcom_host_reset(struct ufs_hba *hba)
|
|||
|
||||
usleep_range(1000, 1100);
|
||||
|
||||
if (reenable_intr) {
|
||||
enable_irq(hba->irq);
|
||||
hba->is_irq_enabled = true;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -94,8 +94,6 @@
|
|||
16, 4, buf, __len, false); \
|
||||
} while (0)
|
||||
|
||||
static bool early_suspend;
|
||||
|
||||
int ufshcd_dump_regs(struct ufs_hba *hba, size_t offset, size_t len,
|
||||
const char *prefix)
|
||||
{
|
||||
|
@ -1526,7 +1524,7 @@ static ssize_t ufshcd_clkscale_enable_show(struct device *dev,
|
|||
{
|
||||
struct ufs_hba *hba = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", hba->clk_scaling.is_enabled);
|
||||
return sysfs_emit(buf, "%d\n", hba->clk_scaling.is_enabled);
|
||||
}
|
||||
|
||||
static ssize_t ufshcd_clkscale_enable_store(struct device *dev,
|
||||
|
@ -4976,6 +4974,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
|
|||
* UFS device needs urgent BKOPs.
|
||||
*/
|
||||
if (!hba->pm_op_in_progress &&
|
||||
!ufshcd_eh_in_progress(hba) &&
|
||||
ufshcd_is_exception_event(lrbp->ucd_rsp_ptr) &&
|
||||
schedule_work(&hba->eeh_work)) {
|
||||
/*
|
||||
|
@ -5777,13 +5776,20 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
|
|||
ufshcd_suspend_clkscaling(hba);
|
||||
ufshcd_clk_scaling_allow(hba, false);
|
||||
}
|
||||
ufshcd_scsi_block_requests(hba);
|
||||
/* Drain ufshcd_queuecommand() */
|
||||
down_write(&hba->clk_scaling_lock);
|
||||
up_write(&hba->clk_scaling_lock);
|
||||
cancel_work_sync(&hba->eeh_work);
|
||||
}
|
||||
|
||||
static void ufshcd_err_handling_unprepare(struct ufs_hba *hba)
|
||||
{
|
||||
ufshcd_scsi_unblock_requests(hba);
|
||||
ufshcd_release(hba);
|
||||
if (ufshcd_is_clkscaling_supported(hba))
|
||||
ufshcd_clk_scaling_suspend(hba, false);
|
||||
ufshcd_clear_ua_wluns(hba);
|
||||
pm_runtime_put(hba->dev);
|
||||
}
|
||||
|
||||
|
@ -5875,8 +5881,8 @@ static void ufshcd_err_handler(struct work_struct *work)
|
|||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
ufshcd_err_handling_prepare(hba);
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
ufshcd_scsi_block_requests(hba);
|
||||
hba->ufshcd_state = UFSHCD_STATE_RESET;
|
||||
if (hba->ufshcd_state != UFSHCD_STATE_ERROR)
|
||||
hba->ufshcd_state = UFSHCD_STATE_RESET;
|
||||
|
||||
/* Complete requests that have door-bell cleared by h/w */
|
||||
ufshcd_complete_requests(hba);
|
||||
|
@ -6035,12 +6041,8 @@ skip_err_handling:
|
|||
}
|
||||
ufshcd_clear_eh_in_progress(hba);
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
ufshcd_scsi_unblock_requests(hba);
|
||||
ufshcd_err_handling_unprepare(hba);
|
||||
up(&hba->host_sem);
|
||||
|
||||
if (!err && needs_reset)
|
||||
ufshcd_clear_ua_wluns(hba);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -7846,6 +7848,8 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async)
|
|||
unsigned long flags;
|
||||
ktime_t start = ktime_get();
|
||||
|
||||
hba->ufshcd_state = UFSHCD_STATE_RESET;
|
||||
|
||||
ret = ufshcd_link_startup(hba);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
@ -8965,11 +8969,6 @@ int ufshcd_system_suspend(struct ufs_hba *hba)
|
|||
int ret = 0;
|
||||
ktime_t start = ktime_get();
|
||||
|
||||
if (!hba) {
|
||||
early_suspend = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
down(&hba->host_sem);
|
||||
|
||||
if (!hba->is_powered)
|
||||
|
@ -9021,14 +9020,6 @@ int ufshcd_system_resume(struct ufs_hba *hba)
|
|||
int ret = 0;
|
||||
ktime_t start = ktime_get();
|
||||
|
||||
if (!hba)
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(early_suspend)) {
|
||||
early_suspend = false;
|
||||
down(&hba->host_sem);
|
||||
}
|
||||
|
||||
if (!hba->is_powered || pm_runtime_suspended(hba->dev))
|
||||
/*
|
||||
* Let the runtime resume take care of resuming
|
||||
|
@ -9061,9 +9052,6 @@ int ufshcd_runtime_suspend(struct ufs_hba *hba)
|
|||
int ret = 0;
|
||||
ktime_t start = ktime_get();
|
||||
|
||||
if (!hba)
|
||||
return -EINVAL;
|
||||
|
||||
if (!hba->is_powered)
|
||||
goto out;
|
||||
else
|
||||
|
@ -9102,9 +9090,6 @@ int ufshcd_runtime_resume(struct ufs_hba *hba)
|
|||
int ret = 0;
|
||||
ktime_t start = ktime_get();
|
||||
|
||||
if (!hba)
|
||||
return -EINVAL;
|
||||
|
||||
if (!hba->is_powered)
|
||||
goto out;
|
||||
else
|
||||
|
|
|
@ -17,8 +17,6 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Maintained by: Jim Gill <jgill@vmware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
@ -17,8 +17,6 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Maintained by: Jim Gill <jgill@vmware.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _VMW_PVSCSI_H_
|
||||
|
|
|
@ -881,7 +881,6 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
|
|||
if (!bio) {
|
||||
new_bio:
|
||||
nr_vecs = bio_max_segs(nr_pages);
|
||||
nr_pages -= nr_vecs;
|
||||
/*
|
||||
* Calls bio_kmalloc() and sets bio->bi_end_io()
|
||||
*/
|
||||
|
@ -938,6 +937,14 @@ new_bio:
|
|||
|
||||
return 0;
|
||||
fail:
|
||||
if (bio)
|
||||
bio_put(bio);
|
||||
while (req->bio) {
|
||||
bio = req->bio;
|
||||
req->bio = bio->bi_next;
|
||||
bio_put(bio);
|
||||
}
|
||||
req->biotail = NULL;
|
||||
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||
}
|
||||
|
||||
|
|
|
@ -193,6 +193,7 @@ enum iscsi_connection_state {
|
|||
ISCSI_CONN_UP = 0,
|
||||
ISCSI_CONN_DOWN,
|
||||
ISCSI_CONN_FAILED,
|
||||
ISCSI_CONN_BOUND,
|
||||
};
|
||||
|
||||
struct iscsi_cls_conn {
|
||||
|
|
Загрузка…
Ссылка в новой задаче