Commit 98b37881 authored by Kai Mäkisara's avatar Kai Mäkisara Committed by Martin K. Petersen
Browse files

scsi: st: Don't set pos_unknown just after device recognition



Commit 9604eea5 ("scsi: st: Add third party poweron reset handling") in
v6.6 added new code to handle the Power On/Reset Unit Attention (POR UA)
sense data. This was in addition to the existing method. When this Unit
Attention is received, the driver blocks attempts to read, write and some
other operations because the reset may have rewinded the tape. Because of
the added code, also the initial POR UA resulted in blocking operations,
including those that are used to set the driver options after the device is
recognized. Also, reading and writing are refused, whereas they succeeded
before this commit.

Add code to not set pos_unknown to block operations if the POR UA is
received from the first test_ready() call after the st device has been
created. This restores the behavior before v6.6.

Signed-off-by: default avatarKai Mäkisara <Kai.Makisara@kolumbus.fi>
Link: https://lore.kernel.org/r/20241216113755.30415-1-Kai.Makisara@kolumbus.fi
Fixes: 9604eea5 ("scsi: st: Add third party poweron reset handling")
CC: stable@vger.kernel.org
Closes: https://lore.kernel.org/linux-scsi/2201CF73-4795-4D3B-9A79-6EE5215CF58D@kolumbus.fi/


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 77a4157a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1030,6 +1030,11 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
			retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY;
		break;
	}
	if (STp->first_tur) {
		/* Don't set pos_unknown right after device recognition */
		STp->pos_unknown = 0;
		STp->first_tur = 0;
	}

	if (SRpnt != NULL)
		st_release_request(SRpnt);
@@ -4328,6 +4333,7 @@ static int st_probe(struct device *dev)
	blk_queue_rq_timeout(tpnt->device->request_queue, ST_TIMEOUT);
	tpnt->long_timeout = ST_LONG_TIMEOUT;
	tpnt->try_dio = try_direct_io;
	tpnt->first_tur = 1;

	for (i = 0; i < ST_NBR_MODES; i++) {
		STm = &(tpnt->modes[i]);
+1 −0
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ struct scsi_tape {
	unsigned char rew_at_close;  /* rewind necessary at close */
	unsigned char inited;
	unsigned char cleaning_req;  /* cleaning requested? */
	unsigned char first_tur;     /* first TEST UNIT READY */
	int block_size;
	int min_block;
	int max_block;