diff mbox series

scsi: st: Fix input/output error on empty drive reset

Message ID 20240905173921.10944-1-rrochavi@fnal.gov
State New
Headers show
Series scsi: st: Fix input/output error on empty drive reset | expand

Commit Message

Rafael Rocha Sept. 5, 2024, 5:39 p.m. UTC
A previous change was introduced to prevent data loss during a power-on reset
when a tape is present inside the drive. This change set the "pos_unknown" flag
to true to avoid operations that could compromise data by performing actions
from an untracked position. The relevant commit is:

Commit: 9604eea5bd3ae1fa3c098294f4fc29ad687141ea
Subject: scsi: st: Add third-party power-on reset handling

As a consequence of this change, a new issue has surfaced: the driver now
returns an "Input/output error" even for empty drives when the drive, host, or
bus is reset. This issue stems from the "flush_buffer" function, which first
checks whether the "pos_unknown" flag is set. If the flag is set, the user will
encounter an "Input/output error" until the tape position is known again. This
behavior differs from the previous implementation, where empty drives were not
affected at system start up time, allowing tape software to send commands to
the driver to retrieve the drive's status and other information.

The current behavior prioritizes the "pos_unknown" flag over the "ST_NO_TAPE"
status, leading to issues for software that detects drives during system
startup. This software will receive an "Input/output error" until a tape is
loaded and its position is known.

To resolve this, the "ST_NO_TAPE" status should take priority when the drive is
empty, allowing communication with the drive following a power-on reset. At the
same time, the change should continue to protect data by maintaining the
"pos_unknown" flag when the drive contains a tape and its position is unknown.

Signed-off-by: Rafael Rocha <rrochavi@fnal.gov>
---
 drivers/scsi/st.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Martin K. Petersen Sept. 13, 2024, 12:08 a.m. UTC | #1
Rafael,

> To resolve this, the "ST_NO_TAPE" status should take priority when the
> drive is empty, allowing communication with the drive following a
> power-on reset. At the same time, the change should continue to
> protect data by maintaining the "pos_unknown" flag when the drive
> contains a tape and its position is unknown.

Applied to 6.12/scsi-staging, thanks!
Martin K. Petersen Sept. 19, 2024, 3:53 p.m. UTC | #2
On Thu, 05 Sep 2024 12:39:21 -0500, Rafael Rocha wrote:

> A previous change was introduced to prevent data loss during a power-on reset
> when a tape is present inside the drive. This change set the "pos_unknown" flag
> to true to avoid operations that could compromise data by performing actions
> from an untracked position. The relevant commit is:
> 
> Commit: 9604eea5bd3ae1fa3c098294f4fc29ad687141ea
> Subject: scsi: st: Add third-party power-on reset handling
> 
> [...]

Applied to 6.12/scsi-queue, thanks!

[1/1] scsi: st: Fix input/output error on empty drive reset
      https://git.kernel.org/mkp/scsi/c/3d882cca73be
diff mbox series

Patch

diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 0d8ce1a92168..be881d5bac05 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -834,6 +834,9 @@  static int flush_buffer(struct scsi_tape *STp, int seek_next)
 	int backspace, result;
 	struct st_partstat *STps;
 
+        if (STp->ready != ST_READY)
+                return 0;
+
 	/*
 	 * If there was a bus reset, block further access
 	 * to this device.
@@ -841,8 +844,6 @@  static int flush_buffer(struct scsi_tape *STp, int seek_next)
 	if (STp->pos_unknown)
 		return (-EIO);
 
-	if (STp->ready != ST_READY)
-		return 0;
 	STps = &(STp->ps[STp->partition]);
 	if (STps->rw == ST_WRITING)	/* Writing */
 		return st_flush_write_buffer(STp);