Commit 9e9fbe44 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "Twelve fixes, eleven in drivers (target, qla2xx, scsi_debug, mpt3sas,
  ufs). The core fix is a minor correction to the previous state update
  fix for the iscsi daemons"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: scsi_debug: Zero clear zones at reset write pointer
  scsi: core: sysfs: Fix setting device state to SDEV_RUNNING
  scsi: scsi_debug: Sanity check block descriptor length in resp_mode_select()
  scsi: target: configfs: Delete unnecessary checks for NULL
  scsi: target: core: Use RCU helpers for INQUIRY t10_alua_tg_pt_gp
  scsi: mpt3sas: Fix incorrect system timestamp
  scsi: mpt3sas: Fix system going into read-only mode
  scsi: mpt3sas: Fix kernel panic during drive powercycle test
  scsi: ufs: ufs-mediatek: Add put_device() after of_find_device_by_node()
  scsi: scsi_debug: Fix type in min_t to avoid stack OOB
  scsi: qla2xxx: edif: Fix off by one bug in qla_edif_app_getfcinfo()
  scsi: ufs: ufshpb: Fix warning in ufshpb_set_hpb_read_to_upiu()
parents 74139277 2d62253e
...@@ -639,8 +639,8 @@ static void _base_sync_drv_fw_timestamp(struct MPT3SAS_ADAPTER *ioc) ...@@ -639,8 +639,8 @@ static void _base_sync_drv_fw_timestamp(struct MPT3SAS_ADAPTER *ioc)
mpi_request->IOCParameter = MPI26_SET_IOC_PARAMETER_SYNC_TIMESTAMP; mpi_request->IOCParameter = MPI26_SET_IOC_PARAMETER_SYNC_TIMESTAMP;
current_time = ktime_get_real(); current_time = ktime_get_real();
TimeStamp = ktime_to_ms(current_time); TimeStamp = ktime_to_ms(current_time);
mpi_request->Reserved7 = cpu_to_le32(TimeStamp & 0xFFFFFFFF); mpi_request->Reserved7 = cpu_to_le32(TimeStamp >> 32);
mpi_request->IOCParameterValue = cpu_to_le32(TimeStamp >> 32); mpi_request->IOCParameterValue = cpu_to_le32(TimeStamp & 0xFFFFFFFF);
init_completion(&ioc->scsih_cmds.done); init_completion(&ioc->scsih_cmds.done);
ioc->put_smid_default(ioc, smid); ioc->put_smid_default(ioc, smid);
dinitprintk(ioc, ioc_info(ioc, dinitprintk(ioc, ioc_info(ioc,
......
...@@ -142,6 +142,8 @@ ...@@ -142,6 +142,8 @@
#define MPT_MAX_CALLBACKS 32 #define MPT_MAX_CALLBACKS 32
#define MPT_MAX_HBA_NUM_PHYS 32
#define INTERNAL_CMDS_COUNT 10 /* reserved cmds */ #define INTERNAL_CMDS_COUNT 10 /* reserved cmds */
/* reserved for issuing internally framed scsi io cmds */ /* reserved for issuing internally framed scsi io cmds */
#define INTERNAL_SCSIIO_CMDS_COUNT 3 #define INTERNAL_SCSIIO_CMDS_COUNT 3
...@@ -798,6 +800,7 @@ struct _sas_phy { ...@@ -798,6 +800,7 @@ struct _sas_phy {
* @enclosure_handle: handle for this a member of an enclosure * @enclosure_handle: handle for this a member of an enclosure
* @device_info: bitwise defining capabilities of this sas_host/expander * @device_info: bitwise defining capabilities of this sas_host/expander
* @responding: used in _scsih_expander_device_mark_responding * @responding: used in _scsih_expander_device_mark_responding
* @nr_phys_allocated: Allocated memory for this many count phys
* @phy: a list of phys that make up this sas_host/expander * @phy: a list of phys that make up this sas_host/expander
* @sas_port_list: list of ports attached to this sas_host/expander * @sas_port_list: list of ports attached to this sas_host/expander
* @port: hba port entry containing node's port number info * @port: hba port entry containing node's port number info
...@@ -813,6 +816,7 @@ struct _sas_node { ...@@ -813,6 +816,7 @@ struct _sas_node {
u16 enclosure_handle; u16 enclosure_handle;
u64 enclosure_logical_id; u64 enclosure_logical_id;
u8 responding; u8 responding;
u8 nr_phys_allocated;
struct hba_port *port; struct hba_port *port;
struct _sas_phy *phy; struct _sas_phy *phy;
struct list_head sas_port_list; struct list_head sas_port_list;
......
...@@ -3869,7 +3869,7 @@ _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc, ...@@ -3869,7 +3869,7 @@ _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc,
shost_for_each_device(sdev, ioc->shost) { shost_for_each_device(sdev, ioc->shost) {
sas_device_priv_data = sdev->hostdata; sas_device_priv_data = sdev->hostdata;
if (!sas_device_priv_data) if (!sas_device_priv_data || !sas_device_priv_data->sas_target)
continue; continue;
if (sas_device_priv_data->sas_target->sas_address if (sas_device_priv_data->sas_target->sas_address
!= sas_address) != sas_address)
...@@ -6406,11 +6406,26 @@ _scsih_sas_port_refresh(struct MPT3SAS_ADAPTER *ioc) ...@@ -6406,11 +6406,26 @@ _scsih_sas_port_refresh(struct MPT3SAS_ADAPTER *ioc)
int i, j, count = 0, lcount = 0; int i, j, count = 0, lcount = 0;
int ret; int ret;
u64 sas_addr; u64 sas_addr;
u8 num_phys;
drsprintk(ioc, ioc_info(ioc, drsprintk(ioc, ioc_info(ioc,
"updating ports for sas_host(0x%016llx)\n", "updating ports for sas_host(0x%016llx)\n",
(unsigned long long)ioc->sas_hba.sas_address)); (unsigned long long)ioc->sas_hba.sas_address));
mpt3sas_config_get_number_hba_phys(ioc, &num_phys);
if (!num_phys) {
ioc_err(ioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
return;
}
if (num_phys > ioc->sas_hba.nr_phys_allocated) {
ioc_err(ioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
return;
}
ioc->sas_hba.num_phys = num_phys;
port_table = kcalloc(ioc->sas_hba.num_phys, port_table = kcalloc(ioc->sas_hba.num_phys,
sizeof(struct hba_port), GFP_KERNEL); sizeof(struct hba_port), GFP_KERNEL);
if (!port_table) if (!port_table)
...@@ -6611,6 +6626,30 @@ _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc) ...@@ -6611,6 +6626,30 @@ _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc)
ioc->sas_hba.phy[i].hba_vphy = 1; ioc->sas_hba.phy[i].hba_vphy = 1;
} }
/*
* Add new HBA phys to STL if these new phys got added as part
* of HBA Firmware upgrade/downgrade operation.
*/
if (!ioc->sas_hba.phy[i].phy) {
if ((mpt3sas_config_get_phy_pg0(ioc, &mpi_reply,
&phy_pg0, i))) {
ioc_err(ioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
continue;
}
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
MPI2_IOCSTATUS_MASK;
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
ioc_err(ioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
continue;
}
ioc->sas_hba.phy[i].phy_id = i;
mpt3sas_transport_add_host_phy(ioc,
&ioc->sas_hba.phy[i], phy_pg0,
ioc->sas_hba.parent_dev);
continue;
}
ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle; ioc->sas_hba.phy[i].handle = ioc->sas_hba.handle;
attached_handle = le16_to_cpu(sas_iounit_pg0->PhyData[i]. attached_handle = le16_to_cpu(sas_iounit_pg0->PhyData[i].
AttachedDevHandle); AttachedDevHandle);
...@@ -6622,6 +6661,19 @@ _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc) ...@@ -6622,6 +6661,19 @@ _scsih_sas_host_refresh(struct MPT3SAS_ADAPTER *ioc)
attached_handle, i, link_rate, attached_handle, i, link_rate,
ioc->sas_hba.phy[i].port); ioc->sas_hba.phy[i].port);
} }
/*
* Clear the phy details if this phy got disabled as part of
* HBA Firmware upgrade/downgrade operation.
*/
for (i = ioc->sas_hba.num_phys;
i < ioc->sas_hba.nr_phys_allocated; i++) {
if (ioc->sas_hba.phy[i].phy &&
ioc->sas_hba.phy[i].phy->negotiated_linkrate >=
SAS_LINK_RATE_1_5_GBPS)
mpt3sas_transport_update_links(ioc,
ioc->sas_hba.sas_address, 0, i,
MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED, NULL);
}
out: out:
kfree(sas_iounit_pg0); kfree(sas_iounit_pg0);
} }
...@@ -6654,7 +6706,10 @@ _scsih_sas_host_add(struct MPT3SAS_ADAPTER *ioc) ...@@ -6654,7 +6706,10 @@ _scsih_sas_host_add(struct MPT3SAS_ADAPTER *ioc)
__FILE__, __LINE__, __func__); __FILE__, __LINE__, __func__);
return; return;
} }
ioc->sas_hba.phy = kcalloc(num_phys,
ioc->sas_hba.nr_phys_allocated = max_t(u8,
MPT_MAX_HBA_NUM_PHYS, num_phys);
ioc->sas_hba.phy = kcalloc(ioc->sas_hba.nr_phys_allocated,
sizeof(struct _sas_phy), GFP_KERNEL); sizeof(struct _sas_phy), GFP_KERNEL);
if (!ioc->sas_hba.phy) { if (!ioc->sas_hba.phy) {
ioc_err(ioc, "failure at %s:%d/%s()!\n", ioc_err(ioc, "failure at %s:%d/%s()!\n",
......
...@@ -865,7 +865,7 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job) ...@@ -865,7 +865,7 @@ qla_edif_app_getfcinfo(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
"APP request entry - portid=%06x.\n", tdid.b24); "APP request entry - portid=%06x.\n", tdid.b24);
/* Ran out of space */ /* Ran out of space */
if (pcnt > app_req.num_ports) if (pcnt >= app_req.num_ports)
break; break;
if (tdid.b24 != 0 && tdid.b24 != fcport->d_id.b24) if (tdid.b24 != 0 && tdid.b24 != fcport->d_id.b24)
......
...@@ -1189,7 +1189,7 @@ static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr, ...@@ -1189,7 +1189,7 @@ static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
__func__, off_dst, scsi_bufflen(scp), act_len, __func__, off_dst, scsi_bufflen(scp), act_len,
scsi_get_resid(scp)); scsi_get_resid(scp));
n = scsi_bufflen(scp) - (off_dst + act_len); n = scsi_bufflen(scp) - (off_dst + act_len);
scsi_set_resid(scp, min_t(int, scsi_get_resid(scp), n)); scsi_set_resid(scp, min_t(u32, scsi_get_resid(scp), n));
return 0; return 0;
} }
...@@ -1562,7 +1562,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) ...@@ -1562,7 +1562,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
unsigned char pq_pdt; unsigned char pq_pdt;
unsigned char *arr; unsigned char *arr;
unsigned char *cmd = scp->cmnd; unsigned char *cmd = scp->cmnd;
int alloc_len, n, ret; u32 alloc_len, n;
int ret;
bool have_wlun, is_disk, is_zbc, is_disk_zbc; bool have_wlun, is_disk, is_zbc, is_disk_zbc;
alloc_len = get_unaligned_be16(cmd + 3); alloc_len = get_unaligned_be16(cmd + 3);
...@@ -1585,7 +1586,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) ...@@ -1585,7 +1586,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
kfree(arr); kfree(arr);
return check_condition_result; return check_condition_result;
} else if (0x1 & cmd[1]) { /* EVPD bit set */ } else if (0x1 & cmd[1]) { /* EVPD bit set */
int lu_id_num, port_group_id, target_dev_id, len; int lu_id_num, port_group_id, target_dev_id;
u32 len;
char lu_id_str[6]; char lu_id_str[6];
int host_no = devip->sdbg_host->shost->host_no; int host_no = devip->sdbg_host->shost->host_no;
...@@ -1676,9 +1678,9 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) ...@@ -1676,9 +1678,9 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
kfree(arr); kfree(arr);
return check_condition_result; return check_condition_result;
} }
len = min(get_unaligned_be16(arr + 2) + 4, alloc_len); len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
ret = fill_from_dev_buffer(scp, arr, ret = fill_from_dev_buffer(scp, arr,
min(len, SDEBUG_MAX_INQ_ARR_SZ)); min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
kfree(arr); kfree(arr);
return ret; return ret;
} }
...@@ -1714,7 +1716,7 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) ...@@ -1714,7 +1716,7 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
} }
put_unaligned_be16(0x2100, arr + n); /* SPL-4 no version claimed */ put_unaligned_be16(0x2100, arr + n); /* SPL-4 no version claimed */
ret = fill_from_dev_buffer(scp, arr, ret = fill_from_dev_buffer(scp, arr,
min_t(int, alloc_len, SDEBUG_LONG_INQ_SZ)); min_t(u32, alloc_len, SDEBUG_LONG_INQ_SZ));
kfree(arr); kfree(arr);
return ret; return ret;
} }
...@@ -1729,8 +1731,8 @@ static int resp_requests(struct scsi_cmnd *scp, ...@@ -1729,8 +1731,8 @@ static int resp_requests(struct scsi_cmnd *scp,
unsigned char *cmd = scp->cmnd; unsigned char *cmd = scp->cmnd;
unsigned char arr[SCSI_SENSE_BUFFERSIZE]; /* assume >= 18 bytes */ unsigned char arr[SCSI_SENSE_BUFFERSIZE]; /* assume >= 18 bytes */
bool dsense = !!(cmd[1] & 1); bool dsense = !!(cmd[1] & 1);
int alloc_len = cmd[4]; u32 alloc_len = cmd[4];
int len = 18; u32 len = 18;
int stopped_state = atomic_read(&devip->stopped); int stopped_state = atomic_read(&devip->stopped);
memset(arr, 0, sizeof(arr)); memset(arr, 0, sizeof(arr));
...@@ -1774,7 +1776,7 @@ static int resp_requests(struct scsi_cmnd *scp, ...@@ -1774,7 +1776,7 @@ static int resp_requests(struct scsi_cmnd *scp,
arr[7] = 0xa; arr[7] = 0xa;
} }
} }
return fill_from_dev_buffer(scp, arr, min_t(int, len, alloc_len)); return fill_from_dev_buffer(scp, arr, min_t(u32, len, alloc_len));
} }
static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
...@@ -2312,7 +2314,8 @@ static int resp_mode_sense(struct scsi_cmnd *scp, ...@@ -2312,7 +2314,8 @@ static int resp_mode_sense(struct scsi_cmnd *scp,
{ {
int pcontrol, pcode, subpcode, bd_len; int pcontrol, pcode, subpcode, bd_len;
unsigned char dev_spec; unsigned char dev_spec;
int alloc_len, offset, len, target_dev_id; u32 alloc_len, offset, len;
int target_dev_id;
int target = scp->device->id; int target = scp->device->id;
unsigned char *ap; unsigned char *ap;
unsigned char arr[SDEBUG_MAX_MSENSE_SZ]; unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
...@@ -2468,7 +2471,7 @@ static int resp_mode_sense(struct scsi_cmnd *scp, ...@@ -2468,7 +2471,7 @@ static int resp_mode_sense(struct scsi_cmnd *scp,
arr[0] = offset - 1; arr[0] = offset - 1;
else else
put_unaligned_be16((offset - 2), arr + 0); put_unaligned_be16((offset - 2), arr + 0);
return fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, offset)); return fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, offset));
} }
#define SDEBUG_MAX_MSELECT_SZ 512 #define SDEBUG_MAX_MSELECT_SZ 512
...@@ -2499,11 +2502,11 @@ static int resp_mode_select(struct scsi_cmnd *scp, ...@@ -2499,11 +2502,11 @@ static int resp_mode_select(struct scsi_cmnd *scp,
__func__, param_len, res); __func__, param_len, res);
md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2); md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6); bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
if (md_len > 2) { off = bd_len + (mselect6 ? 4 : 8);
if (md_len > 2 || off >= res) {
mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1); mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
return check_condition_result; return check_condition_result;
} }
off = bd_len + (mselect6 ? 4 : 8);
mpage = arr[off] & 0x3f; mpage = arr[off] & 0x3f;
ps = !!(arr[off] & 0x80); ps = !!(arr[off] & 0x80);
if (ps) { if (ps) {
...@@ -2583,7 +2586,8 @@ static int resp_ie_l_pg(unsigned char *arr) ...@@ -2583,7 +2586,8 @@ static int resp_ie_l_pg(unsigned char *arr)
static int resp_log_sense(struct scsi_cmnd *scp, static int resp_log_sense(struct scsi_cmnd *scp,
struct sdebug_dev_info *devip) struct sdebug_dev_info *devip)
{ {
int ppc, sp, pcode, subpcode, alloc_len, len, n; int ppc, sp, pcode, subpcode;
u32 alloc_len, len, n;
unsigned char arr[SDEBUG_MAX_LSENSE_SZ]; unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
unsigned char *cmd = scp->cmnd; unsigned char *cmd = scp->cmnd;
...@@ -2653,9 +2657,9 @@ static int resp_log_sense(struct scsi_cmnd *scp, ...@@ -2653,9 +2657,9 @@ static int resp_log_sense(struct scsi_cmnd *scp,
mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1); mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
return check_condition_result; return check_condition_result;
} }
len = min_t(int, get_unaligned_be16(arr + 2) + 4, alloc_len); len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
return fill_from_dev_buffer(scp, arr, return fill_from_dev_buffer(scp, arr,
min_t(int, len, SDEBUG_MAX_INQ_ARR_SZ)); min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
} }
static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip) static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip)
...@@ -4430,7 +4434,7 @@ static int resp_report_zones(struct scsi_cmnd *scp, ...@@ -4430,7 +4434,7 @@ static int resp_report_zones(struct scsi_cmnd *scp,
put_unaligned_be64(sdebug_capacity - 1, arr + 8); put_unaligned_be64(sdebug_capacity - 1, arr + 8);
rep_len = (unsigned long)desc - (unsigned long)arr; rep_len = (unsigned long)desc - (unsigned long)arr;
ret = fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, rep_len)); ret = fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, rep_len));
fini: fini:
read_unlock(macc_lckp); read_unlock(macc_lckp);
...@@ -4653,6 +4657,7 @@ static void zbc_rwp_zone(struct sdebug_dev_info *devip, ...@@ -4653,6 +4657,7 @@ static void zbc_rwp_zone(struct sdebug_dev_info *devip,
struct sdeb_zone_state *zsp) struct sdeb_zone_state *zsp)
{ {
enum sdebug_z_cond zc; enum sdebug_z_cond zc;
struct sdeb_store_info *sip = devip2sip(devip, false);
if (zbc_zone_is_conv(zsp)) if (zbc_zone_is_conv(zsp))
return; return;
...@@ -4664,6 +4669,10 @@ static void zbc_rwp_zone(struct sdebug_dev_info *devip, ...@@ -4664,6 +4669,10 @@ static void zbc_rwp_zone(struct sdebug_dev_info *devip,
if (zsp->z_cond == ZC4_CLOSED) if (zsp->z_cond == ZC4_CLOSED)
devip->nr_closed--; devip->nr_closed--;
if (zsp->z_wp > zsp->z_start)
memset(sip->storep + zsp->z_start * sdebug_sector_size, 0,
(zsp->z_wp - zsp->z_start) * sdebug_sector_size);
zsp->z_non_seq_resource = false; zsp->z_non_seq_resource = false;
zsp->z_wp = zsp->z_start; zsp->z_wp = zsp->z_start;
zsp->z_cond = ZC1_EMPTY; zsp->z_cond = ZC1_EMPTY;
......
...@@ -812,7 +812,7 @@ store_state_field(struct device *dev, struct device_attribute *attr, ...@@ -812,7 +812,7 @@ store_state_field(struct device *dev, struct device_attribute *attr,
mutex_lock(&sdev->state_mutex); mutex_lock(&sdev->state_mutex);
if (sdev->sdev_state == SDEV_RUNNING && state == SDEV_RUNNING) { if (sdev->sdev_state == SDEV_RUNNING && state == SDEV_RUNNING) {
ret = count; ret = 0;
} else { } else {
ret = scsi_device_set_state(sdev, state); ret = scsi_device_set_state(sdev, state);
if (ret == 0 && state == SDEV_RUNNING) if (ret == 0 && state == SDEV_RUNNING)
......
...@@ -1189,6 +1189,7 @@ static int ufs_mtk_probe(struct platform_device *pdev) ...@@ -1189,6 +1189,7 @@ static int ufs_mtk_probe(struct platform_device *pdev)
} }
link = device_link_add(dev, &reset_pdev->dev, link = device_link_add(dev, &reset_pdev->dev,
DL_FLAG_AUTOPROBE_CONSUMER); DL_FLAG_AUTOPROBE_CONSUMER);
put_device(&reset_pdev->dev);
if (!link) { if (!link) {
dev_notice(dev, "add reset device_link fail\n"); dev_notice(dev, "add reset device_link fail\n");
goto skip_reset; goto skip_reset;
......
...@@ -331,7 +331,7 @@ ufshpb_set_hpb_read_to_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, ...@@ -331,7 +331,7 @@ ufshpb_set_hpb_read_to_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
cdb[0] = UFSHPB_READ; cdb[0] = UFSHPB_READ;
if (hba->dev_quirks & UFS_DEVICE_QUIRK_SWAP_L2P_ENTRY_FOR_HPB_READ) if (hba->dev_quirks & UFS_DEVICE_QUIRK_SWAP_L2P_ENTRY_FOR_HPB_READ)
ppn_tmp = swab64(ppn); ppn_tmp = (__force __be64)swab64((__force u64)ppn);
/* ppn value is stored as big-endian in the host memory */ /* ppn value is stored as big-endian in the host memory */
memcpy(&cdb[6], &ppn_tmp, sizeof(__be64)); memcpy(&cdb[6], &ppn_tmp, sizeof(__be64));
......
...@@ -520,7 +520,7 @@ static ssize_t target_fabric_port_alua_tg_pt_gp_show(struct config_item *item, ...@@ -520,7 +520,7 @@ static ssize_t target_fabric_port_alua_tg_pt_gp_show(struct config_item *item,
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_tg_pt_gp_info(lun, page); return core_alua_show_tg_pt_gp_info(lun, page);
...@@ -531,7 +531,7 @@ static ssize_t target_fabric_port_alua_tg_pt_gp_store(struct config_item *item, ...@@ -531,7 +531,7 @@ static ssize_t target_fabric_port_alua_tg_pt_gp_store(struct config_item *item,
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_tg_pt_gp_info(lun, page, count); return core_alua_store_tg_pt_gp_info(lun, page, count);
...@@ -542,7 +542,7 @@ static ssize_t target_fabric_port_alua_tg_pt_offline_show( ...@@ -542,7 +542,7 @@ static ssize_t target_fabric_port_alua_tg_pt_offline_show(
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_offline_bit(lun, page); return core_alua_show_offline_bit(lun, page);
...@@ -553,7 +553,7 @@ static ssize_t target_fabric_port_alua_tg_pt_offline_store( ...@@ -553,7 +553,7 @@ static ssize_t target_fabric_port_alua_tg_pt_offline_store(
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_offline_bit(lun, page, count); return core_alua_store_offline_bit(lun, page, count);
...@@ -564,7 +564,7 @@ static ssize_t target_fabric_port_alua_tg_pt_status_show( ...@@ -564,7 +564,7 @@ static ssize_t target_fabric_port_alua_tg_pt_status_show(
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_secondary_status(lun, page); return core_alua_show_secondary_status(lun, page);
...@@ -575,7 +575,7 @@ static ssize_t target_fabric_port_alua_tg_pt_status_store( ...@@ -575,7 +575,7 @@ static ssize_t target_fabric_port_alua_tg_pt_status_store(
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_secondary_status(lun, page, count); return core_alua_store_secondary_status(lun, page, count);
...@@ -586,7 +586,7 @@ static ssize_t target_fabric_port_alua_tg_pt_write_md_show( ...@@ -586,7 +586,7 @@ static ssize_t target_fabric_port_alua_tg_pt_write_md_show(
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_show_secondary_write_metadata(lun, page); return core_alua_show_secondary_write_metadata(lun, page);
...@@ -597,7 +597,7 @@ static ssize_t target_fabric_port_alua_tg_pt_write_md_store( ...@@ -597,7 +597,7 @@ static ssize_t target_fabric_port_alua_tg_pt_write_md_store(
{ {
struct se_lun *lun = item_to_lun(item); struct se_lun *lun = item_to_lun(item);
if (!lun || !lun->lun_se_dev) if (!lun->lun_se_dev)
return -ENODEV; return -ENODEV;
return core_alua_store_secondary_write_metadata(lun, page, count); return core_alua_store_secondary_write_metadata(lun, page, count);
......
...@@ -40,11 +40,11 @@ static void spc_fill_alua_data(struct se_lun *lun, unsigned char *buf) ...@@ -40,11 +40,11 @@ static void spc_fill_alua_data(struct se_lun *lun, unsigned char *buf)
* *
* See spc4r17 section 6.4.2 Table 135 * See spc4r17 section 6.4.2 Table 135
*/ */
spin_lock(&lun->lun_tg_pt_gp_lock); rcu_read_lock();
tg_pt_gp = lun->lun_tg_pt_gp; tg_pt_gp = rcu_dereference(lun->lun_tg_pt_gp);
if (tg_pt_gp) if (tg_pt_gp)
buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type; buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type;
spin_unlock(&lun->lun_tg_pt_gp_lock); rcu_read_unlock();
} }
static u16 static u16
...@@ -325,14 +325,14 @@ spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf) ...@@ -325,14 +325,14 @@ spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
* Get the PROTOCOL IDENTIFIER as defined by spc4r17 * Get the PROTOCOL IDENTIFIER as defined by spc4r17
* section 7.5.1 Table 362 * section 7.5.1 Table 362
*/ */
spin_lock(&lun->lun_tg_pt_gp_lock); rcu_read_lock();
tg_pt_gp = lun->lun_tg_pt_gp; tg_pt_gp = rcu_dereference(lun->lun_tg_pt_gp);
if (!tg_pt_gp) { if (!tg_pt_gp) {
spin_unlock(&lun->lun_tg_pt_gp_lock); rcu_read_unlock();
goto check_lu_gp; goto check_lu_gp;
} }
tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id; tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id;
spin_unlock(&lun->lun_tg_pt_gp_lock); rcu_read_unlock();
buf[off] = tpg->proto_id << 4; buf[off] = tpg->proto_id << 4;
buf[off++] |= 0x1; /* CODE SET == Binary */ buf[off++] |= 0x1; /* CODE SET == Binary */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment