Message ID | 20240604144501.3862738-1-martin.petersen@oracle.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | scsi: sd: Use READ(16) when reading block zero on large capacity disks | expand |
On 6/4/24 08:45, Martin K. Petersen wrote: > static void sd_read_block_zero(struct scsi_disk *sdkp) > { > - unsigned int buf_len = sdkp->device->sector_size; > - char *buffer, cmd[10] = { }; > + struct scsi_device *sdev = sdkp->device; > + unsigned int buf_len = sdev->sector_size; > + char *buffer, cmd[16] = { }; Maybe this is a good opportunity to change 'char' into 'u8'? It seems a bit unusual to me to use signed char for a SCSI CDB and a data buffer. Otherwise this patch looks good to me. Thanks, Bart.
Hi Bart! > Maybe this is a good opportunity to change 'char' into 'u8'? It seems > a bit unusual to me to use signed char for a SCSI CDB and a data > buffer. It's not signed (-funsigned-char) but I can change it to u8. Martin
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 65cdc8b77e35..6759bd5af58a 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -3572,16 +3572,23 @@ static bool sd_validate_opt_xfer_size(struct scsi_disk *sdkp, static void sd_read_block_zero(struct scsi_disk *sdkp) { - unsigned int buf_len = sdkp->device->sector_size; - char *buffer, cmd[10] = { }; + struct scsi_device *sdev = sdkp->device; + unsigned int buf_len = sdev->sector_size; + char *buffer, cmd[16] = { }; buffer = kmalloc(buf_len, GFP_KERNEL); if (!buffer) return; - cmd[0] = READ_10; - put_unaligned_be32(0, &cmd[2]); /* Logical block address 0 */ - put_unaligned_be16(1, &cmd[7]); /* Transfer 1 logical block */ + if (sdev->use_16_for_rw) { + cmd[0] = READ_16; + put_unaligned_be64(0, &cmd[2]); /* Logical block address 0 */ + put_unaligned_be32(1, &cmd[10]);/* Transfer 1 logical block */ + } else { + cmd[0] = READ_10; + put_unaligned_be32(0, &cmd[2]); /* Logical block address 0 */ + put_unaligned_be16(1, &cmd[7]); /* Transfer 1 logical block */ + } scsi_execute_cmd(sdkp->device, cmd, REQ_OP_DRV_IN, buffer, buf_len, SD_TIMEOUT, sdkp->max_retries, NULL);