scsi: target: Send unit attention condition even if the sense buffer is too small
authorBart Van Assche <bart.vanassche@wdc.com>
Fri, 22 Jun 2018 21:53:05 +0000 (14:53 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 2 Jul 2018 20:44:32 +0000 (16:44 -0400)
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Reviewed-by: Mike Christie <mchristi@redhat.com>
Cc: Mike Christie <mchristi@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_transport.c

index ebbc7e3..a71cfae 100644 (file)
@@ -64,7 +64,7 @@ struct kmem_cache *t10_alua_lba_map_cache;
 struct kmem_cache *t10_alua_lba_map_mem_cache;
 
 static void transport_complete_task_attr(struct se_cmd *cmd);
 struct kmem_cache *t10_alua_lba_map_mem_cache;
 
 static void transport_complete_task_attr(struct se_cmd *cmd);
-static int translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason);
+static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason);
 static void transport_handle_queue_full(struct se_cmd *cmd,
                struct se_device *dev, int err, bool write_pending);
 static void target_complete_ok_work(struct work_struct *work);
 static void transport_handle_queue_full(struct se_cmd *cmd,
                struct se_device *dev, int err, bool write_pending);
 static void target_complete_ok_work(struct work_struct *work);
@@ -3170,7 +3170,7 @@ static const struct sense_info sense_info_table[] = {
        },
 };
 
        },
 };
 
-static int translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
+static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
 {
        const struct sense_info *si;
        u8 *buffer = cmd->sense_buffer;
 {
        const struct sense_info *si;
        u8 *buffer = cmd->sense_buffer;
@@ -3201,11 +3201,9 @@ static int translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
        cmd->scsi_sense_length  = TRANSPORT_SENSE_BUFFER;
        scsi_build_sense_buffer(desc_format, buffer, si->key, asc, ascq);
        if (si->add_sector_info)
        cmd->scsi_sense_length  = TRANSPORT_SENSE_BUFFER;
        scsi_build_sense_buffer(desc_format, buffer, si->key, asc, ascq);
        if (si->add_sector_info)
-               return scsi_set_sense_information(buffer,
-                                                 cmd->scsi_sense_length,
-                                                 cmd->bad_sector);
-
-       return 0;
+               WARN_ON_ONCE(scsi_set_sense_information(buffer,
+                                                       cmd->scsi_sense_length,
+                                                       cmd->bad_sector) < 0);
 }
 
 int
 }
 
 int
@@ -3222,13 +3220,8 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
        cmd->se_cmd_flags |= SCF_SENT_CHECK_CONDITION;
        spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 
        cmd->se_cmd_flags |= SCF_SENT_CHECK_CONDITION;
        spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 
-       if (!from_transport) {
-               int rc;
-
-               rc = translate_sense_reason(cmd, reason);
-               if (rc)
-                       return rc;
-       }
+       if (!from_transport)
+               translate_sense_reason(cmd, reason);
 
        trace_target_cmd_complete(cmd);
        return cmd->se_tfo->queue_status(cmd);
 
        trace_target_cmd_complete(cmd);
        return cmd->se_tfo->queue_status(cmd);