diff options
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 10 | 
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 1b199e15ce9..67f412bb497 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -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  |