--- linux/drivers/scsi/scsi_lib.c 2004-11-07 22:54:47.000000000 +1000 +++ linux/drivers/scsi/scsi_lib.c2610rc1ds 2004-11-08 17:14:41.000000000 +1000 @@ -717,7 +717,7 @@ clear_errors = 0; if (scsi_command_normalize_sense(cmd, &sshdr)) { /* - * SG_IO wants to know about deferred errors + * SG_IO wants current and deferred errors */ int len = 8 + cmd->sense_buffer[7]; @@ -843,9 +843,10 @@ cmd = scsi_end_request(cmd, 0, this_count, 1); return; case VOLUME_OVERFLOW: - printk("scsi%d: ERROR on channel %d, id %d, lun %d, CDB: ", - cmd->device->host->host_no, (int) cmd->device->channel, - (int) cmd->device->id, (int) cmd->device->lun); + printk(KERN_INFO "Volume overflow <%d %d %d %d> CDB: ", + cmd->device->host->host_no, + (int)cmd->device->channel, + (int)cmd->device->id, (int)cmd->device->lun); __scsi_print_command(cmd->data_cmnd); scsi_print_sense("", cmd); cmd = scsi_end_request(cmd, 0, block_bytes, 1); @@ -864,8 +865,8 @@ return; } if (result) { - printk("SCSI error : <%d %d %d %d> return code = 0x%x\n", - cmd->device->host->host_no, + printk(KERN_INFO "SCSI error : <%d %d %d %d> return code " + "= 0x%x\n", cmd->device->host->host_no, cmd->device->channel, cmd->device->id, cmd->device->lun, result); @@ -1600,12 +1601,15 @@ sreq->sr_data_direction = DMA_NONE; scsi_wait_req(sreq, cmd, NULL, 0, timeout, retries); - if ((driver_byte(sreq->sr_result) & DRIVER_SENSE) && - ((sreq->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION || - (sreq->sr_sense_buffer[2] & 0x0f) == NOT_READY) && - sdev->removable) { - sdev->changed = 1; - sreq->sr_result = 0; + if ((driver_byte(sreq->sr_result) & DRIVER_SENSE) && sdev->removable) { + struct scsi_sense_hdr sshdr; + + if ((scsi_request_normalize_sense(sreq, &sshdr)) && + ((sshdr.sense_key == UNIT_ATTENTION) || + (sshdr.sense_key == NOT_READY))) { + sdev->changed = 1; + sreq->sr_result = 0; + } } result = sreq->sr_result; scsi_release_request(sreq);