Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 11 Nov 2019 17:14:36 +0000 (09:14 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 11 Nov 2019 17:14:36 +0000 (09:14 -0800)
Pull SCSI fixes from James Bottomley:
 "Three small changes: two in the core and one in the qla2xxx driver.

  The sg_tablesize fix affects a thinko in the migration to blk-mq of
  certain legacy drivers which could cause an oops and the sd core
  change should only affect zoned block devices which were wrongly
  suppressing error messages for reset all zones"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: core: Handle drivers which set sg_tablesize to zero
  scsi: qla2xxx: fix NPIV tear down process
  scsi: sd_zbc: Fix sd_zbc_complete()

drivers/scsi/qla2xxx/qla_mid.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/scsi_lib.c
drivers/scsi/sd_zbc.c

index 6afad68e5ba2152da404e32f404b2960e760c1b5..238240984bc15da3c33f30d4d931072b0041f448 100644 (file)
@@ -76,9 +76,11 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)
         * ensures no active vp_list traversal while the vport is removed
         * from the queue)
         */
-       for (i = 0; i < 10 && atomic_read(&vha->vref_count); i++)
-               wait_event_timeout(vha->vref_waitq,
-                   atomic_read(&vha->vref_count), HZ);
+       for (i = 0; i < 10; i++) {
+               if (wait_event_timeout(vha->vref_waitq,
+                   !atomic_read(&vha->vref_count), HZ) > 0)
+                       break;
+       }
 
        spin_lock_irqsave(&ha->vport_slock, flags);
        if (atomic_read(&vha->vref_count)) {
index 337162ac3a7716c46bc18774410f7a1796e2b33a..726ad4cbf4a64f10f094e53fa1a6d991d7907145 100644 (file)
@@ -1119,9 +1119,11 @@ qla2x00_wait_for_sess_deletion(scsi_qla_host_t *vha)
 
        qla2x00_mark_all_devices_lost(vha, 0);
 
-       for (i = 0; i < 10; i++)
-               wait_event_timeout(vha->fcport_waitQ, test_fcport_count(vha),
-                   HZ);
+       for (i = 0; i < 10; i++) {
+               if (wait_event_timeout(vha->fcport_waitQ,
+                   test_fcport_count(vha), HZ) > 0)
+                       break;
+       }
 
        flush_workqueue(vha->hw->wq);
 }
index 5447738906ac04257fe6b1d92ee1460b75c825e3..91c007d26c1ef7934e3e19289b6335ecde573f6f 100644 (file)
@@ -1883,7 +1883,8 @@ int scsi_mq_setup_tags(struct Scsi_Host *shost)
 {
        unsigned int cmd_size, sgl_size;
 
-       sgl_size = scsi_mq_inline_sgl_size(shost);
+       sgl_size = max_t(unsigned int, sizeof(struct scatterlist),
+                               scsi_mq_inline_sgl_size(shost));
        cmd_size = sizeof(struct scsi_cmnd) + shost->hostt->cmd_size + sgl_size;
        if (scsi_host_get_prot(shost))
                cmd_size += sizeof(struct scsi_data_buffer) +
index de4019dc0f0b65c17a78de643c21f0e69015519e..1efc69e194f8e06a231b0501d405ac563541adc8 100644 (file)
@@ -263,25 +263,16 @@ void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
        int result = cmd->result;
        struct request *rq = cmd->request;
 
-       switch (req_op(rq)) {
-       case REQ_OP_ZONE_RESET:
-       case REQ_OP_ZONE_RESET_ALL:
-
-               if (result &&
-                   sshdr->sense_key == ILLEGAL_REQUEST &&
-                   sshdr->asc == 0x24)
-                       /*
-                        * INVALID FIELD IN CDB error: reset of a conventional
-                        * zone was attempted. Nothing to worry about, so be
-                        * quiet about the error.
-                        */
-                       rq->rq_flags |= RQF_QUIET;
-               break;
-
-       case REQ_OP_WRITE:
-       case REQ_OP_WRITE_ZEROES:
-       case REQ_OP_WRITE_SAME:
-               break;
+       if (req_op(rq) == REQ_OP_ZONE_RESET &&
+           result &&
+           sshdr->sense_key == ILLEGAL_REQUEST &&
+           sshdr->asc == 0x24) {
+               /*
+                * INVALID FIELD IN CDB error: reset of a conventional
+                * zone was attempted. Nothing to worry about, so be
+                * quiet about the error.
+                */
+               rq->rq_flags |= RQF_QUIET;
        }
 }