diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9ea95dd3e260..17bb541f7cc2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -591,7 +591,6 @@ static void scsi_free_sgtable(struct scsi_data_buffer *sdb, bool mq) | |||
591 | static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq) | 591 | static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq) |
592 | { | 592 | { |
593 | struct scatterlist *first_chunk = NULL; | 593 | struct scatterlist *first_chunk = NULL; |
594 | gfp_t gfp_mask = mq ? GFP_NOIO : GFP_ATOMIC; | ||
595 | int ret; | 594 | int ret; |
596 | 595 | ||
597 | BUG_ON(!nents); | 596 | BUG_ON(!nents); |
@@ -606,7 +605,7 @@ static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq) | |||
606 | } | 605 | } |
607 | 606 | ||
608 | ret = __sg_alloc_table(&sdb->table, nents, SCSI_MAX_SG_SEGMENTS, | 607 | ret = __sg_alloc_table(&sdb->table, nents, SCSI_MAX_SG_SEGMENTS, |
609 | first_chunk, gfp_mask, scsi_sg_alloc); | 608 | first_chunk, GFP_ATOMIC, scsi_sg_alloc); |
610 | if (unlikely(ret)) | 609 | if (unlikely(ret)) |
611 | scsi_free_sgtable(sdb, mq); | 610 | scsi_free_sgtable(sdb, mq); |
612 | return ret; | 611 | return ret; |
@@ -1144,7 +1143,17 @@ int scsi_init_io(struct scsi_cmnd *cmd) | |||
1144 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; | 1143 | struct scsi_data_buffer *prot_sdb = cmd->prot_sdb; |
1145 | int ivecs, count; | 1144 | int ivecs, count; |
1146 | 1145 | ||
1147 | BUG_ON(prot_sdb == NULL); | 1146 | if (prot_sdb == NULL) { |
1147 | /* | ||
1148 | * This can happen if someone (e.g. multipath) | ||
1149 | * queues a command to a device on an adapter | ||
1150 | * that does not support DIX. | ||
1151 | */ | ||
1152 | WARN_ON_ONCE(1); | ||
1153 | error = BLKPREP_KILL; | ||
1154 | goto err_exit; | ||
1155 | } | ||
1156 | |||
1148 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); | 1157 | ivecs = blk_rq_count_integrity_sg(rq->q, rq->bio); |
1149 | 1158 | ||
1150 | if (scsi_alloc_sgtable(prot_sdb, ivecs, is_mq)) { | 1159 | if (scsi_alloc_sgtable(prot_sdb, ivecs, is_mq)) { |