|
@@ -839,7 +839,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
|
|
int this_count = scsi_bufflen(cmd);
|
|
|
struct request_queue *q = cmd->device->request_queue;
|
|
|
struct request *req = cmd->request;
|
|
|
- int clear_errors = 1;
|
|
|
+ int error = 0;
|
|
|
struct scsi_sense_hdr sshdr;
|
|
|
int sense_valid = 0;
|
|
|
int sense_deferred = 0;
|
|
@@ -853,7 +853,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
|
|
if (blk_pc_request(req)) { /* SG_IO ioctl from block level */
|
|
|
req->errors = result;
|
|
|
if (result) {
|
|
|
- clear_errors = 0;
|
|
|
if (sense_valid && req->sense) {
|
|
|
/*
|
|
|
* SG_IO wants current and deferred errors
|
|
@@ -865,6 +864,8 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
|
|
memcpy(req->sense, cmd->sense_buffer, len);
|
|
|
req->sense_len = len;
|
|
|
}
|
|
|
+ if (!sense_deferred)
|
|
|
+ error = -EIO;
|
|
|
}
|
|
|
if (scsi_bidi_cmnd(cmd)) {
|
|
|
/* will also release_buffers */
|
|
@@ -885,14 +886,11 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
|
|
"%d bytes done.\n",
|
|
|
req->nr_sectors, good_bytes));
|
|
|
|
|
|
- if (clear_errors)
|
|
|
- req->errors = 0;
|
|
|
-
|
|
|
/* A number of bytes were successfully read. If there
|
|
|
* are leftovers and there is some kind of error
|
|
|
* (result != 0), retry the rest.
|
|
|
*/
|
|
|
- if (scsi_end_request(cmd, 0, good_bytes, result == 0) == NULL)
|
|
|
+ if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL)
|
|
|
return;
|
|
|
|
|
|
/* good_bytes = 0, or (inclusive) there were leftovers and
|