Message ID | 20241104112623.2675-3-Kai.Makisara@kolumbus.fi (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | scsi: st: Device reset patches | expand |
Reviewed-by: John Meneghini <jmeneghi@redhat.com> Tested-by: John Meneghini <jmeneghi@redhat.com> Looks great, please merge. On 11/4/24 06:26, Kai Mäkisara wrote: > Most drives rewind the tape when the device is reset. Reading > and writing are not allowed until something is done to make > the tape position match the user's expectation (e.g., > rewind the tape). Add MTIOCGET and MTLOAD to operations allowed > after reset. MTIOCGET is modified to not touch the tape if > pos_unknown is non-zero. The tape location is known after MTLOAD. > > Signed-off-by: Kai Mäkisara <Kai.Makisara@kolumbus.fi> > --- > drivers/scsi/st.c | 29 +++++++++++++++++++++-------- > 1 file changed, 21 insertions(+), 8 deletions(-) > > diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c > index 8d27e6caf027..c9038284bc89 100644 > --- a/drivers/scsi/st.c > +++ b/drivers/scsi/st.c > @@ -3506,6 +3506,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) > int i, cmd_nr, cmd_type, bt; > int retval = 0; > unsigned int blk; > + bool cmd_mtiocget; > struct scsi_tape *STp = file->private_data; > struct st_modedef *STm; > struct st_partstat *STps; > @@ -3619,6 +3620,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) > */ > if (mtc.mt_op != MTREW && > mtc.mt_op != MTOFFL && > + mtc.mt_op != MTLOAD && > mtc.mt_op != MTRETEN && > mtc.mt_op != MTERASE && > mtc.mt_op != MTSEEK && > @@ -3732,17 +3734,28 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) > goto out; > } > > + cmd_mtiocget = cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET); > + > if ((i = flush_buffer(STp, 0)) < 0) { > - retval = i; > - goto out; > - } > - if (STp->can_partitions && > - (i = switch_partition(STp)) < 0) { > - retval = i; > - goto out; > + if (cmd_mtiocget && STp->pos_unknown) { > + /* flush fails -> modify status accordingly */ > + reset_state(STp); > + STp->pos_unknown = 1; > + } else { /* return error */ > + retval = i; > + goto out; > + } > + } else { /* flush_buffer succeeds */ > + if (STp->can_partitions) { > + i = switch_partition(STp); > + if (i < 0) { > + retval = i; > + goto out; > + } > + } > } > > - if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) { > + if (cmd_mtiocget) { > struct mtget mt_status; > > if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 8d27e6caf027..c9038284bc89 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -3506,6 +3506,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) int i, cmd_nr, cmd_type, bt; int retval = 0; unsigned int blk; + bool cmd_mtiocget; struct scsi_tape *STp = file->private_data; struct st_modedef *STm; struct st_partstat *STps; @@ -3619,6 +3620,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) */ if (mtc.mt_op != MTREW && mtc.mt_op != MTOFFL && + mtc.mt_op != MTLOAD && mtc.mt_op != MTRETEN && mtc.mt_op != MTERASE && mtc.mt_op != MTSEEK && @@ -3732,17 +3734,28 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) goto out; } + cmd_mtiocget = cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET); + if ((i = flush_buffer(STp, 0)) < 0) { - retval = i; - goto out; - } - if (STp->can_partitions && - (i = switch_partition(STp)) < 0) { - retval = i; - goto out; + if (cmd_mtiocget && STp->pos_unknown) { + /* flush fails -> modify status accordingly */ + reset_state(STp); + STp->pos_unknown = 1; + } else { /* return error */ + retval = i; + goto out; + } + } else { /* flush_buffer succeeds */ + if (STp->can_partitions) { + i = switch_partition(STp); + if (i < 0) { + retval = i; + goto out; + } + } } - if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) { + if (cmd_mtiocget) { struct mtget mt_status; if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
Most drives rewind the tape when the device is reset. Reading and writing are not allowed until something is done to make the tape position match the user's expectation (e.g., rewind the tape). Add MTIOCGET and MTLOAD to operations allowed after reset. MTIOCGET is modified to not touch the tape if pos_unknown is non-zero. The tape location is known after MTLOAD. Signed-off-by: Kai Mäkisara <Kai.Makisara@kolumbus.fi> --- drivers/scsi/st.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)