diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/sd.c | 12 | ||||
-rw-r--r-- | drivers/scsi/sr.c | 8 |
2 files changed, 19 insertions, 1 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 20295774bf7..57d1e3e1bd4 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -1498,6 +1498,9 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1498 | unsigned long long lba; | 1498 | unsigned long long lba; |
1499 | unsigned sector_size; | 1499 | unsigned sector_size; |
1500 | 1500 | ||
1501 | if (sdp->no_read_capacity_16) | ||
1502 | return -EINVAL; | ||
1503 | |||
1501 | do { | 1504 | do { |
1502 | memset(cmd, 0, 16); | 1505 | memset(cmd, 0, 16); |
1503 | cmd[0] = SERVICE_ACTION_IN; | 1506 | cmd[0] = SERVICE_ACTION_IN; |
@@ -1626,6 +1629,15 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1626 | sector_size = get_unaligned_be32(&buffer[4]); | 1629 | sector_size = get_unaligned_be32(&buffer[4]); |
1627 | lba = get_unaligned_be32(&buffer[0]); | 1630 | lba = get_unaligned_be32(&buffer[0]); |
1628 | 1631 | ||
1632 | if (sdp->no_read_capacity_16 && (lba == 0xffffffff)) { | ||
1633 | /* Some buggy (usb cardreader) devices return an lba of | ||
1634 | 0xffffffff when the want to report a size of 0 (with | ||
1635 | which they really mean no media is present) */ | ||
1636 | sdkp->capacity = 0; | ||
1637 | sdkp->physical_block_size = sector_size; | ||
1638 | return sector_size; | ||
1639 | } | ||
1640 | |||
1629 | if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) { | 1641 | if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) { |
1630 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " | 1642 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " |
1631 | "kernel compiled with support for large block " | 1643 | "kernel compiled with support for large block " |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index e148341079b..d7b383c96d5 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -862,10 +862,16 @@ static void get_capabilities(struct scsi_cd *cd) | |||
862 | static int sr_packet(struct cdrom_device_info *cdi, | 862 | static int sr_packet(struct cdrom_device_info *cdi, |
863 | struct packet_command *cgc) | 863 | struct packet_command *cgc) |
864 | { | 864 | { |
865 | struct scsi_cd *cd = cdi->handle; | ||
866 | struct scsi_device *sdev = cd->device; | ||
867 | |||
868 | if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info) | ||
869 | return -EDRIVE_CANT_DO_THIS; | ||
870 | |||
865 | if (cgc->timeout <= 0) | 871 | if (cgc->timeout <= 0) |
866 | cgc->timeout = IOCTL_TIMEOUT; | 872 | cgc->timeout = IOCTL_TIMEOUT; |
867 | 873 | ||
868 | sr_do_ioctl(cdi->handle, cgc); | 874 | sr_do_ioctl(cd, cgc); |
869 | 875 | ||
870 | return cgc->stat; | 876 | return cgc->stat; |
871 | } | 877 | } |