include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / scsi / sr.c
index cd350df..0a90abc 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/init.h>
 #include <linux/blkdev.h>
 #include <linux/mutex.h>
+#include <linux/slab.h>
 #include <asm/uaccess.h>
 
 #include <scsi/scsi.h>
@@ -525,7 +526,7 @@ static int sr_block_media_changed(struct gendisk *disk)
        return cdrom_media_changed(&cd->cdi);
 }
 
-static struct block_device_operations sr_bdops =
+static const struct block_device_operations sr_bdops =
 {
        .owner          = THIS_MODULE,
        .open           = sr_block_open,
@@ -684,14 +685,20 @@ static void get_sectorsize(struct scsi_cd *cd)
                cd->capacity = 0x1fffff;
                sector_size = 2048;     /* A guess, just in case */
        } else {
-#if 0
-               if (cdrom_get_last_written(&cd->cdi,
-                                          &cd->capacity))
-#endif
-                       cd->capacity = 1 + ((buffer[0] << 24) |
-                                                   (buffer[1] << 16) |
-                                                   (buffer[2] << 8) |
-                                                   buffer[3]);
+               long last_written;
+
+               cd->capacity = 1 + ((buffer[0] << 24) | (buffer[1] << 16) |
+                                   (buffer[2] << 8) | buffer[3]);
+               /*
+                * READ_CAPACITY doesn't return the correct size on
+                * certain UDF media.  If last_written is larger, use
+                * it instead.
+                *
+                * http://bugzilla.kernel.org/show_bug.cgi?id=9668
+                */
+               if (!cdrom_get_last_written(&cd->cdi, &last_written))
+                       cd->capacity = max_t(long, cd->capacity, last_written);
+
                sector_size = (buffer[4] << 24) |
                    (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
                switch (sector_size) {
@@ -881,6 +888,7 @@ static int sr_remove(struct device *dev)
 {
        struct scsi_cd *cd = dev_get_drvdata(dev);
 
+       blk_queue_prep_rq(cd->device->request_queue, scsi_prep_fn);
        del_gendisk(cd->disk);
 
        mutex_lock(&sr_ref_mutex);