scsi: target: pscsi: Remove struct pscsi_plugin_task
Copy directly from the se_cmd CDB to the one in the scsi_request. This temporarily limits the pscsi backend to supporting only up to 16 byte CDBs, but this restriction will be lifted later in this series. Link: https://lore.kernel.org/r/20220224175552.988286-2-hch@lst.de Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Родитель
a2a59faa35
Коммит
c49ff72cff
|
@ -593,16 +593,14 @@ static void pscsi_complete_cmd(struct se_cmd *cmd, u8 scsi_status,
|
|||
{
|
||||
struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
|
||||
struct scsi_device *sd = pdv->pdv_sd;
|
||||
struct pscsi_plugin_task *pt = cmd->priv;
|
||||
unsigned char *cdb;
|
||||
unsigned char *cdb = cmd->priv;
|
||||
|
||||
/*
|
||||
* Special case for REPORT_LUNs handling where pscsi_plugin_task has
|
||||
* not been allocated because TCM is handling the emulation directly.
|
||||
* Special case for REPORT_LUNs which is emulated and not passed on.
|
||||
*/
|
||||
if (!pt)
|
||||
if (!cdb)
|
||||
return;
|
||||
|
||||
cdb = &pt->pscsi_cdb[0];
|
||||
/*
|
||||
* Hack to make sure that Write-Protect modepage is set if R/O mode is
|
||||
* forced.
|
||||
|
@ -963,30 +961,14 @@ pscsi_execute_cmd(struct se_cmd *cmd)
|
|||
struct scatterlist *sgl = cmd->t_data_sg;
|
||||
u32 sgl_nents = cmd->t_data_nents;
|
||||
struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
|
||||
struct pscsi_plugin_task *pt;
|
||||
struct request *req;
|
||||
sense_reason_t ret;
|
||||
|
||||
/*
|
||||
* Dynamically alloc cdb space, since it may be larger than
|
||||
* TCM_MAX_COMMAND_SIZE
|
||||
*/
|
||||
pt = kzalloc(sizeof(*pt) + scsi_command_size(cmd->t_task_cdb), GFP_KERNEL);
|
||||
if (!pt) {
|
||||
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||
}
|
||||
cmd->priv = pt;
|
||||
|
||||
memcpy(pt->pscsi_cdb, cmd->t_task_cdb,
|
||||
scsi_command_size(cmd->t_task_cdb));
|
||||
|
||||
req = scsi_alloc_request(pdv->pdv_sd->request_queue,
|
||||
cmd->data_direction == DMA_TO_DEVICE ?
|
||||
REQ_OP_DRV_OUT : REQ_OP_DRV_IN, 0);
|
||||
if (IS_ERR(req)) {
|
||||
ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||
goto fail;
|
||||
}
|
||||
if (IS_ERR(req))
|
||||
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||
|
||||
if (sgl) {
|
||||
ret = pscsi_map_sg(cmd, sgl, sgl_nents, req);
|
||||
|
@ -996,8 +978,12 @@ pscsi_execute_cmd(struct se_cmd *cmd)
|
|||
|
||||
req->end_io = pscsi_req_done;
|
||||
req->end_io_data = cmd;
|
||||
scsi_req(req)->cmd_len = scsi_command_size(pt->pscsi_cdb);
|
||||
scsi_req(req)->cmd = &pt->pscsi_cdb[0];
|
||||
scsi_req(req)->cmd_len = scsi_command_size(cmd->t_task_cdb);
|
||||
if (scsi_req(req)->cmd_len > BLK_MAX_CDB) {
|
||||
ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||
goto fail_put_request;
|
||||
}
|
||||
memcpy(scsi_req(req)->cmd, cmd->t_task_cdb, scsi_req(req)->cmd_len);
|
||||
if (pdv->pdv_sd->type == TYPE_DISK ||
|
||||
pdv->pdv_sd->type == TYPE_ZBC)
|
||||
req->timeout = PS_TIMEOUT_DISK;
|
||||
|
@ -1005,6 +991,8 @@ pscsi_execute_cmd(struct se_cmd *cmd)
|
|||
req->timeout = PS_TIMEOUT_OTHER;
|
||||
scsi_req(req)->retries = PS_RETRY;
|
||||
|
||||
cmd->priv = scsi_req(req)->cmd;
|
||||
|
||||
blk_execute_rq_nowait(req, cmd->sam_task_attr == TCM_HEAD_TAG,
|
||||
pscsi_req_done);
|
||||
|
||||
|
@ -1012,8 +1000,6 @@ pscsi_execute_cmd(struct se_cmd *cmd)
|
|||
|
||||
fail_put_request:
|
||||
blk_mq_free_request(req);
|
||||
fail:
|
||||
kfree(pt);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1041,14 +1027,13 @@ static sector_t pscsi_get_blocks(struct se_device *dev)
|
|||
static void pscsi_req_done(struct request *req, blk_status_t status)
|
||||
{
|
||||
struct se_cmd *cmd = req->end_io_data;
|
||||
struct pscsi_plugin_task *pt = cmd->priv;
|
||||
int result = scsi_req(req)->result;
|
||||
enum sam_status scsi_status = result & 0xff;
|
||||
u8 *cdb = cmd->priv;
|
||||
|
||||
if (scsi_status != SAM_STAT_GOOD) {
|
||||
pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
|
||||
" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
|
||||
result);
|
||||
" 0x%02x Result: 0x%08x\n", cmd, cdb[0], result);
|
||||
}
|
||||
|
||||
pscsi_complete_cmd(cmd, scsi_status, scsi_req(req)->sense);
|
||||
|
@ -1060,14 +1045,12 @@ static void pscsi_req_done(struct request *req, blk_status_t status)
|
|||
break;
|
||||
default:
|
||||
pr_debug("PSCSI Host Byte exception at cmd: %p CDB:"
|
||||
" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
|
||||
result);
|
||||
" 0x%02x Result: 0x%08x\n", cmd, cdb[0], result);
|
||||
target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION);
|
||||
break;
|
||||
}
|
||||
|
||||
blk_mq_free_request(req);
|
||||
kfree(pt);
|
||||
}
|
||||
|
||||
static const struct target_backend_ops pscsi_ops = {
|
||||
|
|
|
@ -23,10 +23,6 @@ struct block_device;
|
|||
struct scsi_device;
|
||||
struct Scsi_Host;
|
||||
|
||||
struct pscsi_plugin_task {
|
||||
unsigned char pscsi_cdb[0];
|
||||
} ____cacheline_aligned;
|
||||
|
||||
#define PDF_HAS_CHANNEL_ID 0x01
|
||||
#define PDF_HAS_TARGET_ID 0x02
|
||||
#define PDF_HAS_LUN_ID 0x04
|
||||
|
|
Загрузка…
Ссылка в новой задаче