Messages in this thread Patch in this message |  | | Date | Fri, 10 Nov 2000 17:20:51 +0100 | From | Jens Axboe <> |
| |
On Fri, Nov 10 2000, Henning P. Schmiedehausen wrote: [snip] > Running 2.2.18pre17 completely modular built + 20001027 IDE patch from > kernel.org + Andreas' 2.2.18pre17aa1 patch + some more but I think not > related patches. Complete Kernel SRPMS and RPMS on request. :-)
> The Mitsumi CDROM is used only for listening to music. There is still > an entry in my automount table for /mnt/misc mounting /dev/hdd to > /mnt/misc/cdrom1 if I ever desire to. > > % cat /etc/auto.misc > [...] > cdrom1 -fstype=iso9660,ro :/dev/hdd
[snip cdrom_analyze_sense oops]
Could you try with this patch? It's against 2.2.18-pre21, but will probably apply cleanly to your current kernel.
-- * Jens Axboe <axboe@suse.de> * SuSE Labs --- /opt/kernel/linux-2.2.17.SuSE/drivers/block/ide-cd.c Fri Oct 27 12:22:01 2000 +++ drivers/block/ide-cd.c Fri Nov 10 17:16:14 2000 @@ -324,41 +325,50 @@ info->nsectors_buffered = 0; } +static int cdrom_log_sense(ide_drive_t *drive, struct packet_command *pc, + struct request_sense *sense) +{ + int log = 0; + + if (sense == NULL) + return 0; + + switch (sense->sense_key) { + case NO_SENSE: case RECOVERED_ERROR: + break; + case NOT_READY: + /* + * don't care about tray state messages for + * e.g. capacity commands or in-progress or + * becoming ready + */ + if (sense->asc == 0x3a || sense->asc == 0x04) + break; + log = 1; + break; + case UNIT_ATTENTION: + /* + * Make good and sure we've seen this potential media + * change. Some drives (i.e. Creative) fail to present + * the correct sense key in the error register. + */ + cdrom_saw_media_change(drive); + break; + default: + log = 1; + break; + } + return log; +} static void cdrom_analyze_sense_data(ide_drive_t *drive, struct packet_command *failed_command, struct request_sense *sense) { - if (sense->sense_key == NOT_READY || - sense->sense_key == UNIT_ATTENTION) { - /* Make good and sure we've seen this potential media change. - Some drives (i.e. Creative) fail to present the correct - sense key in the error register. */ - cdrom_saw_media_change (drive); - - - /* Don't print not ready or unit attention errors for - READ_SUBCHANNEL. Workman (and probably other programs) - uses this command to poll the drive, and we don't want - to fill the syslog with useless errors. */ - if (failed_command && - (failed_command->c[0] == GPCMD_READ_SUBCHANNEL || - failed_command->c[0] == GPCMD_TEST_UNIT_READY)) - return; - } - - if (sense->error_code == 0x70 && sense->sense_key == 0x02 - && ((sense->asc == 0x3a && sense->ascq == 0x00) || - (sense->asc == 0x04 && sense->ascq == 0x01))) - { - /* - * Suppress the following errors: - * "Medium not present", "in progress of becoming ready", - * and "writing" to keep the noise level down to a dull roar. - */ + + if (!cdrom_log_sense(drive, failed_command, sense)) return; - } #if VERBOSE_IDE_CD_ERRORS { @@ -1105,7 +1115,13 @@ if (retry && jiffies - info->start_seek > IDECD_SEEK_TIMER) { if (--retry == 0) { + /* + * this condition is far too common, to bother + * users about it + */ +#if 0 printk("%s: disabled DSC seek overlap\n", drive->name); +#endif drive->dsc_overlap = 0; } } @@ -1329,8 +1345,12 @@ static void cdrom_sleep (int time) { - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(time); + int sleep = time; + + do { + set_current_state(TASK_INTERRUPTIBLE); + sleep = schedule_timeout(sleep); + } while (sleep); } static @@ -1848,6 +1868,9 @@ struct cdrom_info *info = drive->driver_data; struct atapi_toc *toc = info->toc; int ntracks; + + if (!CDROM_STATE_FLAGS(drive)->toc_valid) + return -EINVAL; /* Check validity of requested track number. */ ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; --- /opt/kernel/linux-2.2.17.SuSE/drivers/scsi/sr.c Fri Oct 27 12:21:44 2000 +++ drivers/scsi/sr.c Fri Nov 10 14:25:16 2000 @@ -1034,65 +1034,14 @@ */ static int sr_packet(struct cdrom_device_info *cdi, struct cdrom_generic_command *cgc) { - Scsi_Cmnd *SCpnt; Scsi_Device *device = scsi_CDs[MINOR(cdi->dev)].device; - unsigned char *buffer = cgc->buffer; - unsigned long flags; - int buflen; - int stat; - - /* get the device */ - SCpnt = scsi_allocate_device(NULL, device, 1); - if (SCpnt == NULL) - return -ENODEV; /* this just doesn't seem right /axboe */ - - /* use buffer for ISA DMA */ - buflen = (cgc->buflen + 511) & ~511; - if (cgc->buffer && SCpnt->host->unchecked_isa_dma && - (virt_to_phys(cgc->buffer) + cgc->buflen - 1 > ISA_DMA_THRESHOLD)) { - spin_lock_irq(&io_request_lock); - buffer = scsi_malloc(buflen); - spin_unlock_irq(&io_request_lock); - if (buffer == NULL) { - printk("sr: SCSI DMA pool exhausted."); - return -ENOMEM; - } - memcpy(buffer, cgc->buffer, cgc->buflen); - } /* set the LUN */ cgc->cmd[1] |= device->lun << 5; - /* do the locking and issue the command */ - SCpnt->request.rq_dev = cdi->dev; - /* scsi_do_cmd sets the command length */ - SCpnt->cmd_len = 0; - - { - struct semaphore sem = MUTEX_LOCKED; - SCpnt->request.sem = &sem; - spin_lock_irqsave(&io_request_lock, flags); - scsi_do_cmd(SCpnt, (void *)cgc->cmd, (void *) buffer, - cgc->buflen, sr_init_done, SR_TIMEOUT, - MAX_RETRIES); - spin_unlock_irqrestore(&io_request_lock, flags); - down(&sem); - } - - stat = SCpnt->result; - - /* release */ - SCpnt->request.rq_dev = MKDEV(0, 0); - scsi_release_command(SCpnt); - SCpnt = NULL; - - /* write DMA buffer back if used */ - if (buffer && (buffer != cgc->buffer)) { - memcpy(cgc->buffer, buffer, cgc->buflen); - scsi_free(buffer, buflen); - } + cgc->stat = sr_do_ioctl(MINOR(cdi->dev), cgc->cmd, cgc->buffer, cgc->buflen, 1); - return stat; + return cgc->stat; } static int sr_registered = 0; --- /opt/kernel/linux-2.2.17.SuSE/drivers/scsi/sr_ioctl.c Fri Oct 27 12:21:31 2000 +++ drivers/scsi/sr_ioctl.c Fri Nov 10 14:08:50 2000 @@ -77,6 +77,8 @@ buffer = bounce_buffer; } + SCpnt->cmd_len = 0; + retry: if( !scsi_block_when_processing_errors(SDev) ) return -ENODEV; @@ -158,9 +160,8 @@ err = -EIO; } } - + spin_lock_irqsave(&io_request_lock, flags); - result = SCpnt->result; /* Wake up a process waiting for device*/ wake_up(&SCpnt->device->device_wait); scsi_release_command(SCpnt); --- /opt/kernel/linux-2.2.17.SuSE/drivers/scsi/constants.c Mon Aug 9 21:04:40 1999 +++ drivers/scsi/constants.c Fri Nov 10 14:19:22 2000 @@ -501,7 +501,7 @@ printk("%s%s: sns = %2x %2x\n", devclass, kdevname(SCpnt->request.rq_dev), sense_buffer[0], sense_buffer[2]); - printk("Non-extended sense class %d code 0x%0x ", sense_class, code); + printk("Non-extended sense class %d code 0x%0x\n", sense_class, code); s = 4; } |  |