summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-11-09 14:42:38 +0100
committerJens Axboe <axboe@kernel.dk>2018-11-10 03:17:14 +0100
commit14784565f740e862adae4b1d7c91f51b4038c4f5 (patch)
treea7997ce39a5ad73e5d5ce3526511a43df801bb33 /drivers/scsi/scsi_lib.c
parentscsi: push blk_status_t up into scsi_setup_{fs,scsi}_cmnd (diff)
downloadlinux-14784565f740e862adae4b1d7c91f51b4038c4f5.tar.xz
linux-14784565f740e862adae4b1d7c91f51b4038c4f5.zip
scsi: clean up error handling in scsi_init_io
There is no need to call scsi_mq_free_sgtables until we have actually allocated sgtables. Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index e665c25da144..1f84e2cec57b 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1044,31 +1044,30 @@ int scsi_init_io(struct scsi_cmnd *cmd)
int error = BLKPREP_KILL;
if (WARN_ON_ONCE(!blk_rq_nr_phys_segments(rq)))
- goto err_exit;
+ return BLKPREP_KILL;
error = scsi_init_sgtable(rq, &cmd->sdb);
if (error)
- goto err_exit;
+ return error;
if (blk_bidi_rq(rq)) {
error = scsi_init_sgtable(rq->next_rq, rq->next_rq->special);
if (error)
- goto err_exit;
+ goto out_free_sgtables;
}
if (blk_integrity_rq(rq)) {
struct scsi_data_buffer *prot_sdb = cmd->prot_sdb;
int ivecs, count;
- if (prot_sdb == NULL) {
+ if (WARN_ON_ONCE(!prot_sdb)) {
/*
* This can happen if someone (e.g. multipath)
* queues a command to a device on an adapter
* that does not support DIX.
*/
- WARN_ON_ONCE(1);
error = BLKPREP_KILL;
- goto err_exit;
+ goto out_free_sgtables;
}
ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio);
@@ -1076,7 +1075,7 @@ int scsi_init_io(struct scsi_cmnd *cmd)
if (sg_alloc_table_chained(&prot_sdb->table, ivecs,
prot_sdb->table.sgl)) {
error = BLKPREP_DEFER;
- goto err_exit;
+ goto out_free_sgtables;
}
count = blk_rq_map_integrity_sg(rq->q, rq->bio,
@@ -1089,7 +1088,7 @@ int scsi_init_io(struct scsi_cmnd *cmd)
}
return BLKPREP_OK;
-err_exit:
+out_free_sgtables:
scsi_mq_free_sgtables(cmd);
return error;
}