return SUCCESS;
 
                /* these are not supported */
+       case DATA_PROTECT:
+               if (sshdr.asc == 0x27 && sshdr.ascq == 0x07) {
+                       /* Thin provisioning hard threshold reached */
+                       set_host_byte(scmd, DID_ALLOC_FAILURE);
+                       return SUCCESS;
+               }
        case COPY_ABORTED:
        case VOLUME_OVERFLOW:
        case MISCOMPARE:
        case BLANK_CHECK:
-       case DATA_PROTECT:
                set_host_byte(scmd, DID_TARGET_FAILURE);
                return SUCCESS;
 
 
  * -ENOLINK    temporary transport failure
  * -EREMOTEIO  permanent target failure, do not retry
  * -EBADE      permanent nexus failure, retry on other path
+ * -ENOSPC     No write space available
  * -EIO                unspecified I/O error
  */
 static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
                set_host_byte(cmd, DID_OK);
                error = -EBADE;
                break;
+       case DID_ALLOC_FAILURE:
+               set_host_byte(cmd, DID_OK);
+               error = -ENOSPC;
+               break;
        default:
                error = -EIO;
                break;
 
                                 * other paths */
 #define DID_NEXUS_FAILURE 0x11  /* Permanent nexus failure, retry on other
                                 * paths might yield different results */
+#define DID_ALLOC_FAILURE 0x12  /* Space allocation on the device failed */
 #define DRIVER_OK       0x00   /* Driver status                           */
 
 /*