Merge branch '6.1/scsi-queue' into 6.1/scsi-fixes

Include the patches that weren't included in the 6.1 pull request.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Martin K. Petersen 2022-10-21 01:10:34 +00:00
commit 47eee861fa
11 changed files with 91 additions and 52 deletions

View File

@ -2582,7 +2582,7 @@ static int lpfcdiag_loop_self_unreg(struct lpfc_hba *phba, uint16_t rpi)
* *
* This function obtains the transmit and receive ids required to send * This function obtains the transmit and receive ids required to send
* an unsolicited ct command with a payload. A special lpfc FsType and CmdRsp * an unsolicited ct command with a payload. A special lpfc FsType and CmdRsp
* flags are used to the unsolicted response handler is able to process * flags are used to the unsolicited response handler is able to process
* the ct command sent on the same port. * the ct command sent on the same port.
**/ **/
static int lpfcdiag_loop_get_xri(struct lpfc_hba *phba, uint16_t rpi, static int lpfcdiag_loop_get_xri(struct lpfc_hba *phba, uint16_t rpi,
@ -2874,7 +2874,7 @@ out:
* @len: Number of data bytes * @len: Number of data bytes
* *
* This function allocates and posts a data buffer of sufficient size to receive * This function allocates and posts a data buffer of sufficient size to receive
* an unsolicted CT command. * an unsolicited CT command.
**/ **/
static int lpfcdiag_sli3_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri, static int lpfcdiag_sli3_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri,
size_t len) size_t len)

View File

@ -90,7 +90,7 @@ lpfc_ct_ignore_hbq_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
get_job_ulpstatus(phba, piocbq)); get_job_ulpstatus(phba, piocbq));
} }
lpfc_printf_log(phba, KERN_INFO, LOG_ELS, lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
"0145 Ignoring unsolicted CT HBQ Size:%d " "0145 Ignoring unsolicited CT HBQ Size:%d "
"status = x%x\n", "status = x%x\n",
size, get_job_ulpstatus(phba, piocbq)); size, get_job_ulpstatus(phba, piocbq));
} }

View File

@ -5874,10 +5874,6 @@ fallback:
static static
int megasas_get_device_list(struct megasas_instance *instance) int megasas_get_device_list(struct megasas_instance *instance)
{ {
memset(instance->pd_list, 0,
(MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
if (instance->enable_fw_dev_list) { if (instance->enable_fw_dev_list) {
if (megasas_host_device_list_query(instance, true)) if (megasas_host_device_list_query(instance, true))
return FAILED; return FAILED;
@ -7220,7 +7216,7 @@ int megasas_alloc_ctrl_dma_buffers(struct megasas_instance *instance)
if (!fusion->ioc_init_request) { if (!fusion->ioc_init_request) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Failed to allocate PD list buffer\n"); "Failed to allocate ioc init request\n");
return -ENOMEM; return -ENOMEM;
} }
@ -7439,7 +7435,6 @@ static inline void megasas_init_ctrl_params(struct megasas_instance *instance)
(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY)) (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY))
instance->flag_ieee = 1; instance->flag_ieee = 1;
megasas_dbg_lvl = 0;
instance->flag = 0; instance->flag = 0;
instance->unload = 1; instance->unload = 1;
instance->last_time = 0; instance->last_time = 0;
@ -8762,33 +8757,26 @@ static
int megasas_update_device_list(struct megasas_instance *instance, int megasas_update_device_list(struct megasas_instance *instance,
int event_type) int event_type)
{ {
int dcmd_ret = DCMD_SUCCESS; int dcmd_ret;
if (instance->enable_fw_dev_list) { if (instance->enable_fw_dev_list) {
dcmd_ret = megasas_host_device_list_query(instance, false); return megasas_host_device_list_query(instance, false);
if (dcmd_ret != DCMD_SUCCESS)
goto out;
} else { } else {
if (event_type & SCAN_PD_CHANNEL) { if (event_type & SCAN_PD_CHANNEL) {
dcmd_ret = megasas_get_pd_list(instance); dcmd_ret = megasas_get_pd_list(instance);
if (dcmd_ret != DCMD_SUCCESS) if (dcmd_ret != DCMD_SUCCESS)
goto out; return dcmd_ret;
} }
if (event_type & SCAN_VD_CHANNEL) { if (event_type & SCAN_VD_CHANNEL) {
if (!instance->requestorId || if (!instance->requestorId ||
megasas_get_ld_vf_affiliation(instance, 0)) { megasas_get_ld_vf_affiliation(instance, 0)) {
dcmd_ret = megasas_ld_list_query(instance, return megasas_ld_list_query(instance,
MR_LD_QUERY_TYPE_EXPOSED_TO_HOST); MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
if (dcmd_ret != DCMD_SUCCESS)
goto out;
} }
} }
} }
return DCMD_SUCCESS;
out:
return dcmd_ret;
} }
/** /**
@ -8918,7 +8906,7 @@ megasas_aen_polling(struct work_struct *work)
sdev1 = scsi_device_lookup(instance->host, sdev1 = scsi_device_lookup(instance->host,
MEGASAS_MAX_PD_CHANNELS + MEGASAS_MAX_PD_CHANNELS +
(ld_target_id / MEGASAS_MAX_DEV_PER_CHANNEL), (ld_target_id / MEGASAS_MAX_DEV_PER_CHANNEL),
(ld_target_id - MEGASAS_MAX_DEV_PER_CHANNEL), (ld_target_id % MEGASAS_MAX_DEV_PER_CHANNEL),
0); 0);
if (sdev1) if (sdev1)
megasas_remove_scsi_device(sdev1); megasas_remove_scsi_device(sdev1);
@ -9016,6 +9004,7 @@ static int __init megasas_init(void)
*/ */
pr_info("megasas: %s\n", MEGASAS_VERSION); pr_info("megasas: %s\n", MEGASAS_VERSION);
megasas_dbg_lvl = 0;
support_poll_for_event = 2; support_poll_for_event = 2;
support_device_change = 1; support_device_change = 1;
support_nvme_encapsulation = true; support_nvme_encapsulation = true;

View File

@ -951,9 +951,9 @@ qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj,
if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE) if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE)
return 0; return 0;
mutex_lock(&vha->hw->optrom_mutex);
if (ha->dcbx_tlv) if (ha->dcbx_tlv)
goto do_read; goto do_read;
mutex_lock(&vha->hw->optrom_mutex);
if (qla2x00_chip_is_down(vha)) { if (qla2x00_chip_is_down(vha)) {
mutex_unlock(&vha->hw->optrom_mutex); mutex_unlock(&vha->hw->optrom_mutex);
return 0; return 0;
@ -3330,11 +3330,34 @@ struct fc_function_template qla2xxx_transport_vport_functions = {
.bsg_timeout = qla24xx_bsg_timeout, .bsg_timeout = qla24xx_bsg_timeout,
}; };
static uint
qla2x00_get_host_supported_speeds(scsi_qla_host_t *vha, uint speeds)
{
uint supported_speeds = FC_PORTSPEED_UNKNOWN;
if (speeds & FDMI_PORT_SPEED_64GB)
supported_speeds |= FC_PORTSPEED_64GBIT;
if (speeds & FDMI_PORT_SPEED_32GB)
supported_speeds |= FC_PORTSPEED_32GBIT;
if (speeds & FDMI_PORT_SPEED_16GB)
supported_speeds |= FC_PORTSPEED_16GBIT;
if (speeds & FDMI_PORT_SPEED_8GB)
supported_speeds |= FC_PORTSPEED_8GBIT;
if (speeds & FDMI_PORT_SPEED_4GB)
supported_speeds |= FC_PORTSPEED_4GBIT;
if (speeds & FDMI_PORT_SPEED_2GB)
supported_speeds |= FC_PORTSPEED_2GBIT;
if (speeds & FDMI_PORT_SPEED_1GB)
supported_speeds |= FC_PORTSPEED_1GBIT;
return supported_speeds;
}
void void
qla2x00_init_host_attr(scsi_qla_host_t *vha) qla2x00_init_host_attr(scsi_qla_host_t *vha)
{ {
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
u32 speeds = FC_PORTSPEED_UNKNOWN; u32 speeds = 0, fdmi_speed = 0;
fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count; fc_host_dev_loss_tmo(vha->host) = ha->port_down_retry_count;
fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name); fc_host_node_name(vha->host) = wwn_to_u64(vha->node_name);
@ -3344,7 +3367,8 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
speeds = qla25xx_fdmi_port_speed_capability(ha); fdmi_speed = qla25xx_fdmi_port_speed_capability(ha);
speeds = qla2x00_get_host_supported_speeds(vha, fdmi_speed);
fc_host_supported_speeds(vha->host) = speeds; fc_host_supported_speeds(vha->host) = speeds;
} }

View File

@ -284,6 +284,25 @@ void target_pr_kref_release(struct kref *kref)
complete(&deve->pr_comp); complete(&deve->pr_comp);
} }
/*
* Establish UA condition on SCSI device - all LUNs
*/
void target_dev_ua_allocate(struct se_device *dev, u8 asc, u8 ascq)
{
struct se_dev_entry *se_deve;
struct se_lun *lun;
spin_lock(&dev->se_port_lock);
list_for_each_entry(lun, &dev->dev_sep_list, lun_dev_link) {
spin_lock(&lun->lun_deve_lock);
list_for_each_entry(se_deve, &lun->lun_deve_list, lun_link)
core_scsi3_ua_allocate(se_deve, asc, ascq);
spin_unlock(&lun->lun_deve_lock);
}
spin_unlock(&dev->se_port_lock);
}
static void static void
target_luns_data_has_changed(struct se_node_acl *nacl, struct se_dev_entry *new, target_luns_data_has_changed(struct se_node_acl *nacl, struct se_dev_entry *new,
bool skip_new) bool skip_new)

View File

@ -230,14 +230,12 @@ static void iblock_unplug_device(struct se_dev_plug *se_plug)
clear_bit(IBD_PLUGF_PLUGGED, &ib_dev_plug->flags); clear_bit(IBD_PLUGF_PLUGGED, &ib_dev_plug->flags);
} }
static unsigned long long iblock_emulate_read_cap_with_block_size( static sector_t iblock_get_blocks(struct se_device *dev)
struct se_device *dev,
struct block_device *bd,
struct request_queue *q)
{ {
u32 block_size = bdev_logical_block_size(bd); struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
u32 block_size = bdev_logical_block_size(ib_dev->ibd_bd);
unsigned long long blocks_long = unsigned long long blocks_long =
div_u64(bdev_nr_bytes(bd), block_size) - 1; div_u64(bdev_nr_bytes(ib_dev->ibd_bd), block_size) - 1;
if (block_size == dev->dev_attrib.block_size) if (block_size == dev->dev_attrib.block_size)
return blocks_long; return blocks_long;
@ -829,15 +827,6 @@ fail:
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
} }
static sector_t iblock_get_blocks(struct se_device *dev)
{
struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
struct block_device *bd = ib_dev->ibd_bd;
struct request_queue *q = bdev_get_queue(bd);
return iblock_emulate_read_cap_with_block_size(dev, bd, q);
}
static sector_t iblock_get_alignment_offset_lbas(struct se_device *dev) static sector_t iblock_get_alignment_offset_lbas(struct se_device *dev)
{ {
struct iblock_dev *ib_dev = IBLOCK_DEV(dev); struct iblock_dev *ib_dev = IBLOCK_DEV(dev);

View File

@ -89,6 +89,7 @@ int target_configure_device(struct se_device *dev);
void target_free_device(struct se_device *); void target_free_device(struct se_device *);
int target_for_each_device(int (*fn)(struct se_device *dev, void *data), int target_for_each_device(int (*fn)(struct se_device *dev, void *data),
void *data); void *data);
void target_dev_ua_allocate(struct se_device *dev, u8 asc, u8 ascq);
/* target_core_configfs.c */ /* target_core_configfs.c */
extern struct configfs_item_operations target_core_dev_item_ops; extern struct configfs_item_operations target_core_dev_item_ops;

View File

@ -2956,13 +2956,28 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
__core_scsi3_complete_pro_preempt(dev, pr_reg_n, __core_scsi3_complete_pro_preempt(dev, pr_reg_n,
(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : NULL, (preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : NULL,
type, scope, preempt_type); type, scope, preempt_type);
if (preempt_type == PREEMPT_AND_ABORT)
core_scsi3_release_preempt_and_abort(
&preempt_and_abort_list, pr_reg_n);
} }
spin_unlock(&dev->dev_reservation_lock); spin_unlock(&dev->dev_reservation_lock);
/*
* SPC-4 5.12.11.2.6 Preempting and aborting
* The actions described in this subclause shall be performed
* for all I_T nexuses that are registered with the non-zero
* SERVICE ACTION RESERVATION KEY value, without regard for
* whether the preempted I_T nexuses hold the persistent
* reservation. If the SERVICE ACTION RESERVATION KEY field is
* set to zero and an all registrants persistent reservation is
* present, the device server shall abort all commands for all
* registered I_T nexuses.
*/
if (preempt_type == PREEMPT_AND_ABORT) {
core_tmr_lun_reset(dev, NULL, &preempt_and_abort_list,
cmd);
core_scsi3_release_preempt_and_abort(
&preempt_and_abort_list, pr_reg_n);
}
if (pr_tmpl->pr_aptpl_active) if (pr_tmpl->pr_aptpl_active)
core_scsi3_update_and_write_aptpl(cmd->se_dev, true); core_scsi3_update_and_write_aptpl(cmd->se_dev, true);
@ -3022,7 +3037,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
if (calling_it_nexus) if (calling_it_nexus)
continue; continue;
if (pr_reg->pr_res_key != sa_res_key) if (sa_res_key && pr_reg->pr_res_key != sa_res_key)
continue; continue;
pr_reg_nacl = pr_reg->pr_reg_nacl; pr_reg_nacl = pr_reg->pr_reg_nacl;
@ -3425,8 +3440,6 @@ after_iport_check:
* transport protocols where port names are not required; * transport protocols where port names are not required;
* d) Register the reservation key specified in the SERVICE ACTION * d) Register the reservation key specified in the SERVICE ACTION
* RESERVATION KEY field; * RESERVATION KEY field;
* e) Retain the reservation key specified in the SERVICE ACTION
* RESERVATION KEY field and associated information;
* *
* Also, It is not an error for a REGISTER AND MOVE service action to * Also, It is not an error for a REGISTER AND MOVE service action to
* register an I_T nexus that is already registered with the same * register an I_T nexus that is already registered with the same
@ -3448,6 +3461,12 @@ after_iport_check:
dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl, dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
iport_ptr); iport_ptr);
new_reg = 1; new_reg = 1;
} else {
/*
* e) Retain the reservation key specified in the SERVICE ACTION
* RESERVATION KEY field and associated information;
*/
dest_pr_reg->pr_res_key = sa_res_key;
} }
/* /*
* f) Release the persistent reservation for the persistent reservation * f) Release the persistent reservation for the persistent reservation

View File

@ -3531,8 +3531,7 @@ static void target_tmr_work(struct work_struct *work)
tmr->response = (!ret) ? TMR_FUNCTION_COMPLETE : tmr->response = (!ret) ? TMR_FUNCTION_COMPLETE :
TMR_FUNCTION_REJECTED; TMR_FUNCTION_REJECTED;
if (tmr->response == TMR_FUNCTION_COMPLETE) { if (tmr->response == TMR_FUNCTION_COMPLETE) {
target_ua_allocate_lun(cmd->se_sess->se_node_acl, target_dev_ua_allocate(dev, 0x29,
cmd->orig_fe_lun, 0x29,
ASCQ_29H_BUS_DEVICE_RESET_FUNCTION_OCCURRED); ASCQ_29H_BUS_DEVICE_RESET_FUNCTION_OCCURRED);
} }
break; break;

View File

@ -616,7 +616,7 @@ static void ufshpb_activate_subregion(struct ufshpb_lu *hpb,
static enum rq_end_io_ret ufshpb_umap_req_compl_fn(struct request *req, static enum rq_end_io_ret ufshpb_umap_req_compl_fn(struct request *req,
blk_status_t error) blk_status_t error)
{ {
struct ufshpb_req *umap_req = (struct ufshpb_req *)req->end_io_data; struct ufshpb_req *umap_req = req->end_io_data;
ufshpb_put_req(umap_req->hpb, umap_req); ufshpb_put_req(umap_req->hpb, umap_req);
return RQ_END_IO_NONE; return RQ_END_IO_NONE;
@ -625,7 +625,7 @@ static enum rq_end_io_ret ufshpb_umap_req_compl_fn(struct request *req,
static enum rq_end_io_ret ufshpb_map_req_compl_fn(struct request *req, static enum rq_end_io_ret ufshpb_map_req_compl_fn(struct request *req,
blk_status_t error) blk_status_t error)
{ {
struct ufshpb_req *map_req = (struct ufshpb_req *) req->end_io_data; struct ufshpb_req *map_req = req->end_io_data;
struct ufshpb_lu *hpb = map_req->hpb; struct ufshpb_lu *hpb = map_req->hpb;
struct ufshpb_subregion *srgn; struct ufshpb_subregion *srgn;
unsigned long flags; unsigned long flags;

View File

@ -118,7 +118,6 @@ int ufs_qcom_ice_init(struct ufs_qcom_host *host)
host->ice_mmio = devm_ioremap_resource(dev, res); host->ice_mmio = devm_ioremap_resource(dev, res);
if (IS_ERR(host->ice_mmio)) { if (IS_ERR(host->ice_mmio)) {
err = PTR_ERR(host->ice_mmio); err = PTR_ERR(host->ice_mmio);
dev_err(dev, "Failed to map ICE registers; err=%d\n", err);
return err; return err;
} }