Signed-off-by: Douglas Gilbert <dgilbert@xxxxxxxxxxxx> --- drivers/scsi/sr.c | 24 +++++++++++++----------- drivers/scsi/st.c | 12 +++++++----- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 5ba9df334968..f51c8e1bdb2e 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -929,6 +929,7 @@ static int sr_read_cdda_bpc(struct cdrom_device_info *cdi, void __user *ubuf, struct scsi_cmnd *scmd; struct request *rq; struct bio *bio; + u8 *cdb; int ret; rq = scsi_alloc_request(disk->queue, REQ_OP_DRV_IN, 0); @@ -940,17 +941,18 @@ static int sr_read_cdda_bpc(struct cdrom_device_info *cdi, void __user *ubuf, if (ret) goto out_put_request; - scmd->cmnd[0] = GPCMD_READ_CD; - scmd->cmnd[1] = 1 << 2; - scmd->cmnd[2] = (lba >> 24) & 0xff; - scmd->cmnd[3] = (lba >> 16) & 0xff; - scmd->cmnd[4] = (lba >> 8) & 0xff; - scmd->cmnd[5] = lba & 0xff; - scmd->cmnd[6] = (nr >> 16) & 0xff; - scmd->cmnd[7] = (nr >> 8) & 0xff; - scmd->cmnd[8] = nr & 0xff; - scmd->cmnd[9] = 0xf8; scmd->cmd_len = 12; + cdb = scsi_cmnd_set_cdb(scmd, NULL, scmd->cmd_len); + cdb[0] = GPCMD_READ_CD; + cdb[1] = 1 << 2; + cdb[2] = (lba >> 24) & 0xff; + cdb[3] = (lba >> 16) & 0xff; + cdb[4] = (lba >> 8) & 0xff; + cdb[5] = lba & 0xff; + cdb[6] = (nr >> 16) & 0xff; + cdb[7] = (nr >> 8) & 0xff; + cdb[8] = nr & 0xff; + cdb[9] = 0xf8; rq->timeout = 60 * HZ; bio = rq->bio; @@ -967,7 +969,7 @@ static int sr_read_cdda_bpc(struct cdrom_device_info *cdi, void __user *ubuf, if (blk_rq_unmap_user(bio)) ret = -EFAULT; out_put_request: - blk_mq_free_request(rq); + scsi_free_cmnd(scmd); return ret; } diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 56a093a90b92..801486c9b411 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -473,10 +473,11 @@ static void st_release_request(struct st_request *streq) static void st_do_stats(struct scsi_tape *STp, struct request *req) { struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(req); + const u8 *cdb = scsi_cmnd_get_cdb(scmd); ktime_t now; now = ktime_get(); - if (scmd->cmnd[0] == WRITE_6) { + if (cdb[0] == WRITE_6) { now = ktime_sub(now, STp->stats->write_time); atomic64_add(ktime_to_ns(now), &STp->stats->tot_write_time); atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); @@ -490,7 +491,7 @@ static void st_do_stats(struct scsi_tape *STp, struct request *req) } else atomic64_add(atomic_read(&STp->stats->last_write_size), &STp->stats->write_byte_cnt); - } else if (scmd->cmnd[0] == READ_6) { + } else if (cdb[0] == READ_6) { now = ktime_sub(now, STp->stats->read_time); atomic64_add(ktime_to_ns(now), &STp->stats->tot_read_time); atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); @@ -531,7 +532,7 @@ static void st_scsi_execute_end(struct request *req, blk_status_t status) complete(SRpnt->waiting); blk_rq_unmap_user(tmp); - blk_mq_free_request(req); + scsi_free_cmnd(scmd); } static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, @@ -558,7 +559,7 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, err = blk_rq_map_user(req->q, req, mdata, NULL, bufflen, GFP_KERNEL); if (err) { - blk_mq_free_request(req); + scsi_free_cmnd(scmd); return err; } } @@ -576,7 +577,8 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, SRpnt->bio = req->bio; scmd->cmd_len = COMMAND_SIZE(cmd[0]); - memcpy(scmd->cmnd, cmd, scmd->cmd_len); + /* Don't check for NULL return as extremely unlikely */ + scsi_cmnd_set_cdb(scmd, cmd, scmd->cmd_len); req->timeout = timeout; scmd->allowed = retries; req->end_io_data = SRpnt; -- 2.25.1