LCOV - code coverage report
Current view: top level - lib/bdev - scsi_nvme.c (source / functions) Hit Total Coverage
Test: ut_cov_unit.info Lines: 145 145 100.0 %
Date: 2024-12-16 14:02:58 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*   SPDX-License-Identifier: BSD-3-Clause
       2             :  *   Copyright (C) 2017 Intel Corporation.
       3             :  *   Copyright (c) 2016 FUJITSU LIMITED, All rights reserved.
       4             :  */
       5             : 
       6             : #include "spdk/bdev_module.h"
       7             : 
       8             : #include "spdk/nvme_spec.h"
       9             : 
      10             : void
      11          26 : spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk,
      12             :                          int *asc, int *ascq)
      13             : {
      14          26 :         int nvme_sct = bdev_io->internal.error.nvme.sct;
      15          26 :         int nvme_sc = bdev_io->internal.error.nvme.sc;
      16             : 
      17          26 :         switch (nvme_sct) {
      18             :         case SPDK_NVME_SCT_GENERIC:
      19          12 :                 switch (nvme_sc) {
      20             :                 case SPDK_NVME_SC_SUCCESS:
      21           1 :                         *sc   = SPDK_SCSI_STATUS_GOOD;
      22           1 :                         *sk   = SPDK_SCSI_SENSE_NO_SENSE;
      23           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
      24           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      25           1 :                         break;
      26             :                 case SPDK_NVME_SC_INVALID_OPCODE:
      27           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      28           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
      29           1 :                         *asc  = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE;
      30           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      31           1 :                         break;
      32             :                 case SPDK_NVME_SC_INVALID_FIELD:
      33           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      34           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
      35           1 :                         *asc  = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
      36           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      37           1 :                         break;
      38             :                 case SPDK_NVME_SC_DATA_TRANSFER_ERROR:
      39             :                 case SPDK_NVME_SC_CAPACITY_EXCEEDED:
      40           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      41           1 :                         *sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
      42           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
      43           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      44           1 :                         break;
      45             :                 case SPDK_NVME_SC_ABORTED_POWER_LOSS:
      46           1 :                         *sc   = SPDK_SCSI_STATUS_TASK_ABORTED;
      47           1 :                         *sk   = SPDK_SCSI_SENSE_ABORTED_COMMAND;
      48           1 :                         *asc  = SPDK_SCSI_ASC_WARNING;
      49           1 :                         *ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
      50           1 :                         break;
      51             :                 case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR:
      52           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      53           1 :                         *sk   = SPDK_SCSI_SENSE_HARDWARE_ERROR;
      54           1 :                         *asc  = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE;
      55           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      56           1 :                         break;
      57             :                 case SPDK_NVME_SC_ABORTED_BY_REQUEST:
      58             :                 case SPDK_NVME_SC_ABORTED_SQ_DELETION:
      59             :                 case SPDK_NVME_SC_ABORTED_FAILED_FUSED:
      60             :                 case SPDK_NVME_SC_ABORTED_MISSING_FUSED:
      61           1 :                         *sc   = SPDK_SCSI_STATUS_TASK_ABORTED;
      62           1 :                         *sk   = SPDK_SCSI_SENSE_ABORTED_COMMAND;
      63           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
      64           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      65           1 :                         break;
      66             :                 case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT:
      67           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      68           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
      69           1 :                         *asc  = SPDK_SCSI_ASC_ACCESS_DENIED;
      70           1 :                         *ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER;
      71           1 :                         break;
      72             :                 case SPDK_NVME_SC_LBA_OUT_OF_RANGE:
      73           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      74           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
      75           1 :                         *asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
      76           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      77           1 :                         break;
      78             :                 case SPDK_NVME_SC_NAMESPACE_NOT_READY:
      79           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
      80           1 :                         *sk   = SPDK_SCSI_SENSE_NOT_READY;
      81           1 :                         *asc  = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY;
      82           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      83           1 :                         break;
      84             :                 case SPDK_NVME_SC_RESERVATION_CONFLICT:
      85           1 :                         *sc   = SPDK_SCSI_STATUS_RESERVATION_CONFLICT;
      86           1 :                         *sk   = SPDK_SCSI_SENSE_NO_SENSE;
      87           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
      88           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
      89           1 :                         break;
      90             :                 case SPDK_NVME_SC_COMMAND_ID_CONFLICT:
      91             :                 case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR:
      92             :                 case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR:
      93             :                 case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS:
      94             :                 case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID:
      95             :                 case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID:
      96             :                 case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID:
      97             :                 case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF:
      98             :                 case SPDK_NVME_SC_INVALID_PRP_OFFSET:
      99             :                 case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED:
     100             :                 case SPDK_NVME_SC_INVALID_SGL_OFFSET:
     101             :                 case SPDK_NVME_SC_HOSTID_INCONSISTENT_FORMAT:
     102             :                 case SPDK_NVME_SC_KEEP_ALIVE_EXPIRED:
     103             :                 case SPDK_NVME_SC_KEEP_ALIVE_INVALID:
     104           1 :                 case SPDK_NVME_SC_FORMAT_IN_PROGRESS:
     105             :                 default:
     106           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     107           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     108           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
     109           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     110           1 :                         break;
     111             :                 }
     112          12 :                 break;
     113             :         case SPDK_NVME_SCT_COMMAND_SPECIFIC:
     114           5 :                 switch (nvme_sc) {
     115             :                 case SPDK_NVME_SC_COMPLETION_QUEUE_INVALID:
     116             :                 case SPDK_NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED:
     117           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     118           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     119           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
     120           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     121           1 :                         break;
     122             :                 case SPDK_NVME_SC_INVALID_FORMAT:
     123           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     124           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     125           1 :                         *asc  = SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED;
     126           1 :                         *ascq = SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED;
     127           1 :                         break;
     128             :                 case SPDK_NVME_SC_CONFLICTING_ATTRIBUTES:
     129           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     130           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     131           1 :                         *asc  = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
     132           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     133           1 :                         break;
     134             :                 case SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_RANGE:
     135           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     136           1 :                         *sk   = SPDK_SCSI_SENSE_DATA_PROTECT;
     137           1 :                         *asc  = SPDK_SCSI_ASC_WRITE_PROTECTED;
     138           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     139           1 :                         break;
     140             :                 case SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER:
     141             :                 case SPDK_NVME_SC_INVALID_QUEUE_SIZE:
     142             :                 case SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED:
     143             :                 case SPDK_NVME_SC_INVALID_FIRMWARE_SLOT:
     144             :                 case SPDK_NVME_SC_INVALID_FIRMWARE_IMAGE:
     145             :                 case SPDK_NVME_SC_INVALID_INTERRUPT_VECTOR:
     146             :                 case SPDK_NVME_SC_INVALID_LOG_PAGE:
     147             :                 case SPDK_NVME_SC_FIRMWARE_REQ_CONVENTIONAL_RESET:
     148             :                 case SPDK_NVME_SC_INVALID_QUEUE_DELETION:
     149             :                 case SPDK_NVME_SC_FEATURE_ID_NOT_SAVEABLE:
     150             :                 case SPDK_NVME_SC_FEATURE_NOT_CHANGEABLE:
     151             :                 case SPDK_NVME_SC_FEATURE_NOT_NAMESPACE_SPECIFIC:
     152             :                 case SPDK_NVME_SC_FIRMWARE_REQ_NVM_RESET:
     153             :                 case SPDK_NVME_SC_FIRMWARE_REQ_RESET:
     154             :                 case SPDK_NVME_SC_FIRMWARE_REQ_MAX_TIME_VIOLATION:
     155             :                 case SPDK_NVME_SC_FIRMWARE_ACTIVATION_PROHIBITED:
     156             :                 case SPDK_NVME_SC_OVERLAPPING_RANGE:
     157             :                 case SPDK_NVME_SC_NAMESPACE_INSUFFICIENT_CAPACITY:
     158             :                 case SPDK_NVME_SC_NAMESPACE_ID_UNAVAILABLE:
     159             :                 case SPDK_NVME_SC_NAMESPACE_ALREADY_ATTACHED:
     160             :                 case SPDK_NVME_SC_NAMESPACE_IS_PRIVATE:
     161             :                 case SPDK_NVME_SC_NAMESPACE_NOT_ATTACHED:
     162             :                 case SPDK_NVME_SC_THINPROVISIONING_NOT_SUPPORTED:
     163             :                 case SPDK_NVME_SC_CONTROLLER_LIST_INVALID:
     164           1 :                 case SPDK_NVME_SC_INVALID_PROTECTION_INFO:
     165             :                 default:
     166           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     167           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     168           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
     169           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     170           1 :                         break;
     171             :                 }
     172           5 :                 break;
     173             :         case SPDK_NVME_SCT_MEDIA_ERROR:
     174           8 :                 switch (nvme_sc) {
     175             :                 case SPDK_NVME_SC_WRITE_FAULTS:
     176           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     177           1 :                         *sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
     178           1 :                         *asc  = SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT;
     179           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     180           1 :                         break;
     181             :                 case SPDK_NVME_SC_UNRECOVERED_READ_ERROR:
     182           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     183           1 :                         *sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
     184           1 :                         *asc  = SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR;
     185           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     186           1 :                         break;
     187             :                 case SPDK_NVME_SC_GUARD_CHECK_ERROR:
     188           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     189           1 :                         *sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
     190           1 :                         *asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
     191           1 :                         *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
     192           1 :                         break;
     193             :                 case SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR:
     194           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     195           1 :                         *sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
     196           1 :                         *asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
     197           1 :                         *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
     198           1 :                         break;
     199             :                 case SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR:
     200           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     201           1 :                         *sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
     202           1 :                         *asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
     203           1 :                         *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
     204           1 :                         break;
     205             :                 case SPDK_NVME_SC_COMPARE_FAILURE:
     206           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     207           1 :                         *sk   = SPDK_SCSI_SENSE_MISCOMPARE;
     208           1 :                         *asc  = SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION;
     209           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     210           1 :                         break;
     211             :                 case SPDK_NVME_SC_ACCESS_DENIED:
     212           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     213           1 :                         *sk   = SPDK_SCSI_SENSE_DATA_PROTECT;
     214           1 :                         *asc  = SPDK_SCSI_ASC_ACCESS_DENIED;
     215           1 :                         *ascq = SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS;
     216           1 :                         break;
     217           1 :                 case SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK:
     218             :                 default:
     219           1 :                         *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     220           1 :                         *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     221           1 :                         *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
     222           1 :                         *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     223           1 :                         break;
     224             :                 }
     225           8 :                 break;
     226           1 :         case SPDK_NVME_SCT_VENDOR_SPECIFIC:
     227             :         default:
     228           1 :                 *sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
     229           1 :                 *sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
     230           1 :                 *asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
     231           1 :                 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
     232           1 :                 break;
     233             :         }
     234          26 : }

Generated by: LCOV version 1.15