From: Jens Axboe Mt rainier probe must be deferred to media load time, since it requires a valid media (the drive may present a different capability based on what media is loaded). This fixes that for ide-cd and sr. Signed-Off-By: Jens Axboe Signed-off-by: Andrew Morton --- 25-akpm/drivers/cdrom/cdrom.c | 32 ++++++++++++++++++++++++++++++-- 25-akpm/drivers/ide/ide-cd.c | 23 +---------------------- 25-akpm/drivers/ide/ide-cd.h | 2 -- 25-akpm/drivers/scsi/sr.c | 16 +--------------- 4 files changed, 32 insertions(+), 41 deletions(-) diff -puN drivers/cdrom/cdrom.c~fix-cdrom-mt-rainier-probe drivers/cdrom/cdrom.c --- 25/drivers/cdrom/cdrom.c~fix-cdrom-mt-rainier-probe Thu Jun 10 13:53:44 2004 +++ 25-akpm/drivers/cdrom/cdrom.c Thu Jun 10 13:53:44 2004 @@ -508,6 +508,8 @@ int cdrom_is_mrw(struct cdrom_device_inf unsigned char buffer[16]; int ret; + *write = 0; + init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ); cgc.cmd[0] = GPCMD_GET_CONFIGURATION; @@ -521,8 +523,10 @@ int cdrom_is_mrw(struct cdrom_device_inf mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)]; *write = mfd->write; - if ((ret = cdrom_mrw_probe_pc(cdi))) + if ((ret = cdrom_mrw_probe_pc(cdi))) { + *write = 0; return ret; + } return 0; } @@ -822,8 +826,30 @@ static int cdrom_ram_open_write(struct c */ static int cdrom_open_write(struct cdrom_device_info *cdi) { + int mrw, mrw_write, ram_write; int ret = 1; + mrw = 0; + if (!cdrom_is_mrw(cdi, &mrw_write)) + mrw = 1; + + (void) cdrom_is_random_writable(cdi, &ram_write); + + if (mrw) + cdi->mask &= ~CDC_MRW; + else + cdi->mask |= CDC_MRW; + + if (mrw_write) + cdi->mask &= ~CDC_MRW_W; + else + cdi->mask |= CDC_MRW_W; + + if (ram_write) + cdi->mask &= ~CDC_RAM; + else + cdi->mask |= CDC_RAM; + if (CDROM_CAN(CDC_MRW_W)) ret = cdrom_mrw_open_write(cdi); else if (CDROM_CAN(CDC_DVD_RAM)) @@ -866,6 +892,9 @@ int cdrom_open(struct cdrom_device_info if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) { ret = cdi->ops->open(cdi, 1); } else { + ret = open_for_data(cdi); + if (ret) + goto err; if (fp->f_mode & FMODE_WRITE) { ret = -EROFS; if (!CDROM_CAN(CDC_RAM)) @@ -873,7 +902,6 @@ int cdrom_open(struct cdrom_device_info if (cdrom_open_write(cdi)) goto err; } - ret = open_for_data(cdi); } if (ret) diff -puN drivers/ide/ide-cd.c~fix-cdrom-mt-rainier-probe drivers/ide/ide-cd.c --- 25/drivers/ide/ide-cd.c~fix-cdrom-mt-rainier-probe Thu Jun 10 13:53:44 2004 +++ 25-akpm/drivers/ide/ide-cd.c Thu Jun 10 13:53:44 2004 @@ -2816,7 +2816,6 @@ int ide_cdrom_open_real (struct cdrom_de return 0; } - /* * Close down the device. Invalidate all cached blocks. */ @@ -2890,12 +2889,6 @@ static int ide_cdrom_register (ide_drive devinfo->mask |= CDC_CLOSE_TRAY; if (!CDROM_CONFIG_FLAGS(drive)->mo_drive) devinfo->mask |= CDC_MO_DRIVE; - if (!CDROM_CONFIG_FLAGS(drive)->mrw) - devinfo->mask |= CDC_MRW; - if (!CDROM_CONFIG_FLAGS(drive)->mrw_w) - devinfo->mask |= CDC_MRW_W; - if (!CDROM_CONFIG_FLAGS(drive)->ram) - devinfo->mask |= CDC_RAM; devinfo->disk = drive->disk; return register_cdrom(devinfo); @@ -2932,7 +2925,7 @@ int ide_cdrom_probe_capabilities (ide_dr struct cdrom_info *info = drive->driver_data; struct cdrom_device_info *cdi = &info->devinfo; struct atapi_capabilities_page cap; - int nslots = 1, mrw_write = 0, ram_write = 0; + int nslots = 1; if (drive->media == ide_optical) { CDROM_CONFIG_FLAGS(drive)->mo_drive = 1; @@ -2961,17 +2954,6 @@ int ide_cdrom_probe_capabilities (ide_dr if (ide_cdrom_get_capabilities(drive, &cap)) return 0; - if (!cdrom_is_mrw(cdi, &mrw_write)) { - CDROM_CONFIG_FLAGS(drive)->mrw = 1; - if (mrw_write) { - CDROM_CONFIG_FLAGS(drive)->mrw_w = 1; - CDROM_CONFIG_FLAGS(drive)->ram = 1; - } - } - if (!cdrom_is_random_writable(cdi, &ram_write)) - if (ram_write) - CDROM_CONFIG_FLAGS(drive)->ram = 1; - if (cap.lock == 0) CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1; if (cap.eject) @@ -3051,9 +3033,6 @@ int ide_cdrom_probe_capabilities (ide_dr (CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "", (CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : ""); - if (CDROM_CONFIG_FLAGS(drive)->mrw || CDROM_CONFIG_FLAGS(drive)->mrw_w) - printk(" CD-MR%s", CDROM_CONFIG_FLAGS(drive)->mrw_w ? "W" : ""); - if (CDROM_CONFIG_FLAGS(drive)->is_changer) printk(" changer w/%d slots", nslots); else diff -puN drivers/ide/ide-cd.h~fix-cdrom-mt-rainier-probe drivers/ide/ide-cd.h --- 25/drivers/ide/ide-cd.h~fix-cdrom-mt-rainier-probe Thu Jun 10 13:53:44 2004 +++ 25-akpm/drivers/ide/ide-cd.h Thu Jun 10 13:53:44 2004 @@ -79,8 +79,6 @@ struct ide_cd_config_flags { __u8 dvd : 1; /* Drive is a DVD-ROM */ __u8 dvd_r : 1; /* Drive can write DVD-R */ __u8 dvd_ram : 1; /* Drive can write DVD-RAM */ - __u8 mrw : 1; /* drive can read mrw */ - __u8 mrw_w : 1; /* drive can write mrw */ __u8 ram : 1; /* generic WRITE (dvd-ram/mrw) */ __u8 test_write : 1; /* Drive can fake writes */ __u8 supp_disc_present : 1; /* Changer can report exact contents diff -puN drivers/scsi/sr.c~fix-cdrom-mt-rainier-probe drivers/scsi/sr.c --- 25/drivers/scsi/sr.c~fix-cdrom-mt-rainier-probe Thu Jun 10 13:53:44 2004 +++ 25-akpm/drivers/scsi/sr.c Thu Jun 10 13:53:44 2004 @@ -754,12 +754,11 @@ Enomem: static void get_capabilities(struct scsi_cd *cd) { unsigned char *buffer; - int rc, n, mrw_write = 0, mrw = 1,ram_write=0; struct scsi_mode_data data; struct scsi_request *SRpnt; unsigned char cmd[MAX_COMMAND_SIZE]; unsigned int the_result; - int retries; + int retries, rc, n; static char *loadmech[] = { @@ -831,19 +830,6 @@ static void get_capabilities(struct scsi return; } - if (cdrom_is_mrw(&cd->cdi, &mrw_write)) { - mrw = 0; - cd->cdi.mask |= CDC_MRW; - cd->cdi.mask |= CDC_MRW_W; - } - if (!mrw_write) - cd->cdi.mask |= CDC_MRW_W; - - if (cdrom_is_random_writable(&cd->cdi, &ram_write)) - cd->cdi.mask |= CDC_RAM; - if (!ram_write) - cd->cdi.mask |= CDC_RAM; - n = data.header_length + data.block_descriptor_length; cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176; cd->readcd_known = 1; _