6
6
* anything out of the ordinary is seen.
7
7
* ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8
8
*
9
- * Copyright (C) 2001 - 2016 Douglas Gilbert
9
+ * Copyright (C) 2001 - 2017 Douglas Gilbert
10
10
*
11
11
* This program is free software; you can redistribute it and/or modify
12
12
* it under the terms of the GNU General Public License as published by
61
61
#include "scsi_logging.h"
62
62
63
63
/* make sure inq_product_rev string corresponds to this version */
64
- #define SDEBUG_VERSION "1.86"
65
- static const char * sdebug_version_date = "20160430 " ;
64
+ #define SDEBUG_VERSION "0187" /* format to fit INQUIRY revision field */
65
+ static const char * sdebug_version_date = "20171202 " ;
66
66
67
67
#define MY_NAME "scsi_debug"
68
68
@@ -105,6 +105,7 @@ static const char *sdebug_version_date = "20160430";
105
105
* (id 0) containing 1 logical unit (lun 0). That is 1 device.
106
106
*/
107
107
#define DEF_ATO 1
108
+ #define DEF_CDB_LEN 10
108
109
#define DEF_JDELAY 1 /* if > 0 unit is a jiffy */
109
110
#define DEF_DEV_SIZE_MB 8
110
111
#define DEF_DIF 0
@@ -571,6 +572,7 @@ static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
571
572
572
573
static int sdebug_add_host = DEF_NUM_HOST ;
573
574
static int sdebug_ato = DEF_ATO ;
575
+ static int sdebug_cdb_len = DEF_CDB_LEN ;
574
576
static int sdebug_jdelay = DEF_JDELAY ; /* if > 0 then unit is jiffies */
575
577
static int sdebug_dev_size_mb = DEF_DEV_SIZE_MB ;
576
578
static int sdebug_dif = DEF_DIF ;
@@ -797,6 +799,61 @@ static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
797
799
/* return -ENOTTY; // correct return but upsets fdisk */
798
800
}
799
801
802
+ static void config_cdb_len (struct scsi_device * sdev )
803
+ {
804
+ switch (sdebug_cdb_len ) {
805
+ case 6 : /* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
806
+ sdev -> use_10_for_rw = false;
807
+ sdev -> use_16_for_rw = false;
808
+ sdev -> use_10_for_ms = false;
809
+ break ;
810
+ case 10 : /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
811
+ sdev -> use_10_for_rw = true;
812
+ sdev -> use_16_for_rw = false;
813
+ sdev -> use_10_for_ms = false;
814
+ break ;
815
+ case 12 : /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
816
+ sdev -> use_10_for_rw = true;
817
+ sdev -> use_16_for_rw = false;
818
+ sdev -> use_10_for_ms = true;
819
+ break ;
820
+ case 16 :
821
+ sdev -> use_10_for_rw = false;
822
+ sdev -> use_16_for_rw = true;
823
+ sdev -> use_10_for_ms = true;
824
+ break ;
825
+ case 32 : /* No knobs to suggest this so same as 16 for now */
826
+ sdev -> use_10_for_rw = false;
827
+ sdev -> use_16_for_rw = true;
828
+ sdev -> use_10_for_ms = true;
829
+ break ;
830
+ default :
831
+ pr_warn ("unexpected cdb_len=%d, force to 10\n" ,
832
+ sdebug_cdb_len );
833
+ sdev -> use_10_for_rw = true;
834
+ sdev -> use_16_for_rw = false;
835
+ sdev -> use_10_for_ms = false;
836
+ sdebug_cdb_len = 10 ;
837
+ break ;
838
+ }
839
+ }
840
+
841
+ static void all_config_cdb_len (void )
842
+ {
843
+ struct sdebug_host_info * sdbg_host ;
844
+ struct Scsi_Host * shost ;
845
+ struct scsi_device * sdev ;
846
+
847
+ spin_lock (& sdebug_host_list_lock );
848
+ list_for_each_entry (sdbg_host , & sdebug_host_list , host_list ) {
849
+ shost = sdbg_host -> shost ;
850
+ shost_for_each_device (sdev , shost ) {
851
+ config_cdb_len (sdev );
852
+ }
853
+ }
854
+ spin_unlock (& sdebug_host_list_lock );
855
+ }
856
+
800
857
static void clear_luns_changed_on_target (struct sdebug_dev_info * devip )
801
858
{
802
859
struct sdebug_host_info * sdhp ;
@@ -955,7 +1012,7 @@ static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
955
1012
956
1013
static char sdebug_inq_vendor_id [9 ] = "Linux " ;
957
1014
static char sdebug_inq_product_id [17 ] = "scsi_debug " ;
958
- static char sdebug_inq_product_rev [5 ] = "0186" ; /* version less '.' */
1015
+ static char sdebug_inq_product_rev [5 ] = SDEBUG_VERSION ;
959
1016
/* Use some locally assigned NAAs for SAS addresses. */
960
1017
static const u64 naa3_comp_a = 0x3222222000000000ULL ;
961
1018
static const u64 naa3_comp_b = 0x3333333000000000ULL ;
@@ -1411,6 +1468,8 @@ static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1411
1468
memcpy (& arr [8 ], sdebug_inq_vendor_id , 8 );
1412
1469
memcpy (& arr [16 ], sdebug_inq_product_id , 16 );
1413
1470
memcpy (& arr [32 ], sdebug_inq_product_rev , 4 );
1471
+ /* Use Vendor Specific area to place driver date in ASCII hex */
1472
+ memcpy (& arr [36 ], sdebug_version_date , 8 );
1414
1473
/* version descriptors (2 bytes each) follow */
1415
1474
put_unaligned_be16 (0xc0 , arr + 58 ); /* SAM-6 no version claimed */
1416
1475
put_unaligned_be16 (0x5c0 , arr + 60 ); /* SPC-5 no version claimed */
@@ -3660,6 +3719,7 @@ static int scsi_debug_slave_configure(struct scsi_device *sdp)
3660
3719
blk_queue_max_segment_size (sdp -> request_queue , -1U );
3661
3720
if (sdebug_no_uld )
3662
3721
sdp -> no_uld_attach = 1 ;
3722
+ config_cdb_len (sdp );
3663
3723
return 0 ;
3664
3724
}
3665
3725
@@ -4138,6 +4198,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
4138
4198
*/
4139
4199
module_param_named (add_host , sdebug_add_host , int , S_IRUGO | S_IWUSR );
4140
4200
module_param_named (ato , sdebug_ato , int , S_IRUGO );
4201
+ module_param_named (cdb_len , sdebug_cdb_len , int , 0644 );
4141
4202
module_param_named (clustering , sdebug_clustering , bool , S_IRUGO | S_IWUSR );
4142
4203
module_param_named (delay , sdebug_jdelay , int , S_IRUGO | S_IWUSR );
4143
4204
module_param_named (dev_size_mb , sdebug_dev_size_mb , int , S_IRUGO );
@@ -4195,6 +4256,7 @@ MODULE_VERSION(SDEBUG_VERSION);
4195
4256
4196
4257
MODULE_PARM_DESC (add_host , "0..127 hosts allowed(def=1)" );
4197
4258
MODULE_PARM_DESC (ato , "application tag ownership: 0=disk 1=host (def=1)" );
4259
+ MODULE_PARM_DESC (cdb_len , "suggest CDB lengths to drivers (def=10)" );
4198
4260
MODULE_PARM_DESC (clustering , "when set enables larger transfers (def=0)" );
4199
4261
MODULE_PARM_DESC (delay , "response delay (def=1 jiffy); 0:imm, -1,-2:tiny" );
4200
4262
MODULE_PARM_DESC (dev_size_mb , "size in MiB of ram shared by devs(def=8)" );
@@ -4207,7 +4269,8 @@ MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
4207
4269
MODULE_PARM_DESC (host_lock , "host_lock is ignored (def=0)" );
4208
4270
MODULE_PARM_DESC (inq_vendor , "SCSI INQUIRY vendor string (def=\"Linux\")" );
4209
4271
MODULE_PARM_DESC (inq_product , "SCSI INQUIRY product string (def=\"scsi_debug\")" );
4210
- MODULE_PARM_DESC (inq_rev , "SCSI INQUIRY revision string (def=\"0186\")" );
4272
+ MODULE_PARM_DESC (inq_rev , "SCSI INQUIRY revision string (def=\""
4273
+ SDEBUG_VERSION "\")" );
4211
4274
MODULE_PARM_DESC (lbpu , "enable LBP, support UNMAP command (def=0)" );
4212
4275
MODULE_PARM_DESC (lbpws , "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)" );
4213
4276
MODULE_PARM_DESC (lbpws10 , "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)" );
@@ -4881,6 +4944,24 @@ static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
4881
4944
}
4882
4945
static DRIVER_ATTR_RO (uuid_ctl );
4883
4946
4947
+ static ssize_t cdb_len_show (struct device_driver * ddp , char * buf )
4948
+ {
4949
+ return scnprintf (buf , PAGE_SIZE , "%d\n" , sdebug_cdb_len );
4950
+ }
4951
+ static ssize_t cdb_len_store (struct device_driver * ddp , const char * buf ,
4952
+ size_t count )
4953
+ {
4954
+ int ret , n ;
4955
+
4956
+ ret = kstrtoint (buf , 0 , & n );
4957
+ if (ret )
4958
+ return ret ;
4959
+ sdebug_cdb_len = n ;
4960
+ all_config_cdb_len ();
4961
+ return count ;
4962
+ }
4963
+ static DRIVER_ATTR_RW (cdb_len );
4964
+
4884
4965
4885
4966
/* Note: The following array creates attribute files in the
4886
4967
/sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
@@ -4920,6 +5001,7 @@ static struct attribute *sdebug_drv_attrs[] = {
4920
5001
& driver_attr_ndelay .attr ,
4921
5002
& driver_attr_strict .attr ,
4922
5003
& driver_attr_uuid_ctl .attr ,
5004
+ & driver_attr_cdb_len .attr ,
4923
5005
NULL ,
4924
5006
};
4925
5007
ATTRIBUTE_GROUPS (sdebug_drv );
0 commit comments