On 1/5/22 11:17, Wenchao Hao wrote: > This is just a clean code. Since each branch of "if" state would check > scmd->cmd_len, so move the check of scmd->cmd_len out of "if" state to > simplify the logic of input parameters check. > > The patch do not change origin function logic. > > Signed-off-by: Wenchao Hao <haowenchao@xxxxxxxxxx> > --- > drivers/ata/libata-scsi.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c > index 313e9475507b..1c653b5327db 100644 > --- a/drivers/ata/libata-scsi.c > +++ b/drivers/ata/libata-scsi.c > @@ -4020,19 +4020,18 @@ void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd) > int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev) > { > u8 scsi_op = scmd->cmnd[0]; > - ata_xlat_func_t xlat_func; > + ata_xlat_func_t xlat_func = NULL; Not needed. xlat_func is always set for the non-error cases. > int rc = 0; > > + if (unlikely(!scmd->cmd_len)) > + goto bad_cdb_len; > + > if (dev->class == ATA_DEV_ATA || dev->class == ATA_DEV_ZAC) { > - if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len)) > + if (unlikely(scmd->cmd_len > dev->cdb_len)) > goto bad_cdb_len; > > xlat_func = ata_get_xlat_func(dev, scsi_op); > } else { > - if (unlikely(!scmd->cmd_len)) > - goto bad_cdb_len; > - > - xlat_func = NULL; > if (likely((scsi_op != ATA_16) || !atapi_passthru16)) { > /* relay SCSI command to ATAPI device */ > int len = COMMAND_SIZE(scsi_op); I would go further and cleanup the if else { if else } sequence too. Something like this: diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index a16ef0030667..ed8be585a98f 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -3958,42 +3958,39 @@ int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev) { u8 scsi_op = scmd->cmnd[0]; ata_xlat_func_t xlat_func; - int rc = 0; + + if (unlikely(!scmd->cmd_len)) + goto bad_cdb_len; if (dev->class == ATA_DEV_ATA || dev->class == ATA_DEV_ZAC) { - if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len)) + if (unlikely(scmd->cmd_len > dev->cdb_len)) goto bad_cdb_len; xlat_func = ata_get_xlat_func(dev, scsi_op); - } else { - if (unlikely(!scmd->cmd_len)) - goto bad_cdb_len; + } else if (likely((scsi_op != ATA_16) || !atapi_passthru16)) { + /* relay SCSI command to ATAPI device */ + int len = COMMAND_SIZE(scsi_op); - xlat_func = NULL; - if (likely((scsi_op != ATA_16) || !atapi_passthru16)) { - /* relay SCSI command to ATAPI device */ - int len = COMMAND_SIZE(scsi_op); - if (unlikely(len > scmd->cmd_len || - len > dev->cdb_len || - scmd->cmd_len > ATAPI_CDB_LEN)) - goto bad_cdb_len; + if (unlikely(len > scmd->cmd_len || + len > dev->cdb_len || + scmd->cmd_len > ATAPI_CDB_LEN)) + goto bad_cdb_len; - xlat_func = atapi_xlat; - } else { - /* ATA_16 passthru, treat as an ATA command */ - if (unlikely(scmd->cmd_len > 16)) - goto bad_cdb_len; + xlat_func = atapi_xlat; + } else { + /* ATA_16 passthru, treat as an ATA command */ + if (unlikely(scmd->cmd_len > 16)) + goto bad_cdb_len; - xlat_func = ata_get_xlat_func(dev, scsi_op); - } + xlat_func = ata_get_xlat_func(dev, scsi_op); } if (xlat_func) - rc = ata_scsi_translate(dev, scmd, xlat_func); - else - ata_scsi_simulate(dev, scmd); + return ata_scsi_translate(dev, scmd, xlat_func); - return rc; + ata_scsi_simulate(dev, scmd); + + return 0; bad_cdb_len: scmd->result = DID_ERROR << 16; -- Damien Le Moal Western Digital Research