VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / ide / ide-cd.c
index 6f14bbf..c3d6286 100644 (file)
@@ -785,14 +785,6 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
                                do_end_request = 1;
                } else if (sense_key == ILLEGAL_REQUEST ||
                           sense_key == DATA_PROTECT) {
-                       /*
-                        * check if this was a write protected media
-                        */
-                       if (rq_data_dir(rq) == WRITE) {
-                               printk("ide-cd: media marked write protected\n");
-                               set_disk_ro(drive->disk, 1);
-                       }
-
                        /* No point in retrying after an illegal
                           request or data protect error.*/
                        ide_dump_status (drive, "command error", stat);
@@ -1967,13 +1959,17 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
         * sg request
         */
        if (rq->bio) {
-               if (rq->data_len & 3) {
-                       printk("%s: block pc not aligned, len=%d\n", drive->name, rq->data_len);
-                       cdrom_end_request(drive, 0);
-                       return ide_stopped;
-               }
-               info->dma = drive->using_dma;
+               int mask = drive->queue->dma_alignment;
+               unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
+
                info->cmd = rq_data_dir(rq);
+               info->dma = drive->using_dma;
+
+               /*
+                * check if dma is safe
+                */
+               if ((rq->data_len & mask) || (addr & mask))
+                       info->dma = 0;
        }
 
        /* Start sending the command to the drive. */
@@ -2816,7 +2812,6 @@ int ide_cdrom_open_real (struct cdrom_device_info *cdi, int purpose)
        return 0;
 }
 
-
 /*
  * Close down the device.  Invalidate all cached blocks.
  */
@@ -2890,12 +2885,6 @@ static int ide_cdrom_register (ide_drive_t *drive, int nslots)
                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 +2921,7 @@ int ide_cdrom_probe_capabilities (ide_drive_t *drive)
        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 +2950,6 @@ int ide_cdrom_probe_capabilities (ide_drive_t *drive)
        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 +3029,6 @@ int ide_cdrom_probe_capabilities (ide_drive_t *drive)
                (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   
@@ -3162,7 +3137,7 @@ int ide_cdrom_setup (ide_drive_t *drive)
        int nslots;
 
        blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
-       blk_queue_dma_alignment(drive->queue, 3);
+       blk_queue_dma_alignment(drive->queue, 31);
        drive->queue->unplug_delay = (1 * HZ) / 1000;
        if (!drive->queue->unplug_delay)
                drive->queue->unplug_delay = 1;
@@ -3269,9 +3244,8 @@ int ide_cdrom_setup (ide_drive_t *drive)
        nslots = ide_cdrom_probe_capabilities (drive);
 
        /*
-        * set correct block size and read-only for non-ram media
+        * set correct block size
         */
-       set_disk_ro(drive->disk, !CDROM_CONFIG_FLAGS(drive)->ram);
        blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
 
 #if 0
@@ -3421,10 +3395,10 @@ static int idecd_ioctl (struct inode *inode, struct file *file,
 {
        struct block_device *bdev = inode->i_bdev;
        ide_drive_t *drive = bdev->bd_disk->private_data;
-       int err = generic_ide_ioctl(bdev, cmd, arg);
+       int err = generic_ide_ioctl(file, bdev, cmd, arg);
        if (err == -EINVAL) {
                struct cdrom_info *info = drive->driver_data;
-               err = cdrom_ioctl(&info->devinfo, inode, cmd, arg);
+               err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
        }
        return err;
 }