SCSI fixes on 20191214
24 fixes, all in drivers. The lion's share (16) are qla2xxx and the rest are iscsi (3), ufs (2), smarpqi, lpfc and libsas. Signed-off-by: James E.J. Bottomley <jejb@linux.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCXfUGbSYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishRNxAP4zxu9A 93AijCfJaMhtuzh2bdegf1IC/LXhbu69CQm9bgD+OeQLR9XvopjRBsQC35W1Im5T 73K+w8YTyddZEkOvcio= =m0Xq -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "24 fixes, all in drivers. The lion's share (16) are qla2xxx and the rest are iscsi (3), ufs (2), smarpqi, lpfc and libsas" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (24 commits) scsi: iscsi: Avoid potential deadlock in iscsi_if_rx func scsi: iscsi: Fix a potential deadlock in the timeout handler scsi: smartpqi: Update attribute name to `driver_version` scsi: libsas: stop discovering if oob mode is disconnected scsi: ufs: Disable autohibern8 feature in Cadence UFS scsi: iscsi: qla4xxx: fix double free in probe scsi: ufs: Give an unique ID to each ufs-bsg scsi: qla2xxx: Add debug dump of LOGO payload and ELS IOCB scsi: qla2xxx: Ignore PORT UPDATE after N2N PLOGI scsi: qla2xxx: Don't defer relogin unconditonally scsi: qla2xxx: Send Notify ACK after N2N PLOGI scsi: qla2xxx: Configure local loop for N2N target scsi: qla2xxx: Fix PLOGI payload and ELS IOCB dump length scsi: qla2xxx: Don't call qlt_async_event twice scsi: qla2xxx: Allow PLOGI in target mode scsi: qla2xxx: Change discovery state before PLOGI scsi: qla2xxx: Drop superfluous INIT_WORK of del_work scsi: qla2xxx: Initialize free_work before flushing it scsi: qla2xxx: Use explicit LOGO in target mode scsi: qla2xxx: Ignore NULL pointer in tcm_qla2xxx_free_mcmd ...
This commit is contained in:
Коммит
07c4b9e9f7
|
@ -29,7 +29,7 @@ smartpqi specific entries in /sys
|
|||
smartpqi host attributes:
|
||||
-------------------------
|
||||
/sys/class/scsi_host/host*/rescan
|
||||
/sys/class/scsi_host/host*/version
|
||||
/sys/class/scsi_host/host*/driver_version
|
||||
|
||||
The host rescan attribute is a write only attribute. Writing to this
|
||||
attribute will trigger the driver to scan for new, changed, or removed
|
||||
|
|
|
@ -1945,7 +1945,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
|
|||
|
||||
ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc);
|
||||
|
||||
spin_lock(&session->frwd_lock);
|
||||
spin_lock_bh(&session->frwd_lock);
|
||||
task = (struct iscsi_task *)sc->SCp.ptr;
|
||||
if (!task) {
|
||||
/*
|
||||
|
@ -2072,7 +2072,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
|
|||
done:
|
||||
if (task)
|
||||
task->last_timeout = jiffies;
|
||||
spin_unlock(&session->frwd_lock);
|
||||
spin_unlock_bh(&session->frwd_lock);
|
||||
ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ?
|
||||
"timer reset" : "shutdown or nh");
|
||||
return rc;
|
||||
|
|
|
@ -81,12 +81,21 @@ static int sas_get_port_device(struct asd_sas_port *port)
|
|||
else
|
||||
dev->dev_type = SAS_SATA_DEV;
|
||||
dev->tproto = SAS_PROTOCOL_SATA;
|
||||
} else {
|
||||
} else if (port->oob_mode == SAS_OOB_MODE) {
|
||||
struct sas_identify_frame *id =
|
||||
(struct sas_identify_frame *) dev->frame_rcvd;
|
||||
dev->dev_type = id->dev_type;
|
||||
dev->iproto = id->initiator_bits;
|
||||
dev->tproto = id->target_bits;
|
||||
} else {
|
||||
/* If the oob mode is OOB_NOT_CONNECTED, the port is
|
||||
* disconnected due to race with PHY down. We cannot
|
||||
* continue to discover this port
|
||||
*/
|
||||
sas_put_device(dev);
|
||||
pr_warn("Port %016llx is disconnected when discovering\n",
|
||||
SAS_ADDR(port->attached_sas_addr));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
sas_init_dev(dev);
|
||||
|
|
|
@ -4489,12 +4489,6 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
phba->mbox_ext_buf_ctx.seqNum++;
|
||||
nemb_tp = phba->mbox_ext_buf_ctx.nembType;
|
||||
|
||||
dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
|
||||
if (!dd_data) {
|
||||
rc = -ENOMEM;
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
pbuf = (uint8_t *)dmabuf->virt;
|
||||
size = job->request_payload.payload_len;
|
||||
sg_copy_to_buffer(job->request_payload.sg_list,
|
||||
|
@ -4531,6 +4525,13 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
"2968 SLI_CONFIG ext-buffer wr all %d "
|
||||
"ebuffers received\n",
|
||||
phba->mbox_ext_buf_ctx.numBuf);
|
||||
|
||||
dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
|
||||
if (!dd_data) {
|
||||
rc = -ENOMEM;
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
/* mailbox command structure for base driver */
|
||||
pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!pmboxq) {
|
||||
|
@ -4579,6 +4580,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
|
|||
return SLI_CONFIG_HANDLED;
|
||||
|
||||
job_error:
|
||||
if (pmboxq)
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
lpfc_bsg_dma_page_free(phba, dmabuf);
|
||||
kfree(dd_data);
|
||||
|
||||
|
|
|
@ -178,6 +178,7 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj,
|
|||
|
||||
faddr = ha->flt_region_nvram;
|
||||
if (IS_QLA28XX(ha)) {
|
||||
qla28xx_get_aux_images(vha, &active_regions);
|
||||
if (active_regions.aux.vpd_nvram == QLA27XX_SECONDARY_IMAGE)
|
||||
faddr = ha->flt_region_nvram_sec;
|
||||
}
|
||||
|
|
|
@ -2399,7 +2399,7 @@ qla2x00_get_flash_image_status(struct bsg_job *bsg_job)
|
|||
struct qla_active_regions regions = { };
|
||||
struct active_regions active_regions = { };
|
||||
|
||||
qla28xx_get_aux_images(vha, &active_regions);
|
||||
qla27xx_get_active_image(vha, &active_regions);
|
||||
regions.global_image = active_regions.global;
|
||||
|
||||
if (IS_QLA28XX(ha)) {
|
||||
|
|
|
@ -2401,6 +2401,7 @@ typedef struct fc_port {
|
|||
unsigned int id_changed:1;
|
||||
unsigned int scan_needed:1;
|
||||
unsigned int n2n_flag:1;
|
||||
unsigned int explicit_logout:1;
|
||||
|
||||
struct completion nvme_del_done;
|
||||
uint32_t nvme_prli_service_param;
|
||||
|
|
|
@ -1523,6 +1523,10 @@ struct qla_flt_header {
|
|||
#define FLT_REG_NVRAM_SEC_28XX_1 0x10F
|
||||
#define FLT_REG_NVRAM_SEC_28XX_2 0x111
|
||||
#define FLT_REG_NVRAM_SEC_28XX_3 0x113
|
||||
#define FLT_REG_MPI_PRI_28XX 0xD3
|
||||
#define FLT_REG_MPI_SEC_28XX 0xF0
|
||||
#define FLT_REG_PEP_PRI_28XX 0xD1
|
||||
#define FLT_REG_PEP_SEC_28XX 0xF1
|
||||
|
||||
struct qla_flt_region {
|
||||
uint16_t code;
|
||||
|
|
|
@ -533,6 +533,7 @@ static int qla_post_els_plogi_work(struct scsi_qla_host *vha, fc_port_t *fcport)
|
|||
|
||||
e->u.fcport.fcport = fcport;
|
||||
fcport->flags |= FCF_ASYNC_ACTIVE;
|
||||
fcport->disc_state = DSC_LOGIN_PEND;
|
||||
return qla2x00_post_work(vha, e);
|
||||
}
|
||||
|
||||
|
@ -1526,8 +1527,8 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
|
|||
}
|
||||
}
|
||||
|
||||
/* for pure Target Mode. Login will not be initiated */
|
||||
if (vha->host->active_mode == MODE_TARGET)
|
||||
/* Target won't initiate port login if fabric is present */
|
||||
if (vha->host->active_mode == MODE_TARGET && !N2N_TOPO(vha->hw))
|
||||
return 0;
|
||||
|
||||
if (fcport->flags & FCF_ASYNC_SENT) {
|
||||
|
@ -1719,6 +1720,10 @@ void qla24xx_handle_relogin_event(scsi_qla_host_t *vha,
|
|||
void qla_handle_els_plogi_done(scsi_qla_host_t *vha,
|
||||
struct event_arg *ea)
|
||||
{
|
||||
/* for pure Target Mode, PRLI will not be initiated */
|
||||
if (vha->host->active_mode == MODE_TARGET)
|
||||
return;
|
||||
|
||||
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
||||
"%s %d %8phC post PRLI\n",
|
||||
__func__, __LINE__, ea->fcport->port_name);
|
||||
|
@ -4852,6 +4857,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
|
|||
}
|
||||
|
||||
INIT_WORK(&fcport->del_work, qla24xx_delete_sess_fn);
|
||||
INIT_WORK(&fcport->free_work, qlt_free_session_done);
|
||||
INIT_WORK(&fcport->reg_work, qla_register_fcport_fn);
|
||||
INIT_LIST_HEAD(&fcport->gnl_entry);
|
||||
INIT_LIST_HEAD(&fcport->list);
|
||||
|
@ -4930,14 +4936,8 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
|
|||
set_bit(RSCN_UPDATE, &flags);
|
||||
clear_bit(LOCAL_LOOP_UPDATE, &flags);
|
||||
|
||||
} else if (ha->current_topology == ISP_CFG_N) {
|
||||
clear_bit(RSCN_UPDATE, &flags);
|
||||
if (qla_tgt_mode_enabled(vha)) {
|
||||
/* allow the other side to start the login */
|
||||
clear_bit(LOCAL_LOOP_UPDATE, &flags);
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
}
|
||||
} else if (ha->current_topology == ISP_CFG_NL) {
|
||||
} else if (ha->current_topology == ISP_CFG_NL ||
|
||||
ha->current_topology == ISP_CFG_N) {
|
||||
clear_bit(RSCN_UPDATE, &flags);
|
||||
set_bit(LOCAL_LOOP_UPDATE, &flags);
|
||||
} else if (!vha->flags.online ||
|
||||
|
@ -5054,7 +5054,6 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
|
|||
memcpy(&ha->plogi_els_payld.data,
|
||||
(void *)ha->init_cb,
|
||||
sizeof(ha->plogi_els_payld.data));
|
||||
set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
|
||||
} else {
|
||||
ql_dbg(ql_dbg_init, vha, 0x00d1,
|
||||
"PLOGI ELS param read fail.\n");
|
||||
|
|
|
@ -2405,11 +2405,19 @@ qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx)
|
|||
static void
|
||||
qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio)
|
||||
{
|
||||
u16 control_flags = LCF_COMMAND_LOGO;
|
||||
logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
|
||||
logio->control_flags =
|
||||
cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO);
|
||||
if (!sp->fcport->keep_nport_handle)
|
||||
logio->control_flags |= cpu_to_le16(LCF_FREE_NPORT);
|
||||
|
||||
if (sp->fcport->explicit_logout) {
|
||||
control_flags |= LCF_EXPL_LOGO|LCF_FREE_NPORT;
|
||||
} else {
|
||||
control_flags |= LCF_IMPL_LOGO;
|
||||
|
||||
if (!sp->fcport->keep_nport_handle)
|
||||
control_flags |= LCF_FREE_NPORT;
|
||||
}
|
||||
|
||||
logio->control_flags = cpu_to_le16(control_flags);
|
||||
logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
|
||||
logio->port_id[0] = sp->fcport->d_id.b.al_pa;
|
||||
logio->port_id[1] = sp->fcport->d_id.b.area;
|
||||
|
@ -2617,6 +2625,10 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
|
||||
memcpy(elsio->u.els_logo.els_logo_pyld, &logo_pyld,
|
||||
sizeof(struct els_logo_payload));
|
||||
ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x3075, "LOGO buffer:");
|
||||
ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x010a,
|
||||
elsio->u.els_logo.els_logo_pyld,
|
||||
sizeof(*elsio->u.els_logo.els_logo_pyld));
|
||||
|
||||
rval = qla2x00_start_sp(sp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
|
@ -2676,7 +2688,8 @@ qla24xx_els_logo_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
|
|||
ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x3073,
|
||||
"PLOGI ELS IOCB:\n");
|
||||
ql_dump_buffer(ql_log_info, vha, 0x0109,
|
||||
(uint8_t *)els_iocb, 0x70);
|
||||
(uint8_t *)els_iocb,
|
||||
sizeof(*els_iocb));
|
||||
} else {
|
||||
els_iocb->control_flags = 1 << 13;
|
||||
els_iocb->tx_byte_count =
|
||||
|
@ -2688,6 +2701,11 @@ qla24xx_els_logo_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
|
|||
els_iocb->rx_byte_count = 0;
|
||||
els_iocb->rx_address = 0;
|
||||
els_iocb->rx_len = 0;
|
||||
ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x3076,
|
||||
"LOGO ELS IOCB:");
|
||||
ql_dump_buffer(ql_log_info, vha, 0x010b,
|
||||
els_iocb,
|
||||
sizeof(*els_iocb));
|
||||
}
|
||||
|
||||
sp->vha->qla_stats.control_requests++;
|
||||
|
@ -2934,7 +2952,8 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,
|
|||
|
||||
ql_dbg(ql_dbg_disc + ql_dbg_buffer, vha, 0x3073, "PLOGI buffer:\n");
|
||||
ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x0109,
|
||||
(uint8_t *)elsio->u.els_plogi.els_plogi_pyld, 0x70);
|
||||
(uint8_t *)elsio->u.els_plogi.els_plogi_pyld,
|
||||
sizeof(*elsio->u.els_plogi.els_plogi_pyld));
|
||||
|
||||
rval = qla2x00_start_sp(sp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
|
|
|
@ -1061,8 +1061,6 @@ global_port_update:
|
|||
ql_dbg(ql_dbg_async, vha, 0x5011,
|
||||
"Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n",
|
||||
mb[1], mb[2], mb[3]);
|
||||
|
||||
qlt_async_event(mb[0], vha, mb);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1079,8 +1077,6 @@ global_port_update:
|
|||
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
||||
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
||||
set_bit(VP_CONFIG_OK, &vha->vp_flags);
|
||||
|
||||
qlt_async_event(mb[0], vha, mb);
|
||||
break;
|
||||
|
||||
case MBA_RSCN_UPDATE: /* State Change Registration */
|
||||
|
|
|
@ -3921,6 +3921,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
|||
vha->d_id.b24 = 0;
|
||||
vha->d_id.b.al_pa = 1;
|
||||
ha->flags.n2n_bigger = 1;
|
||||
ha->flags.n2n_ae = 0;
|
||||
|
||||
id.b.al_pa = 2;
|
||||
ql_dbg(ql_dbg_async, vha, 0x5075,
|
||||
|
@ -3931,6 +3932,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
|||
"Format 1: Remote login - Waiting for WWPN %8phC.\n",
|
||||
rptid_entry->u.f1.port_name);
|
||||
ha->flags.n2n_bigger = 0;
|
||||
ha->flags.n2n_ae = 1;
|
||||
}
|
||||
qla24xx_post_newsess_work(vha, &id,
|
||||
rptid_entry->u.f1.port_name,
|
||||
|
@ -3942,7 +3944,6 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
|||
/* if our portname is higher then initiate N2N login */
|
||||
|
||||
set_bit(N2N_LOGIN_NEEDED, &vha->dpc_flags);
|
||||
ha->flags.n2n_ae = 1;
|
||||
return;
|
||||
break;
|
||||
case TOPO_FL:
|
||||
|
|
|
@ -847,15 +847,15 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
ha->flt_region_img_status_pri = start;
|
||||
break;
|
||||
case FLT_REG_IMG_SEC_27XX:
|
||||
if (IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
||||
if (IS_QLA27XX(ha) || IS_QLA28XX(ha))
|
||||
ha->flt_region_img_status_sec = start;
|
||||
break;
|
||||
case FLT_REG_FW_SEC_27XX:
|
||||
if (IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
||||
if (IS_QLA27XX(ha) || IS_QLA28XX(ha))
|
||||
ha->flt_region_fw_sec = start;
|
||||
break;
|
||||
case FLT_REG_BOOTLOAD_SEC_27XX:
|
||||
if (IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
||||
if (IS_QLA27XX(ha) || IS_QLA28XX(ha))
|
||||
ha->flt_region_boot_sec = start;
|
||||
break;
|
||||
case FLT_REG_AUX_IMG_PRI_28XX:
|
||||
|
@ -2725,8 +2725,11 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
|
|||
ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff,
|
||||
"Region %x is secure\n", region.code);
|
||||
|
||||
if (region.code == FLT_REG_FW ||
|
||||
region.code == FLT_REG_FW_SEC_27XX) {
|
||||
switch (region.code) {
|
||||
case FLT_REG_FW:
|
||||
case FLT_REG_FW_SEC_27XX:
|
||||
case FLT_REG_MPI_PRI_28XX:
|
||||
case FLT_REG_MPI_SEC_28XX:
|
||||
fw_array = dwptr;
|
||||
|
||||
/* 1st fw array */
|
||||
|
@ -2757,9 +2760,23 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
|
|||
buf_size_without_sfub += risc_size;
|
||||
fw_array += risc_size;
|
||||
}
|
||||
} else {
|
||||
ql_log(ql_log_warn + ql_dbg_verbose, vha, 0xffff,
|
||||
"Secure region %x not supported\n",
|
||||
break;
|
||||
|
||||
case FLT_REG_PEP_PRI_28XX:
|
||||
case FLT_REG_PEP_SEC_28XX:
|
||||
fw_array = dwptr;
|
||||
|
||||
/* 1st fw array */
|
||||
risc_size = be32_to_cpu(fw_array[3]);
|
||||
risc_attr = be32_to_cpu(fw_array[9]);
|
||||
|
||||
buf_size_without_sfub = risc_size;
|
||||
fw_array += risc_size;
|
||||
break;
|
||||
|
||||
default:
|
||||
ql_log(ql_log_warn + ql_dbg_verbose, vha,
|
||||
0xffff, "Secure region %x not supported\n",
|
||||
region.code);
|
||||
rval = QLA_COMMAND_ERROR;
|
||||
goto done;
|
||||
|
@ -2880,7 +2897,7 @@ qla28xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
|
|||
"Sending Secure Flash MB Cmd\n");
|
||||
rval = qla28xx_secure_flash_update(vha, 0, region.code,
|
||||
buf_size_without_sfub, sfub_dma,
|
||||
sizeof(struct secure_flash_update_block));
|
||||
sizeof(struct secure_flash_update_block) >> 2);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
ql_log(ql_log_warn, vha, 0xffff,
|
||||
"Secure Flash MB Cmd failed %x.", rval);
|
||||
|
|
|
@ -1104,6 +1104,7 @@ void qlt_free_session_done(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
|
||||
sess->explicit_logout = 0;
|
||||
spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
|
||||
sess->free_pending = 0;
|
||||
|
||||
|
@ -1160,7 +1161,6 @@ void qlt_unreg_sess(struct fc_port *sess)
|
|||
sess->last_rscn_gen = sess->rscn_gen;
|
||||
sess->last_login_gen = sess->login_gen;
|
||||
|
||||
INIT_WORK(&sess->free_work, qlt_free_session_done);
|
||||
queue_work(sess->vha->hw->wq, &sess->free_work);
|
||||
}
|
||||
EXPORT_SYMBOL(qlt_unreg_sess);
|
||||
|
@ -1265,7 +1265,6 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
|
|||
"Scheduling sess %p for deletion %8phC\n",
|
||||
sess, sess->port_name);
|
||||
|
||||
INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn);
|
||||
WARN_ON(!queue_work(sess->vha->hw->wq, &sess->del_work));
|
||||
}
|
||||
|
||||
|
@ -4804,6 +4803,7 @@ static int qlt_handle_login(struct scsi_qla_host *vha,
|
|||
|
||||
switch (sess->disc_state) {
|
||||
case DSC_DELETED:
|
||||
case DSC_LOGIN_PEND:
|
||||
qlt_plogi_ack_unref(vha, pla);
|
||||
break;
|
||||
|
||||
|
|
|
@ -246,6 +246,8 @@ static void tcm_qla2xxx_complete_mcmd(struct work_struct *work)
|
|||
*/
|
||||
static void tcm_qla2xxx_free_mcmd(struct qla_tgt_mgmt_cmd *mcmd)
|
||||
{
|
||||
if (!mcmd)
|
||||
return;
|
||||
INIT_WORK(&mcmd->free_work, tcm_qla2xxx_complete_mcmd);
|
||||
queue_work(tcm_qla2xxx_free_wq, &mcmd->free_work);
|
||||
}
|
||||
|
@ -348,6 +350,7 @@ static void tcm_qla2xxx_close_session(struct se_session *se_sess)
|
|||
target_sess_cmd_list_set_waiting(se_sess);
|
||||
spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
|
||||
|
||||
sess->explicit_logout = 1;
|
||||
tcm_qla2xxx_put_sess(sess);
|
||||
}
|
||||
|
||||
|
|
|
@ -4275,7 +4275,6 @@ static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
|
|||
return QLA_SUCCESS;
|
||||
|
||||
mem_alloc_error_exit:
|
||||
qla4xxx_mem_free(ha);
|
||||
return QLA_ERROR;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
|
||||
#define ISCSI_TRANSPORT_VERSION "2.0-870"
|
||||
|
||||
#define ISCSI_SEND_MAX_ALLOWED 10
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/iscsi.h>
|
||||
|
||||
|
@ -3682,6 +3684,7 @@ iscsi_if_rx(struct sk_buff *skb)
|
|||
struct nlmsghdr *nlh;
|
||||
struct iscsi_uevent *ev;
|
||||
uint32_t group;
|
||||
int retries = ISCSI_SEND_MAX_ALLOWED;
|
||||
|
||||
nlh = nlmsg_hdr(skb);
|
||||
if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) ||
|
||||
|
@ -3712,6 +3715,10 @@ iscsi_if_rx(struct sk_buff *skb)
|
|||
break;
|
||||
err = iscsi_if_send_reply(portid, nlh->nlmsg_type,
|
||||
ev, sizeof(*ev));
|
||||
if (err == -EAGAIN && --retries < 0) {
|
||||
printk(KERN_WARNING "Send reply failed, error %d\n", err);
|
||||
break;
|
||||
}
|
||||
} while (err < 0 && err != -ECONNREFUSED && err != -ESRCH);
|
||||
skb_pull(skb, rlen);
|
||||
}
|
||||
|
|
|
@ -99,6 +99,12 @@ static int cdns_ufs_link_startup_notify(struct ufs_hba *hba,
|
|||
*/
|
||||
ufshcd_dme_set(hba, UIC_ARG_MIB(PA_LOCAL_TX_LCC_ENABLE), 0);
|
||||
|
||||
/*
|
||||
* Disabling Autohibern8 feature in cadence UFS
|
||||
* to mask unexpected interrupt trigger.
|
||||
*/
|
||||
hba->ahit = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -203,7 +203,7 @@ int ufs_bsg_probe(struct ufs_hba *hba)
|
|||
bsg_dev->parent = get_device(parent);
|
||||
bsg_dev->release = ufs_bsg_node_release;
|
||||
|
||||
dev_set_name(bsg_dev, "ufs-bsg");
|
||||
dev_set_name(bsg_dev, "ufs-bsg%u", shost->host_no);
|
||||
|
||||
ret = device_add(bsg_dev);
|
||||
if (ret)
|
||||
|
|
Загрузка…
Ссылка в новой задаче