OSDN Git Service

scsi: target: pscsi: Remove struct pscsi_plugin_task
authorChristoph Hellwig <hch@lst.de>
Thu, 24 Feb 2022 17:55:45 +0000 (18:55 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 2 Mar 2022 03:21:49 +0000 (22:21 -0500)
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>
drivers/target/target_core_pscsi.c
drivers/target/target_core_pscsi.h

index 807d06e..622158e 100644 (file)
@@ -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 = {
index e8458b5..23d9a6e 100644 (file)
@@ -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