mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
scsi: st: Add MTIOCGET and MTLOAD to ioctls allowed after device reset
[ Upstream commit 0b120edb37dc9dd8ca82893d386922eb6b16f860 ] 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> Link: https://bugzilla.kernel.org/show_bug.cgi?id=219419#c14 Link: https://lore.kernel.org/r/20241106095723.63254-3-Kai.Makisara@kolumbus.fi Reviewed-by: John Meneghini <jmeneghi@redhat.com> Tested-by: John Meneghini <jmeneghi@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
910f9d2209
commit
5d552000fe
@ -3505,6 +3505,7 @@ static long st_ioctl_common(struct file *file, unsigned int cmd_in, void __user
|
||||
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;
|
||||
@ -3618,6 +3619,7 @@ static long st_ioctl_common(struct file *file, unsigned int cmd_in, void __user
|
||||
*/
|
||||
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 &&
|
||||
@ -3731,17 +3733,28 @@ static long st_ioctl_common(struct file *file, unsigned int cmd_in, void __user
|
||||
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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user