diff options
| author | Andy Grover <agrover@redhat.com> | 2011-07-19 10:26:37 +0000 | 
|---|---|---|
| committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-07-22 09:37:43 +0000 | 
| commit | 5951146dea1ac8ff2f177477c907084d63913cad (patch) | |
| tree | 699cb7c498ca1799ae3e349cb4360171d9fa63e0 /drivers/target/loopback/tcm_loop.c | |
| parent | f22c119683e73498d8126581a1be75e1b7a339a3 (diff) | |
| download | olio-linux-3.10-5951146dea1ac8ff2f177477c907084d63913cad.tar.xz olio-linux-3.10-5951146dea1ac8ff2f177477c907084d63913cad.zip  | |
target: More core cleanups from AGrover (round 2)
This patch contains the squashed version of second round of target core
cleanups and simplifications and Andy and Co.   It also contains a handful
of fixes to address bugs the original series and other minor cleanups.
Here is the condensed shortlog:
target: Remove unneeded casts to void*
target: Rename get_lun_for_{cmd,tmr} to lookup_{cmd,tmr}_lun
target: Make t_task a member of se_cmd, not a pointer
target: Handle functions returning "-2"
target: Use cmd->se_dev over cmd->se_lun->lun_se_dev
target: Embed qr in struct se_cmd
target: Replace embedded struct se_queue_req with a list_head
target: Rename list_heads that are nodes in struct se_cmd to "*_node"
target: Fold transport_device_setup_cmd() into lookup_{tmr,cmd}_lun()
target: Make t_mem_list and t_mem_list_bidi members of t_task
target: Add comment & cleanup transport_map_sg_to_mem()
target: Remove unneeded checks in transport_free_pages()
(Roland: Fix se_queue_req removal leftovers OOPs)
(nab: Fix transport_lookup_tmr_lun failure case)
(nab: Fix list_empty(&cmd->t_task.t_mem_bidi_list) inversion bugs)
Signed-off-by: Andy Grover <agrover@redhat.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/loopback/tcm_loop.c')
| -rw-r--r-- | drivers/target/loopback/tcm_loop.c | 56 | 
1 files changed, 22 insertions, 34 deletions
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index 2f19e192649..eeb7ee7ab9f 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c @@ -118,17 +118,16 @@ static struct se_cmd *tcm_loop_allocate_core_cmd(  	 * Signal BIDI usage with T_TASK(cmd)->t_tasks_bidi  	 */  	if (scsi_bidi_cmnd(sc)) -		se_cmd->t_task->t_tasks_bidi = 1; +		se_cmd->t_task.t_tasks_bidi = 1;  	/*  	 * Locate the struct se_lun pointer and attach it to struct se_cmd  	 */ -	if (transport_get_lun_for_cmd(se_cmd, tl_cmd->sc->device->lun) < 0) { +	if (transport_lookup_cmd_lun(se_cmd, tl_cmd->sc->device->lun) < 0) {  		kmem_cache_free(tcm_loop_cmd_cache, tl_cmd);  		set_host_byte(sc, DID_NO_CONNECT);  		return NULL;  	} -	transport_device_setup_cmd(se_cmd);  	return se_cmd;  } @@ -143,17 +142,17 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd)  	struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,  				struct tcm_loop_cmd, tl_se_cmd);  	struct scsi_cmnd *sc = tl_cmd->sc; -	void *mem_ptr, *mem_bidi_ptr = NULL; -	u32 sg_no_bidi = 0; +	struct scatterlist *sgl_bidi = NULL; +	u32 sgl_bidi_count = 0;  	int ret;  	/*  	 * Allocate the necessary tasks to complete the received CDB+data  	 */ -	ret = transport_generic_allocate_tasks(se_cmd, tl_cmd->sc->cmnd); -	if (ret == -1) { +	ret = transport_generic_allocate_tasks(se_cmd, sc->cmnd); +	if (ret == -ENOMEM) {  		/* Out of Resources */  		return PYX_TRANSPORT_LU_COMM_FAILURE; -	} else if (ret == -2) { +	} else if (ret == -EINVAL) {  		/*  		 * Handle case for SAM_STAT_RESERVATION_CONFLICT  		 */ @@ -165,35 +164,24 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd)  		 */  		return PYX_TRANSPORT_USE_SENSE_REASON;  	} +  	/* -	 * Setup the struct scatterlist memory from the received -	 * struct scsi_cmnd. +	 * For BIDI commands, pass in the extra READ buffer +	 * to transport_generic_map_mem_to_cmd() below..  	 */ -	if (scsi_sg_count(sc)) { -		se_cmd->se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM; -		mem_ptr = (void *)scsi_sglist(sc); -		/* -		 * For BIDI commands, pass in the extra READ buffer -		 * to transport_generic_map_mem_to_cmd() below.. -		 */ -		if (se_cmd->t_task->t_tasks_bidi) { -			struct scsi_data_buffer *sdb = scsi_in(sc); +	if (se_cmd->t_task.t_tasks_bidi) { +		struct scsi_data_buffer *sdb = scsi_in(sc); -			mem_bidi_ptr = (void *)sdb->table.sgl; -			sg_no_bidi = sdb->table.nents; -		} -	} else { -		/* -		 * Used for DMA_NONE -		 */ -		mem_ptr = NULL; +		sgl_bidi = sdb->table.sgl; +		sgl_bidi_count = sdb->table.nents;  	} +  	/*  	 * Map the SG memory into struct se_mem->page linked list using the same  	 * physical memory at sg->page_link.  	 */ -	ret = transport_generic_map_mem_to_cmd(se_cmd, mem_ptr, -			scsi_sg_count(sc), mem_bidi_ptr, sg_no_bidi); +	ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc), +			scsi_sg_count(sc), sgl_bidi, sgl_bidi_count);  	if (ret < 0)  		return PYX_TRANSPORT_LU_COMM_FAILURE; @@ -384,14 +372,14 @@ static int tcm_loop_device_reset(struct scsi_cmnd *sc)  	/*  	 * Allocate the LUN_RESET TMR  	 */ -	se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, (void *)tl_tmr, +	se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, tl_tmr,  				TMR_LUN_RESET);  	if (IS_ERR(se_cmd->se_tmr_req))  		goto release;  	/*  	 * Locate the underlying TCM struct se_lun from sc->device->lun  	 */ -	if (transport_get_lun_for_tmr(se_cmd, sc->device->lun) < 0) +	if (transport_lookup_tmr_lun(se_cmd, sc->device->lun) < 0)  		goto release;  	/*  	 * Queue the TMR to TCM Core and sleep waiting for tcm_loop_queue_tm_rsp() @@ -904,7 +892,7 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd)  	   ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) ||  	    (se_cmd->se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { -		memcpy((void *)sc->sense_buffer, (void *)se_cmd->sense_buffer, +		memcpy(sc->sense_buffer, se_cmd->sense_buffer,  				SCSI_SENSE_BUFFERSIZE);  		sc->result = SAM_STAT_CHECK_CONDITION;  		set_driver_byte(sc, DRIVER_SENSE); @@ -1054,7 +1042,7 @@ static int tcm_loop_make_nexus(  	 * transport_register_session()  	 */  	__transport_register_session(se_tpg, tl_nexus->se_sess->se_node_acl, -			tl_nexus->se_sess, (void *)tl_nexus); +			tl_nexus->se_sess, tl_nexus);  	tl_tpg->tl_hba->tl_nexus = tl_nexus;  	printk(KERN_INFO "TCM_Loop_ConfigFS: Established I_T Nexus to emulated"  		" %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba), @@ -1242,7 +1230,7 @@ struct se_portal_group *tcm_loop_make_naa_tpg(  	 * Register the tl_tpg as a emulated SAS TCM Target Endpoint  	 */  	ret = core_tpg_register(&tcm_loop_fabric_configfs->tf_ops, -			wwn, &tl_tpg->tl_se_tpg, (void *)tl_tpg, +			wwn, &tl_tpg->tl_se_tpg, tl_tpg,  			TRANSPORT_TPG_TYPE_NORMAL);  	if (ret < 0)  		return ERR_PTR(-ENOMEM);  |