Skip to content

Commit 946dd68

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target fixes from Nicholas Bellinger: "Mostly minor fixes this time to v3.14-rc1 related changes. Also included is one fix for a free after use regression in persistent reservations UNREGISTER logic that is CC'ed to >= v3.11.y stable" * git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: Target/sbc: Fix protection copy routine IB/srpt: replace strict_strtoul() with kstrtoul() target: Simplify command completion by removing CMD_T_FAILED flag iser-target: Fix leak on failure in isert_conn_create_fastreg_pool iscsi-target: Fix SNACK Type 1 + BegRun=0 handling target: Fix missing length check in spc_emulate_evpd_83() qla2xxx: Remove last vestiges of qla_tgt_cmd.cmd_list target: Fix 32-bit + CONFIG_LBDAF=n link error w/ sector_div target: Fix free-after-use regression in PR unregister
2 parents 2d0ef4f + d6a65fd commit 946dd68

File tree

11 files changed

+30
-23
lines changed

11 files changed

+30
-23
lines changed

drivers/infiniband/ulp/isert/ib_isert.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ isert_conn_create_fastreg_pool(struct isert_conn *isert_conn)
453453
if (ret) {
454454
pr_err("Failed to create fastreg descriptor err=%d\n",
455455
ret);
456+
kfree(fr_desc);
456457
goto err;
457458
}
458459

drivers/infiniband/ulp/srpt/ib_srpt.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3666,9 +3666,9 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(
36663666
unsigned long val;
36673667
int ret;
36683668

3669-
ret = strict_strtoul(page, 0, &val);
3669+
ret = kstrtoul(page, 0, &val);
36703670
if (ret < 0) {
3671-
pr_err("strict_strtoul() failed with ret: %d\n", ret);
3671+
pr_err("kstrtoul() failed with ret: %d\n", ret);
36723672
return -EINVAL;
36733673
}
36743674
if (val > MAX_SRPT_RDMA_SIZE) {
@@ -3706,9 +3706,9 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(
37063706
unsigned long val;
37073707
int ret;
37083708

3709-
ret = strict_strtoul(page, 0, &val);
3709+
ret = kstrtoul(page, 0, &val);
37103710
if (ret < 0) {
3711-
pr_err("strict_strtoul() failed with ret: %d\n", ret);
3711+
pr_err("kstrtoul() failed with ret: %d\n", ret);
37123712
return -EINVAL;
37133713
}
37143714
if (val > MAX_SRPT_RSP_SIZE) {
@@ -3746,9 +3746,9 @@ static ssize_t srpt_tpg_attrib_store_srp_sq_size(
37463746
unsigned long val;
37473747
int ret;
37483748

3749-
ret = strict_strtoul(page, 0, &val);
3749+
ret = kstrtoul(page, 0, &val);
37503750
if (ret < 0) {
3751-
pr_err("strict_strtoul() failed with ret: %d\n", ret);
3751+
pr_err("kstrtoul() failed with ret: %d\n", ret);
37523752
return -EINVAL;
37533753
}
37543754
if (val > MAX_SRPT_SRQ_SIZE) {
@@ -3793,7 +3793,7 @@ static ssize_t srpt_tpg_store_enable(
37933793
unsigned long tmp;
37943794
int ret;
37953795

3796-
ret = strict_strtoul(page, 0, &tmp);
3796+
ret = kstrtoul(page, 0, &tmp);
37973797
if (ret < 0) {
37983798
printk(KERN_ERR "Unable to extract srpt_tpg_store_enable\n");
37993799
return -EINVAL;

drivers/scsi/qla2xxx/qla_target.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2595,8 +2595,6 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
25952595
return -ENOMEM;
25962596
}
25972597

2598-
INIT_LIST_HEAD(&cmd->cmd_list);
2599-
26002598
memcpy(&cmd->atio, atio, sizeof(*atio));
26012599
cmd->state = QLA_TGT_STATE_NEW;
26022600
cmd->tgt = vha->vha_tgt.qla_tgt;

drivers/scsi/qla2xxx/qla_target.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,6 @@ struct qla_tgt_cmd {
855855
uint16_t loop_id; /* to save extra sess dereferences */
856856
struct qla_tgt *tgt; /* to save extra sess dereferences */
857857
struct scsi_qla_host *vha;
858-
struct list_head cmd_list;
859858

860859
struct atio_from_isp atio;
861860
};

drivers/target/iscsi/iscsi_target_erl1.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,9 @@ int iscsit_handle_status_snack(
507507
u32 last_statsn;
508508
int found_cmd;
509509

510-
if (conn->exp_statsn > begrun) {
510+
if (!begrun) {
511+
begrun = conn->exp_statsn;
512+
} else if (conn->exp_statsn > begrun) {
511513
pr_err("Got Status SNACK Begrun: 0x%08x, RunLength:"
512514
" 0x%08x but already got ExpStatSN: 0x%08x on CID:"
513515
" %hu.\n", begrun, runlength, conn->exp_statsn,

drivers/target/target_core_alua.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ static inline int core_alua_state_lba_dependent(
500500

501501
if (segment_mult) {
502502
u64 tmp = lba;
503-
start_lba = sector_div(tmp, segment_size * segment_mult);
503+
start_lba = do_div(tmp, segment_size * segment_mult);
504504

505505
last_lba = first_lba + segment_size - 1;
506506
if (start_lba >= first_lba &&

drivers/target/target_core_pr.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,7 +2009,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
20092009
struct t10_reservation *pr_tmpl = &dev->t10_pr;
20102010
unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;
20112011
sense_reason_t ret = TCM_NO_SENSE;
2012-
int pr_holder = 0;
2012+
int pr_holder = 0, type;
20132013

20142014
if (!se_sess || !se_lun) {
20152015
pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
@@ -2131,6 +2131,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
21312131
ret = TCM_RESERVATION_CONFLICT;
21322132
goto out;
21332133
}
2134+
type = pr_reg->pr_res_type;
21342135

21352136
spin_lock(&pr_tmpl->registration_lock);
21362137
/*
@@ -2161,6 +2162,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
21612162
* Release the calling I_T Nexus registration now..
21622163
*/
21632164
__core_scsi3_free_registration(cmd->se_dev, pr_reg, NULL, 1);
2165+
pr_reg = NULL;
21642166

21652167
/*
21662168
* From spc4r17, section 5.7.11.3 Unregistering
@@ -2174,8 +2176,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
21742176
* RESERVATIONS RELEASED.
21752177
*/
21762178
if (pr_holder &&
2177-
(pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY ||
2178-
pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) {
2179+
(type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY ||
2180+
type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) {
21792181
list_for_each_entry(pr_reg_p,
21802182
&pr_tmpl->registration_list,
21812183
pr_reg_list) {
@@ -2194,7 +2196,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
21942196
ret = core_scsi3_update_and_write_aptpl(dev, aptpl);
21952197

21962198
out:
2197-
core_scsi3_put_pr_reg(pr_reg);
2199+
if (pr_reg)
2200+
core_scsi3_put_pr_reg(pr_reg);
21982201
return ret;
21992202
}
22002203

drivers/target/target_core_sbc.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,12 +1074,19 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
10741074
struct scatterlist *psg;
10751075
void *paddr, *addr;
10761076
unsigned int i, len, left;
1077+
unsigned int offset = 0;
10771078

10781079
left = sectors * dev->prot_length;
10791080

10801081
for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) {
10811082

10821083
len = min(psg->length, left);
1084+
if (offset >= sg->length) {
1085+
sg = sg_next(sg);
1086+
offset = 0;
1087+
sg_off = sg->offset;
1088+
}
1089+
10831090
paddr = kmap_atomic(sg_page(psg)) + psg->offset;
10841091
addr = kmap_atomic(sg_page(sg)) + sg_off;
10851092

@@ -1089,6 +1096,7 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
10891096
memcpy(addr, paddr, len);
10901097

10911098
left -= len;
1099+
offset += len;
10921100
kunmap_atomic(paddr);
10931101
kunmap_atomic(addr);
10941102
}

drivers/target/target_core_spc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,8 +440,8 @@ spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
440440
padding = ((-scsi_target_len) & 3);
441441
if (padding)
442442
scsi_target_len += padding;
443-
if (scsi_name_len > 256)
444-
scsi_name_len = 256;
443+
if (scsi_target_len > 256)
444+
scsi_target_len = 256;
445445

446446
buf[off-1] = scsi_target_len;
447447
off += scsi_target_len;

drivers/target/target_core_transport.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,6 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
669669
return;
670670
}
671671

672-
if (!success)
673-
cmd->transport_state |= CMD_T_FAILED;
674-
675672
/*
676673
* Check for case where an explicit ABORT_TASK has been received
677674
* and transport_wait_for_tasks() will be waiting for completion..
@@ -681,7 +678,7 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
681678
spin_unlock_irqrestore(&cmd->t_state_lock, flags);
682679
complete(&cmd->t_transport_stop_comp);
683680
return;
684-
} else if (cmd->transport_state & CMD_T_FAILED) {
681+
} else if (!success) {
685682
INIT_WORK(&cmd->work, target_complete_failure_work);
686683
} else {
687684
INIT_WORK(&cmd->work, target_complete_ok_work);

include/target/target_core_base.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,6 @@ struct se_cmd {
525525
#define CMD_T_COMPLETE (1 << 2)
526526
#define CMD_T_SENT (1 << 4)
527527
#define CMD_T_STOP (1 << 5)
528-
#define CMD_T_FAILED (1 << 6)
529528
#define CMD_T_DEV_ACTIVE (1 << 7)
530529
#define CMD_T_REQUEST_STOP (1 << 8)
531530
#define CMD_T_BUSY (1 << 9)

0 commit comments

Comments
 (0)