[SCSI] sr: consider the last written sector when determining media size

On certain cases, UDF disc doesn't report capacity correctly via
READ_CAPACITY but TOC or trackinfo contains valid information which
can be obtained using cdrom_get_last_written().  ide-cd considers both
values and uses the larger one.  Do the same in sr.  This fixes
bko#9668.

 http://bugzilla.kernel.org/show_bug.cgi?id=9668

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Milan Kocian <milan.kocian@wq.cz>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
Tejun Heo 2009-09-04 11:38:02 +09:00 committed by James Bottomley
parent 53203244a4
commit 5915136d4d

View file

@ -684,14 +684,20 @@ static void get_sectorsize(struct scsi_cd *cd)
cd->capacity = 0x1fffff; cd->capacity = 0x1fffff;
sector_size = 2048; /* A guess, just in case */ sector_size = 2048; /* A guess, just in case */
} else { } else {
#if 0 long last_written;
if (cdrom_get_last_written(&cd->cdi,
&cd->capacity)) cd->capacity = 1 + ((buffer[0] << 24) | (buffer[1] << 16) |
#endif (buffer[2] << 8) | buffer[3]);
cd->capacity = 1 + ((buffer[0] << 24) | /*
(buffer[1] << 16) | * READ_CAPACITY doesn't return the correct size on
(buffer[2] << 8) | * certain UDF media. If last_written is larger, use
buffer[3]); * 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) | sector_size = (buffer[4] << 24) |
(buffer[5] << 16) | (buffer[6] << 8) | buffer[7]; (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
switch (sector_size) { switch (sector_size) {