|
@@ -684,14 +684,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) {
|