mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
scsi: sr: Have midlayer retry get_sectorsize() errors
This has get_sectorsize() have the SCSI midlayer retry errors instead of driving them itself. There is one behavior change where we no longer retry when scsi_execute_cmd() returns < 0, but we should be ok. We don't need to retry for failures like the queue being removed, and for the case where there are no tags/reqs the block layer waits/retries for us. For possible memory allocation failures from blk_rq_map_kern() we use GFP_NOIO, so retrying will probably not help. Signed-off-by: Mike Christie <michael.christie@oracle.com> Link: https://lore.kernel.org/r/20240123002220.129141-18-michael.christie@oracle.com Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
3a7b457932
commit
b72f2d149e
@ -717,27 +717,29 @@ static int sr_probe(struct device *dev)
|
||||
|
||||
static void get_sectorsize(struct scsi_cd *cd)
|
||||
{
|
||||
unsigned char cmd[10];
|
||||
unsigned char buffer[8];
|
||||
int the_result, retries = 3;
|
||||
static const u8 cmd[10] = { READ_CAPACITY };
|
||||
unsigned char buffer[8] = { };
|
||||
int the_result;
|
||||
int sector_size;
|
||||
struct request_queue *queue;
|
||||
struct scsi_failure failure_defs[] = {
|
||||
{
|
||||
.result = SCMD_FAILURE_RESULT_ANY,
|
||||
.allowed = 3,
|
||||
},
|
||||
{}
|
||||
};
|
||||
struct scsi_failures failures = {
|
||||
.failure_definitions = failure_defs,
|
||||
};
|
||||
const struct scsi_exec_args exec_args = {
|
||||
.failures = &failures,
|
||||
};
|
||||
|
||||
do {
|
||||
cmd[0] = READ_CAPACITY;
|
||||
memset((void *) &cmd[1], 0, 9);
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
|
||||
/* Do the command and wait.. */
|
||||
the_result = scsi_execute_cmd(cd->device, cmd, REQ_OP_DRV_IN,
|
||||
buffer, sizeof(buffer),
|
||||
SR_TIMEOUT, MAX_RETRIES, NULL);
|
||||
|
||||
retries--;
|
||||
|
||||
} while (the_result && retries);
|
||||
|
||||
|
||||
/* Do the command and wait.. */
|
||||
the_result = scsi_execute_cmd(cd->device, cmd, REQ_OP_DRV_IN, buffer,
|
||||
sizeof(buffer), SR_TIMEOUT, MAX_RETRIES,
|
||||
&exec_args);
|
||||
if (the_result) {
|
||||
cd->capacity = 0x1fffff;
|
||||
sector_size = 2048; /* A guess, just in case */
|
||||
|
Loading…
Reference in New Issue
Block a user