Skip to content

Commit 7ffca2b

Browse files
committed
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley: "Four fixes, all in drivers, all of which can lead to user visible problems in certain situations" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: target: Fix NULL dereference on XCOPY completion scsi: mpt3sas: Transition IOC to Ready state during shutdown scsi: target: Fix protect handling in WRITE SAME(32) scsi: iscsi: Fix iface sysfs attr detection
2 parents 0ee818c + a47fa41 commit 7ffca2b

File tree

6 files changed

+78
-92
lines changed

6 files changed

+78
-92
lines changed

drivers/scsi/mpt3sas/mpt3sas_base.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,13 +2983,13 @@ _base_check_enable_msix(struct MPT3SAS_ADAPTER *ioc)
29832983
}
29842984

29852985
/**
2986-
* _base_free_irq - free irq
2986+
* mpt3sas_base_free_irq - free irq
29872987
* @ioc: per adapter object
29882988
*
29892989
* Freeing respective reply_queue from the list.
29902990
*/
2991-
static void
2992-
_base_free_irq(struct MPT3SAS_ADAPTER *ioc)
2991+
void
2992+
mpt3sas_base_free_irq(struct MPT3SAS_ADAPTER *ioc)
29932993
{
29942994
struct adapter_reply_queue *reply_q, *next;
29952995

@@ -3191,12 +3191,12 @@ _base_check_and_enable_high_iops_queues(struct MPT3SAS_ADAPTER *ioc,
31913191
}
31923192

31933193
/**
3194-
* _base_disable_msix - disables msix
3194+
* mpt3sas_base_disable_msix - disables msix
31953195
* @ioc: per adapter object
31963196
*
31973197
*/
3198-
static void
3199-
_base_disable_msix(struct MPT3SAS_ADAPTER *ioc)
3198+
void
3199+
mpt3sas_base_disable_msix(struct MPT3SAS_ADAPTER *ioc)
32003200
{
32013201
if (!ioc->msix_enable)
32023202
return;
@@ -3304,8 +3304,8 @@ _base_enable_msix(struct MPT3SAS_ADAPTER *ioc)
33043304
for (i = 0; i < ioc->reply_queue_count; i++) {
33053305
r = _base_request_irq(ioc, i);
33063306
if (r) {
3307-
_base_free_irq(ioc);
3308-
_base_disable_msix(ioc);
3307+
mpt3sas_base_free_irq(ioc);
3308+
mpt3sas_base_disable_msix(ioc);
33093309
goto try_ioapic;
33103310
}
33113311
}
@@ -3342,8 +3342,8 @@ mpt3sas_base_unmap_resources(struct MPT3SAS_ADAPTER *ioc)
33423342

33433343
dexitprintk(ioc, ioc_info(ioc, "%s\n", __func__));
33443344

3345-
_base_free_irq(ioc);
3346-
_base_disable_msix(ioc);
3345+
mpt3sas_base_free_irq(ioc);
3346+
mpt3sas_base_disable_msix(ioc);
33473347

33483348
kfree(ioc->replyPostRegisterIndex);
33493349
ioc->replyPostRegisterIndex = NULL;
@@ -7613,14 +7613,14 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
76137613
}
76147614

76157615
/**
7616-
* _base_make_ioc_ready - put controller in READY state
7616+
* mpt3sas_base_make_ioc_ready - put controller in READY state
76177617
* @ioc: per adapter object
76187618
* @type: FORCE_BIG_HAMMER or SOFT_RESET
76197619
*
76207620
* Return: 0 for success, non-zero for failure.
76217621
*/
7622-
static int
7623-
_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type)
7622+
int
7623+
mpt3sas_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type)
76247624
{
76257625
u32 ioc_state;
76267626
int rc;
@@ -7897,7 +7897,7 @@ mpt3sas_base_free_resources(struct MPT3SAS_ADAPTER *ioc)
78977897
if (ioc->chip_phys && ioc->chip) {
78987898
mpt3sas_base_mask_interrupts(ioc);
78997899
ioc->shost_recovery = 1;
7900-
_base_make_ioc_ready(ioc, SOFT_RESET);
7900+
mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
79017901
ioc->shost_recovery = 0;
79027902
}
79037903

@@ -8017,7 +8017,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
80178017
ioc->build_sg_mpi = &_base_build_sg;
80188018
ioc->build_zero_len_sge_mpi = &_base_build_zero_len_sge;
80198019

8020-
r = _base_make_ioc_ready(ioc, SOFT_RESET);
8020+
r = mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
80218021
if (r)
80228022
goto out_free_resources;
80238023

@@ -8471,7 +8471,7 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
84718471
_base_pre_reset_handler(ioc);
84728472
mpt3sas_wait_for_commands_to_complete(ioc);
84738473
mpt3sas_base_mask_interrupts(ioc);
8474-
r = _base_make_ioc_ready(ioc, type);
8474+
r = mpt3sas_base_make_ioc_ready(ioc, type);
84758475
if (r)
84768476
goto out;
84778477
_base_clear_outstanding_commands(ioc);

drivers/scsi/mpt3sas/mpt3sas_base.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,6 +1730,10 @@ do { ioc_err(ioc, "In func: %s\n", __func__); \
17301730
status, mpi_request, sz); } while (0)
17311731

17321732
int mpt3sas_wait_for_ioc(struct MPT3SAS_ADAPTER *ioc, int wait_count);
1733+
int
1734+
mpt3sas_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type);
1735+
void mpt3sas_base_free_irq(struct MPT3SAS_ADAPTER *ioc);
1736+
void mpt3sas_base_disable_msix(struct MPT3SAS_ADAPTER *ioc);
17331737

17341738
/* scsih shared API */
17351739
struct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc,

drivers/scsi/mpt3sas/mpt3sas_scsih.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11295,7 +11295,12 @@ scsih_shutdown(struct pci_dev *pdev)
1129511295

1129611296
_scsih_ir_shutdown(ioc);
1129711297
_scsih_nvme_shutdown(ioc);
11298-
mpt3sas_base_detach(ioc);
11298+
mpt3sas_base_mask_interrupts(ioc);
11299+
ioc->shost_recovery = 1;
11300+
mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
11301+
ioc->shost_recovery = 0;
11302+
mpt3sas_base_free_irq(ioc);
11303+
mpt3sas_base_disable_msix(ioc);
1129911304
}
1130011305

1130111306

drivers/scsi/scsi_transport_iscsi.c

Lines changed: 34 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -439,39 +439,10 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
439439
struct device *dev = container_of(kobj, struct device, kobj);
440440
struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
441441
struct iscsi_transport *t = iface->transport;
442-
int param;
443-
int param_type;
442+
int param = -1;
444443

445444
if (attr == &dev_attr_iface_enabled.attr)
446445
param = ISCSI_NET_PARAM_IFACE_ENABLE;
447-
else if (attr == &dev_attr_iface_vlan_id.attr)
448-
param = ISCSI_NET_PARAM_VLAN_ID;
449-
else if (attr == &dev_attr_iface_vlan_priority.attr)
450-
param = ISCSI_NET_PARAM_VLAN_PRIORITY;
451-
else if (attr == &dev_attr_iface_vlan_enabled.attr)
452-
param = ISCSI_NET_PARAM_VLAN_ENABLED;
453-
else if (attr == &dev_attr_iface_mtu.attr)
454-
param = ISCSI_NET_PARAM_MTU;
455-
else if (attr == &dev_attr_iface_port.attr)
456-
param = ISCSI_NET_PARAM_PORT;
457-
else if (attr == &dev_attr_iface_ipaddress_state.attr)
458-
param = ISCSI_NET_PARAM_IPADDR_STATE;
459-
else if (attr == &dev_attr_iface_delayed_ack_en.attr)
460-
param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
461-
else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
462-
param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
463-
else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
464-
param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
465-
else if (attr == &dev_attr_iface_tcp_wsf.attr)
466-
param = ISCSI_NET_PARAM_TCP_WSF;
467-
else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
468-
param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
469-
else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
470-
param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
471-
else if (attr == &dev_attr_iface_cache_id.attr)
472-
param = ISCSI_NET_PARAM_CACHE_ID;
473-
else if (attr == &dev_attr_iface_redirect_en.attr)
474-
param = ISCSI_NET_PARAM_REDIRECT_EN;
475446
else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
476447
param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
477448
else if (attr == &dev_attr_iface_header_digest.attr)
@@ -508,6 +479,38 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
508479
param = ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN;
509480
else if (attr == &dev_attr_iface_initiator_name.attr)
510481
param = ISCSI_IFACE_PARAM_INITIATOR_NAME;
482+
483+
if (param != -1)
484+
return t->attr_is_visible(ISCSI_IFACE_PARAM, param);
485+
486+
if (attr == &dev_attr_iface_vlan_id.attr)
487+
param = ISCSI_NET_PARAM_VLAN_ID;
488+
else if (attr == &dev_attr_iface_vlan_priority.attr)
489+
param = ISCSI_NET_PARAM_VLAN_PRIORITY;
490+
else if (attr == &dev_attr_iface_vlan_enabled.attr)
491+
param = ISCSI_NET_PARAM_VLAN_ENABLED;
492+
else if (attr == &dev_attr_iface_mtu.attr)
493+
param = ISCSI_NET_PARAM_MTU;
494+
else if (attr == &dev_attr_iface_port.attr)
495+
param = ISCSI_NET_PARAM_PORT;
496+
else if (attr == &dev_attr_iface_ipaddress_state.attr)
497+
param = ISCSI_NET_PARAM_IPADDR_STATE;
498+
else if (attr == &dev_attr_iface_delayed_ack_en.attr)
499+
param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
500+
else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
501+
param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
502+
else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
503+
param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
504+
else if (attr == &dev_attr_iface_tcp_wsf.attr)
505+
param = ISCSI_NET_PARAM_TCP_WSF;
506+
else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
507+
param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
508+
else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
509+
param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
510+
else if (attr == &dev_attr_iface_cache_id.attr)
511+
param = ISCSI_NET_PARAM_CACHE_ID;
512+
else if (attr == &dev_attr_iface_redirect_en.attr)
513+
param = ISCSI_NET_PARAM_REDIRECT_EN;
511514
else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
512515
if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
513516
param = ISCSI_NET_PARAM_IPV4_ADDR;
@@ -598,32 +601,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
598601
return 0;
599602
}
600603

601-
switch (param) {
602-
case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO:
603-
case ISCSI_IFACE_PARAM_HDRDGST_EN:
604-
case ISCSI_IFACE_PARAM_DATADGST_EN:
605-
case ISCSI_IFACE_PARAM_IMM_DATA_EN:
606-
case ISCSI_IFACE_PARAM_INITIAL_R2T_EN:
607-
case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN:
608-
case ISCSI_IFACE_PARAM_PDU_INORDER_EN:
609-
case ISCSI_IFACE_PARAM_ERL:
610-
case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH:
611-
case ISCSI_IFACE_PARAM_FIRST_BURST:
612-
case ISCSI_IFACE_PARAM_MAX_R2T:
613-
case ISCSI_IFACE_PARAM_MAX_BURST:
614-
case ISCSI_IFACE_PARAM_CHAP_AUTH_EN:
615-
case ISCSI_IFACE_PARAM_BIDI_CHAP_EN:
616-
case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL:
617-
case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN:
618-
case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN:
619-
case ISCSI_IFACE_PARAM_INITIATOR_NAME:
620-
param_type = ISCSI_IFACE_PARAM;
621-
break;
622-
default:
623-
param_type = ISCSI_NET_PARAM;
624-
}
625-
626-
return t->attr_is_visible(param_type, param);
604+
return t->attr_is_visible(ISCSI_NET_PARAM, param);
627605
}
628606

629607
static struct attribute *iscsi_iface_attrs[] = {

drivers/target/target_core_sbc.c

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include "target_core_alua.h"
2626

2727
static sense_reason_t
28-
sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool);
28+
sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char, u32, bool);
2929
static sense_reason_t sbc_execute_unmap(struct se_cmd *cmd);
3030

3131
static sense_reason_t
@@ -279,14 +279,14 @@ static inline unsigned long long transport_lba_64_ext(unsigned char *cdb)
279279
}
280280

281281
static sense_reason_t
282-
sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *ops)
282+
sbc_setup_write_same(struct se_cmd *cmd, unsigned char flags, struct sbc_ops *ops)
283283
{
284284
struct se_device *dev = cmd->se_dev;
285285
sector_t end_lba = dev->transport->get_blocks(dev) + 1;
286286
unsigned int sectors = sbc_get_write_same_sectors(cmd);
287287
sense_reason_t ret;
288288

289-
if ((flags[0] & 0x04) || (flags[0] & 0x02)) {
289+
if ((flags & 0x04) || (flags & 0x02)) {
290290
pr_err("WRITE_SAME PBDATA and LBDATA"
291291
" bits not supported for Block Discard"
292292
" Emulation\n");
@@ -308,15 +308,15 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
308308
}
309309

310310
/* We always have ANC_SUP == 0 so setting ANCHOR is always an error */
311-
if (flags[0] & 0x10) {
311+
if (flags & 0x10) {
312312
pr_warn("WRITE SAME with ANCHOR not supported\n");
313313
return TCM_INVALID_CDB_FIELD;
314314
}
315315
/*
316316
* Special case for WRITE_SAME w/ UNMAP=1 that ends up getting
317317
* translated into block discard requests within backend code.
318318
*/
319-
if (flags[0] & 0x08) {
319+
if (flags & 0x08) {
320320
if (!ops->execute_unmap)
321321
return TCM_UNSUPPORTED_SCSI_OPCODE;
322322

@@ -331,7 +331,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
331331
if (!ops->execute_write_same)
332332
return TCM_UNSUPPORTED_SCSI_OPCODE;
333333

334-
ret = sbc_check_prot(dev, cmd, &cmd->t_task_cdb[0], sectors, true);
334+
ret = sbc_check_prot(dev, cmd, flags >> 5, sectors, true);
335335
if (ret)
336336
return ret;
337337

@@ -717,10 +717,9 @@ sbc_set_prot_op_checks(u8 protect, bool fabric_prot, enum target_prot_type prot_
717717
}
718718

719719
static sense_reason_t
720-
sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb,
720+
sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char protect,
721721
u32 sectors, bool is_write)
722722
{
723-
u8 protect = cdb[1] >> 5;
724723
int sp_ops = cmd->se_sess->sup_prot_ops;
725724
int pi_prot_type = dev->dev_attrib.pi_prot_type;
726725
bool fabric_prot = false;
@@ -768,7 +767,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb,
768767
fallthrough;
769768
default:
770769
pr_err("Unable to determine pi_prot_type for CDB: 0x%02x "
771-
"PROTECT: 0x%02x\n", cdb[0], protect);
770+
"PROTECT: 0x%02x\n", cmd->t_task_cdb[0], protect);
772771
return TCM_INVALID_CDB_FIELD;
773772
}
774773

@@ -843,7 +842,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
843842
if (sbc_check_dpofua(dev, cmd, cdb))
844843
return TCM_INVALID_CDB_FIELD;
845844

846-
ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
845+
ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
847846
if (ret)
848847
return ret;
849848

@@ -857,7 +856,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
857856
if (sbc_check_dpofua(dev, cmd, cdb))
858857
return TCM_INVALID_CDB_FIELD;
859858

860-
ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
859+
ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
861860
if (ret)
862861
return ret;
863862

@@ -871,7 +870,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
871870
if (sbc_check_dpofua(dev, cmd, cdb))
872871
return TCM_INVALID_CDB_FIELD;
873872

874-
ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
873+
ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
875874
if (ret)
876875
return ret;
877876

@@ -892,7 +891,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
892891
if (sbc_check_dpofua(dev, cmd, cdb))
893892
return TCM_INVALID_CDB_FIELD;
894893

895-
ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
894+
ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
896895
if (ret)
897896
return ret;
898897

@@ -906,7 +905,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
906905
if (sbc_check_dpofua(dev, cmd, cdb))
907906
return TCM_INVALID_CDB_FIELD;
908907

909-
ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
908+
ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
910909
if (ret)
911910
return ret;
912911

@@ -921,7 +920,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
921920
if (sbc_check_dpofua(dev, cmd, cdb))
922921
return TCM_INVALID_CDB_FIELD;
923922

924-
ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
923+
ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
925924
if (ret)
926925
return ret;
927926

@@ -980,7 +979,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
980979
size = sbc_get_size(cmd, 1);
981980
cmd->t_task_lba = get_unaligned_be64(&cdb[12]);
982981

983-
ret = sbc_setup_write_same(cmd, &cdb[10], ops);
982+
ret = sbc_setup_write_same(cmd, cdb[10], ops);
984983
if (ret)
985984
return ret;
986985
break;
@@ -1079,7 +1078,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
10791078
size = sbc_get_size(cmd, 1);
10801079
cmd->t_task_lba = get_unaligned_be64(&cdb[2]);
10811080

1082-
ret = sbc_setup_write_same(cmd, &cdb[1], ops);
1081+
ret = sbc_setup_write_same(cmd, cdb[1], ops);
10831082
if (ret)
10841083
return ret;
10851084
break;
@@ -1097,7 +1096,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
10971096
* Follow sbcr26 with WRITE_SAME (10) and check for the existence
10981097
* of byte 1 bit 3 UNMAP instead of original reserved field
10991098
*/
1100-
ret = sbc_setup_write_same(cmd, &cdb[1], ops);
1099+
ret = sbc_setup_write_same(cmd, cdb[1], ops);
11011100
if (ret)
11021101
return ret;
11031102
break;

0 commit comments

Comments
 (0)