/* rd_MEMCPY_do_task(): (Part of se_subsystem_api_t template) * * */ static int rd_MEMCPY_do_task(struct se_task *task) { struct se_device *dev = task->task_se_cmd->se_dev; struct rd_request *req = RD_REQ(task); unsigned long long lba; int ret; req->rd_page = (task->task_lba * dev->se_sub_dev->se_dev_attrib.block_size) / PAGE_SIZE; lba = task->task_lba; req->rd_offset = (do_div(lba, (PAGE_SIZE / dev->se_sub_dev->se_dev_attrib.block_size))) * dev->se_sub_dev->se_dev_attrib.block_size; req->rd_size = task->task_size; if (task->task_data_direction == DMA_FROM_DEVICE) ret = rd_MEMCPY_read(req); else ret = rd_MEMCPY_write(req); if (ret != 0) return ret; task->task_scsi_status = GOOD; transport_complete_task(task, 1); return PYX_TRANSPORT_SENT_TO_TRANSPORT; }
/* rd_MEMCPY_do_task(): (Part of se_subsystem_api_t template) * * */ static int rd_MEMCPY_do_task(struct se_task *task) { struct se_device *dev = task->task_se_cmd->se_dev; struct rd_request *req = RD_REQ(task); u64 tmp; int ret; tmp = task->task_lba * dev->se_sub_dev->se_dev_attrib.block_size; req->rd_offset = do_div(tmp, PAGE_SIZE); req->rd_page = tmp; req->rd_size = task->task_size; ret = rd_MEMCPY(req, task->task_data_direction == DMA_FROM_DEVICE); if (ret != 0) return ret; task->task_scsi_status = GOOD; transport_complete_task(task, 1); return 0; }
/* rd_free_task(): (Part of se_subsystem_api_t template) * * */ static void rd_free_task(struct se_task *task) { kfree(RD_REQ(task)); }
/* rd_get_cdb(): (Part of se_subsystem_api_t template) * * */ static unsigned char *rd_get_cdb(struct se_task *task) { struct rd_request *req = RD_REQ(task); return req->rd_scsi_cdb; }