Message ID | 20230822181413.1210647-2-jmeneghi@redhat.com |
---|---|
State | New |
Headers | show |
Series | [1/2] scsi: tape: add third party poweron reset handling | expand |
> On 22. Aug 2023, at 21.14, John Meneghini <jmeneghi@redhat.com> wrote: > > Handle the unexpected condition where the tape drive reports > that tape is rewinding. > > ... > I'm providing this patch because I think it's valuable for testing > purposes and it should be safe. Any time the device unexpectedly > reports "Rewind is in progress", it should be safe to set > pos_unknown in the driver. > I am a bit hesitant about this, because it does not recognize if the rewind in progress was initiated by the user or not. In immediate mode (ST_NOWAIT option), a user rewind may be still in progress when a (impatient) user tries to do something else. One possibility would be to make this conditional on !STp->immediate. Another, perhaps better, method would be to use the STps->rw state variable. A new state ST_REWINDING could be introduced (or state should be set to ST_IDLE when rewinding). (Looking at the state, I think it should be set to something else than ST_WRITING more frequently. This could, in some cases prevent improper automatic writing of filemarks. See, for instance, the problem with failing rewinds in the report with PATCH 1/2.) Thanks, Kai > Tested-by: Laurence Oberman <loberman@redhat.com> > Signed-off-by: John Meneghini <jmeneghi@redhat.com> > --- > drivers/scsi/st.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c > index 338aa8c42968..b641490ed9d1 100644 > --- a/drivers/scsi/st.c > +++ b/drivers/scsi/st.c > @@ -416,6 +416,9 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt) > STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */ > if (cmdstatp->have_sense && scode == UNIT_ATTENTION && cmdstatp->sense_hdr.asc == 0x29) > STp->pos_unknown = 1; /* ASC => power on / reset */ > + if (cmdstatp->have_sense && cmdstatp->sense_hdr.asc == 0 > + && cmdstatp->sense_hdr.ascq == 0x1a) > + STp->pos_unknown = 1; /* ASCQ => rewind in progress */ > > STp->pos_unknown |= STp->device->was_reset; > > -- > 2.39.3 >
On 8/24/23 05:13, "Kai Mäkisara (Kolumbus)" wrote: > > >> On 22. Aug 2023, at 21.14, John Meneghini <jmeneghi@redhat.com> wrote: >> >> Handle the unexpected condition where the tape drive reports >> that tape is rewinding. >> >> ... >> I'm providing this patch because I think it's valuable for testing >> purposes and it should be safe. Any time the device unexpectedly >> reports "Rewind is in progress", it should be safe to set >> pos_unknown in the driver. >> > I am a bit hesitant about this, because it does not recognize if the rewind in > progress was initiated by the user or not. In immediate mode (ST_NOWAIT > option), a user rewind may be still in progress when a (impatient) user > tries to do something else. That's fine. We can drop this patch if you are uncomfortable with it. The real need it patch 1, which is and will affect customers using the AWS tape gateway. > One possibility would be to make this conditional on !STp->immediate. > > Another, perhaps better, method would be to use the STps->rw state > variable. A new state ST_REWINDING could be introduced (or state > should be set to ST_IDLE when rewinding). > > (Looking at the state, I think it should be set to something else than > ST_WRITING more frequently. This could, in some cases prevent > improper automatic writing of filemarks. See, for instance, the problem > with failing rewinds in the report with PATCH 1/2.) Agreed. This patch was only a improvised way to run the code I needed to test in patch 1/2. Let's leave this patch out. Thanks, /John
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 338aa8c42968..b641490ed9d1 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -416,6 +416,9 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt) STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */ if (cmdstatp->have_sense && scode == UNIT_ATTENTION && cmdstatp->sense_hdr.asc == 0x29) STp->pos_unknown = 1; /* ASC => power on / reset */ + if (cmdstatp->have_sense && cmdstatp->sense_hdr.asc == 0 + && cmdstatp->sense_hdr.ascq == 0x1a) + STp->pos_unknown = 1; /* ASCQ => rewind in progress */ STp->pos_unknown |= STp->device->was_reset;