@@ -902,6 +902,8 @@ static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
902
902
static int submit_queues = DEF_SUBMIT_QUEUES ; /* > 1 for multi-queue (mq) */
903
903
static int poll_queues ; /* iouring iopoll interface.*/
904
904
905
+ static atomic_long_t writes_by_group_number [64 ];
906
+
905
907
static char sdebug_proc_name [] = MY_NAME ;
906
908
static const char * my_name = MY_NAME ;
907
909
@@ -3377,7 +3379,8 @@ static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip,
3377
3379
3378
3380
/* Returns number of bytes copied or -1 if error. */
3379
3381
static int do_device_access (struct sdeb_store_info * sip , struct scsi_cmnd * scp ,
3380
- u32 sg_skip , u64 lba , u32 num , bool do_write )
3382
+ u32 sg_skip , u64 lba , u32 num , bool do_write ,
3383
+ u8 group_number )
3381
3384
{
3382
3385
int ret ;
3383
3386
u64 block , rest = 0 ;
@@ -3396,6 +3399,10 @@ static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
3396
3399
return 0 ;
3397
3400
if (scp -> sc_data_direction != dir )
3398
3401
return -1 ;
3402
+
3403
+ if (do_write && group_number < ARRAY_SIZE (writes_by_group_number ))
3404
+ atomic_long_inc (& writes_by_group_number [group_number ]);
3405
+
3399
3406
fsp = sip -> storep ;
3400
3407
3401
3408
block = do_div (lba , sdebug_store_sectors );
@@ -3769,7 +3776,7 @@ static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3769
3776
}
3770
3777
}
3771
3778
3772
- ret = do_device_access (sip , scp , 0 , lba , num , false);
3779
+ ret = do_device_access (sip , scp , 0 , lba , num , false, 0 );
3773
3780
sdeb_read_unlock (sip );
3774
3781
if (unlikely (ret == -1 ))
3775
3782
return DID_ERROR << 16 ;
@@ -3954,6 +3961,7 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3954
3961
{
3955
3962
bool check_prot ;
3956
3963
u32 num ;
3964
+ u8 group = 0 ;
3957
3965
u32 ei_lba ;
3958
3966
int ret ;
3959
3967
u64 lba ;
@@ -3965,11 +3973,13 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3965
3973
ei_lba = 0 ;
3966
3974
lba = get_unaligned_be64 (cmd + 2 );
3967
3975
num = get_unaligned_be32 (cmd + 10 );
3976
+ group = cmd [14 ] & 0x3f ;
3968
3977
check_prot = true;
3969
3978
break ;
3970
3979
case WRITE_10 :
3971
3980
ei_lba = 0 ;
3972
3981
lba = get_unaligned_be32 (cmd + 2 );
3982
+ group = cmd [6 ] & 0x3f ;
3973
3983
num = get_unaligned_be16 (cmd + 7 );
3974
3984
check_prot = true;
3975
3985
break ;
@@ -3984,15 +3994,18 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3984
3994
ei_lba = 0 ;
3985
3995
lba = get_unaligned_be32 (cmd + 2 );
3986
3996
num = get_unaligned_be32 (cmd + 6 );
3997
+ group = cmd [6 ] & 0x3f ;
3987
3998
check_prot = true;
3988
3999
break ;
3989
4000
case 0x53 : /* XDWRITEREAD(10) */
3990
4001
ei_lba = 0 ;
3991
4002
lba = get_unaligned_be32 (cmd + 2 );
4003
+ group = cmd [6 ] & 0x1f ;
3992
4004
num = get_unaligned_be16 (cmd + 7 );
3993
4005
check_prot = false;
3994
4006
break ;
3995
4007
default : /* assume WRITE(32) */
4008
+ group = cmd [6 ] & 0x3f ;
3996
4009
lba = get_unaligned_be64 (cmd + 12 );
3997
4010
ei_lba = get_unaligned_be32 (cmd + 20 );
3998
4011
num = get_unaligned_be32 (cmd + 28 );
@@ -4047,7 +4060,7 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4047
4060
}
4048
4061
}
4049
4062
4050
- ret = do_device_access (sip , scp , 0 , lba , num , true);
4063
+ ret = do_device_access (sip , scp , 0 , lba , num , true, group );
4051
4064
if (unlikely (scsi_debug_lbp ()))
4052
4065
map_region (sip , lba , num );
4053
4066
/* If ZBC zone then bump its write pointer */
@@ -4099,12 +4112,14 @@ static int resp_write_scat(struct scsi_cmnd *scp,
4099
4112
u32 lb_size = sdebug_sector_size ;
4100
4113
u32 ei_lba ;
4101
4114
u64 lba ;
4115
+ u8 group ;
4102
4116
int ret , res ;
4103
4117
bool is_16 ;
4104
4118
static const u32 lrd_size = 32 ; /* + parameter list header size */
4105
4119
4106
4120
if (cmd [0 ] == VARIABLE_LENGTH_CMD ) {
4107
4121
is_16 = false;
4122
+ group = cmd [6 ] & 0x3f ;
4108
4123
wrprotect = (cmd [10 ] >> 5 ) & 0x7 ;
4109
4124
lbdof = get_unaligned_be16 (cmd + 12 );
4110
4125
num_lrd = get_unaligned_be16 (cmd + 16 );
@@ -4115,6 +4130,7 @@ static int resp_write_scat(struct scsi_cmnd *scp,
4115
4130
lbdof = get_unaligned_be16 (cmd + 4 );
4116
4131
num_lrd = get_unaligned_be16 (cmd + 8 );
4117
4132
bt_len = get_unaligned_be32 (cmd + 10 );
4133
+ group = cmd [14 ] & 0x3f ;
4118
4134
if (unlikely (have_dif_prot )) {
4119
4135
if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
4120
4136
wrprotect ) {
@@ -4203,7 +4219,7 @@ static int resp_write_scat(struct scsi_cmnd *scp,
4203
4219
}
4204
4220
}
4205
4221
4206
- ret = do_device_access (sip , scp , sg_off , lba , num , true);
4222
+ ret = do_device_access (sip , scp , sg_off , lba , num , true, group );
4207
4223
/* If ZBC zone then bump its write pointer */
4208
4224
if (sdebug_dev_is_zoned (devip ))
4209
4225
zbc_inc_wp (devip , lba , num );
@@ -7298,6 +7314,30 @@ static ssize_t tur_ms_to_ready_show(struct device_driver *ddp, char *buf)
7298
7314
}
7299
7315
static DRIVER_ATTR_RO (tur_ms_to_ready );
7300
7316
7317
+ static ssize_t group_number_stats_show (struct device_driver * ddp , char * buf )
7318
+ {
7319
+ char * p = buf , * end = buf + PAGE_SIZE ;
7320
+ int i ;
7321
+
7322
+ for (i = 0 ; i < ARRAY_SIZE (writes_by_group_number ); i ++ )
7323
+ p += scnprintf (p , end - p , "%d %ld\n" , i ,
7324
+ atomic_long_read (& writes_by_group_number [i ]));
7325
+
7326
+ return p - buf ;
7327
+ }
7328
+
7329
+ static ssize_t group_number_stats_store (struct device_driver * ddp ,
7330
+ const char * buf , size_t count )
7331
+ {
7332
+ int i ;
7333
+
7334
+ for (i = 0 ; i < ARRAY_SIZE (writes_by_group_number ); i ++ )
7335
+ atomic_long_set (& writes_by_group_number [i ], 0 );
7336
+
7337
+ return count ;
7338
+ }
7339
+ static DRIVER_ATTR_RW (group_number_stats );
7340
+
7301
7341
/* Note: The following array creates attribute files in the
7302
7342
/sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
7303
7343
files (over those found in the /sys/module/scsi_debug/parameters
@@ -7344,6 +7384,7 @@ static struct attribute *sdebug_drv_attrs[] = {
7344
7384
& driver_attr_cdb_len .attr ,
7345
7385
& driver_attr_tur_ms_to_ready .attr ,
7346
7386
& driver_attr_zbc .attr ,
7387
+ & driver_attr_group_number_stats .attr ,
7347
7388
NULL ,
7348
7389
};
7349
7390
ATTRIBUTE_GROUPS (sdebug_drv );
0 commit comments