diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-15 16:18:47 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-15 16:18:47 -0800 | 
| commit | 946dd683afb611721cce2cc7e76a19e74f58e067 (patch) | |
| tree | f27e415c00548c56c2d6f35013e43b1df5576018 | |
| parent | 2d0ef4fb34b0462d84a2d87292144b9dad79c8d0 (diff) | |
| parent | d6a65fdc8903e632aa7bf86ee0f61a73969371f6 (diff) | |
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
| -rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 1 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/srpt/ib_srpt.c | 14 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_target.h | 1 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_erl1.c | 4 | ||||
| -rw-r--r-- | drivers/target/target_core_alua.c | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_pr.c | 11 | ||||
| -rw-r--r-- | drivers/target/target_core_sbc.c | 8 | ||||
| -rw-r--r-- | drivers/target/target_core_spc.c | 4 | ||||
| -rw-r--r-- | drivers/target/target_core_transport.c | 5 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 1 | 
11 files changed, 30 insertions, 23 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 2b161be3c1a3..d18d08a076e8 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -453,6 +453,7 @@ isert_conn_create_fastreg_pool(struct isert_conn *isert_conn)  		if (ret) {  			pr_err("Failed to create fastreg descriptor err=%d\n",  			       ret); +			kfree(fr_desc);  			goto err;  		} diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index 520a7e5a490b..0e537d8d0e47 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c @@ -3666,9 +3666,9 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(  	unsigned long val;  	int ret; -	ret = strict_strtoul(page, 0, &val); +	ret = kstrtoul(page, 0, &val);  	if (ret < 0) { -		pr_err("strict_strtoul() failed with ret: %d\n", ret); +		pr_err("kstrtoul() failed with ret: %d\n", ret);  		return -EINVAL;  	}  	if (val > MAX_SRPT_RDMA_SIZE) { @@ -3706,9 +3706,9 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(  	unsigned long val;  	int ret; -	ret = strict_strtoul(page, 0, &val); +	ret = kstrtoul(page, 0, &val);  	if (ret < 0) { -		pr_err("strict_strtoul() failed with ret: %d\n", ret); +		pr_err("kstrtoul() failed with ret: %d\n", ret);  		return -EINVAL;  	}  	if (val > MAX_SRPT_RSP_SIZE) { @@ -3746,9 +3746,9 @@ static ssize_t srpt_tpg_attrib_store_srp_sq_size(  	unsigned long val;  	int ret; -	ret = strict_strtoul(page, 0, &val); +	ret = kstrtoul(page, 0, &val);  	if (ret < 0) { -		pr_err("strict_strtoul() failed with ret: %d\n", ret); +		pr_err("kstrtoul() failed with ret: %d\n", ret);  		return -EINVAL;  	}  	if (val > MAX_SRPT_SRQ_SIZE) { @@ -3793,7 +3793,7 @@ static ssize_t srpt_tpg_store_enable(  	unsigned long tmp;          int ret; -	ret = strict_strtoul(page, 0, &tmp); +	ret = kstrtoul(page, 0, &tmp);  	if (ret < 0) {  		printk(KERN_ERR "Unable to extract srpt_tpg_store_enable\n");  		return -EINVAL; diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 9e80d61e5a3a..2eb97d7e8d12 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -2595,8 +2595,6 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,  		return -ENOMEM;  	} -	INIT_LIST_HEAD(&cmd->cmd_list); -  	memcpy(&cmd->atio, atio, sizeof(*atio));  	cmd->state = QLA_TGT_STATE_NEW;  	cmd->tgt = vha->vha_tgt.qla_tgt; diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 1d10eecad499..66e755cdde57 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h @@ -855,7 +855,6 @@ struct qla_tgt_cmd {  	uint16_t loop_id;	/* to save extra sess dereferences */  	struct qla_tgt *tgt;	/* to save extra sess dereferences */  	struct scsi_qla_host *vha; -	struct list_head cmd_list;  	struct atio_from_isp atio;  }; diff --git a/drivers/target/iscsi/iscsi_target_erl1.c b/drivers/target/iscsi/iscsi_target_erl1.c index e048d6439f4a..cda4d80cfaef 100644 --- a/drivers/target/iscsi/iscsi_target_erl1.c +++ b/drivers/target/iscsi/iscsi_target_erl1.c @@ -507,7 +507,9 @@ int iscsit_handle_status_snack(  	u32 last_statsn;  	int found_cmd; -	if (conn->exp_statsn > begrun) { +	if (!begrun) { +		begrun = conn->exp_statsn; +	} else if (conn->exp_statsn > begrun) {  		pr_err("Got Status SNACK Begrun: 0x%08x, RunLength:"  			" 0x%08x but already got ExpStatSN: 0x%08x on CID:"  			" %hu.\n", begrun, runlength, conn->exp_statsn, diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index 12da9b386169..c3d9df6aaf5f 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c @@ -500,7 +500,7 @@ static inline int core_alua_state_lba_dependent(  			if (segment_mult) {  				u64 tmp = lba; -				start_lba = sector_div(tmp, segment_size * segment_mult); +				start_lba = do_div(tmp, segment_size * segment_mult);  				last_lba = first_lba + segment_size - 1;  				if (start_lba >= first_lba && diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 2f5d77932c80..3013287a2aaa 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -2009,7 +2009,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  	struct t10_reservation *pr_tmpl = &dev->t10_pr;  	unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;  	sense_reason_t ret = TCM_NO_SENSE; -	int pr_holder = 0; +	int pr_holder = 0, type;  	if (!se_sess || !se_lun) {  		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,  			ret = TCM_RESERVATION_CONFLICT;  			goto out;  		} +		type = pr_reg->pr_res_type;  		spin_lock(&pr_tmpl->registration_lock);  		/* @@ -2161,6 +2162,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  		 * Release the calling I_T Nexus registration now..  		 */  		__core_scsi3_free_registration(cmd->se_dev, pr_reg, NULL, 1); +		pr_reg = NULL;  		/*  		 * 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,  		 * RESERVATIONS RELEASED.  		 */  		if (pr_holder && -		    (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY || -		     pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) { +		    (type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY || +		     type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) {  			list_for_each_entry(pr_reg_p,  					&pr_tmpl->registration_list,  					pr_reg_list) { @@ -2194,7 +2196,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,  	ret = core_scsi3_update_and_write_aptpl(dev, aptpl);  out: -	core_scsi3_put_pr_reg(pr_reg); +	if (pr_reg) +		core_scsi3_put_pr_reg(pr_reg);  	return ret;  } diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index fa3cae393e13..a4489444ffbc 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c @@ -1074,12 +1074,19 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,  	struct scatterlist *psg;  	void *paddr, *addr;  	unsigned int i, len, left; +	unsigned int offset = 0;  	left = sectors * dev->prot_length;  	for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) {  		len = min(psg->length, left); +		if (offset >= sg->length) { +			sg = sg_next(sg); +			offset = 0; +			sg_off = sg->offset; +		} +  		paddr = kmap_atomic(sg_page(psg)) + psg->offset;  		addr = kmap_atomic(sg_page(sg)) + sg_off; @@ -1089,6 +1096,7 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,  			memcpy(addr, paddr, len);  		left -= len; +		offset += len;  		kunmap_atomic(paddr);  		kunmap_atomic(addr);  	} diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 43c5ca9878bc..3bebc71ea033 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c @@ -440,8 +440,8 @@ check_scsi_name:  		padding = ((-scsi_target_len) & 3);  		if (padding)  			scsi_target_len += padding; -		if (scsi_name_len > 256) -			scsi_name_len = 256; +		if (scsi_target_len > 256) +			scsi_target_len = 256;  		buf[off-1] = scsi_target_len;  		off += scsi_target_len; diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index c50fd9f11aab..24b4f65d8777 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -669,9 +669,6 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)  		return;  	} -	if (!success) -		cmd->transport_state |= CMD_T_FAILED; -  	/*  	 * Check for case where an explicit ABORT_TASK has been received  	 * 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)  		spin_unlock_irqrestore(&cmd->t_state_lock, flags);  		complete(&cmd->t_transport_stop_comp);  		return; -	} else if (cmd->transport_state & CMD_T_FAILED) { +	} else if (!success) {  		INIT_WORK(&cmd->work, target_complete_failure_work);  	} else {  		INIT_WORK(&cmd->work, target_complete_ok_work); diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index c9c791209cd1..1772fadcff62 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -525,7 +525,6 @@ struct se_cmd {  #define CMD_T_COMPLETE		(1 << 2)  #define CMD_T_SENT		(1 << 4)  #define CMD_T_STOP		(1 << 5) -#define CMD_T_FAILED		(1 << 6)  #define CMD_T_DEV_ACTIVE	(1 << 7)  #define CMD_T_REQUEST_STOP	(1 << 8)  #define CMD_T_BUSY		(1 << 9)  | 
