@@ -163,9 +163,11 @@ static const char *st_formats[] = {
163
163
164
164
static int debugging = DEBUG ;
165
165
166
+ /* Setting these non-zero may risk recognizing resets */
166
167
#define MAX_RETRIES 0
167
168
#define MAX_WRITE_RETRIES 0
168
169
#define MAX_READY_RETRIES 0
170
+
169
171
#define NO_TAPE NOT_READY
170
172
171
173
#define ST_TIMEOUT (900 * HZ)
@@ -357,10 +359,18 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
357
359
{
358
360
int result = SRpnt -> result ;
359
361
u8 scode ;
362
+ unsigned int ctr ;
360
363
DEB (const char * stp ;)
361
364
char * name = STp -> name ;
362
365
struct st_cmdstatus * cmdstatp ;
363
366
367
+ ctr = scsi_get_ua_por_ctr (STp -> device );
368
+ if (ctr != STp -> por_ctr ) {
369
+ STp -> por_ctr = ctr ;
370
+ STp -> pos_unknown = 1 ; /* ASC => power on / reset */
371
+ st_printk (KERN_WARNING , STp , "Power on/reset recognized." );
372
+ }
373
+
364
374
if (!result )
365
375
return 0 ;
366
376
@@ -413,10 +423,11 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
413
423
if (cmdstatp -> have_sense &&
414
424
cmdstatp -> sense_hdr .asc == 0 && cmdstatp -> sense_hdr .ascq == 0x17 )
415
425
STp -> cleaning_req = 1 ; /* ASC and ASCQ => cleaning requested */
416
- if (cmdstatp -> have_sense && scode == UNIT_ATTENTION && cmdstatp -> sense_hdr .asc == 0x29 )
426
+ if (cmdstatp -> have_sense && scode == UNIT_ATTENTION &&
427
+ cmdstatp -> sense_hdr .asc == 0x29 && !STp -> pos_unknown ) {
417
428
STp -> pos_unknown = 1 ; /* ASC => power on / reset */
418
-
419
- STp -> pos_unknown |= STp -> device -> was_reset ;
429
+ st_printk ( KERN_WARNING , STp , "Power on/reset recognized." );
430
+ }
420
431
421
432
if (cmdstatp -> have_sense &&
422
433
scode == RECOVERED_ERROR
@@ -952,7 +963,6 @@ static void reset_state(struct scsi_tape *STp)
952
963
STp -> partition = find_partition (STp );
953
964
if (STp -> partition < 0 )
954
965
STp -> partition = 0 ;
955
- STp -> new_partition = STp -> partition ;
956
966
}
957
967
}
958
968
@@ -969,6 +979,7 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
969
979
{
970
980
int attentions , waits , max_wait , scode ;
971
981
int retval = CHKRES_READY , new_session = 0 ;
982
+ unsigned int ctr ;
972
983
unsigned char cmd [MAX_COMMAND_SIZE ];
973
984
struct st_request * SRpnt = NULL ;
974
985
struct st_cmdstatus * cmdstatp = & STp -> buffer -> cmdstat ;
@@ -1025,6 +1036,13 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
1025
1036
}
1026
1037
}
1027
1038
1039
+ ctr = scsi_get_ua_new_media_ctr (STp -> device );
1040
+ if (ctr != STp -> new_media_ctr ) {
1041
+ STp -> new_media_ctr = ctr ;
1042
+ new_session = 1 ;
1043
+ DEBC_printk (STp , "New tape session." );
1044
+ }
1045
+
1028
1046
retval = (STp -> buffer )-> syscall_result ;
1029
1047
if (!retval )
1030
1048
retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY ;
@@ -2930,14 +2948,17 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
2930
2948
if (cmd_in == MTSETDENSITY ) {
2931
2949
(STp -> buffer )-> b_data [4 ] = arg ;
2932
2950
STp -> density_changed = 1 ; /* At least we tried ;-) */
2951
+ STp -> changed_density = arg ;
2933
2952
} else if (cmd_in == SET_DENS_AND_BLK )
2934
2953
(STp -> buffer )-> b_data [4 ] = arg >> 24 ;
2935
2954
else
2936
2955
(STp -> buffer )-> b_data [4 ] = STp -> density ;
2937
2956
if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK ) {
2938
2957
ltmp = arg & MT_ST_BLKSIZE_MASK ;
2939
- if (cmd_in == MTSETBLK )
2958
+ if (cmd_in == MTSETBLK ) {
2940
2959
STp -> blksize_changed = 1 ; /* At least we tried ;-) */
2960
+ STp -> changed_blksize = arg ;
2961
+ }
2941
2962
} else
2942
2963
ltmp = STp -> block_size ;
2943
2964
(STp -> buffer )-> b_data [9 ] = (ltmp >> 16 );
@@ -3636,9 +3657,23 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
3636
3657
retval = (- EIO );
3637
3658
goto out ;
3638
3659
}
3639
- reset_state (STp );
3640
- /* remove this when the midlevel properly clears was_reset */
3641
- STp -> device -> was_reset = 0 ;
3660
+ reset_state (STp ); /* Clears pos_unknown */
3661
+
3662
+ /* Fix the device settings after reset, ignore errors */
3663
+ if (mtc .mt_op == MTREW || mtc .mt_op == MTSEEK ||
3664
+ mtc .mt_op == MTEOM ) {
3665
+ if (STp -> can_partitions ) {
3666
+ /* STp->new_partition contains the
3667
+ * latest partition set
3668
+ */
3669
+ STp -> partition = 0 ;
3670
+ switch_partition (STp );
3671
+ }
3672
+ if (STp -> density_changed )
3673
+ st_int_ioctl (STp , MTSETDENSITY , STp -> changed_density );
3674
+ if (STp -> blksize_changed )
3675
+ st_int_ioctl (STp , MTSETBLK , STp -> changed_blksize );
3676
+ }
3642
3677
}
3643
3678
3644
3679
if (mtc .mt_op != MTNOP && mtc .mt_op != MTSETBLK &&
@@ -4384,6 +4419,9 @@ static int st_probe(struct device *dev)
4384
4419
goto out_idr_remove ;
4385
4420
}
4386
4421
4422
+ tpnt -> new_media_ctr = scsi_get_ua_new_media_ctr (SDp );
4423
+ tpnt -> por_ctr = scsi_get_ua_por_ctr (SDp );
4424
+
4387
4425
dev_set_drvdata (dev , tpnt );
4388
4426
4389
4427
@@ -4665,6 +4703,24 @@ options_show(struct device *dev, struct device_attribute *attr, char *buf)
4665
4703
}
4666
4704
static DEVICE_ATTR_RO (options );
4667
4705
4706
+ /**
4707
+ * position_lost_in_reset_show - Value 1 indicates that reads, writes, etc.
4708
+ * are blocked because a device reset has occurred and no operation positioning
4709
+ * the tape has been issued.
4710
+ * @dev: struct device
4711
+ * @attr: attribute structure
4712
+ * @buf: buffer to return formatted data in
4713
+ */
4714
+ static ssize_t position_lost_in_reset_show (struct device * dev ,
4715
+ struct device_attribute * attr , char * buf )
4716
+ {
4717
+ struct st_modedef * STm = dev_get_drvdata (dev );
4718
+ struct scsi_tape * STp = STm -> tape ;
4719
+
4720
+ return sprintf (buf , "%d" , STp -> pos_unknown );
4721
+ }
4722
+ static DEVICE_ATTR_RO (position_lost_in_reset );
4723
+
4668
4724
/* Support for tape stats */
4669
4725
4670
4726
/**
@@ -4849,6 +4905,7 @@ static struct attribute *st_dev_attrs[] = {
4849
4905
& dev_attr_default_density .attr ,
4850
4906
& dev_attr_default_compression .attr ,
4851
4907
& dev_attr_options .attr ,
4908
+ & dev_attr_position_lost_in_reset .attr ,
4852
4909
NULL ,
4853
4910
};
4854
4911
0 commit comments