ata: libata-scsi: Refactor ata_scsiop_maint_in()
authorDamien Le Moal <dlemoal@kernel.org>
Tue, 22 Oct 2024 02:45:34 +0000 (11:45 +0900)
committerNiklas Cassel <cassel@kernel.org>
Fri, 25 Oct 2024 08:09:49 +0000 (10:09 +0200)
Move the check for MI_REPORT_SUPPORTED_OPERATION_CODES from
ata_scsi_simulate() into ata_scsiop_maint_in() to simplify
ata_scsi_simulate() code.

Furthermore, since an rbuff fill actor function returning a non-zero
value causes no data to be returned for the command, directly return
an error (return 1) for invalid command formt after setting the invalid
field in cdb error.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Link: https://lore.kernel.org/r/20241022024537.251905-4-dlemoal@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/libata-scsi.c

index 8097cf318b04f7ab8b7dae0c28827f32386370ef..f9c70f650cfc7afa4d57b82271abcffd4a77f934 100644 (file)
@@ -3388,12 +3388,16 @@ static unsigned int ata_scsiop_maint_in(struct ata_scsi_args *args, u8 *rbuf)
        struct ata_device *dev = args->dev;
        u8 *cdb = args->cmd->cmnd;
        u8 supported = 0, cdlp = 0, rwcdlp = 0;
-       unsigned int err = 0;
+
+       if ((cdb[1] & 0x1f) != MI_REPORT_SUPPORTED_OPERATION_CODES) {
+               ata_scsi_set_invalid_field(dev, args->cmd, 1, 0xff);
+               return 1;
+       }
 
        if (cdb[2] != 1 && cdb[2] != 3) {
                ata_dev_warn(dev, "invalid command format %d\n", cdb[2]);
-               err = 2;
-               goto out;
+               ata_scsi_set_invalid_field(dev, args->cmd, 1, 0xff);
+               return 1;
        }
 
        switch (cdb[3]) {
@@ -3461,11 +3465,12 @@ static unsigned int ata_scsiop_maint_in(struct ata_scsi_args *args, u8 *rbuf)
        default:
                break;
        }
-out:
+
        /* One command format */
        rbuf[0] = rwcdlp;
        rbuf[1] = cdlp | supported;
-       return err;
+
+       return 0;
 }
 
 /**
@@ -4377,10 +4382,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
                break;
 
        case MAINTENANCE_IN:
-               if ((scsicmd[1] & 0x1f) == MI_REPORT_SUPPORTED_OPERATION_CODES)
-                       ata_scsi_rbuf_fill(&args, ata_scsiop_maint_in);
-               else
-                       ata_scsi_set_invalid_field(dev, cmd, 1, 0xff);
+               ata_scsi_rbuf_fill(&args, ata_scsiop_maint_in);
                break;
 
        /* all other commands */