cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
                                  sensebuf, &sshdr, (10*HZ), 5, 0, 0, NULL);
 
+       if (cmd_result < 0) {
+               rc = cmd_result;
+               goto error;
+       }
        if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
                u8 *desc = sensebuf + 8;
                cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
        cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
                                sensebuf, &sshdr, (10*HZ), 5, 0, 0, NULL);
 
+       if (cmd_result < 0) {
+               rc = cmd_result;
+               goto error;
+       }
        if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
                u8 *desc = sensebuf + 8;
                cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
 
        result = scsi_execute_req(ch->device, cmd, direction, buffer,
                                  buflength, &sshdr, timeout * HZ,
                                  MAX_RETRIES, NULL);
-
+       if (result < 0)
+               return result;
        if (driver_byte(result) == DRIVER_SENSE) {
                if (debug)
                        scsi_print_sense_hdr(ch->device, ch->name, &sshdr);
 
                goto out;
        }
 
-       if (driver_byte(result) == DRIVER_SENSE) {
+       if (result > 0 && driver_byte(result) == DRIVER_SENSE) {
                result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
                if (result & SAM_STAT_CHECK_CONDITION) {
                        switch (sshdr.sense_key) {
 
        result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer, len,
                                  &sshdr, 30 * HZ, 3, NULL);
 
+       if (result < 0)
+               return result;
        if (result && scsi_sense_valid(&sshdr) &&
            sshdr.sense_key == ILLEGAL_REQUEST &&
            (sshdr.asc == 0x20 || sshdr.asc == 0x24) && sshdr.ascq == 0x00)
 
        SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
                                      "Ioctl returned  0x%x\n", result));
 
+       if (result < 0)
+               goto out;
        if (driver_byte(result) == DRIVER_SENSE &&
            scsi_sense_valid(&sshdr)) {
                switch (sshdr.sense_key) {
                        break;
                }
        }
-
+out:
        SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
                                      "IOCTL Releasing command\n"));
        return result;
 
 {
        struct request *req;
        struct scsi_request *rq;
-       int ret = DRIVER_ERROR << 24;
+       int ret;
 
        req = blk_get_request(sdev->request_queue,
                        data_direction == DMA_TO_DEVICE ?
                        REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN,
                        rq_flags & RQF_PM ? BLK_MQ_REQ_PM : 0);
        if (IS_ERR(req))
-               return ret;
-       rq = scsi_req(req);
+               return PTR_ERR(req);
 
-       if (bufflen &&  blk_rq_map_kern(sdev->request_queue, req,
-                                       buffer, bufflen, GFP_NOIO))
-               goto out;
+       rq = scsi_req(req);
 
+       if (bufflen) {
+               ret = blk_rq_map_kern(sdev->request_queue, req,
+                                     buffer, bufflen, GFP_NOIO);
+               if (ret)
+                       goto out;
+       }
        rq->cmd_len = COMMAND_SIZE(cmd[0]);
        memcpy(rq->cmd, cmd, rq->cmd_len);
        rq->retries = retries;
 
                                "scsi scan: INQUIRY %s with code 0x%x\n",
                                result ? "failed" : "successful", result));
 
-               if (result) {
+               if (result > 0) {
                        /*
                         * not-ready to ready transition [asc/ascq=0x28/0x0]
                         * or power-on, reset [asc/ascq=0x29/0x0], continue.
                                    (sshdr.ascq == 0))
                                        continue;
                        }
-               } else {
+               } else if (result == 0) {
                        /*
                         * if nothing was transferred, we try
                         * again. It's a workaround for some USB
 
                                      REQ_FAILFAST_TRANSPORT |
                                      REQ_FAILFAST_DRIVER,
                                      RQF_PM, NULL);
-               if (driver_byte(result) != DRIVER_SENSE ||
+               if (result < 0 || driver_byte(result) != DRIVER_SENSE ||
                    sshdr->sense_key != UNIT_ATTENTION)
                        break;
        }
 
                                              &sshdr);
 
                /* failed to execute TUR, assume media not present */
-               if (host_byte(retval)) {
+               if (retval < 0 || host_byte(retval)) {
                        set_media_not_present(sdkp);
                        goto out;
                }
        if (res) {
                sd_print_result(sdkp, "Synchronize Cache(10) failed", res);
 
+               if (res < 0)
+                       return res;
+
                if (driver_byte(res) == DRIVER_SENSE)
                        sd_print_sense_hdr(sdkp, sshdr);
 
        result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, &data, sizeof(data),
                        &sshdr, SD_TIMEOUT, sdkp->max_retries, NULL);
 
-       if (driver_byte(result) == DRIVER_SENSE &&
+       if (result > 0 && driver_byte(result) == DRIVER_SENSE &&
            scsi_sense_valid(&sshdr)) {
                sdev_printk(KERN_INFO, sdev, "PR command failed: %d\n", result);
                scsi_print_sense_hdr(sdev, NULL, &sshdr);
                          ((driver_byte(the_result) == DRIVER_SENSE) &&
                          sense_valid && sshdr.sense_key == UNIT_ATTENTION)));
 
-               if (driver_byte(the_result) != DRIVER_SENSE) {
+               if (the_result < 0 || driver_byte(the_result) != DRIVER_SENSE) {
                        /* no sense, TUR either succeeded or failed
                         * with a status error */
                        if(!spintime && !scsi_status_is_good(the_result)) {
                if (media_not_present(sdkp, &sshdr))
                        return -ENODEV;
 
-               if (the_result) {
+               if (the_result > 0) {
                        sense_valid = scsi_sense_valid(&sshdr);
                        if (sense_valid &&
                            sshdr.sense_key == ILLEGAL_REQUEST &&
                if (media_not_present(sdkp, &sshdr))
                        return -ENODEV;
 
-               if (the_result) {
+               if (the_result > 0) {
                        sense_valid = scsi_sense_valid(&sshdr);
                        if (sense_valid &&
                            sshdr.sense_key == UNIT_ATTENTION &&
                        SD_TIMEOUT, sdkp->max_retries, 0, RQF_PM, NULL);
        if (res) {
                sd_print_result(sdkp, "Start/Stop Unit failed", res);
-               if (driver_byte(res) == DRIVER_SENSE)
+               if (res > 0 && driver_byte(res) == DRIVER_SENSE)
                        sd_print_sense_hdr(sdkp, &sshdr);
                if (scsi_sense_valid(&sshdr) &&
                        /* 0x3a is medium not present */
 
                sd_printk(KERN_ERR, sdkp,
                          "REPORT ZONES start lba %llu failed\n", lba);
                sd_print_result(sdkp, "REPORT ZONES", result);
-               if (driver_byte(result) == DRIVER_SENSE &&
+               if (result > 0 && driver_byte(result) == DRIVER_SENSE &&
                    scsi_sense_valid(&sshdr))
                        sd_print_sense_hdr(sdkp, &sshdr);
                return -EIO;
 
                              cgc->timeout, IOCTL_RETRIES, 0, 0, NULL);
 
        /* Minimal error checking.  Ignore cases we know about, and report the rest. */
+       if (result < 0) {
+               err = result;
+               goto out;
+       }
        if (driver_byte(result) != 0) {
                switch (sshdr->sense_key) {
                case UNIT_ATTENTION:
 
                sdev_printk(KERN_WARNING, sdp,
                            "START_STOP failed for power mode: %d, result %x\n",
                            pwr_mode, ret);
-               if (driver_byte(ret) == DRIVER_SENSE)
+               if (ret > 0 && driver_byte(ret) == DRIVER_SENSE)
                        scsi_print_sense_hdr(sdp, NULL, &sshdr);
        }
 
 
                if (result == 0 && inq_result[0] >> 5) {
                        /* PQ indicates the LUN is not attached */
                        scsi_remove_device(sdev);
-               } else if (host_byte(result) == DID_BAD_TARGET) {
+               } else if (result > 0 && host_byte(result) == DID_BAD_TARGET) {
                        /*
                         * If all LUNs of a virtio-scsi device are unplugged
                         * it will respond with BAD TARGET on any INQUIRY
 
  * This returns true for known good conditions that may be treated as
  * command completed normally
  */
-static inline int scsi_status_is_good(int status)
+static inline bool scsi_status_is_good(int status)
 {
+       if (status < 0)
+               return false;
+
        if (host_byte(status) == DID_NO_CONNECT)
-               return 0;
+               return false;
 
        /*
         * FIXME: bit0 is listed as reserved in SCSI-2, but is