diff options
Diffstat (limited to 'drivers/infiniband/ulp/srpt/ib_srpt.c')
| -rw-r--r-- | drivers/infiniband/ulp/srpt/ib_srpt.c | 65 | 
1 files changed, 33 insertions, 32 deletions
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index 653ac6bfc57..fe09f2788b1 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c @@ -1078,6 +1078,7 @@ static void srpt_unmap_sg_to_ib_sge(struct srpt_rdma_ch *ch,  static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,  				 struct srpt_send_ioctx *ioctx)  { +	struct ib_device *dev = ch->sport->sdev->device;  	struct se_cmd *cmd;  	struct scatterlist *sg, *sg_orig;  	int sg_cnt; @@ -1124,7 +1125,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,  	db = ioctx->rbufs;  	tsize = cmd->data_length; -	dma_len = sg_dma_len(&sg[0]); +	dma_len = ib_sg_dma_len(dev, &sg[0]);  	riu = ioctx->rdma_ius;  	/* @@ -1155,7 +1156,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,  					++j;  					if (j < count) {  						sg = sg_next(sg); -						dma_len = sg_dma_len(sg); +						dma_len = ib_sg_dma_len( +								dev, sg);  					}  				}  			} else { @@ -1192,8 +1194,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,  	tsize = cmd->data_length;  	riu = ioctx->rdma_ius;  	sg = sg_orig; -	dma_len = sg_dma_len(&sg[0]); -	dma_addr = sg_dma_address(&sg[0]); +	dma_len = ib_sg_dma_len(dev, &sg[0]); +	dma_addr = ib_sg_dma_address(dev, &sg[0]);  	/* this second loop is really mapped sg_addres to rdma_iu->ib_sge */  	for (i = 0, j = 0; @@ -1216,8 +1218,10 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,  					++j;  					if (j < count) {  						sg = sg_next(sg); -						dma_len = sg_dma_len(sg); -						dma_addr = sg_dma_address(sg); +						dma_len = ib_sg_dma_len( +								dev, sg); +						dma_addr = ib_sg_dma_address( +								dev, sg);  					}  				}  			} else { @@ -1352,11 +1356,8 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)  		/* XXX(hch): this is a horrible layering violation.. */  		spin_lock_irqsave(&ioctx->cmd.t_state_lock, flags); -		ioctx->cmd.transport_state |= CMD_T_LUN_STOP;  		ioctx->cmd.transport_state &= ~CMD_T_ACTIVE;  		spin_unlock_irqrestore(&ioctx->cmd.t_state_lock, flags); - -		complete(&ioctx->cmd.transport_lun_stop_comp);  		break;  	case SRPT_STATE_CMD_RSP_SENT:  		/* @@ -1364,9 +1365,6 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)  		 * not been received in time.  		 */  		srpt_unmap_sg_to_ib_sge(ioctx->ch, ioctx); -		spin_lock_irqsave(&ioctx->cmd.t_state_lock, flags); -		ioctx->cmd.transport_state |= CMD_T_LUN_STOP; -		spin_unlock_irqrestore(&ioctx->cmd.t_state_lock, flags);  		target_put_sess_cmd(ioctx->ch->sess, &ioctx->cmd);  		break;  	case SRPT_STATE_MGMT_RSP_SENT: @@ -1476,7 +1474,6 @@ static void srpt_handle_rdma_err_comp(struct srpt_rdma_ch *ch,  {  	struct se_cmd *cmd;  	enum srpt_command_state state; -	unsigned long flags;  	cmd = &ioctx->cmd;  	state = srpt_get_cmd_state(ioctx); @@ -1496,9 +1493,6 @@ static void srpt_handle_rdma_err_comp(struct srpt_rdma_ch *ch,  			       __func__, __LINE__, state);  		break;  	case SRPT_RDMA_WRITE_LAST: -		spin_lock_irqsave(&ioctx->cmd.t_state_lock, flags); -		ioctx->cmd.transport_state |= CMD_T_LUN_STOP; -		spin_unlock_irqrestore(&ioctx->cmd.t_state_lock, flags);  		break;  	default:  		printk(KERN_ERR "%s[%d]: opcode = %u\n", __func__, @@ -1588,7 +1582,7 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch,  	int resp_data_len;  	int resp_len; -	resp_data_len = (rsp_code == SRP_TSK_MGMT_SUCCESS) ? 0 : 4; +	resp_data_len = 4;  	resp_len = sizeof(*srp_rsp) + resp_data_len;  	srp_rsp = ioctx->ioctx.buf; @@ -1600,11 +1594,9 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch,  				    + atomic_xchg(&ch->req_lim_delta, 0));  	srp_rsp->tag = tag; -	if (rsp_code != SRP_TSK_MGMT_SUCCESS) { -		srp_rsp->flags |= SRP_RSP_FLAG_RSPVALID; -		srp_rsp->resp_data_len = cpu_to_be32(resp_data_len); -		srp_rsp->data[3] = rsp_code; -	} +	srp_rsp->flags |= SRP_RSP_FLAG_RSPVALID; +	srp_rsp->resp_data_len = cpu_to_be32(resp_data_len); +	srp_rsp->data[3] = rsp_code;  	return resp_len;  } @@ -2358,6 +2350,8 @@ static void srpt_release_channel_work(struct work_struct *w)  	transport_deregister_session(se_sess);  	ch->sess = NULL; +	ib_destroy_cm_id(ch->cm_id); +  	srpt_destroy_ch_ib(ch);  	srpt_free_ioctx_ring((struct srpt_ioctx **)ch->ioctx_ring, @@ -2368,8 +2362,6 @@ static void srpt_release_channel_work(struct work_struct *w)  	list_del(&ch->list);  	spin_unlock_irq(&sdev->spinlock); -	ib_destroy_cm_id(ch->cm_id); -  	if (ch->release_done)  		complete(ch->release_done); @@ -2592,7 +2584,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,  		goto destroy_ib;  	} -	ch->sess = transport_init_session(); +	ch->sess = transport_init_session(TARGET_PROT_NORMAL);  	if (IS_ERR(ch->sess)) {  		rej->reason = __constant_cpu_to_be32(  				SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES); @@ -3093,6 +3085,14 @@ static void srpt_queue_tm_rsp(struct se_cmd *cmd)  	srpt_queue_response(cmd);  } +static void srpt_aborted_task(struct se_cmd *cmd) +{ +	struct srpt_send_ioctx *ioctx = container_of(cmd, +				struct srpt_send_ioctx, cmd); + +	srpt_unmap_sg_to_ib_sge(ioctx->ch, ioctx); +} +  static int srpt_queue_status(struct se_cmd *cmd)  {  	struct srpt_send_ioctx *ioctx; @@ -3678,9 +3678,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) { @@ -3718,9 +3718,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) { @@ -3758,9 +3758,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) { @@ -3805,7 +3805,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; @@ -3940,6 +3940,7 @@ static struct target_core_fabric_ops srpt_template = {  	.queue_data_in			= srpt_queue_data_in,  	.queue_status			= srpt_queue_status,  	.queue_tm_rsp			= srpt_queue_tm_rsp, +	.aborted_task			= srpt_aborted_task,  	/*  	 * Setup function pointers for generic logic in  	 * target_core_fabric_configfs.c  | 
