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 <[EMAIL PROTECTED]>
* 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;
     }
     

Reply via email to