Re: [PATCH, RFC] target: simplify se_task mapping

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2010-11-16 at 12:38 -0500, Christoph Hellwig wrote:
> Instead of having separate methods for mapping read/write CDBs
> add a data_direction member to struct se_task abd unify the code
> in the backends.  Also remove all kinds of unused copies of the
> task state in the backend-specific task structures.
> 
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Hi Christoph,

I think this cleanup looks good.  Committed as e79b6805

--nab

> 
> Index: lio-core/drivers/target/target_core_file.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_file.c	2010-11-16 10:33:03.117004333 +0100
> +++ lio-core/drivers/target/target_core_file.c	2010-11-16 12:26:05.116254863 +0100
> @@ -304,41 +304,30 @@ fd_alloc_task(struct se_cmd *cmd)
>  	return &fd_req->fd_task;
>  }
>  
> -static inline int fd_iovec_alloc(struct fd_request *req)
> -{
> -	req->fd_iovs = kzalloc(sizeof(struct iovec) * req->fd_sg_count,
> -				GFP_KERNEL);
> -	if (!(req->fd_iovs)) {
> -		printk(KERN_ERR "Unable to allocate req->fd_iovs\n");
> -		return -1;
> -	}
> -
> -	return 0;
> -}
> -
> -static int fd_do_readv(struct fd_request *req, struct se_task *task)
> +static int fd_do_readv(struct se_task *task)
>  {
> +	struct fd_request *req = FILE_REQ(task);
>  	struct file *fd = req->fd_dev->fd_file;
>  	struct scatterlist *sg = task->task_sg;
>  	struct iovec *iov;
>  	mm_segment_t old_fs;
> -	loff_t pos = (req->fd_lba * DEV_ATTRIB(task->se_dev)->block_size);
> +	loff_t pos = (task->task_lba * DEV_ATTRIB(task->se_dev)->block_size);
>  	int ret = 0, i;
>  
> -	iov = kzalloc(sizeof(struct iovec) * req->fd_sg_count, GFP_KERNEL);
> +	iov = kzalloc(sizeof(struct iovec) * task->task_sg_num, GFP_KERNEL);
>  	if (!(iov)) {
>  		printk(KERN_ERR "Unable to allocate fd_do_readv iov[]\n");
>  		return -1;
>  	}
>  
> -	for (i = 0; i < req->fd_sg_count; i++) {
> +	for (i = 0; i < task->task_sg_num; i++) {
>  		iov[i].iov_len = sg[i].length;
>  		iov[i].iov_base = sg_virt(&sg[i]);
>  	}
>  
>  	old_fs = get_fs();
>  	set_fs(get_ds());
> -	ret = vfs_readv(fd, &iov[0], req->fd_sg_count, &pos);
> +	ret = vfs_readv(fd, &iov[0], task->task_sg_num, &pos);
>  	set_fs(old_fs);
>  
>  	kfree(iov);
> @@ -348,10 +337,10 @@ static int fd_do_readv(struct fd_request
>  	 * block_device.
>  	 */
>  	if (S_ISBLK(fd->f_dentry->d_inode->i_mode)) {
> -		if (ret < 0 || ret != req->fd_size) {
> +		if (ret < 0 || ret != task->task_size) {
>  			printk(KERN_ERR "vfs_readv() returned %d,"
>  				" expecting %d for S_ISBLK\n", ret,
> -				(int)req->fd_size);
> +				(int)task->task_size);
>  			return -1;
>  		}
>  	} else {
> @@ -365,98 +354,35 @@ static int fd_do_readv(struct fd_request
>  	return 1;
>  }
>  
> -#if 0
> -
> -static void fd_sendfile_free_DMA(struct se_cmd *cmd)
> -{
> -	printk(KERN_INFO "Release reference to pages now..\n");
> -}
> -
> -static static int fd_sendactor(
> -	read_descriptor_t *desc,
> -	struct page *page,
> -	unsigned long offset,
> -	unsigned long size)
> +static int fd_do_writev(struct se_task *task)
>  {
> -	unsigned long count = desc->count;
> -	struct se_task *task = desc->arg.data;
>  	struct fd_request *req = FILE_REQ(task);
> -	struct scatterlist *sg = task->task_sg;
> -
> -	printk(KERN_INFO "page: %p offset: %lu size: %lu\n", page,
> -			offset, size);
> -
> -	__free_page(sg[req->fd_cur_offset].page);
> -
> -	printk(KERN_INFO "page_address(page): %p\n", page_address(page));
> -	sg[req->fd_cur_offset].page = page;
> -	sg[req->fd_cur_offset].offset = offset;
> -	sg[req->fd_cur_offset].length = size;
> -
> -	printk(KERN_INFO "sg[%d:%p].page %p length: %d\n", req->fd_cur_offset,
> -		&sg[req->fd_cur_offset], sg[req->fd_cur_offset].page,
> -		sg[req->fd_cur_offset].length);
> -
> -	req->fd_cur_size += size;
> -	printk(KERN_INFO "fd_cur_size: %u\n", req->fd_cur_size);
> -
> -	req->fd_cur_offset++;
> -
> -	desc->count--;
> -	desc->written += size;
> -	return size;
> -}
> -
> -static int fd_do_sendfile(struct fd_request *req, struct se_task *task)
> -{
> -	int ret = 0;
> -	struct file *fd = req->fd_dev->fd_file;
> -
> -	if (fd_seek(fd, req->fd_lba, DEV_ATTRIB(task->se_dev)->block_size) < 0)
> -		return -1;
> -
> -	TASK_CMD(task)->transport_free_DMA = &fd_sendfile_free_DMA;
> -
> -	ret = fd->f_op->sendfile(fd, &fd->f_pos, req->fd_sg_count,
> -			fd_sendactor, (void *)task);
> -
> -	if (ret < 0) {
> -		printk(KERN_ERR "fd->f_op->sendfile() returned %d\n", ret);
> -		return -1;
> -	}
> -
> -	return 1;
> -}
> -#endif
> -
> -static int fd_do_writev(struct fd_request *req, struct se_task *task)
> -{
>  	struct file *fd = req->fd_dev->fd_file;
>  	struct scatterlist *sg = task->task_sg;
>  	struct iovec *iov;
>  	mm_segment_t old_fs;
> -	loff_t pos = (req->fd_lba * DEV_ATTRIB(task->se_dev)->block_size);
> +	loff_t pos = (task->task_lba * DEV_ATTRIB(task->se_dev)->block_size);
>  	int ret, i = 0;
>  
> -	iov = kzalloc(sizeof(struct iovec) * req->fd_sg_count, GFP_KERNEL);
> +	iov = kzalloc(sizeof(struct iovec) * task->task_sg_num, GFP_KERNEL);
>  	if (!(iov)) {
>  		printk(KERN_ERR "Unable to allocate fd_do_writev iov[]\n");
>  		return -1;
>  	}
>  
> -	for (i = 0; i < req->fd_sg_count; i++) {
> +	for (i = 0; i < task->task_sg_num; i++) {
>  		iov[i].iov_len = sg[i].length;
>  		iov[i].iov_base = sg_virt(&sg[i]);
>  	}
>  
>  	old_fs = get_fs();
>  	set_fs(get_ds());
> -	ret = vfs_writev(fd, &iov[0], req->fd_sg_count, &pos);
> +	ret = vfs_writev(fd, &iov[0], task->task_sg_num, &pos);
>  	set_fs(old_fs);
>  
>  	kfree(iov);
>  
> -	if (ret < 0 || ret != req->fd_size) {
> +	if (ret < 0 || ret != task->task_size) {
>  		printk(KERN_ERR "vfs_writev() returned %d\n", ret);
>  		return -1;
>  	}
> @@ -553,31 +479,21 @@ static int fd_do_task(struct se_task *ta
>  {
>  	struct se_cmd *cmd = task->task_se_cmd;
>  	struct se_device *dev = cmd->se_dev;
> -	struct fd_request *req = FILE_REQ(task);
>  	int ret = 0;
>  
> -	req->fd_lba = task->task_lba;
> -	req->fd_size = task->task_size;
>  	/*
>  	 * Call vectorized fileio functions to map struct scatterlist
>  	 * physical memory addresses to struct iovec virtual memory.
>  	 */
> -	if (req->fd_data_direction == FD_DATA_READ)
> -		ret = fd_do_readv(req, task);
> -	else
> -		ret = fd_do_writev(req, task);
> -
> -	if (ret < 0)
> -		return ret;
> +	if (task->task_data_direction == DMA_FROM_DEVICE) {
> +		ret = fd_do_readv(task);
> +	} else {
> +		ret = fd_do_writev(task);
>  
> -	if (ret) {
> -		/*
> -		 * Check for Forced Unit Access WRITE emulation
> -		 */
> -		if ((DEV_ATTRIB(dev)->emulate_write_cache > 0) &&
> -		    (DEV_ATTRIB(dev)->emulate_fua_write > 0) &&
> -		    (req->fd_data_direction == FD_DATA_WRITE) &&
> -		    (T_TASK(cmd)->t_tasks_fua)) {
> +		if (ret > 0 &&
> +		    DEV_ATTRIB(dev)->emulate_write_cache > 0 &&
> +		    DEV_ATTRIB(dev)->emulate_fua_write > 0 &&
> +		    T_TASK(cmd)->t_tasks_fua) {
>  			/*
>  			 * We might need to be a bit smarter here
>  			 * and return some sense data to let the initiator
> @@ -586,10 +502,14 @@ static int fd_do_task(struct se_task *ta
>  			fd_emulate_write_fua(cmd, task);
>  		}
>  
> +	}
> +
> +	if (ret < 0)
> +		return ret;
> +	if (ret) {
>  		task->task_scsi_status = GOOD;
>  		transport_complete_task(task, 1);
>  	}
> -
>  	return PYX_TRANSPORT_SENT_TO_TRANSPORT;
>  }
>  
> @@ -601,7 +521,6 @@ static void fd_free_task(struct se_task
>  {
>  	struct fd_request *req = FILE_REQ(task);
>  
> -	kfree(req->fd_iovs);
>  	kfree(req);
>  }
>  
> @@ -722,105 +641,6 @@ static ssize_t fd_show_configfs_dev_para
>  	return bl;
>  }
>  
> -/*	fd_map_task_non_SG():
> - *
> - *
> - */
> -static void fd_map_task_non_SG(struct se_task *task)
> -{
> -	struct se_cmd *cmd = TASK_CMD(task);
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_bufflen		= task->task_size;
> -	req->fd_buf		= (void *) T_TASK(cmd)->t_task_buf;
> -	req->fd_sg_count	= 0;
> -}
> -
> -/*	fd_map_task_SG():
> - *
> - *
> - */
> -static void fd_map_task_SG(struct se_task *task)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_bufflen		= task->task_size;
> -	req->fd_buf		= NULL;
> -	req->fd_sg_count	= task->task_sg_num;
> -}
> -
> -/*      fd_CDB_none():
> - *
> - *
> - */
> -static int fd_CDB_none(struct se_task *task, u32 size)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_data_direction	= FD_DATA_NONE;
> -	req->fd_bufflen		= 0;
> -	req->fd_sg_count	= 0;
> -	req->fd_buf		= NULL;
> -
> -	return 0;
> -}
> -
> -/*	fd_CDB_read_non_SG():
> - *
> - *
> - */
> -static int fd_CDB_read_non_SG(struct se_task *task, u32 size)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_data_direction = FD_DATA_READ;
> -	fd_map_task_non_SG(task);
> -
> -	return 0;
> -}
> -
> -/*	fd_CDB_read_SG):
> - *
> - *
> - */
> -static int fd_CDB_read_SG(struct se_task *task, u32 size)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_data_direction = FD_DATA_READ;
> -	fd_map_task_SG(task);
> -
> -	return req->fd_sg_count;
> -}
> -
> -/*	fd_CDB_write_non_SG():
> - *
> - *
> - */
> -static int fd_CDB_write_non_SG(struct se_task *task, u32 size)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_data_direction = FD_DATA_WRITE;
> -	fd_map_task_non_SG(task);
> -
> -	return 0;
> -}
> -
> -/*	fd_CDB_write_SG():
> - *
> - *
> - */
> -static int fd_CDB_write_SG(struct se_task *task, u32 size)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	req->fd_data_direction = FD_DATA_WRITE;
> -	fd_map_task_SG(task);
> -
> -	return req->fd_sg_count;
> -}
> -
>  /*	fd_check_lba():
>   *
>   *
> @@ -830,17 +650,6 @@ static int fd_check_lba(unsigned long lo
>  	return 0;
>  }
>  
> -/*	fd_check_for_SG(): (Part of se_subsystem_api_t template)
> - *
> - *
> - */
> -static int fd_check_for_SG(struct se_task *task)
> -{
> -	struct fd_request *req = FILE_REQ(task);
> -
> -	return req->fd_sg_count;
> -}
> -
>  /*	fd_get_cdb(): (Part of se_subsystem_api_t template)
>   *
>   *
> @@ -895,11 +704,6 @@ static struct se_subsystem_api fileio_te
>  	.transport_type		= TRANSPORT_PLUGIN_VHBA_PDEV,
>  	.attach_hba		= fd_attach_hba,
>  	.detach_hba		= fd_detach_hba,
> -	.cdb_none		= fd_CDB_none,
> -	.cdb_read_non_SG	= fd_CDB_read_non_SG,
> -	.cdb_read_SG		= fd_CDB_read_SG,
> -	.cdb_write_non_SG	= fd_CDB_write_non_SG,
> -	.cdb_write_SG		= fd_CDB_write_SG,
>  	.allocate_virtdevice	= fd_allocate_virtdevice,
>  	.create_virtdevice	= fd_create_virtdevice,
>  	.free_device		= fd_free_device,
> @@ -918,7 +722,6 @@ static struct se_subsystem_api fileio_te
>  	.get_plugin_info	= fd_get_plugin_info,
>  	.get_hba_info		= fd_get_hba_info,
>  	.check_lba		= fd_check_lba,
> -	.check_for_SG		= fd_check_for_SG,
>  	.get_cdb		= fd_get_cdb,
>  	.get_device_rev		= fd_get_device_rev,
>  	.get_device_type	= fd_get_device_type,
> Index: lio-core/drivers/target/target_core_file.h
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_file.h	2010-11-16 10:33:03.125004403 +0100
> +++ lio-core/drivers/target/target_core_file.h	2010-11-16 10:34:05.928032340 +0100
> @@ -11,10 +11,6 @@
>  #define FD_BLOCKSIZE		512
>  #define FD_MAX_SECTORS		1024
>  
> -#define FD_DATA_READ		1
> -#define FD_DATA_WRITE		2
> -#define FD_DATA_NONE		3
> -
>  extern struct se_global *se_global;
>  
>  #define RRF_EMULATE_CDB		0x01
> @@ -24,26 +20,6 @@ struct fd_request {
>  	struct se_task	fd_task;
>  	/* SCSI CDB from iSCSI Command PDU */
>  	unsigned char	fd_scsi_cdb[TCM_MAX_COMMAND_SIZE];
> -	/* Data Direction */
> -	u8		fd_data_direction;
> -	/* Total length of request */
> -	u32		fd_bufflen;
> -	/* RD request flags */
> -	u32		fd_req_flags;
> -	/* Offset from start of page */
> -	u32		fd_offset;
> -	u32		fd_cur_size;
> -	u32		fd_cur_offset;
> -	/* Scatterlist count */
> -	u32		fd_sg_count;
> -	/* Logical Block Address */
> -	unsigned long long	fd_lba;
> -	u64		fd_size;
> -	struct kiocb	fd_iocb;
> -	struct iovec	*fd_iovs;
> -	/* Data buffer containing scatterlists(s) or contingous
> -	   memory segments */
> -	void		*fd_buf;
>  	/* FILEIO device */
>  	struct fd_dev	*fd_dev;
>  } ____cacheline_aligned;
> @@ -65,8 +41,6 @@ struct fd_dev {
>  	struct file	*fd_file;
>  	/* FILEIO HBA device is connected to */
>  	struct fd_host *fd_host;
> -	int (*fd_do_read)(struct fd_request *, struct se_task *);
> -	int (*fd_do_write)(struct fd_request *, struct se_task *);
>  } ____cacheline_aligned;
>  
>  struct fd_host {
> Index: lio-core/drivers/target/target_core_iblock.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_iblock.c	2010-11-16 10:33:03.134004613 +0100
> +++ lio-core/drivers/target/target_core_iblock.c	2010-11-16 12:26:33.202041352 +0100
> @@ -412,7 +412,7 @@ static int iblock_do_task(struct se_task
>  	struct bio *bio = req->ib_bio, *nbio = NULL;
>  	int rw;
>  
> -	if (TASK_CMD(task)->data_direction == DMA_TO_DEVICE) {
> +	if (task->task_data_direction == DMA_TO_DEVICE) {
>  		/*
>  		 * Force data to disk if we pretend to not have a volatile
>  		 * write cache, or the initiator set the Force Unit Access bit.
> @@ -710,7 +710,7 @@ again:
>  				" %u\n", task, bio->bi_vcnt);
>  	}
>  
> -	return task->task_sg_num;
> +	return 0;
>  fail:
>  	while (hbio) {
>  		bio = hbio;
> @@ -721,41 +721,11 @@ fail:
>  	return ret;
>  }
>  
> -static int iblock_CDB_none(struct se_task *task, u32 size)
> -{
> -	return 0;
> -}
> -
> -static int iblock_CDB_read_non_SG(struct se_task *task, u32 size)
> -{
> -	return 0;
> -}
> -
> -static int iblock_CDB_read_SG(struct se_task *task, u32 size)
> -{
> -	return iblock_map_task_SG(task);
> -}
> -
> -static int iblock_CDB_write_non_SG(struct se_task *task, u32 size)
> -{
> -	return 0;
> -}
> -
> -static int iblock_CDB_write_SG(struct se_task *task, u32 size)
> -{
> -	return iblock_map_task_SG(task);
> -}
> -
>  static int iblock_check_lba(unsigned long long lba, struct se_device *dev)
>  {
>  	return 0;
>  }
>  
> -static int iblock_check_for_SG(struct se_task *task)
> -{
> -	return task->task_sg_num;
> -}
> -
>  static unsigned char *iblock_get_cdb(struct se_task *task)
>  {
>  	return IBLOCK_REQ(task)->ib_scsi_cdb;
> @@ -838,11 +808,7 @@ static struct se_subsystem_api iblock_te
>  	.owner			= THIS_MODULE,
>  	.type			= IBLOCK,
>  	.transport_type		= TRANSPORT_PLUGIN_VHBA_PDEV,
> -	.cdb_none		= iblock_CDB_none,
> -	.cdb_read_non_SG	= iblock_CDB_read_non_SG,
> -	.cdb_read_SG		= iblock_CDB_read_SG,
> -	.cdb_write_non_SG	= iblock_CDB_write_non_SG,
> -	.cdb_write_SG		= iblock_CDB_write_SG,
> +	.map_task_SG		= iblock_map_task_SG,
>  	.attach_hba		= iblock_attach_hba,
>  	.detach_hba		= iblock_detach_hba,
>  	.allocate_virtdevice	= iblock_allocate_virtdevice,
> @@ -864,7 +830,6 @@ static struct se_subsystem_api iblock_te
>  	.get_plugin_info	= iblock_get_plugin_info,
>  	.get_hba_info		= iblock_get_hba_info,
>  	.check_lba		= iblock_check_lba,
> -	.check_for_SG		= iblock_check_for_SG,
>  	.get_cdb		= iblock_get_cdb,
>  	.get_device_rev		= iblock_get_device_rev,
>  	.get_device_type	= iblock_get_device_type,
> Index: lio-core/drivers/target/target_core_iblock.h
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_iblock.h	2010-11-16 10:33:03.142010829 +0100
> +++ lio-core/drivers/target/target_core_iblock.h	2010-11-16 10:34:05.936022143 +0100
> @@ -16,8 +16,6 @@ struct iblock_req {
>  	unsigned char ib_scsi_cdb[TCM_MAX_COMMAND_SIZE];
>  	atomic_t ib_bio_cnt;
>  	atomic_t ib_bio_err_cnt;
> -	u32	ib_sg_count;
> -	void	*ib_buf;
>  	struct bio *ib_bio;
>  	struct iblock_dev *ib_dev;
>  } ____cacheline_aligned;
> Index: lio-core/drivers/target/target_core_rd.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_rd.c	2010-11-16 10:34:05.085260863 +0100
> +++ lio-core/drivers/target/target_core_rd.c	2010-11-16 12:27:09.238272596 +0100
> @@ -394,6 +394,7 @@ static struct rd_dev_sg_table *rd_get_sg
>   */
>  static int rd_MEMCPY_read(struct rd_request *req)
>  {
> +	struct se_task *task = &req->rd_task;
>  	struct rd_dev *dev = req->rd_dev;
>  	struct rd_dev_sg_table *table;
>  	struct scatterlist *sg_d, *sg_s;
> @@ -407,11 +408,11 @@ static int rd_MEMCPY_read(struct rd_requ
>  		return -1;
>  
>  	table_sg_end = (table->page_end_offset - req->rd_page);
> -	sg_d = req->rd_buf;
> +	sg_d = task->task_sg;
>  	sg_s = &table->sg_table[req->rd_page - table->page_start_offset];
>  #ifdef DEBUG_RAMDISK_MCP
>  	printk(KERN_INFO "RD[%u]: Read LBA: %llu, Size: %u Page: %u, Offset:"
> -		" %u\n", dev->rd_dev_id, req->rd_lba, req->rd_size,
> +		" %u\n", dev->rd_dev_id, task->task_lba, req->rd_size,
>  		req->rd_page, req->rd_offset);
>  #endif
>  	src_offset = rd_offset;
> @@ -516,6 +517,7 @@ static int rd_MEMCPY_read(struct rd_requ
>   */
>  static int rd_MEMCPY_write(struct rd_request *req)
>  {
> +	struct se_task *task = &req->rd_task;
>  	struct rd_dev *dev = req->rd_dev;
>  	struct rd_dev_sg_table *table;
>  	struct scatterlist *sg_d, *sg_s;
> @@ -530,10 +532,10 @@ static int rd_MEMCPY_write(struct rd_req
>  
>  	table_sg_end = (table->page_end_offset - req->rd_page);
>  	sg_d = &table->sg_table[req->rd_page - table->page_start_offset];
> -	sg_s = req->rd_buf;
> +	sg_s = task->task_sg;
>  #ifdef DEBUG_RAMDISK_MCP
>  	printk(KERN_INFO "RD[%d] Write LBA: %llu, Size: %u, Page: %u,"
> -		" Offset: %u\n", dev->rd_dev_id, req->rd_lba, req->rd_size,
> +		" Offset: %u\n", dev->rd_dev_id, task->task_lba, req->rd_size,
>  		req->rd_page, req->rd_offset);
>  #endif
>  	dst_offset = rd_offset;
> @@ -640,16 +642,17 @@ static int rd_MEMCPY_do_task(struct se_t
>  {
>  	struct se_device *dev = task->se_dev;
>  	struct rd_request *req = RD_REQ(task);
> +	unsigned long long lba;
>  	int ret;
>  
> -	req->rd_lba = task->task_lba;
> -	req->rd_page = (req->rd_lba * DEV_ATTRIB(dev)->block_size) / PAGE_SIZE;
> -	req->rd_offset = (do_div(req->rd_lba,
> +	req->rd_page = (task->task_lba * DEV_ATTRIB(dev)->block_size) / PAGE_SIZE;
> +	lba = task->task_lba;
> +	req->rd_offset = (do_div(lba,
>  			  (PAGE_SIZE / DEV_ATTRIB(dev)->block_size))) *
>  			   DEV_ATTRIB(dev)->block_size;
>  	req->rd_size = task->task_size;
>  
> -	if (req->rd_data_direction == RD_DATA_READ)
> +	if (task->task_data_direction == DMA_FROM_DEVICE)
>  		ret = rd_MEMCPY_read(req);
>  	else
>  		ret = rd_MEMCPY_write(req);
> @@ -689,8 +692,9 @@ static int rd_DIRECT_with_offset(
>  	sg_s = &table->sg_table[req->rd_page - table->page_start_offset];
>  #ifdef DEBUG_RAMDISK_DR
>  	printk(KERN_INFO "%s DIRECT LBA: %llu, Size: %u Page: %u, Offset: %u\n",
> -		(req->rd_data_direction != RD_DATA_READ) ? "Write" : "Read",
> -		req->rd_lba, req->rd_size, req->rd_page, req->rd_offset);
> +		(task->task_data_direction == DMA_TO_DEVICE) ?
> +			"Write" : "Read",
> +		task->task_lba, req->rd_size, req->rd_page, req->rd_offset);
>  #endif
>  	while (req->rd_size) {
>  		se_mem = kmem_cache_zalloc(se_mem_cache, GFP_KERNEL);
> @@ -790,8 +794,9 @@ static int rd_DIRECT_without_offset(
>  	sg_s = &table->sg_table[req->rd_page - table->page_start_offset];
>  #ifdef DEBUG_RAMDISK_DR
>  	printk(KERN_INFO "%s DIRECT LBA: %llu, Size: %u, Page: %u\n",
> -		(req->rd_data_direction != RD_DATA_READ) ? "Write" : "Read",
> -		req->rd_lba, req->rd_size, req->rd_page);
> +		(task->task_data_direction == DMA_TO_DEVICE) ?
> +			"Write" : "Read",
> +		task->task_lba, req->rd_size, req->rd_page);
>  #endif
>  	while (req->rd_size) {
>  		se_mem = kmem_cache_zalloc(se_mem_cache, GFP_KERNEL);
> @@ -863,13 +868,13 @@ static int rd_DIRECT_do_se_mem_map(
>  	struct se_cmd *cmd = task->task_se_cmd;
>  	struct rd_request *req = RD_REQ(task);
>  	u32 task_offset = *task_offset_in;
> +	unsigned long long lba;
>  	int ret;
>  
> -	req->rd_lba = task->task_lba;
> -	req->rd_req_flags = RRF_GOT_LBA;
> -	req->rd_page = ((req->rd_lba * DEV_ATTRIB(task->se_dev)->block_size) /
> +	req->rd_page = ((task->task_lba * DEV_ATTRIB(task->se_dev)->block_size) /
>  			PAGE_SIZE);
> -	req->rd_offset = (do_div(req->rd_lba,
> +	lba = task->task_lba;
> +	req->rd_offset = (do_div(lba,
>  			  (PAGE_SIZE / DEV_ATTRIB(task->se_dev)->block_size))) *
>  			   DEV_ATTRIB(task->se_dev)->block_size;
>  	req->rd_size = task->task_size;
> @@ -1032,105 +1037,6 @@ static ssize_t rd_show_configfs_dev_para
>  	return bl;
>  }
>  
> -/*	rd_map_task_non_SG():
> - *
> - *
> - */
> -static void rd_map_task_non_SG(struct se_task *task)
> -{
> -	struct se_cmd *cmd = TASK_CMD(task);
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_bufflen		= task->task_size;
> -	req->rd_buf		= (void *) T_TASK(cmd)->t_task_buf;
> -	req->rd_sg_count	= 0;
> -}
> -
> -/*	rd_map_task_SG():
> - *
> - *
> - */
> -static void rd_map_task_SG(struct se_task *task)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_bufflen		= task->task_size;
> -	req->rd_buf		= task->task_sg;
> -	req->rd_sg_count	= task->task_sg_num;
> -}
> -
> -/*      rd_CDB_none():
> - *
> - *
> - */
> -static int rd_CDB_none(struct se_task *task, u32 size)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_data_direction	= RD_DATA_NONE;
> -	req->rd_bufflen		= 0;
> -	req->rd_sg_count	= 0;
> -	req->rd_buf		= NULL;
> -
> -	return 0;
> -}
> -
> -/*	rd_CDB_read_non_SG():
> - *
> - *
> - */
> -static int rd_CDB_read_non_SG(struct se_task *task, u32 size)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_data_direction = RD_DATA_READ;
> -	rd_map_task_non_SG(task);
> -
> -	return 0;
> -}
> -
> -/*	rd_CDB_read_SG):
> - *
> - *
> - */
> -static int rd_CDB_read_SG(struct se_task *task, u32 size)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_data_direction = RD_DATA_READ;
> -	rd_map_task_SG(task);
> -
> -	return req->rd_sg_count;
> -}
> -
> -/*	rd_CDB_write_non_SG():
> - *
> - *
> - */
> -static int rd_CDB_write_non_SG(struct se_task *task, u32 size)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_data_direction = RD_DATA_WRITE;
> -	rd_map_task_non_SG(task);
> -
> -	return 0;
> -}
> -
> -/*	d_CDB_write_SG():
> - *
> - *
> - */
> -static int rd_CDB_write_SG(struct se_task *task, u32 size)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	req->rd_data_direction = RD_DATA_WRITE;
> -	rd_map_task_SG(task);
> -
> -	return req->rd_sg_count;
> -}
> -
>  /*	rd_DIRECT_check_lba():
>   *
>   *
> @@ -1150,17 +1056,6 @@ static int rd_MEMCPY_check_lba(unsigned
>  	return 0;
>  }
>  
> -/*	rd_check_for_SG(): (Part of se_subsystem_api_t template)
> - *
> - *
> - */
> -static int rd_check_for_SG(struct se_task *task)
> -{
> -	struct rd_request *req = RD_REQ(task);
> -
> -	return req->rd_sg_count;
> -}
> -
>  /*	rd_get_cdb(): (Part of se_subsystem_api_t template)
>   *
>   *
> @@ -1204,11 +1099,6 @@ static struct se_subsystem_api rd_dr_tem
>  	.name			= "rd_dr",
>  	.type			= RAMDISK_DR,
>  	.transport_type		= TRANSPORT_PLUGIN_VHBA_VDEV,
> -	.cdb_none		= rd_CDB_none,
> -	.cdb_read_non_SG	= rd_CDB_read_non_SG,
> -	.cdb_read_SG		= rd_CDB_read_SG,
> -	.cdb_write_non_SG	= rd_CDB_write_non_SG,
> -	.cdb_write_SG		= rd_CDB_write_SG,
>  	.attach_hba		= rd_attach_hba,
>  	.detach_hba		= rd_detach_hba,
>  	.allocate_virtdevice	= rd_DIRECT_allocate_virtdevice,
> @@ -1224,7 +1114,6 @@ static struct se_subsystem_api rd_dr_tem
>  	.get_plugin_info	= rd_dr_get_plugin_info,
>  	.get_hba_info		= rd_get_hba_info,
>  	.check_lba		= rd_DIRECT_check_lba,
> -	.check_for_SG		= rd_check_for_SG,
>  	.get_cdb		= rd_get_cdb,
>  	.get_device_rev		= rd_get_device_rev,
>  	.get_device_type	= rd_get_device_type,
> @@ -1237,11 +1126,6 @@ static struct se_subsystem_api rd_mcp_te
>  	.name			= "rd_mcp",
>  	.type			= RAMDISK_MCP,
>  	.transport_type		= TRANSPORT_PLUGIN_VHBA_VDEV,
> -	.cdb_none		= rd_CDB_none,
> -	.cdb_read_non_SG	= rd_CDB_read_non_SG,
> -	.cdb_read_SG		= rd_CDB_read_SG,
> -	.cdb_write_non_SG	= rd_CDB_write_non_SG,
> -	.cdb_write_SG		= rd_CDB_write_SG,
>  	.attach_hba		= rd_attach_hba,
>  	.detach_hba		= rd_detach_hba,
>  	.allocate_virtdevice	= rd_MEMCPY_allocate_virtdevice,
> @@ -1257,7 +1141,6 @@ static struct se_subsystem_api rd_mcp_te
>  	.get_plugin_info	= rd_mcp_get_plugin_info,
>  	.get_hba_info		= rd_get_hba_info,
>  	.check_lba		= rd_MEMCPY_check_lba,
> -	.check_for_SG		= rd_check_for_SG,
>  	.get_cdb		= rd_get_cdb,
>  	.get_device_rev		= rd_get_device_rev,
>  	.get_device_type	= rd_get_device_type,
> Index: lio-core/drivers/target/target_core_rd.h
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_rd.h	2010-11-16 10:33:03.158012295 +0100
> +++ lio-core/drivers/target/target_core_rd.h	2010-11-16 10:34:05.947005241 +0100
> @@ -14,10 +14,6 @@
>  #define RD_BLOCKSIZE		512
>  #define RD_MAX_SECTORS		1024
>  
> -#define RD_DATA_READ		1
> -#define RD_DATA_WRITE		2
> -#define RD_DATA_NONE		3
> -
>  extern struct se_global *se_global;
>  
>  extern struct kmem_cache *se_mem_cache;
> @@ -34,12 +30,6 @@ struct rd_request {
>  
>  	/* SCSI CDB from iSCSI Command PDU */
>  	unsigned char	rd_scsi_cdb[TCM_MAX_COMMAND_SIZE];
> -	/* Data Direction */
> -	u8		rd_data_direction;
> -	/* Total length of request */
> -	u32		rd_bufflen;
> -	/* RD request flags */
> -	u32		rd_req_flags;
>  	/* Offset from start of page */
>  	u32		rd_offset;
>  	/* Starting page in Ramdisk for request */
> @@ -47,13 +37,7 @@ struct rd_request {
>  	/* Total number of pages needed for request */
>  	u32		rd_page_count;
>  	/* Scatterlist count */
> -	u32		rd_sg_count;
>  	u32		rd_size;
> -	/* Logical Block Address */
> -	unsigned long long	rd_lba;
> -	 /* Data buffer containing scatterlists(s) or
> -	  * contiguous memory segments */
> -	void		*rd_buf;
>  	/* Ramdisk device */
>  	struct rd_dev	*rd_dev;
>  } ____cacheline_aligned;
> Index: lio-core/drivers/target/target_core_stgt.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_stgt.c	2010-11-16 10:33:03.167012645 +0100
> +++ lio-core/drivers/target/target_core_stgt.c	2010-11-16 12:27:23.619005311 +0100
> @@ -383,7 +383,8 @@ static int stgt_do_task(struct se_task *
>  	struct scsi_cmnd *sc;
>  	int tag = MSG_SIMPLE_TAG;
>  
> -	sc = scsi_host_get_command(sh, st->stgt_direction, GFP_KERNEL);
> +	sc = scsi_host_get_command(sh, task->task_data_direction,
> +				   GFP_KERNEL);
>  	if (!sc) {
>  		printk(KERN_ERR "Unable to allocate memory for struct"
>  			" scsi_cmnd\n");
> @@ -532,88 +533,6 @@ static ssize_t stgt_show_configfs_dev_pa
>  	return bl;
>  }
>  
> -/*      stgt_map_task_SG():
> - *
> - *
> - */
> -static int stgt_map_task_SG(struct se_task *task)
> -{
> -	return 0;
> -}
> -
> -/*	stgt_map_task_non_SG():
> - *
> - *
> - */
> -static int stgt_map_task_non_SG(struct se_task *task)
> -{
> -	return 0;
> -}
> -
> -static int stgt_CDB_none(struct se_task *task, u32 size)
> -{
> -	struct stgt_plugin_task *pt = STGT_TASK(task);
> -
> -	pt->stgt_direction = DMA_NONE;
> -	return 0;
> -}
> -
> -/*	stgt_CDB_read_non_SG():
> - *
> - *
> - */
> -static int stgt_CDB_read_non_SG(struct se_task *task, u32 size)
> -{
> -	struct stgt_plugin_task *pt = STGT_TASK(task);
> -
> -	pt->stgt_direction = DMA_FROM_DEVICE;
> -	return stgt_map_task_non_SG(task);
> -}
> -
> -/*	stgt_CDB_read_SG():
> - *
> - *
> - */
> -static int stgt_CDB_read_SG(struct se_task *task, u32 size)
> -{
> -	struct stgt_plugin_task *pt = STGT_TASK(task);
> -
> -	pt->stgt_direction = DMA_FROM_DEVICE;
> -
> -	if (stgt_map_task_SG(task) < 0)
> -		return PYX_TRANSPORT_LU_COMM_FAILURE;
> -
> -	return task->task_sg_num;
> -}
> -
> -/*	stgt_CDB_write_non_SG():
> - *
> - *
> - */
> -static int stgt_CDB_write_non_SG(struct se_task *task, u32 size)
> -{
> -	struct stgt_plugin_task *pt = STGT_TASK(task);
> -
> -	pt->stgt_direction = DMA_TO_DEVICE;
> -	return stgt_map_task_non_SG(task);
> -}
> -
> -/*	stgt_CDB_write_SG():
> - *
> - *
> - */
> -static int stgt_CDB_write_SG(struct se_task *task, u32 size)
> -{
> -	struct stgt_plugin_task *pt = STGT_TASK(task);
> -
> -	pt->stgt_direction = DMA_TO_DEVICE;
> -
> -	if (stgt_map_task_SG(task) < 0)
> -		return PYX_TRANSPORT_LU_COMM_FAILURE;
> -
> -	return task->task_sg_num;
> -}
> -
>  /*	stgt_check_lba():
>   *
>   *
> @@ -623,15 +542,6 @@ static int stgt_check_lba(unsigned long
>  	return 0;
>  }
>  
> -/*	stgt_check_for_SG():
> - *
> - *
> - */
> -static int stgt_check_for_SG(struct se_task *task)
> -{
> -	return task->task_sg_num;
> -}
> -
>  /*	stgt_get_cdb():
>   *
>   *
> @@ -758,11 +668,6 @@ static struct se_subsystem_api stgt_temp
>  	.owner			= THIS_MODULE,
>  	.type			= STGT,
>  	.transport_type		= TRANSPORT_PLUGIN_VHBA_PDEV,
> -	.cdb_none		= stgt_CDB_none,
> -	.cdb_read_non_SG	= stgt_CDB_read_non_SG,
> -	.cdb_read_SG		= stgt_CDB_read_SG,
> -	.cdb_write_non_SG	= stgt_CDB_write_non_SG,
> -	.cdb_write_SG		= stgt_CDB_write_SG,
>  	.attach_hba		= stgt_attach_hba,
>  	.detach_hba		= stgt_detach_hba,
>  	.allocate_virtdevice	= stgt_allocate_virtdevice,
> @@ -780,7 +685,6 @@ static struct se_subsystem_api stgt_temp
>  	.get_plugin_info	= stgt_get_plugin_info,
>  	.get_hba_info		= stgt_get_hba_info,
>  	.check_lba		= stgt_check_lba,
> -	.check_for_SG		= stgt_check_for_SG,
>  	.get_cdb		= stgt_get_cdb,
>  	.get_sense_buffer	= stgt_get_sense_buffer,
>  	.get_device_rev		= stgt_get_device_rev,
> Index: lio-core/drivers/target/target_core_pscsi.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_pscsi.c	2010-11-16 10:33:03.175004194 +0100
> +++ lio-core/drivers/target/target_core_pscsi.c	2010-11-16 12:28:04.905004752 +0100
> @@ -741,7 +741,8 @@ static int pscsi_blk_get_request(struct
>  	struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
>  
>  	pt->pscsi_req = blk_get_request(pdv->pdv_sd->request_queue,
> -			(pt->pscsi_direction == DMA_TO_DEVICE), GFP_KERNEL);
> +			(task->task_data_direction == DMA_TO_DEVICE),
> +			GFP_KERNEL);
>  	if (!(pt->pscsi_req) || IS_ERR(pt->pscsi_req)) {
>  		printk(KERN_ERR "PSCSI: blk_get_request() failed: %ld\n",
>  				IS_ERR(pt->pscsi_req));
> @@ -1015,7 +1016,7 @@ static int __pscsi_map_task_SG(
>  	int nr_pages = (task->task_size + task_sg[0].offset +
>  			PAGE_SIZE - 1) >> PAGE_SHIFT;
>  	int nr_vecs = 0, rc, ret = PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES;
> -	int rw = (TASK_CMD(task)->data_direction == DMA_TO_DEVICE);
> +	int rw = (task->task_data_direction == DMA_TO_DEVICE);
>  
>  	if (!task->task_size)
>  		return 0;
> @@ -1152,22 +1153,24 @@ fail:
>  static int pscsi_map_task_SG(struct se_task *task)
>  {
>  	int ret;
> +
>  	/*
>  	 * Setup the main struct request for the task->task_sg[] payload
>  	 */
>  
>  	ret = __pscsi_map_task_SG(task, task->task_sg, task->task_sg_num, 0);
> -	if (ret < 0)
> -		return ret;
> +	if (ret >= 0 && task->task_sg_bidi) {
> +		/*
> +		 * If present, set up the extra BIDI-COMMAND SCSI READ
> +		 * struct request and payload.
> +		 */
> +		ret = __pscsi_map_task_SG(task, task->task_sg_bidi,
> +					task->task_sg_num, 1);
> +	}
>  
> -	if (!(task->task_sg_bidi))
> -		return ret;
> -	/*
> -	 * If present, set up the extra BIDI-COMMAND SCSI READ
> -	 * struct request and payload.
> -	 */
> -	return __pscsi_map_task_SG(task, task->task_sg_bidi,
> -				task->task_sg_num, 1);
> +	if (ret < 0)
> +		return PYX_TRANSPORT_LU_COMM_FAILURE;
> +	return 0;
>  }
>  
>  /*	pscsi_map_task_non_SG():
> @@ -1181,6 +1184,9 @@ static int pscsi_map_task_non_SG(struct
>  	struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
>  	int ret = 0;
>  
> +	if (pscsi_blk_get_request(task) < 0)
> +		return PYX_TRANSPORT_LU_COMM_FAILURE;
> +
>  	if (!task->task_size)
>  		return 0;
>  
> @@ -1194,85 +1200,11 @@ static int pscsi_map_task_non_SG(struct
>  	return 0;
>  }
>  
> -static int pscsi_CDB_none(struct se_task *task, u32 size)
> +static int pscsi_CDB_none(struct se_task *task)
>  {
> -	struct pscsi_plugin_task *pt = PSCSI_TASK(task);
> -
> -	pt->pscsi_direction = DMA_NONE;
> -
>  	return pscsi_blk_get_request(task);
>  }
>  
> -/*	pscsi_CDB_read_non_SG():
> - *
> - *
> - */
> -static int pscsi_CDB_read_non_SG(struct se_task *task, u32 size)
> -{
> -	struct pscsi_plugin_task *pt = PSCSI_TASK(task);
> -
> -	pt->pscsi_direction = DMA_FROM_DEVICE;
> -
> -	if (pscsi_blk_get_request(task) < 0)
> -		return PYX_TRANSPORT_LU_COMM_FAILURE;
> -
> -	return pscsi_map_task_non_SG(task);
> -}
> -
> -/*	pscsi_CDB_read_SG():
> - *
> - *
> - */
> -static int pscsi_CDB_read_SG(struct se_task *task, u32 size)
> -{
> -	struct pscsi_plugin_task *pt = PSCSI_TASK(task);
> -
> -	pt->pscsi_direction = DMA_FROM_DEVICE;
> -	/*
> -	 * pscsi_map_task_SG() calls block/blk-core.c:blk_make_request()
> -	 * for >= v2.6.31 pSCSI
> -	 */
> -	if (pscsi_map_task_SG(task) < 0)
> -		return PYX_TRANSPORT_LU_COMM_FAILURE;
> -
> -	return task->task_sg_num;
> -}
> -
> -/*	pscsi_CDB_write_non_SG():
> - *
> - *
> - */
> -static int pscsi_CDB_write_non_SG(struct se_task *task, u32 size)
> -{
> -	struct pscsi_plugin_task *pt = PSCSI_TASK(task);
> -
> -	pt->pscsi_direction = DMA_TO_DEVICE;
> -
> -	if (pscsi_blk_get_request(task) < 0)
> -		return PYX_TRANSPORT_LU_COMM_FAILURE;
> -
> -	return pscsi_map_task_non_SG(task);
> -}
> -
> -/*	pscsi_CDB_write_SG():
> - *
> - *
> - */
> -static int pscsi_CDB_write_SG(struct se_task *task, u32 size)
> -{
> -	struct pscsi_plugin_task *pt = PSCSI_TASK(task);
> -
> -	pt->pscsi_direction = DMA_TO_DEVICE;
> -	/*
> -	 * pscsi_map_task_SG() calls block/blk-core.c:blk_make_request()
> -	 * for >= v2.6.31 pSCSI
> -	 */
> -	if (pscsi_map_task_SG(task) < 0)
> -		return PYX_TRANSPORT_LU_COMM_FAILURE;
> -
> -	return task->task_sg_num;
> -}
> -
>  /*	pscsi_check_lba():
>   *
>   *
> @@ -1282,15 +1214,6 @@ static int pscsi_check_lba(unsigned long
>  	return 0;
>  }
>  
> -/*	pscsi_check_for_SG():
> - *
> - *
> - */
> -static int pscsi_check_for_SG(struct se_task *task)
> -{
> -	return task->task_sg_num;
> -}
> -
>  /*	pscsi_get_cdb():
>   *
>   *
> @@ -1406,10 +1329,8 @@ static struct se_subsystem_api pscsi_tem
>  	.type			= PSCSI,
>  	.transport_type		= TRANSPORT_PLUGIN_PHBA_PDEV,
>  	.cdb_none		= pscsi_CDB_none,
> -	.cdb_read_non_SG	= pscsi_CDB_read_non_SG,
> -	.cdb_read_SG		= pscsi_CDB_read_SG,
> -	.cdb_write_non_SG	= pscsi_CDB_write_non_SG,
> -	.cdb_write_SG		= pscsi_CDB_write_SG,
> +	.map_task_non_SG	= pscsi_map_task_non_SG,
> +	.map_task_SG		= pscsi_map_task_SG,
>  	.attach_hba		= pscsi_attach_hba,
>  	.detach_hba		= pscsi_detach_hba,
>  	.pmode_enable_hba	= pscsi_pmode_enable_hba,
> @@ -1426,7 +1347,6 @@ static struct se_subsystem_api pscsi_tem
>  	.get_plugin_info	= pscsi_get_plugin_info,
>  	.get_hba_info		= pscsi_get_hba_info,
>  	.check_lba		= pscsi_check_lba,
> -	.check_for_SG		= pscsi_check_for_SG,
>  	.get_cdb		= pscsi_get_cdb,
>  	.get_sense_buffer	= pscsi_get_sense_buffer,
>  	.get_device_rev		= pscsi_get_device_rev,
> Index: lio-core/drivers/target/target_core_stgt.h
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_stgt.h	2010-11-16 10:33:03.184012435 +0100
> +++ lio-core/drivers/target/target_core_stgt.h	2010-11-16 10:34:05.966264356 +0100
> @@ -23,7 +23,6 @@ struct stgt_plugin_task {
>  	struct se_task stgt_task;
>  	unsigned char stgt_cdb[TCM_MAX_COMMAND_SIZE];
>  	unsigned char stgt_sense[SCSI_SENSE_BUFFERSIZE];
> -	int	stgt_direction;
>  	int	stgt_result;
>  	u32	stgt_resid;
>  	struct scsi_cmnd *stgt_cmd;
> Index: lio-core/include/target/target_core_transport.h
> ===================================================================
> --- lio-core.orig/include/target/target_core_transport.h	2010-11-16 10:34:05.083275321 +0100
> +++ lio-core/include/target/target_core_transport.h	2010-11-16 10:34:05.973004473 +0100
> @@ -303,23 +303,15 @@ struct se_subsystem_api {
>  	/*
>  	 * For SCF_SCSI_NON_DATA_CDB
>  	 */
> -	int (*cdb_none)(struct se_task *, u32);
> +	int (*cdb_none)(struct se_task *);
>  	/*
> -	 * For READ SCF_SCSI_CONTROL_NONSG_IO_CDB
> +	 * For SCF_SCSI_CONTROL_NONSG_IO_CDB
>  	 */
> -	int (*cdb_read_non_SG)(struct se_task *, u32);
> +	int (*map_task_non_SG)(struct se_task *);
>  	/*
> -	 * For READ SCF_SCSI_DATA_SG_IO_CDB and SCF_SCSI_CONTROL_SG_IO_CDB
> +	 * For SCF_SCSI_DATA_SG_IO_CDB and SCF_SCSI_CONTROL_SG_IO_CDB
>  	 */
> -	int (*cdb_read_SG)(struct se_task *, u32);
> -	/*
> -	 * For WRITE SCF_SCSI_CONTROL_NONSG_IO_CDB
> -	 */
> -	int (*cdb_write_non_SG)(struct se_task *, u32);
> -	/*
> -	 * For WRITE SCF_SCSI_DATA_SG_IO_CDB and SCF_SCSI_CONTROL_SG_IO_CDB
> -	 */
> -	int (*cdb_write_SG)(struct se_task *, u32);
> +	int (*map_task_SG)(struct se_task *);
>  	/*
>  	 * attach_hba():
>  	 */
> @@ -438,10 +430,6 @@ struct se_subsystem_api {
>  	 */
>  	int (*check_lba)(unsigned long long lba, struct se_device *);
>  	/*
> -	 * check_for_SG():
> -	 */
> -	int (*check_for_SG)(struct se_task *);
> -	/*
>  	 * get_cdb():
>  	 */
>  	unsigned char *(*get_cdb)(struct se_task *);
> Index: lio-core/drivers/target/target_core_transport.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_transport.c	2010-11-16 10:34:05.081254089 +0100
> +++ lio-core/drivers/target/target_core_transport.c	2010-11-16 12:30:12.831254579 +0100
> @@ -2257,6 +2257,7 @@ static struct se_task *transport_generic
>  	task->task_no = T_TASK(cmd)->t_tasks_no++;
>  	task->task_se_cmd = cmd;
>  	task->se_dev = dev;
> +	task->task_data_direction = data_direction;
>  
>  	DEBUG_SO("se_obj_ptr: %p\n", se_obj_ptr);
>  
> @@ -2269,28 +2270,6 @@ static struct se_task *transport_generic
>  	return task;
>  }
>  
> -static inline map_func_t transport_dev_get_map_SG(
> -	struct se_device *dev,
> -	int rw)
> -{
> -	return (rw == DMA_TO_DEVICE) ? dev->transport->cdb_write_SG :
> -		dev->transport->cdb_read_SG;
> -}
> -
> -static inline map_func_t transport_dev_get_map_non_SG(
> -	struct se_device *dev,
> -	int rw)
> -{
> -	return (rw == DMA_TO_DEVICE) ? dev->transport->cdb_write_non_SG :
> -		dev->transport->cdb_read_non_SG;
> -}
> -
> -static inline map_func_t transport_dev_get_map_none(
> -	struct se_device *dev)
> -{
> -	return dev->transport->cdb_none;
> -}
> -
>  static int transport_process_data_sg_transform(
>  	struct se_cmd *cmd,
>  	struct se_transform_info *ti)
> @@ -2333,8 +2312,7 @@ static int transport_process_control_sg_
>  	if (!(task))
>  		return -1;
>  
> -	task->transport_map_task = transport_dev_get_map_SG(ti->se_obj_ptr,
> -				cmd->data_direction);
> +	task->transport_map_task = ti->se_obj_ptr->transport->map_task_SG;
>  
>  	cdb = TRANSPORT(dev)->get_cdb(task);
>  	if (cdb)
> @@ -2375,8 +2353,7 @@ static int transport_process_control_non
>  	if (!(task))
>  		return -1;
>  
> -	task->transport_map_task = transport_dev_get_map_non_SG(ti->se_obj_ptr,
> -				cmd->data_direction);
> +	task->transport_map_task = ti->se_obj_ptr->transport->map_task_non_SG;
>  
>  	cdb = TRANSPORT(dev)->get_cdb(task);
>  	if (cdb)
> @@ -2411,7 +2388,7 @@ static int transport_process_non_data_tr
>  	if (!(task))
>  		return -1;
>  
> -	task->transport_map_task = transport_dev_get_map_none(ti->se_obj_ptr);
> +	task->transport_map_task = ti->se_obj_ptr->transport->cdb_none;
>  
>  	cdb = TRANSPORT(dev)->get_cdb(task);
>  	if (cdb)
> @@ -5994,8 +5971,8 @@ u32 transport_generic_get_cdb_count(
>  		sectors -= task->task_sectors;
>  		task->task_size = (task->task_sectors *
>  				   DEV_ATTRIB(dev)->block_size);
> -		task->transport_map_task = transport_dev_get_map_SG(dev,
> -					data_direction);
> +
> +		task->transport_map_task = dev->transport->map_task_SG;
>  
>  		cdb = TRANSPORT(dev)->get_cdb(task);
>  		if ((cdb)) {
> @@ -6139,9 +6116,11 @@ int transport_generic_new_cmd(struct se_
>  		if (atomic_read(&task->task_sent))
>  			continue;
>  
> -		ret = task->transport_map_task(task, task->task_size);
> -		if (ret < 0)
> -			goto failure;
> +		if (task->transport_map_task) {
> +			ret = task->transport_map_task(task);
> +			if (ret < 0)
> +				goto failure;
> +		}
>  	}
>  
>  	/*
> Index: lio-core/include/target/target_core_base.h
> ===================================================================
> --- lio-core.orig/include/target/target_core_base.h	2010-11-16 10:34:05.089004054 +0100
> +++ lio-core/include/target/target_core_base.h	2010-11-16 12:23:24.621013003 +0100
> @@ -488,6 +488,7 @@ struct se_task {
>  	u32		task_size;
>  	u32		task_sg_num;
>  	u32		task_sg_offset;
> +	enum dma_data_direction	task_data_direction;
>  	struct se_cmd *task_se_cmd;
>  	struct se_device	*se_dev;
>  	struct completion	task_stop_comp;
> @@ -498,7 +499,7 @@ struct se_task {
>  	atomic_t	task_stop;
>  	atomic_t	task_state_active;
>  	struct timer_list	task_timer;
> -	int (*transport_map_task)(struct se_task *, u32);
> +	int (*transport_map_task)(struct se_task *);
>  	struct se_device *se_obj_ptr;
>  	struct list_head t_list;
>  	struct list_head t_execute_list;

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux