Linux Audio

Check our new training course

Loading...
v3.1
 
   1/*
   2 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
   3 *  Copyright (C) 1992  Eric Youngdale
   4 *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
   5 *  to make sure that we are not getting blocks mixed up, and PANIC if
   6 *  anything out of the ordinary is seen.
   7 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   8 *
   9 *  This version is more generic, simulating a variable number of disk
  10 *  (or disk like devices) sharing a common amount of RAM. To be more
  11 *  realistic, the simulated devices have the transport attributes of
  12 *  SAS disks.
  13 *
  14 *
  15 *  For documentation see http://sg.danny.cz/sg/sdebug26.html
  16 *
  17 *   D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
  18 *   dpg: work for devfs large number of disks [20010809]
  19 *        forked for lk 2.5 series [20011216, 20020101]
  20 *        use vmalloc() more inquiry+mode_sense [20020302]
  21 *        add timers for delayed responses [20020721]
  22 *   Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
  23 *   Mike Anderson <andmike@us.ibm.com> sysfs work [20021118]
  24 *   dpg: change style of boot options to "scsi_debug.num_tgts=2" and
  25 *        module options to "modprobe scsi_debug num_tgts=2" [20021221]
  26 */
  27
  28#include <linux/module.h>
  29
 
 
 
 
  30#include <linux/kernel.h>
  31#include <linux/errno.h>
  32#include <linux/timer.h>
  33#include <linux/slab.h>
  34#include <linux/types.h>
  35#include <linux/string.h>
  36#include <linux/genhd.h>
  37#include <linux/fs.h>
  38#include <linux/init.h>
  39#include <linux/proc_fs.h>
  40#include <linux/vmalloc.h>
  41#include <linux/moduleparam.h>
  42#include <linux/scatterlist.h>
  43#include <linux/blkdev.h>
  44#include <linux/crc-t10dif.h>
 
 
 
 
 
 
 
 
 
 
  45
  46#include <net/checksum.h>
  47
  48#include <asm/unaligned.h>
  49
  50#include <scsi/scsi.h>
  51#include <scsi/scsi_cmnd.h>
  52#include <scsi/scsi_device.h>
  53#include <scsi/scsi_host.h>
  54#include <scsi/scsicam.h>
  55#include <scsi/scsi_eh.h>
 
  56#include <scsi/scsi_dbg.h>
  57
  58#include "sd.h"
  59#include "scsi_logging.h"
  60
  61#define SCSI_DEBUG_VERSION "1.82"
  62static const char * scsi_debug_version_date = "20100324";
 
 
 
  63
  64/* Additional Sense Code (ASC) */
  65#define NO_ADDITIONAL_SENSE 0x0
  66#define LOGICAL_UNIT_NOT_READY 0x4
 
  67#define UNRECOVERED_READ_ERR 0x11
  68#define PARAMETER_LIST_LENGTH_ERR 0x1a
  69#define INVALID_OPCODE 0x20
  70#define ADDR_OUT_OF_RANGE 0x21
  71#define INVALID_COMMAND_OPCODE 0x20
  72#define INVALID_FIELD_IN_CDB 0x24
  73#define INVALID_FIELD_IN_PARAM_LIST 0x26
  74#define POWERON_RESET 0x29
 
 
 
 
 
 
 
 
 
 
 
  75#define SAVING_PARAMS_UNSUP 0x39
  76#define TRANSPORT_PROBLEM 0x4b
  77#define THRESHOLD_EXCEEDED 0x5d
  78#define LOW_POWER_COND_ON 0x5e
 
 
 
 
 
 
 
 
 
 
  79
  80/* Additional Sense Code Qualifier (ASCQ) */
  81#define ACK_NAK_TO 0x3
  82
  83#define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
  84
  85/* Default values for driver parameters */
  86#define DEF_NUM_HOST   1
  87#define DEF_NUM_TGTS   1
  88#define DEF_MAX_LUNS   1
  89/* With these defaults, this driver will make 1 host with 1 target
  90 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
  91 */
  92#define DEF_ATO 1
  93#define DEF_DELAY   1
 
 
  94#define DEF_DEV_SIZE_MB   8
 
  95#define DEF_DIF 0
  96#define DEF_DIX 0
 
  97#define DEF_D_SENSE   0
  98#define DEF_EVERY_NTH   0
  99#define DEF_FAKE_RW	0
 100#define DEF_GUARD 0
 
 101#define DEF_LBPU 0
 102#define DEF_LBPWS 0
 103#define DEF_LBPWS10 0
 
 104#define DEF_LOWEST_ALIGNED 0
 
 105#define DEF_NO_LUN_0   0
 106#define DEF_NUM_PARTS   0
 107#define DEF_OPTS   0
 108#define DEF_OPT_BLKS 64
 109#define DEF_PHYSBLK_EXP 0
 110#define DEF_PTYPE   0
 111#define DEF_SCSI_LEVEL   5    /* INQUIRY, byte2 [5->SPC-3] */
 
 
 
 112#define DEF_SECTOR_SIZE 512
 113#define DEF_UNMAP_ALIGNMENT 0
 114#define DEF_UNMAP_GRANULARITY 1
 115#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
 116#define DEF_UNMAP_MAX_DESC 256
 117#define DEF_VIRTUAL_GB   0
 118#define DEF_VPD_USE_HOSTNO 1
 119#define DEF_WRITESAME_LENGTH 0xFFFF
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 120
 121/* bit mask values for scsi_debug_opts */
 122#define SCSI_DEBUG_OPT_NOISE   1
 123#define SCSI_DEBUG_OPT_MEDIUM_ERR   2
 124#define SCSI_DEBUG_OPT_TIMEOUT   4
 125#define SCSI_DEBUG_OPT_RECOVERED_ERR   8
 126#define SCSI_DEBUG_OPT_TRANSPORT_ERR   16
 127#define SCSI_DEBUG_OPT_DIF_ERR   32
 128#define SCSI_DEBUG_OPT_DIX_ERR   64
 129/* When "every_nth" > 0 then modulo "every_nth" commands:
 130 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
 131 *   - a RECOVERED_ERROR is simulated on successful read and write
 132 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
 133 *   - a TRANSPORT_ERROR is simulated on successful read and write
 134 *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
 135 *
 136 * When "every_nth" < 0 then after "- every_nth" commands:
 137 *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
 138 *   - a RECOVERED_ERROR is simulated on successful read and write
 139 *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
 140 *   - a TRANSPORT_ERROR is simulated on successful read and write
 141 *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
 142 * This will continue until some other action occurs (e.g. the user
 143 * writing a new value (other than -1 or 1) to every_nth via sysfs).
 144 */
 145
 146/* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 147 * sector on read commands: */
 148#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 149#define OPT_MEDIUM_ERR_NUM    10     /* number of consecutive medium errs */
 150
 151/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
 152 * or "peripheral device" addressing (value 0) */
 153#define SAM2_LUN_ADDRESS_METHOD 0
 154#define SAM2_WLUN_REPORT_LUNS 0xc101
 155
 156/* Can queue up to this number of commands. Typically commands that
 157 * that have a non-zero delay are queued. */
 158#define SCSI_DEBUG_CANQUEUE  255
 159
 160static int scsi_debug_add_host = DEF_NUM_HOST;
 161static int scsi_debug_ato = DEF_ATO;
 162static int scsi_debug_delay = DEF_DELAY;
 163static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
 164static int scsi_debug_dif = DEF_DIF;
 165static int scsi_debug_dix = DEF_DIX;
 166static int scsi_debug_dsense = DEF_D_SENSE;
 167static int scsi_debug_every_nth = DEF_EVERY_NTH;
 168static int scsi_debug_fake_rw = DEF_FAKE_RW;
 169static int scsi_debug_guard = DEF_GUARD;
 170static int scsi_debug_lowest_aligned = DEF_LOWEST_ALIGNED;
 171static int scsi_debug_max_luns = DEF_MAX_LUNS;
 172static int scsi_debug_max_queue = SCSI_DEBUG_CANQUEUE;
 173static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
 174static int scsi_debug_no_uld = 0;
 175static int scsi_debug_num_parts = DEF_NUM_PARTS;
 176static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 177static int scsi_debug_opt_blks = DEF_OPT_BLKS;
 178static int scsi_debug_opts = DEF_OPTS;
 179static int scsi_debug_physblk_exp = DEF_PHYSBLK_EXP;
 180static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
 181static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
 182static int scsi_debug_sector_size = DEF_SECTOR_SIZE;
 183static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
 184static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 185static unsigned int scsi_debug_lbpu = DEF_LBPU;
 186static unsigned int scsi_debug_lbpws = DEF_LBPWS;
 187static unsigned int scsi_debug_lbpws10 = DEF_LBPWS10;
 188static unsigned int scsi_debug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 189static unsigned int scsi_debug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 190static unsigned int scsi_debug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 191static unsigned int scsi_debug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 192static unsigned int scsi_debug_write_same_length = DEF_WRITESAME_LENGTH;
 193
 194static int scsi_debug_cmnd_count = 0;
 195
 196#define DEV_READONLY(TGT)      (0)
 197#define DEV_REMOVEABLE(TGT)    (0)
 198
 199static unsigned int sdebug_store_sectors;
 200static sector_t sdebug_capacity;	/* in sectors */
 201
 202/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 203   may still need them */
 204static int sdebug_heads;		/* heads per disk */
 205static int sdebug_cylinders_per;	/* cylinders per surface */
 206static int sdebug_sectors_per;		/* sectors per cylinder */
 207
 208#define SDEBUG_MAX_PARTS 4
 209
 210#define SDEBUG_SENSE_LEN 32
 
 
 
 
 
 
 
 211
 212#define SCSI_DEBUG_MAX_CMD_LEN 32
 
 
 
 
 
 
 
 
 
 
 213
 214static unsigned int scsi_debug_lbp(void)
 215{
 216	return scsi_debug_lbpu | scsi_debug_lbpws | scsi_debug_lbpws10;
 217}
 
 
 
 
 218
 219struct sdebug_dev_info {
 220	struct list_head dev_list;
 221	unsigned char sense_buff[SDEBUG_SENSE_LEN];	/* weak nexus */
 222	unsigned int channel;
 223	unsigned int target;
 224	unsigned int lun;
 
 225	struct sdebug_host_info *sdbg_host;
 226	unsigned int wlun;
 227	char reset;
 228	char stopped;
 229	char used;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 230};
 231
 232struct sdebug_host_info {
 233	struct list_head host_list;
 
 234	struct Scsi_Host *shost;
 235	struct device dev;
 236	struct list_head dev_info_list;
 237};
 238
 
 
 
 
 
 
 
 
 239#define to_sdebug_host(d)	\
 240	container_of(d, struct sdebug_host_info, dev)
 241
 242static LIST_HEAD(sdebug_host_list);
 243static DEFINE_SPINLOCK(sdebug_host_list_lock);
 244
 245typedef void (* done_funct_t) (struct scsi_cmnd *);
 
 
 
 
 
 
 
 
 
 
 
 
 
 246
 247struct sdebug_queued_cmd {
 248	int in_use;
 249	struct timer_list cmnd_timer;
 250	done_funct_t done_funct;
 251	struct scsi_cmnd * a_cmnd;
 252	int scsi_result;
 253};
 254static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
 255
 256static unsigned char * fake_storep;	/* ramdisk storage */
 257static unsigned char *dif_storep;	/* protection info */
 258static void *map_storep;		/* provisioning map */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 259
 260static unsigned long map_size;
 261static int num_aborts = 0;
 262static int num_dev_resets = 0;
 263static int num_bus_resets = 0;
 264static int num_host_resets = 0;
 
 265static int dix_writes;
 266static int dix_reads;
 267static int dif_errors;
 268
 269static DEFINE_SPINLOCK(queued_arr_lock);
 
 
 
 
 
 
 
 
 
 
 270static DEFINE_RWLOCK(atomic_rw);
 
 271
 272static char sdebug_proc_name[] = "scsi_debug";
 273
 274static struct bus_type pseudo_lld_bus;
 
 275
 276static inline sector_t dif_offset(sector_t sector)
 277{
 278	return sector << 3;
 279}
 280
 281static struct device_driver sdebug_driverfs_driver = {
 282	.name 		= sdebug_proc_name,
 283	.bus		= &pseudo_lld_bus,
 284};
 285
 286static const int check_condition_result =
 287		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 288
 289static const int illegal_condition_result =
 290	(DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 291
 292static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
 293				    0, 0, 0x2, 0x4b};
 294static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
 295			           0, 0, 0x0, 0x0};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 296
 297static int sdebug_add_adapter(void);
 298static void sdebug_remove_adapter(void);
 299
 300static void sdebug_max_tgts_luns(void)
 301{
 302	struct sdebug_host_info *sdbg_host;
 303	struct Scsi_Host *hpnt;
 304
 305	spin_lock(&sdebug_host_list_lock);
 306	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 307		hpnt = sdbg_host->shost;
 308		if ((hpnt->this_id >= 0) &&
 309		    (scsi_debug_num_tgts > hpnt->this_id))
 310			hpnt->max_id = scsi_debug_num_tgts + 1;
 311		else
 312			hpnt->max_id = scsi_debug_num_tgts;
 313		/* scsi_debug_max_luns; */
 314		hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
 315	}
 316	spin_unlock(&sdebug_host_list_lock);
 317}
 318
 319static void mk_sense_buffer(struct sdebug_dev_info *devip, int key,
 320			    int asc, int asq)
 
 
 
 
 321{
 322	unsigned char *sbuff;
 
 
 323
 324	sbuff = devip->sense_buff;
 325	memset(sbuff, 0, SDEBUG_SENSE_LEN);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 326
 327	scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
 328
 329	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 330		printk(KERN_INFO "scsi_debug:    [sense_key,asc,ascq]: "
 331		      "[0x%x,0x%x,0x%x]\n", key, asc, asq);
 
 332}
 333
 334static void get_data_transfer_info(unsigned char *cmd,
 335				   unsigned long long *lba, unsigned int *num,
 336				   u32 *ei_lba)
 337{
 338	*ei_lba = 0;
 339
 340	switch (*cmd) {
 341	case VARIABLE_LENGTH_CMD:
 342		*lba = (u64)cmd[19] | (u64)cmd[18] << 8 |
 343			(u64)cmd[17] << 16 | (u64)cmd[16] << 24 |
 344			(u64)cmd[15] << 32 | (u64)cmd[14] << 40 |
 345			(u64)cmd[13] << 48 | (u64)cmd[12] << 56;
 346
 347		*ei_lba = (u32)cmd[23] | (u32)cmd[22] << 8 |
 348			(u32)cmd[21] << 16 | (u32)cmd[20] << 24;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 349
 350		*num = (u32)cmd[31] | (u32)cmd[30] << 8 | (u32)cmd[29] << 16 |
 351			(u32)cmd[28] << 24;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 352		break;
 353
 354	case WRITE_SAME_16:
 355	case WRITE_16:
 356	case READ_16:
 357		*lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
 358			(u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
 359			(u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
 360			(u64)cmd[3] << 48 | (u64)cmd[2] << 56;
 361
 362		*num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
 363			(u32)cmd[10] << 24;
 364		break;
 365	case WRITE_12:
 366	case READ_12:
 367		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
 368			(u32)cmd[2] << 24;
 369
 370		*num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
 371			(u32)cmd[6] << 24;
 372		break;
 373	case WRITE_SAME:
 374	case WRITE_10:
 375	case READ_10:
 376	case XDWRITEREAD_10:
 377		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 |	(u32)cmd[3] << 16 |
 378			(u32)cmd[2] << 24;
 379
 380		*num = (u32)cmd[8] | (u32)cmd[7] << 8;
 381		break;
 382	case WRITE_6:
 383	case READ_6:
 384		*lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
 385			(u32)(cmd[1] & 0x1f) << 16;
 386		*num = (0 == cmd[4]) ? 256 : cmd[4];
 387		break;
 388	default:
 389		break;
 390	}
 
 391}
 392
 393static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
 394{
 395	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
 396		printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
 
 
 
 
 
 
 
 
 397	}
 398	return -EINVAL;
 399	/* return -ENOTTY; // correct return but upsets fdisk */
 400}
 401
 402static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
 403			   struct sdebug_dev_info * devip)
 404{
 405	if (devip->reset) {
 406		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 407			printk(KERN_INFO "scsi_debug: Reporting Unit "
 408			       "attention: power on reset\n");
 409		devip->reset = 0;
 410		mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
 411		return check_condition_result;
 412	}
 413	if ((0 == reset_only) && devip->stopped) {
 414		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 415			printk(KERN_INFO "scsi_debug: Reporting Not "
 416			       "ready: initializing command required\n");
 417		mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
 418				0x2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 419		return check_condition_result;
 420	}
 421	return 0;
 422}
 423
 424/* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
 425static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
 426				int arr_len)
 427{
 428	int act_len;
 429	struct scsi_data_buffer *sdb = scsi_in(scp);
 430
 431	if (!sdb->length)
 432		return 0;
 433	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
 434		return (DID_ERROR << 16);
 435
 436	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
 437				      arr, arr_len);
 438	if (sdb->resid)
 439		sdb->resid -= act_len;
 440	else
 441		sdb->resid = scsi_bufflen(scp) - act_len;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 442
 
 
 
 
 
 
 
 443	return 0;
 444}
 445
 446/* Returns number of bytes fetched into 'arr' or -1 if error. */
 
 
 447static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
 448			       int arr_len)
 449{
 450	if (!scsi_bufflen(scp))
 451		return 0;
 452	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
 453		return -1;
 454
 455	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
 456}
 457
 458
 459static const char * inq_vendor_id = "Linux   ";
 460static const char * inq_product_id = "scsi_debug      ";
 461static const char * inq_product_rev = "0004";
 462
 463static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
 464			   int target_dev_id, int dev_id_num,
 465			   const char * dev_id_str,
 466			   int dev_id_str_len)
 
 
 
 
 
 467{
 468	int num, port_a;
 469	char b[32];
 470
 471	port_a = target_dev_id + 1;
 472	/* T10 vendor identifier field format (faked) */
 473	arr[0] = 0x2;	/* ASCII */
 474	arr[1] = 0x1;
 475	arr[2] = 0x0;
 476	memcpy(&arr[4], inq_vendor_id, 8);
 477	memcpy(&arr[12], inq_product_id, 16);
 478	memcpy(&arr[28], dev_id_str, dev_id_str_len);
 479	num = 8 + 16 + dev_id_str_len;
 480	arr[3] = num;
 481	num += 4;
 482	if (dev_id_num >= 0) {
 483		/* NAA-5, Logical unit identifier (binary) */
 484		arr[num++] = 0x1;	/* binary (not necessarily sas) */
 485		arr[num++] = 0x3;	/* PIV=0, lu, naa */
 486		arr[num++] = 0x0;
 487		arr[num++] = 0x8;
 488		arr[num++] = 0x53;  /* naa-5 ieee company id=0x333333 (fake) */
 489		arr[num++] = 0x33;
 490		arr[num++] = 0x33;
 491		arr[num++] = 0x30;
 492		arr[num++] = (dev_id_num >> 24);
 493		arr[num++] = (dev_id_num >> 16) & 0xff;
 494		arr[num++] = (dev_id_num >> 8) & 0xff;
 495		arr[num++] = dev_id_num & 0xff;
 
 
 
 
 
 
 496		/* Target relative port number */
 497		arr[num++] = 0x61;	/* proto=sas, binary */
 498		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
 499		arr[num++] = 0x0;	/* reserved */
 500		arr[num++] = 0x4;	/* length */
 501		arr[num++] = 0x0;	/* reserved */
 502		arr[num++] = 0x0;	/* reserved */
 503		arr[num++] = 0x0;
 504		arr[num++] = 0x1;	/* relative port A */
 505	}
 506	/* NAA-5, Target port identifier */
 507	arr[num++] = 0x61;	/* proto=sas, binary */
 508	arr[num++] = 0x93;	/* piv=1, target port, naa */
 509	arr[num++] = 0x0;
 510	arr[num++] = 0x8;
 511	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
 512	arr[num++] = 0x22;
 513	arr[num++] = 0x22;
 514	arr[num++] = 0x20;
 515	arr[num++] = (port_a >> 24);
 516	arr[num++] = (port_a >> 16) & 0xff;
 517	arr[num++] = (port_a >> 8) & 0xff;
 518	arr[num++] = port_a & 0xff;
 519	/* NAA-5, Target port group identifier */
 520	arr[num++] = 0x61;	/* proto=sas, binary */
 521	arr[num++] = 0x95;	/* piv=1, target port group id */
 522	arr[num++] = 0x0;
 523	arr[num++] = 0x4;
 524	arr[num++] = 0;
 525	arr[num++] = 0;
 526	arr[num++] = (port_group_id >> 8) & 0xff;
 527	arr[num++] = port_group_id & 0xff;
 528	/* NAA-5, Target device identifier */
 529	arr[num++] = 0x61;	/* proto=sas, binary */
 530	arr[num++] = 0xa3;	/* piv=1, target device, naa */
 531	arr[num++] = 0x0;
 532	arr[num++] = 0x8;
 533	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
 534	arr[num++] = 0x22;
 535	arr[num++] = 0x22;
 536	arr[num++] = 0x20;
 537	arr[num++] = (target_dev_id >> 24);
 538	arr[num++] = (target_dev_id >> 16) & 0xff;
 539	arr[num++] = (target_dev_id >> 8) & 0xff;
 540	arr[num++] = target_dev_id & 0xff;
 541	/* SCSI name string: Target device identifier */
 542	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
 543	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
 544	arr[num++] = 0x0;
 545	arr[num++] = 24;
 546	memcpy(arr + num, "naa.52222220", 12);
 547	num += 12;
 548	snprintf(b, sizeof(b), "%08X", target_dev_id);
 549	memcpy(arr + num, b, 8);
 550	num += 8;
 551	memset(arr + num, 0, 4);
 552	num += 4;
 553	return num;
 554}
 555
 556
 557static unsigned char vpd84_data[] = {
 558/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
 559    0x22,0x22,0x22,0x0,0xbb,0x1,
 560    0x22,0x22,0x22,0x0,0xbb,0x2,
 561};
 562
 563static int inquiry_evpd_84(unsigned char * arr)
 
 564{
 565	memcpy(arr, vpd84_data, sizeof(vpd84_data));
 566	return sizeof(vpd84_data);
 567}
 568
 569static int inquiry_evpd_85(unsigned char * arr)
 
 570{
 571	int num = 0;
 572	const char * na1 = "https://www.kernel.org/config";
 573	const char * na2 = "http://www.kernel.org/log";
 574	int plen, olen;
 575
 576	arr[num++] = 0x1;	/* lu, storage config */
 577	arr[num++] = 0x0;	/* reserved */
 578	arr[num++] = 0x0;
 579	olen = strlen(na1);
 580	plen = olen + 1;
 581	if (plen % 4)
 582		plen = ((plen / 4) + 1) * 4;
 583	arr[num++] = plen;	/* length, null termianted, padded */
 584	memcpy(arr + num, na1, olen);
 585	memset(arr + num + olen, 0, plen - olen);
 586	num += plen;
 587
 588	arr[num++] = 0x4;	/* lu, logging */
 589	arr[num++] = 0x0;	/* reserved */
 590	arr[num++] = 0x0;
 591	olen = strlen(na2);
 592	plen = olen + 1;
 593	if (plen % 4)
 594		plen = ((plen / 4) + 1) * 4;
 595	arr[num++] = plen;	/* length, null terminated, padded */
 596	memcpy(arr + num, na2, olen);
 597	memset(arr + num + olen, 0, plen - olen);
 598	num += plen;
 599
 600	return num;
 601}
 602
 603/* SCSI ports VPD page */
 604static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
 605{
 606	int num = 0;
 607	int port_a, port_b;
 608
 609	port_a = target_dev_id + 1;
 610	port_b = port_a + 1;
 611	arr[num++] = 0x0;	/* reserved */
 612	arr[num++] = 0x0;	/* reserved */
 613	arr[num++] = 0x0;
 614	arr[num++] = 0x1;	/* relative port 1 (primary) */
 615	memset(arr + num, 0, 6);
 616	num += 6;
 617	arr[num++] = 0x0;
 618	arr[num++] = 12;	/* length tp descriptor */
 619	/* naa-5 target port identifier (A) */
 620	arr[num++] = 0x61;	/* proto=sas, binary */
 621	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
 622	arr[num++] = 0x0;	/* reserved */
 623	arr[num++] = 0x8;	/* length */
 624	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
 625	arr[num++] = 0x22;
 626	arr[num++] = 0x22;
 627	arr[num++] = 0x20;
 628	arr[num++] = (port_a >> 24);
 629	arr[num++] = (port_a >> 16) & 0xff;
 630	arr[num++] = (port_a >> 8) & 0xff;
 631	arr[num++] = port_a & 0xff;
 632
 633	arr[num++] = 0x0;	/* reserved */
 634	arr[num++] = 0x0;	/* reserved */
 635	arr[num++] = 0x0;
 636	arr[num++] = 0x2;	/* relative port 2 (secondary) */
 637	memset(arr + num, 0, 6);
 638	num += 6;
 639	arr[num++] = 0x0;
 640	arr[num++] = 12;	/* length tp descriptor */
 641	/* naa-5 target port identifier (B) */
 642	arr[num++] = 0x61;	/* proto=sas, binary */
 643	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
 644	arr[num++] = 0x0;	/* reserved */
 645	arr[num++] = 0x8;	/* length */
 646	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
 647	arr[num++] = 0x22;
 648	arr[num++] = 0x22;
 649	arr[num++] = 0x20;
 650	arr[num++] = (port_b >> 24);
 651	arr[num++] = (port_b >> 16) & 0xff;
 652	arr[num++] = (port_b >> 8) & 0xff;
 653	arr[num++] = port_b & 0xff;
 654
 655	return num;
 656}
 657
 658
 659static unsigned char vpd89_data[] = {
 660/* from 4th byte */ 0,0,0,0,
 661'l','i','n','u','x',' ',' ',' ',
 662'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
 663'1','2','3','4',
 6640x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
 6650xec,0,0,0,
 6660x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
 6670,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
 6680x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
 6690x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
 6700x53,0x41,
 6710x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
 6720x20,0x20,
 6730x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
 6740x10,0x80,
 6750,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
 6760x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
 6770x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
 6780,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
 6790x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
 6800x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
 6810,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
 6820,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6830,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6850x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
 6860,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
 6870xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
 6880,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
 6890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6910,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6920,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6930,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6940,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 6990,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
 701};
 702
 703static int inquiry_evpd_89(unsigned char * arr)
 
 704{
 705	memcpy(arr, vpd89_data, sizeof(vpd89_data));
 706	return sizeof(vpd89_data);
 707}
 708
 709
 710/* Block limits VPD page (SBC-3) */
 711static unsigned char vpdb0_data[] = {
 712	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
 713	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 714	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 715	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 716};
 717
 718static int inquiry_evpd_b0(unsigned char * arr)
 
 719{
 720	unsigned int gran;
 721
 722	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
 723
 724	/* Optimal transfer length granularity */
 725	gran = 1 << scsi_debug_physblk_exp;
 726	arr[2] = (gran >> 8) & 0xff;
 727	arr[3] = gran & 0xff;
 
 
 
 728
 729	/* Maximum Transfer Length */
 730	if (sdebug_store_sectors > 0x400) {
 731		arr[4] = (sdebug_store_sectors >> 24) & 0xff;
 732		arr[5] = (sdebug_store_sectors >> 16) & 0xff;
 733		arr[6] = (sdebug_store_sectors >> 8) & 0xff;
 734		arr[7] = sdebug_store_sectors & 0xff;
 735	}
 736
 737	/* Optimal Transfer Length */
 738	put_unaligned_be32(scsi_debug_opt_blks, &arr[8]);
 739
 740	if (scsi_debug_lbpu) {
 741		/* Maximum Unmap LBA Count */
 742		put_unaligned_be32(scsi_debug_unmap_max_blocks, &arr[16]);
 743
 744		/* Maximum Unmap Block Descriptor Count */
 745		put_unaligned_be32(scsi_debug_unmap_max_desc, &arr[20]);
 746	}
 747
 748	/* Unmap Granularity Alignment */
 749	if (scsi_debug_unmap_alignment) {
 750		put_unaligned_be32(scsi_debug_unmap_alignment, &arr[28]);
 751		arr[28] |= 0x80; /* UGAVALID */
 752	}
 753
 754	/* Optimal Unmap Granularity */
 755	put_unaligned_be32(scsi_debug_unmap_granularity, &arr[24]);
 756
 757	/* Maximum WRITE SAME Length */
 758	put_unaligned_be64(scsi_debug_write_same_length, &arr[32]);
 759
 760	return 0x3c; /* Mandatory page length for Logical Block Provisioning */
 761
 762	return sizeof(vpdb0_data);
 763}
 764
 765/* Block device characteristics VPD page (SBC-3) */
 766static int inquiry_evpd_b1(unsigned char *arr)
 767{
 768	memset(arr, 0, 0x3c);
 769	arr[0] = 0;
 770	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
 771	arr[2] = 0;
 772	arr[3] = 5;	/* less than 1.8" */
 
 
 773
 774	return 0x3c;
 775}
 776
 777/* Thin provisioning VPD page (SBC-3) */
 778static int inquiry_evpd_b2(unsigned char *arr)
 779{
 780	memset(arr, 0, 0x8);
 781	arr[0] = 0;			/* threshold exponent */
 782
 783	if (scsi_debug_lbpu)
 784		arr[1] = 1 << 7;
 785
 786	if (scsi_debug_lbpws)
 787		arr[1] |= 1 << 6;
 788
 789	if (scsi_debug_lbpws10)
 790		arr[1] |= 1 << 5;
 
 
 
 
 
 
 
 791
 792	return 0x8;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 793}
 794
 795#define SDEBUG_LONG_INQ_SZ 96
 796#define SDEBUG_MAX_INQ_ARR_SZ 584
 797
 798static int resp_inquiry(struct scsi_cmnd * scp, int target,
 799			struct sdebug_dev_info * devip)
 800{
 801	unsigned char pq_pdt;
 802	unsigned char * arr;
 803	unsigned char *cmd = (unsigned char *)scp->cmnd;
 804	int alloc_len, n, ret;
 
 
 805
 806	alloc_len = (cmd[3] << 8) + cmd[4];
 807	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
 808	if (! arr)
 809		return DID_REQUEUE << 16;
 810	if (devip->wlun)
 811		pq_pdt = 0x1e;	/* present, wlun */
 812	else if (scsi_debug_no_lun_0 && (0 == devip->lun))
 813		pq_pdt = 0x7f;	/* not present, no device type */
 
 
 
 
 814	else
 815		pq_pdt = (scsi_debug_ptype & 0x1f);
 816	arr[0] = pq_pdt;
 817	if (0x2 & cmd[1]) {  /* CMDDT bit set */
 818		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
 819			       	0);
 820		kfree(arr);
 821		return check_condition_result;
 822	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
 823		int lu_id_num, port_group_id, target_dev_id, len;
 
 824		char lu_id_str[6];
 825		int host_no = devip->sdbg_host->shost->host_no;
 826		
 827		port_group_id = (((host_no + 1) & 0x7f) << 8) +
 828		    (devip->channel & 0x7f);
 829		if (0 == scsi_debug_vpd_use_hostno)
 830			host_no = 0;
 831		lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
 832			    (devip->target * 1000) + devip->lun);
 833		target_dev_id = ((host_no + 1) * 2000) +
 834				 (devip->target * 1000) - 3;
 835		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
 836		if (0 == cmd[2]) { /* supported vital product data pages */
 837			arr[1] = cmd[2];	/*sanity */
 838			n = 4;
 839			arr[n++] = 0x0;   /* this page */
 840			arr[n++] = 0x80;  /* unit serial number */
 841			arr[n++] = 0x83;  /* device identification */
 842			arr[n++] = 0x84;  /* software interface ident. */
 843			arr[n++] = 0x85;  /* management network addresses */
 844			arr[n++] = 0x86;  /* extended inquiry */
 845			arr[n++] = 0x87;  /* mode page policy */
 846			arr[n++] = 0x88;  /* SCSI ports */
 847			arr[n++] = 0x89;  /* ATA information */
 848			arr[n++] = 0xb0;  /* Block limits (SBC) */
 849			arr[n++] = 0xb1;  /* Block characteristics (SBC) */
 850			if (scsi_debug_lbp()) /* Logical Block Prov. (SBC) */
 851				arr[n++] = 0xb2;
 
 
 
 
 852			arr[3] = n - 4;	  /* number of supported VPD pages */
 853		} else if (0x80 == cmd[2]) { /* unit serial number */
 854			arr[1] = cmd[2];	/*sanity */
 855			arr[3] = len;
 856			memcpy(&arr[4], lu_id_str, len);
 857		} else if (0x83 == cmd[2]) { /* device identification */
 858			arr[1] = cmd[2];	/*sanity */
 859			arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
 860						 target_dev_id, lu_id_num,
 861						 lu_id_str, len);
 
 862		} else if (0x84 == cmd[2]) { /* Software interface ident. */
 863			arr[1] = cmd[2];	/*sanity */
 864			arr[3] = inquiry_evpd_84(&arr[4]);
 865		} else if (0x85 == cmd[2]) { /* Management network addresses */
 866			arr[1] = cmd[2];	/*sanity */
 867			arr[3] = inquiry_evpd_85(&arr[4]);
 868		} else if (0x86 == cmd[2]) { /* extended inquiry */
 869			arr[1] = cmd[2];	/*sanity */
 870			arr[3] = 0x3c;	/* number of following entries */
 871			if (scsi_debug_dif == SD_DIF_TYPE3_PROTECTION)
 872				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
 873			else if (scsi_debug_dif)
 874				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
 875			else
 876				arr[4] = 0x0;   /* no protection stuff */
 877			arr[5] = 0x7;   /* head of q, ordered + simple q's */
 878		} else if (0x87 == cmd[2]) { /* mode page policy */
 879			arr[1] = cmd[2];	/*sanity */
 880			arr[3] = 0x8;	/* number of following entries */
 881			arr[4] = 0x2;	/* disconnect-reconnect mp */
 882			arr[6] = 0x80;	/* mlus, shared */
 883			arr[8] = 0x18;	 /* protocol specific lu */
 884			arr[10] = 0x82;	 /* mlus, per initiator port */
 885		} else if (0x88 == cmd[2]) { /* SCSI Ports */
 886			arr[1] = cmd[2];	/*sanity */
 887			arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
 888		} else if (0x89 == cmd[2]) { /* ATA information */
 889			arr[1] = cmd[2];        /*sanity */
 890			n = inquiry_evpd_89(&arr[4]);
 891			arr[2] = (n >> 8);
 892			arr[3] = (n & 0xff);
 893		} else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
 894			arr[1] = cmd[2];        /*sanity */
 895			arr[3] = inquiry_evpd_b0(&arr[4]);
 896		} else if (0xb1 == cmd[2]) { /* Block characteristics (SBC) */
 897			arr[1] = cmd[2];        /*sanity */
 898			arr[3] = inquiry_evpd_b1(&arr[4]);
 899		} else if (0xb2 == cmd[2]) { /* Logical Block Prov. (SBC) */
 900			arr[1] = cmd[2];        /*sanity */
 901			arr[3] = inquiry_evpd_b2(&arr[4]);
 
 
 
 902		} else {
 903			/* Illegal request, invalid field in cdb */
 904			mk_sense_buffer(devip, ILLEGAL_REQUEST,
 905					INVALID_FIELD_IN_CDB, 0);
 906			kfree(arr);
 907			return check_condition_result;
 908		}
 909		len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
 910		ret = fill_from_dev_buffer(scp, arr,
 911			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
 912		kfree(arr);
 913		return ret;
 914	}
 915	/* drops through here for a standard inquiry */
 916	arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;	/* Removable disk */
 917	arr[2] = scsi_debug_scsi_level;
 918	arr[3] = 2;    /* response_data_format==2 */
 919	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
 920	arr[5] = scsi_debug_dif ? 1 : 0; /* PROTECT bit */
 921	if (0 == scsi_debug_vpd_use_hostno)
 922		arr[5] = 0x10; /* claim: implicit TGPS */
 923	arr[6] = 0x10; /* claim: MultiP */
 924	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
 925	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
 926	memcpy(&arr[8], inq_vendor_id, 8);
 927	memcpy(&arr[16], inq_product_id, 16);
 928	memcpy(&arr[32], inq_product_rev, 4);
 
 
 929	/* version descriptors (2 bytes each) follow */
 930	arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
 931	arr[60] = 0x3; arr[61] = 0x14;  /* SPC-3 ANSI */
 932	n = 62;
 933	if (scsi_debug_ptype == 0) {
 934		arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
 935	} else if (scsi_debug_ptype == 1) {
 936		arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
 
 
 
 
 
 937	}
 938	arr[n++] = 0xc; arr[n++] = 0xf;  /* SAS-1.1 rev 10 */
 939	ret = fill_from_dev_buffer(scp, arr,
 940			    min(alloc_len, SDEBUG_LONG_INQ_SZ));
 941	kfree(arr);
 942	return ret;
 943}
 944
 945static int resp_requests(struct scsi_cmnd * scp,
 946			 struct sdebug_dev_info * devip)
 
 
 
 
 947{
 948	unsigned char * sbuff;
 949	unsigned char *cmd = (unsigned char *)scp->cmnd;
 950	unsigned char arr[SDEBUG_SENSE_LEN];
 951	int want_dsense;
 952	int len = 18;
 
 953
 954	memset(arr, 0, sizeof(arr));
 955	if (devip->reset == 1)
 956		mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
 957	want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
 958	sbuff = devip->sense_buff;
 959	if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
 960		if (want_dsense) {
 
 
 
 
 
 
 
 
 
 
 
 961			arr[0] = 0x72;
 962			arr[1] = 0x0;		/* NO_SENSE in sense_key */
 963			arr[2] = THRESHOLD_EXCEEDED;
 964			arr[3] = 0xff;		/* TEST set and MRIE==6 */
 
 965		} else {
 966			arr[0] = 0x70;
 967			arr[2] = 0x0;		/* NO_SENSE in sense_key */
 968			arr[7] = 0xa;   	/* 18 byte sense buffer */
 969			arr[12] = THRESHOLD_EXCEEDED;
 970			arr[13] = 0xff;		/* TEST set and MRIE==6 */
 971		}
 972	} else {
 973		memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
 974		if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
 975			/* DESC bit set and sense_buff in fixed format */
 976			memset(arr, 0, sizeof(arr));
 977			arr[0] = 0x72;
 978			arr[1] = sbuff[2];     /* sense key */
 979			arr[2] = sbuff[12];    /* asc */
 980			arr[3] = sbuff[13];    /* ascq */
 981			len = 8;
 
 
 
 
 
 
 982		}
 983	}
 984	mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
 985	return fill_from_dev_buffer(scp, arr, len);
 986}
 987
 988static int resp_start_stop(struct scsi_cmnd * scp,
 989			   struct sdebug_dev_info * devip)
 990{
 991	unsigned char *cmd = (unsigned char *)scp->cmnd;
 992	int power_cond, errsts, start;
 
 993
 994	if ((errsts = check_readiness(scp, 1, devip)))
 995		return errsts;
 996	power_cond = (cmd[4] & 0xf0) >> 4;
 997	if (power_cond) {
 998		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
 999			       	0);
1000		return check_condition_result;
1001	}
1002	start = cmd[4] & 1;
1003	if (start == devip->stopped)
1004		devip->stopped = !start;
1005	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1006}
1007
1008static sector_t get_sdebug_capacity(void)
1009{
1010	if (scsi_debug_virtual_gb > 0)
1011		return (sector_t)scsi_debug_virtual_gb *
1012			(1073741824 / scsi_debug_sector_size);
 
 
1013	else
1014		return sdebug_store_sectors;
1015}
1016
1017#define SDEBUG_READCAP_ARR_SZ 8
1018static int resp_readcap(struct scsi_cmnd * scp,
1019			struct sdebug_dev_info * devip)
1020{
1021	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1022	unsigned int capac;
1023	int errsts;
1024
1025	if ((errsts = check_readiness(scp, 1, devip)))
1026		return errsts;
1027	/* following just in case virtual_gb changed */
1028	sdebug_capacity = get_sdebug_capacity();
1029	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1030	if (sdebug_capacity < 0xffffffff) {
1031		capac = (unsigned int)sdebug_capacity - 1;
1032		arr[0] = (capac >> 24);
1033		arr[1] = (capac >> 16) & 0xff;
1034		arr[2] = (capac >> 8) & 0xff;
1035		arr[3] = capac & 0xff;
1036	} else {
1037		arr[0] = 0xff;
1038		arr[1] = 0xff;
1039		arr[2] = 0xff;
1040		arr[3] = 0xff;
1041	}
1042	arr[6] = (scsi_debug_sector_size >> 8) & 0xff;
1043	arr[7] = scsi_debug_sector_size & 0xff;
1044	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1045}
1046
1047#define SDEBUG_READCAP16_ARR_SZ 32
1048static int resp_readcap16(struct scsi_cmnd * scp,
1049			  struct sdebug_dev_info * devip)
1050{
1051	unsigned char *cmd = (unsigned char *)scp->cmnd;
1052	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1053	unsigned long long capac;
1054	int errsts, k, alloc_len;
1055
1056	if ((errsts = check_readiness(scp, 1, devip)))
1057		return errsts;
1058	alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1059		     + cmd[13]);
1060	/* following just in case virtual_gb changed */
1061	sdebug_capacity = get_sdebug_capacity();
1062	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1063	capac = sdebug_capacity - 1;
1064	for (k = 0; k < 8; ++k, capac >>= 8)
1065		arr[7 - k] = capac & 0xff;
1066	arr[8] = (scsi_debug_sector_size >> 24) & 0xff;
1067	arr[9] = (scsi_debug_sector_size >> 16) & 0xff;
1068	arr[10] = (scsi_debug_sector_size >> 8) & 0xff;
1069	arr[11] = scsi_debug_sector_size & 0xff;
1070	arr[13] = scsi_debug_physblk_exp & 0xf;
1071	arr[14] = (scsi_debug_lowest_aligned >> 8) & 0x3f;
1072
1073	if (scsi_debug_lbp())
1074		arr[14] |= 0x80; /* LBPME */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1075
1076	arr[15] = scsi_debug_lowest_aligned & 0xff;
1077
1078	if (scsi_debug_dif) {
1079		arr[12] = (scsi_debug_dif - 1) << 1; /* P_TYPE */
1080		arr[12] |= 1; /* PROT_EN */
1081	}
1082
1083	return fill_from_dev_buffer(scp, arr,
1084				    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1085}
1086
1087#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1088
1089static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1090			      struct sdebug_dev_info * devip)
1091{
1092	unsigned char *cmd = (unsigned char *)scp->cmnd;
1093	unsigned char * arr;
1094	int host_no = devip->sdbg_host->shost->host_no;
1095	int n, ret, alen, rlen;
1096	int port_group_a, port_group_b, port_a, port_b;
 
 
1097
1098	alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1099		+ cmd[9]);
1100
1101	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1102	if (! arr)
1103		return DID_REQUEUE << 16;
1104	/*
1105	 * EVPD page 0x88 states we have two ports, one
1106	 * real and a fake port with no device connected.
1107	 * So we create two port groups with one port each
1108	 * and set the group with port B to unavailable.
1109	 */
1110	port_a = 0x1; /* relative port A */
1111	port_b = 0x2; /* relative port B */
1112	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1113	    (devip->channel & 0x7f);
1114	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1115	    (devip->channel & 0x7f) + 0x80;
1116
1117	/*
1118	 * The asymmetric access state is cycled according to the host_id.
1119	 */
1120	n = 4;
1121	if (0 == scsi_debug_vpd_use_hostno) {
1122	    arr[n++] = host_no % 3; /* Asymm access state */
1123	    arr[n++] = 0x0F; /* claim: all states are supported */
1124	} else {
1125	    arr[n++] = 0x0; /* Active/Optimized path */
1126	    arr[n++] = 0x01; /* claim: only support active/optimized paths */
1127	}
1128	arr[n++] = (port_group_a >> 8) & 0xff;
1129	arr[n++] = port_group_a & 0xff;
1130	arr[n++] = 0;    /* Reserved */
1131	arr[n++] = 0;    /* Status code */
1132	arr[n++] = 0;    /* Vendor unique */
1133	arr[n++] = 0x1;  /* One port per group */
1134	arr[n++] = 0;    /* Reserved */
1135	arr[n++] = 0;    /* Reserved */
1136	arr[n++] = (port_a >> 8) & 0xff;
1137	arr[n++] = port_a & 0xff;
1138	arr[n++] = 3;    /* Port unavailable */
1139	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1140	arr[n++] = (port_group_b >> 8) & 0xff;
1141	arr[n++] = port_group_b & 0xff;
1142	arr[n++] = 0;    /* Reserved */
1143	arr[n++] = 0;    /* Status code */
1144	arr[n++] = 0;    /* Vendor unique */
1145	arr[n++] = 0x1;  /* One port per group */
1146	arr[n++] = 0;    /* Reserved */
1147	arr[n++] = 0;    /* Reserved */
1148	arr[n++] = (port_b >> 8) & 0xff;
1149	arr[n++] = port_b & 0xff;
1150
1151	rlen = n - 4;
1152	arr[0] = (rlen >> 24) & 0xff;
1153	arr[1] = (rlen >> 16) & 0xff;
1154	arr[2] = (rlen >> 8) & 0xff;
1155	arr[3] = rlen & 0xff;
1156
1157	/*
1158	 * Return the smallest value of either
1159	 * - The allocated length
1160	 * - The constructed command length
1161	 * - The maximum array size
1162	 */
1163	rlen = min(alen,n);
1164	ret = fill_from_dev_buffer(scp, arr,
1165				   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1166	kfree(arr);
1167	return ret;
1168}
1169
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1170/* <<Following mode page info copied from ST318451LW>> */
1171
1172static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1173{	/* Read-Write Error Recovery page for mode_sense */
1174	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1175					5, 0, 0xff, 0xff};
1176
1177	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1178	if (1 == pcontrol)
1179		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1180	return sizeof(err_recov_pg);
1181}
1182
1183static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1184{ 	/* Disconnect-Reconnect page for mode_sense */
1185	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1186					 0, 0, 0, 0, 0, 0, 0, 0};
1187
1188	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1189	if (1 == pcontrol)
1190		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1191	return sizeof(disconnect_pg);
1192}
1193
1194static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1195{       /* Format device page for mode_sense */
1196	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1197				     0, 0, 0, 0, 0, 0, 0, 0,
1198				     0, 0, 0, 0, 0x40, 0, 0, 0};
1199
1200	memcpy(p, format_pg, sizeof(format_pg));
1201	p[10] = (sdebug_sectors_per >> 8) & 0xff;
1202	p[11] = sdebug_sectors_per & 0xff;
1203	p[12] = (scsi_debug_sector_size >> 8) & 0xff;
1204	p[13] = scsi_debug_sector_size & 0xff;
1205	if (DEV_REMOVEABLE(target))
1206		p[20] |= 0x20; /* should agree with INQUIRY */
1207	if (1 == pcontrol)
1208		memset(p + 2, 0, sizeof(format_pg) - 2);
1209	return sizeof(format_pg);
1210}
1211
1212static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
 
 
 
 
1213{ 	/* Caching page for mode_sense */
1214	unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
 
 
1215		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1216
 
 
1217	memcpy(p, caching_pg, sizeof(caching_pg));
1218	if (1 == pcontrol)
1219		memset(p + 2, 0, sizeof(caching_pg) - 2);
 
 
1220	return sizeof(caching_pg);
1221}
1222
1223static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
 
 
 
1224{ 	/* Control mode page for mode_sense */
1225	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1226				        0, 0, 0, 0};
1227	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1228				     0, 0, 0x2, 0x4b};
1229
1230	if (scsi_debug_dsense)
1231		ctrl_m_pg[2] |= 0x4;
1232	else
1233		ctrl_m_pg[2] &= ~0x4;
1234
1235	if (scsi_debug_ato)
1236		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1237
1238	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1239	if (1 == pcontrol)
1240		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1241	else if (2 == pcontrol)
1242		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1243	return sizeof(ctrl_m_pg);
1244}
1245
1246
1247static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1248{	/* Informational Exceptions control mode page for mode_sense */
1249	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1250				       0, 0, 0x0, 0x0};
1251	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1252				      0, 0, 0x0, 0x0};
1253
1254	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1255	if (1 == pcontrol)
1256		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1257	else if (2 == pcontrol)
1258		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1259	return sizeof(iec_m_pg);
1260}
1261
1262static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1263{	/* SAS SSP mode page - short format for mode_sense */
1264	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1265		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1266
1267	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1268	if (1 == pcontrol)
1269		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1270	return sizeof(sas_sf_m_pg);
1271}
1272
1273
1274static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1275			      int target_dev_id)
1276{	/* SAS phy control and discover mode page for mode_sense */
1277	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1278		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1279		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1280		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1281		    0x2, 0, 0, 0, 0, 0, 0, 0,
1282		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1283		    0, 0, 0, 0, 0, 0, 0, 0,
1284		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1285		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1286		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1287		    0x3, 0, 0, 0, 0, 0, 0, 0,
1288		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1289		    0, 0, 0, 0, 0, 0, 0, 0,
1290		};
1291	int port_a, port_b;
1292
 
 
 
 
1293	port_a = target_dev_id + 1;
1294	port_b = port_a + 1;
1295	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1296	p[20] = (port_a >> 24);
1297	p[21] = (port_a >> 16) & 0xff;
1298	p[22] = (port_a >> 8) & 0xff;
1299	p[23] = port_a & 0xff;
1300	p[48 + 20] = (port_b >> 24);
1301	p[48 + 21] = (port_b >> 16) & 0xff;
1302	p[48 + 22] = (port_b >> 8) & 0xff;
1303	p[48 + 23] = port_b & 0xff;
1304	if (1 == pcontrol)
1305		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1306	return sizeof(sas_pcd_m_pg);
1307}
1308
1309static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1310{	/* SAS SSP shared protocol specific port mode subpage */
1311	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1312		    0, 0, 0, 0, 0, 0, 0, 0,
1313		};
1314
1315	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1316	if (1 == pcontrol)
1317		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1318	return sizeof(sas_sha_m_pg);
1319}
1320
1321#define SDEBUG_MAX_MSENSE_SZ 256
1322
1323static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1324			   struct sdebug_dev_info * devip)
1325{
1326	unsigned char dbd, llbaa;
1327	int pcontrol, pcode, subpcode, bd_len;
1328	unsigned char dev_spec;
1329	int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1330	unsigned char * ap;
 
 
1331	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1332	unsigned char *cmd = (unsigned char *)scp->cmnd;
 
1333
1334	if ((errsts = check_readiness(scp, 1, devip)))
1335		return errsts;
1336	dbd = !!(cmd[1] & 0x8);
1337	pcontrol = (cmd[2] & 0xc0) >> 6;
1338	pcode = cmd[2] & 0x3f;
1339	subpcode = cmd[3];
1340	msense_6 = (MODE_SENSE == cmd[0]);
1341	llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1342	if ((0 == scsi_debug_ptype) && (0 == dbd))
 
 
1343		bd_len = llbaa ? 16 : 8;
1344	else
1345		bd_len = 0;
1346	alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1347	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1348	if (0x3 == pcontrol) {  /* Saving values not supported */
1349		mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1350			       	0);
1351		return check_condition_result;
1352	}
1353	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1354			(devip->target * 1000) - 3;
1355	/* set DPOFUA bit for disks */
1356	if (0 == scsi_debug_ptype)
1357		dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1358	else
 
 
1359		dev_spec = 0x0;
1360	if (msense_6) {
1361		arr[2] = dev_spec;
1362		arr[3] = bd_len;
1363		offset = 4;
1364	} else {
1365		arr[3] = dev_spec;
1366		if (16 == bd_len)
1367			arr[4] = 0x1;	/* set LONGLBA bit */
1368		arr[7] = bd_len;	/* assume 255 or less */
1369		offset = 8;
1370	}
1371	ap = arr + offset;
1372	if ((bd_len > 0) && (!sdebug_capacity))
1373		sdebug_capacity = get_sdebug_capacity();
1374
1375	if (8 == bd_len) {
1376		if (sdebug_capacity > 0xfffffffe) {
1377			ap[0] = 0xff;
1378			ap[1] = 0xff;
1379			ap[2] = 0xff;
1380			ap[3] = 0xff;
1381		} else {
1382			ap[0] = (sdebug_capacity >> 24) & 0xff;
1383			ap[1] = (sdebug_capacity >> 16) & 0xff;
1384			ap[2] = (sdebug_capacity >> 8) & 0xff;
1385			ap[3] = sdebug_capacity & 0xff;
1386		}
1387		ap[6] = (scsi_debug_sector_size >> 8) & 0xff;
1388		ap[7] = scsi_debug_sector_size & 0xff;
1389		offset += bd_len;
1390		ap = arr + offset;
1391	} else if (16 == bd_len) {
1392		unsigned long long capac = sdebug_capacity;
1393
1394        	for (k = 0; k < 8; ++k, capac >>= 8)
1395                	ap[7 - k] = capac & 0xff;
1396		ap[12] = (scsi_debug_sector_size >> 24) & 0xff;
1397		ap[13] = (scsi_debug_sector_size >> 16) & 0xff;
1398		ap[14] = (scsi_debug_sector_size >> 8) & 0xff;
1399		ap[15] = scsi_debug_sector_size & 0xff;
1400		offset += bd_len;
1401		ap = arr + offset;
1402	}
1403
1404	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1405		/* TODO: Control Extension page */
1406		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1407			       	0);
1408		return check_condition_result;
1409	}
 
 
1410	switch (pcode) {
1411	case 0x1:	/* Read-Write error recovery page, direct access */
1412		len = resp_err_recov_pg(ap, pcontrol, target);
1413		offset += len;
1414		break;
1415	case 0x2:	/* Disconnect-Reconnect page, all devices */
1416		len = resp_disconnect_pg(ap, pcontrol, target);
1417		offset += len;
1418		break;
1419        case 0x3:       /* Format device page, direct access */
1420                len = resp_format_pg(ap, pcontrol, target);
1421                offset += len;
1422                break;
 
 
 
1423	case 0x8:	/* Caching page, direct access */
1424		len = resp_caching_pg(ap, pcontrol, target);
1425		offset += len;
 
 
 
1426		break;
1427	case 0xa:	/* Control Mode page, all devices */
1428		len = resp_ctrl_m_pg(ap, pcontrol, target);
1429		offset += len;
1430		break;
1431	case 0x19:	/* if spc==1 then sas phy, control+discover */
1432		if ((subpcode > 0x2) && (subpcode < 0xff)) {
1433		        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1434					INVALID_FIELD_IN_CDB, 0);
1435			return check_condition_result;
1436	        }
1437		len = 0;
1438		if ((0x0 == subpcode) || (0xff == subpcode))
1439			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1440		if ((0x1 == subpcode) || (0xff == subpcode))
1441			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1442						  target_dev_id);
1443		if ((0x2 == subpcode) || (0xff == subpcode))
1444			len += resp_sas_sha_m_spg(ap + len, pcontrol);
1445		offset += len;
1446		break;
1447	case 0x1c:	/* Informational Exceptions Mode page, all devices */
1448		len = resp_iec_m_pg(ap, pcontrol, target);
1449		offset += len;
1450		break;
1451	case 0x3f:	/* Read all Mode pages */
1452		if ((0 == subpcode) || (0xff == subpcode)) {
1453			len = resp_err_recov_pg(ap, pcontrol, target);
1454			len += resp_disconnect_pg(ap + len, pcontrol, target);
1455			len += resp_format_pg(ap + len, pcontrol, target);
1456			len += resp_caching_pg(ap + len, pcontrol, target);
 
 
 
 
 
 
 
1457			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1458			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1459			if (0xff == subpcode) {
1460				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1461						  target, target_dev_id);
1462				len += resp_sas_sha_m_spg(ap + len, pcontrol);
1463			}
1464			len += resp_iec_m_pg(ap + len, pcontrol, target);
 
1465		} else {
1466			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1467					INVALID_FIELD_IN_CDB, 0);
1468			return check_condition_result;
1469                }
1470		offset += len;
1471		break;
1472	default:
1473		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1474			       	0);
 
 
 
1475		return check_condition_result;
1476	}
1477	if (msense_6)
1478		arr[0] = offset - 1;
1479	else {
1480		arr[0] = ((offset - 2) >> 8) & 0xff;
1481		arr[1] = (offset - 2) & 0xff;
1482	}
1483	return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1484}
1485
1486#define SDEBUG_MAX_MSELECT_SZ 512
1487
1488static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1489			    struct sdebug_dev_info * devip)
1490{
1491	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1492	int param_len, res, errsts, mpage;
1493	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1494	unsigned char *cmd = (unsigned char *)scp->cmnd;
 
1495
1496	if ((errsts = check_readiness(scp, 1, devip)))
1497		return errsts;
1498	memset(arr, 0, sizeof(arr));
1499	pf = cmd[1] & 0x10;
1500	sp = cmd[1] & 0x1;
1501	param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1502	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1503		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1504				INVALID_FIELD_IN_CDB, 0);
1505		return check_condition_result;
1506	}
1507        res = fetch_to_dev_buffer(scp, arr, param_len);
1508        if (-1 == res)
1509                return (DID_ERROR << 16);
1510        else if ((res < param_len) &&
1511                 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1512                printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1513                       " IO sent=%d bytes\n", param_len, res);
1514	md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1515	bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1516	if (md_len > 2) {
1517		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1518				INVALID_FIELD_IN_PARAM_LIST, 0);
1519		return check_condition_result;
1520	}
1521	off = bd_len + (mselect6 ? 4 : 8);
1522	mpage = arr[off] & 0x3f;
1523	ps = !!(arr[off] & 0x80);
1524	if (ps) {
1525		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1526				INVALID_FIELD_IN_PARAM_LIST, 0);
1527		return check_condition_result;
1528	}
1529	spf = !!(arr[off] & 0x40);
1530	pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1531		       (arr[off + 1] + 2);
1532	if ((pg_len + off) > param_len) {
1533		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1534				PARAMETER_LIST_LENGTH_ERR, 0);
1535		return check_condition_result;
1536	}
1537	switch (mpage) {
 
 
 
 
 
 
 
1538	case 0xa:      /* Control Mode page */
1539		if (ctrl_m_pg[1] == arr[off + 1]) {
1540			memcpy(ctrl_m_pg + 2, arr + off + 2,
1541			       sizeof(ctrl_m_pg) - 2);
1542			scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1543			return 0;
 
 
 
 
1544		}
1545		break;
1546	case 0x1c:      /* Informational Exceptions Mode page */
1547		if (iec_m_pg[1] == arr[off + 1]) {
1548			memcpy(iec_m_pg + 2, arr + off + 2,
1549			       sizeof(iec_m_pg) - 2);
1550			return 0;
1551		}
1552		break;
1553	default:
1554		break;
1555	}
1556	mk_sense_buffer(devip, ILLEGAL_REQUEST,
1557			INVALID_FIELD_IN_PARAM_LIST, 0);
1558	return check_condition_result;
 
 
 
1559}
1560
1561static int resp_temp_l_pg(unsigned char * arr)
1562{
1563	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1564				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
1565		};
1566
1567        memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1568        return sizeof(temp_l_pg);
1569}
1570
1571static int resp_ie_l_pg(unsigned char * arr)
1572{
1573	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1574		};
1575
1576        memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1577	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
1578		arr[4] = THRESHOLD_EXCEEDED;
1579		arr[5] = 0xff;
1580	}
1581        return sizeof(ie_l_pg);
 
 
 
 
 
 
 
 
 
 
 
 
1582}
1583
1584#define SDEBUG_MAX_LSENSE_SZ 512
1585
1586static int resp_log_sense(struct scsi_cmnd * scp,
1587                          struct sdebug_dev_info * devip)
1588{
1589	int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
 
1590	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1591	unsigned char *cmd = (unsigned char *)scp->cmnd;
1592
1593	if ((errsts = check_readiness(scp, 1, devip)))
1594		return errsts;
1595	memset(arr, 0, sizeof(arr));
1596	ppc = cmd[1] & 0x2;
1597	sp = cmd[1] & 0x1;
1598	if (ppc || sp) {
1599		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1600				INVALID_FIELD_IN_CDB, 0);
1601		return check_condition_result;
1602	}
1603	pcontrol = (cmd[2] & 0xc0) >> 6;
1604	pcode = cmd[2] & 0x3f;
1605	subpcode = cmd[3] & 0xff;
1606	alloc_len = (cmd[7] << 8) + cmd[8];
1607	arr[0] = pcode;
1608	if (0 == subpcode) {
1609		switch (pcode) {
1610		case 0x0:	/* Supported log pages log page */
1611			n = 4;
1612			arr[n++] = 0x0;		/* this page */
1613			arr[n++] = 0xd;		/* Temperature */
1614			arr[n++] = 0x2f;	/* Informational exceptions */
1615			arr[3] = n - 4;
1616			break;
1617		case 0xd:	/* Temperature log page */
1618			arr[3] = resp_temp_l_pg(arr + 4);
1619			break;
1620		case 0x2f:	/* Informational exceptions log page */
1621			arr[3] = resp_ie_l_pg(arr + 4);
1622			break;
1623		default:
1624			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1625					INVALID_FIELD_IN_CDB, 0);
1626			return check_condition_result;
1627		}
1628	} else if (0xff == subpcode) {
1629		arr[0] |= 0x40;
1630		arr[1] = subpcode;
1631		switch (pcode) {
1632		case 0x0:	/* Supported log pages and subpages log page */
1633			n = 4;
1634			arr[n++] = 0x0;
1635			arr[n++] = 0x0;		/* 0,0 page */
1636			arr[n++] = 0x0;
1637			arr[n++] = 0xff;	/* this page */
1638			arr[n++] = 0xd;
1639			arr[n++] = 0x0;		/* Temperature */
 
 
 
 
1640			arr[n++] = 0x2f;
1641			arr[n++] = 0x0;	/* Informational exceptions */
 
 
1642			arr[3] = n - 4;
1643			break;
1644		case 0xd:	/* Temperature subpages */
1645			n = 4;
1646			arr[n++] = 0xd;
1647			arr[n++] = 0x0;		/* Temperature */
 
 
 
 
1648			arr[3] = n - 4;
1649			break;
1650		case 0x2f:	/* Informational exceptions subpages */
1651			n = 4;
1652			arr[n++] = 0x2f;
1653			arr[n++] = 0x0;		/* Informational exceptions */
 
 
1654			arr[3] = n - 4;
1655			break;
1656		default:
1657			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1658					INVALID_FIELD_IN_CDB, 0);
 
 
 
 
 
 
 
 
1659			return check_condition_result;
1660		}
1661	} else {
1662		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1663				INVALID_FIELD_IN_CDB, 0);
1664		return check_condition_result;
1665	}
1666	len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1667	return fill_from_dev_buffer(scp, arr,
1668		    min(len, SDEBUG_MAX_INQ_ARR_SZ));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1669}
1670
1671static int check_device_access_params(struct sdebug_dev_info *devi,
1672				      unsigned long long lba, unsigned int num)
 
1673{
 
 
 
1674	if (lba + num > sdebug_capacity) {
1675		mk_sense_buffer(devi, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0);
1676		return check_condition_result;
1677	}
1678	/* transfer length excessive (tie in to block limits VPD page) */
1679	if (num > sdebug_store_sectors) {
1680		mk_sense_buffer(devi, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
 
 
 
 
 
1681		return check_condition_result;
1682	}
 
 
 
1683	return 0;
1684}
1685
1686static int do_device_access(struct scsi_cmnd *scmd,
1687			    struct sdebug_dev_info *devi,
1688			    unsigned long long lba, unsigned int num, int write)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1689{
1690	int ret;
1691	unsigned long long block, rest = 0;
1692	int (*func)(struct scsi_cmnd *, unsigned char *, int);
 
 
 
 
 
 
 
 
 
1693
1694	func = write ? fetch_to_dev_buffer : fill_from_dev_buffer;
 
 
 
 
1695
1696	block = do_div(lba, sdebug_store_sectors);
1697	if (block + num > sdebug_store_sectors)
1698		rest = block + num - sdebug_store_sectors;
1699
1700	ret = func(scmd, fake_storep + (block * scsi_debug_sector_size),
1701		   (num - rest) * scsi_debug_sector_size);
1702	if (!ret && rest)
1703		ret = func(scmd, fake_storep, rest * scsi_debug_sector_size);
 
 
 
 
 
 
 
 
1704
1705	return ret;
1706}
1707
1708static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
1709			    unsigned int sectors, u32 ei_lba)
1710{
1711	unsigned int i, resid;
1712	struct scatterlist *psgl;
1713	struct sd_dif_tuple *sdt;
1714	sector_t sector;
1715	sector_t tmp_sec = start_sec;
1716	void *paddr;
1717
1718	start_sec = do_div(tmp_sec, sdebug_store_sectors);
 
 
 
 
 
 
1719
1720	sdt = (struct sd_dif_tuple *)(dif_storep + dif_offset(start_sec));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1721
1722	for (i = 0 ; i < sectors ; i++) {
1723		u16 csum;
 
1724
1725		if (sdt[i].app_tag == 0xffff)
1726			continue;
 
 
1727
1728		sector = start_sec + i;
 
1729
1730		switch (scsi_debug_guard) {
1731		case 1:
1732			csum = ip_compute_csum(fake_storep +
1733					       sector * scsi_debug_sector_size,
1734					       scsi_debug_sector_size);
1735			break;
1736		case 0:
1737			csum = crc_t10dif(fake_storep +
1738					  sector * scsi_debug_sector_size,
1739					  scsi_debug_sector_size);
1740			csum = cpu_to_be16(csum);
1741			break;
1742		default:
1743			BUG();
1744		}
 
 
 
 
 
 
 
 
 
 
 
1745
1746		if (sdt[i].guard_tag != csum) {
1747			printk(KERN_ERR "%s: GUARD check failed on sector %lu" \
1748			       " rcvd 0x%04x, data 0x%04x\n", __func__,
1749			       (unsigned long)sector,
1750			       be16_to_cpu(sdt[i].guard_tag),
1751			       be16_to_cpu(csum));
1752			dif_errors++;
1753			return 0x01;
1754		}
 
 
 
 
 
 
 
 
 
 
 
 
 
1755
1756		if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1757		    be32_to_cpu(sdt[i].ref_tag) != (sector & 0xffffffff)) {
1758			printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1759			       __func__, (unsigned long)sector);
1760			dif_errors++;
1761			return 0x03;
1762		}
 
 
1763
1764		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1765		    be32_to_cpu(sdt[i].ref_tag) != ei_lba) {
1766			printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1767			       __func__, (unsigned long)sector);
1768			dif_errors++;
1769			return 0x03;
1770		}
1771
1772		ei_lba++;
 
1773	}
 
 
1774
1775	resid = sectors * 8; /* Bytes of protection data to copy into sgl */
1776	sector = start_sec;
 
 
 
 
 
 
 
1777
1778	scsi_for_each_prot_sg(SCpnt, psgl, scsi_prot_sg_count(SCpnt), i) {
1779		int len = min(psgl->length, resid);
 
1780
1781		paddr = kmap_atomic(sg_page(psgl), KM_IRQ0) + psgl->offset;
1782		memcpy(paddr, dif_storep + dif_offset(sector), len);
1783
1784		sector += len >> 3;
1785		if (sector >= sdebug_store_sectors) {
1786			/* Force wrap */
1787			tmp_sec = sector;
1788			sector = do_div(tmp_sec, sdebug_store_sectors);
 
 
 
 
 
 
 
 
 
1789		}
1790		resid -= len;
1791		kunmap_atomic(paddr, KM_IRQ0);
1792	}
1793
 
1794	dix_reads++;
1795
1796	return 0;
1797}
1798
1799static int resp_read(struct scsi_cmnd *SCpnt, unsigned long long lba,
1800		     unsigned int num, struct sdebug_dev_info *devip,
1801		     u32 ei_lba)
1802{
1803	unsigned long iflags;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1804	int ret;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1805
1806	ret = check_device_access_params(devip, lba, num);
1807	if (ret)
1808		return ret;
1809
1810	if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1811	    (lba <= (OPT_MEDIUM_ERR_ADDR + OPT_MEDIUM_ERR_NUM - 1)) &&
1812	    ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1813		/* claim unrecoverable read error */
1814		mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
1815		/* set info field and valid bit for fixed descriptor */
1816		if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1817			devip->sense_buff[0] |= 0x80;	/* Valid bit */
1818			ret = (lba < OPT_MEDIUM_ERR_ADDR)
1819			      ? OPT_MEDIUM_ERR_ADDR : (int)lba;
1820			devip->sense_buff[3] = (ret >> 24) & 0xff;
1821			devip->sense_buff[4] = (ret >> 16) & 0xff;
1822			devip->sense_buff[5] = (ret >> 8) & 0xff;
1823			devip->sense_buff[6] = ret & 0xff;
1824		}
1825	        scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
1826		return check_condition_result;
1827	}
1828
1829	/* DIX + T10 DIF */
1830	if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
1831		int prot_ret = prot_verify_read(SCpnt, lba, num, ei_lba);
1832
1833		if (prot_ret) {
1834			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, prot_ret);
1835			return illegal_condition_result;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1836		}
1837	}
1838
1839	read_lock_irqsave(&atomic_rw, iflags);
1840	ret = do_device_access(SCpnt, devip, lba, num, 0);
1841	read_unlock_irqrestore(&atomic_rw, iflags);
1842	return ret;
1843}
1844
1845void dump_sector(unsigned char *buf, int len)
1846{
1847	int i, j;
1848
1849	printk(KERN_ERR ">>> Sector Dump <<<\n");
1850
1851	for (i = 0 ; i < len ; i += 16) {
1852		printk(KERN_ERR "%04d: ", i);
1853
1854		for (j = 0 ; j < 16 ; j++) {
1855			unsigned char c = buf[i+j];
1856			if (c >= 0x20 && c < 0x7e)
1857				printk(" %c ", buf[i+j]);
1858			else
1859				printk("%02x ", buf[i+j]);
 
1860		}
1861
1862		printk("\n");
1863	}
 
1864}
1865
1866static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
1867			     unsigned int sectors, u32 ei_lba)
1868{
1869	int i, j, ret;
1870	struct sd_dif_tuple *sdt;
1871	struct scatterlist *dsgl = scsi_sglist(SCpnt);
1872	struct scatterlist *psgl = scsi_prot_sglist(SCpnt);
1873	void *daddr, *paddr;
1874	sector_t tmp_sec = start_sec;
1875	sector_t sector;
1876	int ppage_offset;
1877	unsigned short csum;
1878
1879	sector = do_div(tmp_sec, sdebug_store_sectors);
1880
1881	BUG_ON(scsi_sg_count(SCpnt) == 0);
1882	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
1883
1884	paddr = kmap_atomic(sg_page(psgl), KM_IRQ1) + psgl->offset;
1885	ppage_offset = 0;
1886
1887	/* For each data page */
1888	scsi_for_each_sg(SCpnt, dsgl, scsi_sg_count(SCpnt), i) {
1889		daddr = kmap_atomic(sg_page(dsgl), KM_IRQ0) + dsgl->offset;
1890
1891		/* For each sector-sized chunk in data page */
1892		for (j = 0 ; j < dsgl->length ; j += scsi_debug_sector_size) {
 
 
 
 
1893
 
 
1894			/* If we're at the end of the current
1895			 * protection page advance to the next one
1896			 */
1897			if (ppage_offset >= psgl->length) {
1898				kunmap_atomic(paddr, KM_IRQ1);
1899				psgl = sg_next(psgl);
1900				BUG_ON(psgl == NULL);
1901				paddr = kmap_atomic(sg_page(psgl), KM_IRQ1)
1902					+ psgl->offset;
1903				ppage_offset = 0;
1904			}
1905
1906			sdt = paddr + ppage_offset;
1907
1908			switch (scsi_debug_guard) {
1909			case 1:
1910				csum = ip_compute_csum(daddr,
1911						       scsi_debug_sector_size);
1912				break;
1913			case 0:
1914				csum = cpu_to_be16(crc_t10dif(daddr,
1915						      scsi_debug_sector_size));
1916				break;
1917			default:
1918				BUG();
1919				ret = 0;
1920				goto out;
1921			}
1922
1923			if (sdt->guard_tag != csum) {
1924				printk(KERN_ERR
1925				       "%s: GUARD check failed on sector %lu " \
1926				       "rcvd 0x%04x, calculated 0x%04x\n",
1927				       __func__, (unsigned long)sector,
1928				       be16_to_cpu(sdt->guard_tag),
1929				       be16_to_cpu(csum));
1930				ret = 0x01;
1931				dump_sector(daddr, scsi_debug_sector_size);
1932				goto out;
1933			}
1934
1935			if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1936			    be32_to_cpu(sdt->ref_tag)
1937			    != (start_sec & 0xffffffff)) {
1938				printk(KERN_ERR
1939				       "%s: REF check failed on sector %lu\n",
1940				       __func__, (unsigned long)sector);
1941				ret = 0x03;
1942				dump_sector(daddr, scsi_debug_sector_size);
1943				goto out;
1944			}
1945
1946			if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1947			    be32_to_cpu(sdt->ref_tag) != ei_lba) {
1948				printk(KERN_ERR
1949				       "%s: REF check failed on sector %lu\n",
1950				       __func__, (unsigned long)sector);
1951				ret = 0x03;
1952				dump_sector(daddr, scsi_debug_sector_size);
1953				goto out;
1954			}
1955
1956			/* Would be great to copy this in bigger
1957			 * chunks.  However, for the sake of
1958			 * correctness we need to verify each sector
1959			 * before writing it to "stable" storage
1960			 */
1961			memcpy(dif_storep + dif_offset(sector), sdt, 8);
1962
1963			sector++;
1964
1965			if (sector == sdebug_store_sectors)
1966				sector = 0;	/* Force wrap */
 
 
 
1967
1968			start_sec++;
1969			ei_lba++;
1970			daddr += scsi_debug_sector_size;
1971			ppage_offset += sizeof(struct sd_dif_tuple);
1972		}
1973
1974		kunmap_atomic(daddr, KM_IRQ0);
1975	}
 
1976
1977	kunmap_atomic(paddr, KM_IRQ1);
1978
1979	dix_writes++;
1980
1981	return 0;
1982
1983out:
1984	dif_errors++;
1985	kunmap_atomic(daddr, KM_IRQ0);
1986	kunmap_atomic(paddr, KM_IRQ1);
1987	return ret;
1988}
1989
1990static unsigned int map_state(sector_t lba, unsigned int *num)
1991{
1992	unsigned int granularity, alignment, mapped;
1993	sector_t block, next, end;
 
 
 
 
 
 
 
1994
1995	granularity = scsi_debug_unmap_granularity;
1996	alignment = granularity - scsi_debug_unmap_alignment;
1997	block = lba + alignment;
1998	do_div(block, granularity);
 
 
 
 
 
 
 
 
1999
2000	mapped = test_bit(block, map_storep);
 
2001
2002	if (mapped)
2003		next = find_next_zero_bit(map_storep, map_size, block);
2004	else
2005		next = find_next_bit(map_storep, map_size, block);
2006
2007	end = next * granularity - scsi_debug_unmap_alignment;
2008	*num = end - lba;
2009
2010	return mapped;
2011}
2012
2013static void map_region(sector_t lba, unsigned int len)
 
2014{
2015	unsigned int granularity, alignment;
2016	sector_t end = lba + len;
2017
2018	granularity = scsi_debug_unmap_granularity;
2019	alignment = granularity - scsi_debug_unmap_alignment;
2020
2021	while (lba < end) {
2022		sector_t block, rem;
2023
2024		block = lba + alignment;
2025		rem = do_div(block, granularity);
2026
2027		if (block < map_size)
2028			set_bit(block, map_storep);
2029
2030		lba += granularity - rem;
2031	}
2032}
2033
2034static void unmap_region(sector_t lba, unsigned int len)
 
2035{
2036	unsigned int granularity, alignment;
2037	sector_t end = lba + len;
2038
2039	granularity = scsi_debug_unmap_granularity;
2040	alignment = granularity - scsi_debug_unmap_alignment;
2041
2042	while (lba < end) {
2043		sector_t block, rem;
2044
2045		block = lba + alignment;
2046		rem = do_div(block, granularity);
2047
2048		if (rem == 0 && lba + granularity <= end &&
2049		    block < map_size)
2050			clear_bit(block, map_storep);
2051
2052		lba += granularity - rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2053	}
2054}
2055
2056static int resp_write(struct scsi_cmnd *SCpnt, unsigned long long lba,
2057		      unsigned int num, struct sdebug_dev_info *devip,
2058		      u32 ei_lba)
2059{
2060	unsigned long iflags;
 
 
2061	int ret;
 
 
 
2062
2063	ret = check_device_access_params(devip, lba, num);
2064	if (ret)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2065		return ret;
 
2066
2067	/* DIX + T10 DIF */
2068	if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
2069		int prot_ret = prot_verify_write(SCpnt, lba, num, ei_lba);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2070
2071		if (prot_ret) {
2072			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, prot_ret);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2073			return illegal_condition_result;
2074		}
2075	}
 
 
2076
2077	write_lock_irqsave(&atomic_rw, iflags);
2078	ret = do_device_access(SCpnt, devip, lba, num, 1);
2079	if (scsi_debug_unmap_granularity)
2080		map_region(lba, num);
2081	write_unlock_irqrestore(&atomic_rw, iflags);
2082	if (-1 == ret)
2083		return (DID_ERROR << 16);
2084	else if ((ret < (num * scsi_debug_sector_size)) &&
2085		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2086		printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
2087		       " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2088
2089	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2090}
2091
2092static int resp_write_same(struct scsi_cmnd *scmd, unsigned long long lba,
2093		      unsigned int num, struct sdebug_dev_info *devip,
2094			   u32 ei_lba, unsigned int unmap)
2095{
2096	unsigned long iflags;
 
2097	unsigned long long i;
 
 
2098	int ret;
2099
2100	ret = check_device_access_params(devip, lba, num);
2101	if (ret)
 
 
 
 
 
 
 
2102		return ret;
2103
2104	if (num > scsi_debug_write_same_length) {
2105		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2106				0);
2107		return check_condition_result;
2108	}
2109
2110	write_lock_irqsave(&atomic_rw, iflags);
2111
2112	if (unmap && scsi_debug_unmap_granularity) {
2113		unmap_region(lba, num);
2114		goto out;
2115	}
2116
2117	/* Else fetch one logical block */
2118	ret = fetch_to_dev_buffer(scmd,
2119				  fake_storep + (lba * scsi_debug_sector_size),
2120				  scsi_debug_sector_size);
 
 
 
 
 
2121
2122	if (-1 == ret) {
2123		write_unlock_irqrestore(&atomic_rw, iflags);
2124		return (DID_ERROR << 16);
2125	} else if ((ret < (num * scsi_debug_sector_size)) &&
2126		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2127		printk(KERN_INFO "scsi_debug: write same: cdb indicated=%u, "
2128		       " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2129
2130	/* Copy first sector to remaining blocks */
2131	for (i = 1 ; i < num ; i++)
2132		memcpy(fake_storep + ((lba + i) * scsi_debug_sector_size),
2133		       fake_storep + (lba * scsi_debug_sector_size),
2134		       scsi_debug_sector_size);
2135
2136	if (scsi_debug_unmap_granularity)
2137		map_region(lba, num);
 
 
 
2138out:
2139	write_unlock_irqrestore(&atomic_rw, iflags);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2141	return 0;
2142}
2143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2144struct unmap_block_desc {
2145	__be64	lba;
2146	__be32	blocks;
2147	__be32	__reserved;
2148};
2149
2150static int resp_unmap(struct scsi_cmnd * scmd, struct sdebug_dev_info * devip)
2151{
2152	unsigned char *buf;
2153	struct unmap_block_desc *desc;
 
2154	unsigned int i, payload_len, descriptors;
2155	int ret;
2156
2157	ret = check_readiness(scmd, 1, devip);
2158	if (ret)
2159		return ret;
2160
2161	payload_len = get_unaligned_be16(&scmd->cmnd[7]);
2162	BUG_ON(scsi_bufflen(scmd) != payload_len);
2163
2164	descriptors = (payload_len - 8) / 16;
 
 
 
 
2165
2166	buf = kmalloc(scsi_bufflen(scmd), GFP_ATOMIC);
2167	if (!buf)
 
 
2168		return check_condition_result;
 
2169
2170	scsi_sg_copy_to_buffer(scmd, buf, scsi_bufflen(scmd));
2171
2172	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
2173	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
2174
2175	desc = (void *)&buf[8];
2176
 
 
2177	for (i = 0 ; i < descriptors ; i++) {
2178		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
2179		unsigned int num = get_unaligned_be32(&desc[i].blocks);
2180
2181		ret = check_device_access_params(devip, lba, num);
2182		if (ret)
2183			goto out;
2184
2185		unmap_region(lba, num);
2186	}
2187
2188	ret = 0;
2189
2190out:
 
2191	kfree(buf);
2192
2193	return ret;
2194}
2195
2196#define SDEBUG_GET_LBA_STATUS_LEN 32
2197
2198static int resp_get_lba_status(struct scsi_cmnd * scmd,
2199			       struct sdebug_dev_info * devip)
2200{
2201	unsigned long long lba;
2202	unsigned int alloc_len, mapped, num;
2203	unsigned char arr[SDEBUG_GET_LBA_STATUS_LEN];
2204	int ret;
 
2205
2206	ret = check_readiness(scmd, 1, devip);
2207	if (ret)
2208		return ret;
2209
2210	lba = get_unaligned_be64(&scmd->cmnd[2]);
2211	alloc_len = get_unaligned_be32(&scmd->cmnd[10]);
2212
2213	if (alloc_len < 24)
2214		return 0;
2215
2216	ret = check_device_access_params(devip, lba, 1);
2217	if (ret)
2218		return ret;
2219
2220	mapped = map_state(lba, &num);
 
 
 
 
 
 
 
 
 
 
 
 
2221
2222	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
2223	put_unaligned_be32(16, &arr[0]);	/* Parameter Data Length */
2224	put_unaligned_be64(lba, &arr[8]);	/* LBA */
2225	put_unaligned_be32(num, &arr[16]);	/* Number of blocks */
2226	arr[20] = !mapped;			/* mapped = 0, unmapped = 1 */
2227
2228	return fill_from_dev_buffer(scmd, arr, SDEBUG_GET_LBA_STATUS_LEN);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2229}
2230
2231#define SDEBUG_RLUN_ARR_SZ 256
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2232
2233static int resp_report_luns(struct scsi_cmnd * scp,
2234			    struct sdebug_dev_info * devip)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2235{
 
2236	unsigned int alloc_len;
2237	int lun_cnt, i, upper, num, n, wlun, lun;
2238	unsigned char *cmd = (unsigned char *)scp->cmnd;
2239	int select_report = (int)cmd[2];
2240	struct scsi_lun *one_lun;
2241	unsigned char arr[SDEBUG_RLUN_ARR_SZ];
2242	unsigned char * max_addr;
2243
2244	alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
2245	if ((alloc_len < 4) || (select_report > 2)) {
2246		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2247			       	0);
2248		return check_condition_result;
2249	}
2250	/* can produce response with up to 16k luns (lun 0 to lun 16383) */
2251	memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
2252	lun_cnt = scsi_debug_max_luns;
2253	if (1 == select_report)
 
 
 
 
 
 
 
 
 
 
 
 
2254		lun_cnt = 0;
2255	else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2256		--lun_cnt;
2257	wlun = (select_report > 0) ? 1 : 0;
2258	num = lun_cnt + wlun;
2259	arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
2260	arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
2261	n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
2262			    sizeof(struct scsi_lun)), num);
2263	if (n < num) {
2264		wlun = 0;
2265		lun_cnt = n;
2266	}
2267	one_lun = (struct scsi_lun *) &arr[8];
2268	max_addr = arr + SDEBUG_RLUN_ARR_SZ;
2269	for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
2270             ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
2271	     i++, lun++) {
2272		upper = (lun >> 8) & 0x3f;
2273		if (upper)
2274			one_lun[i].scsi_lun[0] =
2275			    (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
2276		one_lun[i].scsi_lun[1] = lun & 0xff;
2277	}
2278	if (wlun) {
2279		one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
2280		one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
2281		i++;
 
 
 
 
 
 
2282	}
2283	alloc_len = (unsigned char *)(one_lun + i) - arr;
2284	return fill_from_dev_buffer(scp, arr,
2285				    min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2286}
2287
2288static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
2289			    unsigned int num, struct sdebug_dev_info *devip)
2290{
2291	int i, j, ret = -1;
2292	unsigned char *kaddr, *buf;
2293	unsigned int offset;
2294	struct scatterlist *sg;
2295	struct scsi_data_buffer *sdb = scsi_in(scp);
2296
2297	/* better not to use temporary buffer. */
2298	buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
2299	if (!buf)
2300		return ret;
 
 
 
 
 
 
 
 
 
2301
2302	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
 
 
 
 
 
 
 
 
 
2303
2304	offset = 0;
2305	for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
2306		kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
2307		if (!kaddr)
2308			goto out;
2309
2310		for (j = 0; j < sg->length; j++)
2311			*(kaddr + sg->offset + j) ^= *(buf + offset + j);
2312
2313		offset += sg->length;
2314		kunmap_atomic(kaddr, KM_USER0);
 
 
 
2315	}
2316	ret = 0;
2317out:
2318	kfree(buf);
2319
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2320	return ret;
2321}
2322
2323/* When timer goes off this function is called. */
2324static void timer_intr_handler(unsigned long indx)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2325{
2326	struct sdebug_queued_cmd * sqcp;
 
 
2327	unsigned long iflags;
 
 
 
 
2328
2329	if (indx >= scsi_debug_max_queue) {
2330		printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
2331		       "large\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2332		return;
2333	}
2334	spin_lock_irqsave(&queued_arr_lock, iflags);
2335	sqcp = &queued_arr[(int)indx];
2336	if (! sqcp->in_use) {
2337		printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
2338		       "interrupt\n");
2339		spin_unlock_irqrestore(&queued_arr_lock, iflags);
 
 
 
 
 
 
2340		return;
2341	}
2342	sqcp->in_use = 0;
2343	if (sqcp->done_funct) {
2344		sqcp->a_cmnd->result = sqcp->scsi_result;
2345		sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2346	}
2347	sqcp->done_funct = NULL;
2348	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2349}
2350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2351
2352static struct sdebug_dev_info *
2353sdebug_device_create(struct sdebug_host_info *sdbg_host, gfp_t flags)
2354{
2355	struct sdebug_dev_info *devip;
2356
2357	devip = kzalloc(sizeof(*devip), flags);
2358	if (devip) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2359		devip->sdbg_host = sdbg_host;
 
 
2360		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
2361	}
2362	return devip;
2363}
2364
2365static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2366{
2367	struct sdebug_host_info * sdbg_host;
2368	struct sdebug_dev_info * open_devip = NULL;
2369	struct sdebug_dev_info * devip =
2370			(struct sdebug_dev_info *)sdev->hostdata;
2371
2372	if (devip)
2373		return devip;
2374	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
2375	if (!sdbg_host) {
2376                printk(KERN_ERR "Host info NULL\n");
2377		return NULL;
2378        }
 
2379	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2380		if ((devip->used) && (devip->channel == sdev->channel) &&
2381                    (devip->target == sdev->id) &&
2382                    (devip->lun == sdev->lun))
2383                        return devip;
2384		else {
2385			if ((!devip->used) && (!open_devip))
2386				open_devip = devip;
2387		}
2388	}
2389	if (!open_devip) { /* try and make a new one */
2390		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
2391		if (!open_devip) {
2392			printk(KERN_ERR "%s: out of memory at line %d\n",
2393				__func__, __LINE__);
2394			return NULL;
2395		}
2396	}
2397
2398	open_devip->channel = sdev->channel;
2399	open_devip->target = sdev->id;
2400	open_devip->lun = sdev->lun;
2401	open_devip->sdbg_host = sdbg_host;
2402	open_devip->reset = 1;
2403	open_devip->used = 1;
2404	memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
2405	if (scsi_debug_dsense)
2406		open_devip->sense_buff[0] = 0x72;
2407	else {
2408		open_devip->sense_buff[0] = 0x70;
2409		open_devip->sense_buff[7] = 0xa;
2410	}
2411	if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2412		open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2413
2414	return open_devip;
2415}
2416
2417static int scsi_debug_slave_alloc(struct scsi_device *sdp)
2418{
2419	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2420		printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
2421		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2422	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
2423	return 0;
2424}
2425
2426static int scsi_debug_slave_configure(struct scsi_device *sdp)
2427{
2428	struct sdebug_dev_info *devip;
 
2429
2430	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2431		printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
2432		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2433	if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
2434		sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
2435	devip = devInfoReg(sdp);
2436	if (NULL == devip)
2437		return 1;	/* no resources, will be marked offline */
 
 
2438	sdp->hostdata = devip;
2439	if (sdp->host->cmd_per_lun)
2440		scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
2441					sdp->host->cmd_per_lun);
2442	blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
2443	if (scsi_debug_no_uld)
2444		sdp->no_uld_attach = 1;
 
2445	return 0;
2446}
2447
2448static void scsi_debug_slave_destroy(struct scsi_device *sdp)
2449{
2450	struct sdebug_dev_info *devip =
2451		(struct sdebug_dev_info *)sdp->hostdata;
2452
2453	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2454		printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
2455		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2456	if (devip) {
2457		/* make this slot available for re-use */
2458		devip->used = 0;
2459		sdp->hostdata = NULL;
2460	}
2461}
2462
2463/* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2464static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
 
 
 
 
 
 
 
 
 
 
 
 
2465{
2466	unsigned long iflags;
2467	int k;
 
 
2468	struct sdebug_queued_cmd *sqcp;
 
 
2469
2470	spin_lock_irqsave(&queued_arr_lock, iflags);
2471	for (k = 0; k < scsi_debug_max_queue; ++k) {
2472		sqcp = &queued_arr[k];
2473		if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2474			del_timer_sync(&sqcp->cmnd_timer);
2475			sqcp->in_use = 0;
2476			sqcp->a_cmnd = NULL;
2477			break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2478		}
 
2479	}
2480	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2481	return (k < scsi_debug_max_queue) ? 1 : 0;
2482}
2483
2484/* Deletes (stops) timers of all queued commands */
2485static void stop_all_queued(void)
2486{
2487	unsigned long iflags;
2488	int k;
 
 
2489	struct sdebug_queued_cmd *sqcp;
 
 
2490
2491	spin_lock_irqsave(&queued_arr_lock, iflags);
2492	for (k = 0; k < scsi_debug_max_queue; ++k) {
2493		sqcp = &queued_arr[k];
2494		if (sqcp->in_use && sqcp->a_cmnd) {
2495			del_timer_sync(&sqcp->cmnd_timer);
2496			sqcp->in_use = 0;
2497			sqcp->a_cmnd = NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2498		}
 
2499	}
2500	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2501}
2502
2503static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
 
2504{
2505	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2506		printk(KERN_INFO "scsi_debug: abort\n");
2507	++num_aborts;
2508	stop_queued_cmnd(SCpnt);
2509	return SUCCESS;
 
 
 
 
 
 
2510}
2511
2512static int scsi_debug_biosparam(struct scsi_device *sdev,
2513		struct block_device * bdev, sector_t capacity, int *info)
2514{
2515	int res;
2516	unsigned char *buf;
2517
2518	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2519		printk(KERN_INFO "scsi_debug: biosparam\n");
2520	buf = scsi_bios_ptable(bdev);
2521	if (buf) {
2522		res = scsi_partsize(buf, capacity,
2523				    &info[2], &info[0], &info[1]);
2524		kfree(buf);
2525		if (! res)
2526			return res;
2527	}
2528	info[0] = sdebug_heads;
2529	info[1] = sdebug_sectors_per;
2530	info[2] = sdebug_cylinders_per;
2531	return 0;
2532}
2533
2534static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2535{
2536	struct sdebug_dev_info * devip;
2537
2538	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2539		printk(KERN_INFO "scsi_debug: device_reset\n");
2540	++num_dev_resets;
2541	if (SCpnt) {
2542		devip = devInfoReg(SCpnt->device);
 
 
 
 
 
2543		if (devip)
2544			devip->reset = 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2545	}
 
 
 
 
2546	return SUCCESS;
2547}
2548
2549static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2550{
2551	struct sdebug_host_info *sdbg_host;
2552        struct sdebug_dev_info * dev_info;
2553        struct scsi_device * sdp;
2554        struct Scsi_Host * hp;
 
2555
2556	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2557		printk(KERN_INFO "scsi_debug: bus_reset\n");
2558	++num_bus_resets;
2559	if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
 
 
 
 
 
 
2560		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2561		if (sdbg_host) {
2562			list_for_each_entry(dev_info,
2563                                            &sdbg_host->dev_info_list,
2564                                            dev_list)
2565				dev_info->reset = 1;
 
 
2566		}
2567	}
 
 
 
 
2568	return SUCCESS;
2569}
2570
2571static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2572{
2573	struct sdebug_host_info * sdbg_host;
2574        struct sdebug_dev_info * dev_info;
 
2575
2576	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2577		printk(KERN_INFO "scsi_debug: host_reset\n");
2578	++num_host_resets;
2579        spin_lock(&sdebug_host_list_lock);
2580        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2581                list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
2582                                    dev_list)
2583                        dev_info->reset = 1;
2584        }
2585        spin_unlock(&sdebug_host_list_lock);
 
 
 
 
2586	stop_all_queued();
 
 
 
2587	return SUCCESS;
2588}
2589
2590/* Initializes timers in queued array */
2591static void __init init_all_queued(void)
2592{
2593	unsigned long iflags;
2594	int k;
2595	struct sdebug_queued_cmd * sqcp;
2596
2597	spin_lock_irqsave(&queued_arr_lock, iflags);
2598	for (k = 0; k < scsi_debug_max_queue; ++k) {
2599		sqcp = &queued_arr[k];
2600		init_timer(&sqcp->cmnd_timer);
2601		sqcp->in_use = 0;
2602		sqcp->a_cmnd = NULL;
2603	}
2604	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2605}
2606
2607static void __init sdebug_build_parts(unsigned char *ramp,
2608				      unsigned long store_size)
2609{
2610	struct partition * pp;
2611	int starts[SDEBUG_MAX_PARTS + 2];
2612	int sectors_per_part, num_sectors, k;
2613	int heads_by_sects, start_sec, end_sec;
2614
2615	/* assume partition table already zeroed */
2616	if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
2617		return;
2618	if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2619		scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2620		printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2621				    "partitions to %d\n", SDEBUG_MAX_PARTS);
2622	}
2623	num_sectors = (int)sdebug_store_sectors;
2624	sectors_per_part = (num_sectors - sdebug_sectors_per)
2625			   / scsi_debug_num_parts;
2626	heads_by_sects = sdebug_heads * sdebug_sectors_per;
2627        starts[0] = sdebug_sectors_per;
2628	for (k = 1; k < scsi_debug_num_parts; ++k)
 
2629		starts[k] = ((k * sectors_per_part) / heads_by_sects)
2630			    * heads_by_sects;
2631	starts[scsi_debug_num_parts] = num_sectors;
2632	starts[scsi_debug_num_parts + 1] = 0;
 
 
 
2633
2634	ramp[510] = 0x55;	/* magic partition markings */
2635	ramp[511] = 0xAA;
2636	pp = (struct partition *)(ramp + 0x1be);
2637	for (k = 0; starts[k + 1]; ++k, ++pp) {
2638		start_sec = starts[k];
2639		end_sec = starts[k + 1] - 1;
2640		pp->boot_ind = 0;
2641
2642		pp->cyl = start_sec / heads_by_sects;
2643		pp->head = (start_sec - (pp->cyl * heads_by_sects))
2644			   / sdebug_sectors_per;
2645		pp->sector = (start_sec % sdebug_sectors_per) + 1;
2646
2647		pp->end_cyl = end_sec / heads_by_sects;
2648		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2649			       / sdebug_sectors_per;
2650		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2651
2652		pp->start_sect = start_sec;
2653		pp->nr_sects = end_sec - start_sec + 1;
2654		pp->sys_ind = 0x83;	/* plain Linux partition */
2655	}
2656}
2657
2658static int schedule_resp(struct scsi_cmnd * cmnd,
2659			 struct sdebug_dev_info * devip,
2660			 done_funct_t done, int scsi_result, int delta_jiff)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2661{
2662	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2663		if (scsi_result) {
2664			struct scsi_device * sdp = cmnd->device;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2665
2666			printk(KERN_INFO "scsi_debug:    <%u %u %u %u> "
2667			       "non-zero result=0x%x\n", sdp->host->host_no,
2668			       sdp->channel, sdp->id, sdp->lun, scsi_result);
2669		}
2670	}
2671	if (cmnd && devip) {
2672		/* simulate autosense by this driver */
2673		if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2674			memcpy(cmnd->sense_buffer, devip->sense_buff,
2675			       (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2676			       SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2677	}
2678	if (delta_jiff <= 0) {
2679		if (cmnd)
2680			cmnd->result = scsi_result;
2681		if (done)
2682			done(cmnd);
2683		return 0;
 
 
 
 
 
 
 
 
 
2684	} else {
2685		unsigned long iflags;
2686		int k;
2687		struct sdebug_queued_cmd * sqcp = NULL;
2688
2689		spin_lock_irqsave(&queued_arr_lock, iflags);
2690		for (k = 0; k < scsi_debug_max_queue; ++k) {
2691			sqcp = &queued_arr[k];
2692			if (! sqcp->in_use)
2693				break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2694		}
2695		if (k >= scsi_debug_max_queue) {
2696			spin_unlock_irqrestore(&queued_arr_lock, iflags);
2697			printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2698			return 1;	/* report busy to mid level */
2699		}
2700		sqcp->in_use = 1;
2701		sqcp->a_cmnd = cmnd;
2702		sqcp->scsi_result = scsi_result;
2703		sqcp->done_funct = done;
2704		sqcp->cmnd_timer.function = timer_intr_handler;
2705		sqcp->cmnd_timer.data = k;
2706		sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2707		add_timer(&sqcp->cmnd_timer);
2708		spin_unlock_irqrestore(&queued_arr_lock, iflags);
2709		if (cmnd)
2710			cmnd->result = 0;
2711		return 0;
2712	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2713}
 
2714/* Note: The following macros create attribute files in the
2715   /sys/module/scsi_debug/parameters directory. Unfortunately this
2716   driver is unaware of a change and cannot trigger auxiliary actions
2717   as it can when the corresponding attribute in the
2718   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2719 */
2720module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2721module_param_named(ato, scsi_debug_ato, int, S_IRUGO);
2722module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2723module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2724module_param_named(dif, scsi_debug_dif, int, S_IRUGO);
2725module_param_named(dix, scsi_debug_dix, int, S_IRUGO);
2726module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2727module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2728module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2729module_param_named(guard, scsi_debug_guard, int, S_IRUGO);
2730module_param_named(lbpu, scsi_debug_lbpu, int, S_IRUGO);
2731module_param_named(lbpws, scsi_debug_lbpws, int, S_IRUGO);
2732module_param_named(lbpws10, scsi_debug_lbpws10, int, S_IRUGO);
2733module_param_named(lowest_aligned, scsi_debug_lowest_aligned, int, S_IRUGO);
2734module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2735module_param_named(max_queue, scsi_debug_max_queue, int, S_IRUGO | S_IWUSR);
2736module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2737module_param_named(no_uld, scsi_debug_no_uld, int, S_IRUGO);
2738module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2739module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2740module_param_named(opt_blks, scsi_debug_opt_blks, int, S_IRUGO);
2741module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2742module_param_named(physblk_exp, scsi_debug_physblk_exp, int, S_IRUGO);
2743module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2744module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2745module_param_named(sector_size, scsi_debug_sector_size, int, S_IRUGO);
2746module_param_named(unmap_alignment, scsi_debug_unmap_alignment, int, S_IRUGO);
2747module_param_named(unmap_granularity, scsi_debug_unmap_granularity, int, S_IRUGO);
2748module_param_named(unmap_max_blocks, scsi_debug_unmap_max_blocks, int, S_IRUGO);
2749module_param_named(unmap_max_desc, scsi_debug_unmap_max_desc, int, S_IRUGO);
2750module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2751module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2752		   S_IRUGO | S_IWUSR);
2753module_param_named(write_same_length, scsi_debug_write_same_length, int,
 
 
 
 
 
 
 
 
 
2754		   S_IRUGO | S_IWUSR);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2755
2756MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2757MODULE_DESCRIPTION("SCSI debug adapter driver");
2758MODULE_LICENSE("GPL");
2759MODULE_VERSION(SCSI_DEBUG_VERSION);
2760
2761MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2762MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
2763MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2764MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
 
 
2765MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
2766MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
2767MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2768MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2769MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2770MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
 
 
 
 
 
 
 
 
 
2771MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
2772MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
2773MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
2774MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
 
2775MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2776MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to 255(def))");
 
 
 
2777MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
 
2778MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
2779MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2780MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2781MODULE_PARM_DESC(opt_blks, "optimal transfer length in block (def=64)");
 
2782MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
 
2783MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
 
2784MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2785MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
 
 
2786MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
 
 
 
 
2787MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
2788MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
2789MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
2790MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
2791MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
 
 
2792MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
 
2793MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
 
 
 
 
 
2794
2795static char sdebug_info[256];
 
2796
2797static const char * scsi_debug_info(struct Scsi_Host * shp)
2798{
2799	sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2800		"dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2801		scsi_debug_version_date, scsi_debug_dev_size_mb,
2802		scsi_debug_opts);
 
 
 
 
 
 
2803	return sdebug_info;
2804}
2805
2806/* scsi_debug_proc_info
2807 * Used if the driver currently has no own support for /proc/scsi
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2808 */
2809static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2810				int length, int inout)
2811{
2812	int len, pos, begin;
2813	int orig_length;
2814
2815	orig_length = length;
2816
2817	if (inout == 1) {
2818		char arr[16];
2819		int minLen = length > 15 ? 15 : length;
2820
2821		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2822			return -EACCES;
2823		memcpy(arr, buffer, minLen);
2824		arr[minLen] = '\0';
2825		if (1 != sscanf(arr, "%d", &pos))
2826			return -EINVAL;
2827		scsi_debug_opts = pos;
2828		if (scsi_debug_every_nth != 0)
2829                        scsi_debug_cmnd_count = 0;
2830		return length;
2831	}
2832	begin = 0;
2833	pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2834	    "%s [%s]\n"
2835	    "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2836	    "every_nth=%d(curr:%d)\n"
2837	    "delay=%d, max_luns=%d, scsi_level=%d\n"
2838	    "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2839	    "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2840	    "host_resets=%d\ndix_reads=%d dix_writes=%d dif_errors=%d\n",
2841	    SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2842	    scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2843	    scsi_debug_cmnd_count, scsi_debug_delay,
2844	    scsi_debug_max_luns, scsi_debug_scsi_level,
2845	    scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
2846	    sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,
2847	    num_host_resets, dix_reads, dix_writes, dif_errors);
2848	if (pos < offset) {
2849		len = 0;
2850		begin = pos;
2851	}
2852	*start = buffer + (offset - begin);	/* Start of wanted data */
2853	len -= (offset - begin);
2854	if (len > length)
2855		len = length;
2856	return len;
2857}
 
2858
2859static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2860{
2861        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2862}
2863
2864static ssize_t sdebug_delay_store(struct device_driver * ddp,
2865				  const char * buf, size_t count)
2866{
2867        int delay;
2868	char work[20];
2869
2870        if (1 == sscanf(buf, "%10s", work)) {
2871		if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2872			scsi_debug_delay = delay;
2873			return count;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2874		}
 
2875	}
2876	return -EINVAL;
2877}
2878DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2879	    sdebug_delay_store);
2880
2881static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2882{
2883        return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2884}
2885
2886static ssize_t sdebug_opts_store(struct device_driver * ddp,
2887				 const char * buf, size_t count)
2888{
2889        int opts;
2890	char work[20];
2891
2892        if (1 == sscanf(buf, "%10s", work)) {
2893		if (0 == strnicmp(work,"0x", 2)) {
2894			if (1 == sscanf(&work[2], "%x", &opts))
2895				goto opts_done;
2896		} else {
2897			if (1 == sscanf(work, "%d", &opts))
2898				goto opts_done;
2899		}
2900	}
2901	return -EINVAL;
2902opts_done:
2903	scsi_debug_opts = opts;
2904	scsi_debug_cmnd_count = 0;
 
 
2905	return count;
2906}
2907DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2908	    sdebug_opts_store);
2909
2910static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2911{
2912        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2913}
2914static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2915				  const char * buf, size_t count)
2916{
2917        int n;
 
 
 
 
2918
2919	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2920		scsi_debug_ptype = n;
 
 
2921		return count;
2922	}
2923	return -EINVAL;
2924}
2925DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2926
2927static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2928{
2929        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2930}
2931static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2932				  const char * buf, size_t count)
2933{
2934        int n;
2935
2936	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2937		scsi_debug_dsense = n;
2938		return count;
2939	}
2940	return -EINVAL;
2941}
2942DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2943	    sdebug_dsense_store);
2944
2945static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2946{
2947        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2948}
2949static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2950				    const char * buf, size_t count)
2951{
2952        int n;
2953
2954	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2955		scsi_debug_fake_rw = n;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2956		return count;
2957	}
2958	return -EINVAL;
2959}
2960DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2961	    sdebug_fake_rw_store);
2962
2963static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2964{
2965        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2966}
2967static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2968				     const char * buf, size_t count)
2969{
2970        int n;
2971
2972	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2973		scsi_debug_no_lun_0 = n;
2974		return count;
2975	}
2976	return -EINVAL;
2977}
2978DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2979	    sdebug_no_lun_0_store);
2980
2981static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2982{
2983        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2984}
2985static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2986				     const char * buf, size_t count)
2987{
2988        int n;
2989
2990	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2991		scsi_debug_num_tgts = n;
2992		sdebug_max_tgts_luns();
2993		return count;
2994	}
2995	return -EINVAL;
2996}
2997DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2998	    sdebug_num_tgts_store);
2999
3000static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
3001{
3002        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
3003}
3004DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
3005
3006static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
3007{
3008        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
3009}
3010DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
3011
3012static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
 
3013{
3014        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
 
 
 
 
 
 
3015}
3016static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
3017				      const char * buf, size_t count)
 
3018{
3019        int nth;
 
 
3020
3021	if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
3022		scsi_debug_every_nth = nth;
3023		scsi_debug_cmnd_count = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3024		return count;
3025	}
3026	return -EINVAL;
3027}
3028DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
3029	    sdebug_every_nth_store);
3030
3031static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
3032{
3033        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
3034}
3035static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
3036				     const char * buf, size_t count)
3037{
3038        int n;
 
3039
3040	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3041		scsi_debug_max_luns = n;
 
 
 
 
 
3042		sdebug_max_tgts_luns();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3043		return count;
3044	}
3045	return -EINVAL;
3046}
3047DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
3048	    sdebug_max_luns_store);
3049
3050static ssize_t sdebug_max_queue_show(struct device_driver * ddp, char * buf)
3051{
3052        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_queue);
3053}
3054static ssize_t sdebug_max_queue_store(struct device_driver * ddp,
3055				      const char * buf, size_t count)
 
 
3056{
3057        int n;
 
3058
3059	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
3060	    (n <= SCSI_DEBUG_CANQUEUE)) {
3061		scsi_debug_max_queue = n;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3062		return count;
3063	}
3064	return -EINVAL;
3065}
3066DRIVER_ATTR(max_queue, S_IRUGO | S_IWUSR, sdebug_max_queue_show,
3067	    sdebug_max_queue_store);
3068
3069static ssize_t sdebug_no_uld_show(struct device_driver * ddp, char * buf)
3070{
3071        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_uld);
3072}
3073DRIVER_ATTR(no_uld, S_IRUGO, sdebug_no_uld_show, NULL);
3074
3075static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
3076{
3077        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
3078}
3079DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
3080
3081static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
3082{
3083        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
 
 
 
 
 
 
3084}
3085static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
3086				       const char * buf, size_t count)
 
 
 
 
 
 
 
3087{
3088        int n;
 
 
3089
3090	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3091		scsi_debug_virtual_gb = n;
 
 
 
3092
3093		sdebug_capacity = get_sdebug_capacity();
 
 
 
 
 
 
 
 
3094
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3095		return count;
3096	}
3097	return -EINVAL;
3098}
3099DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
3100	    sdebug_virtual_gb_store);
3101
3102static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
3103{
3104        return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
 
3105}
3106
3107static ssize_t sdebug_add_host_store(struct device_driver * ddp,
3108				     const char * buf, size_t count)
3109{
 
 
 
 
3110	int delta_hosts;
3111
3112	if (sscanf(buf, "%d", &delta_hosts) != 1)
3113		return -EINVAL;
3114	if (delta_hosts > 0) {
3115		do {
3116			sdebug_add_adapter();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3117		} while (--delta_hosts);
3118	} else if (delta_hosts < 0) {
3119		do {
3120			sdebug_remove_adapter();
3121		} while (++delta_hosts);
3122	}
3123	return count;
3124}
3125DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
3126	    sdebug_add_host_store);
3127
3128static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
3129					  char * buf)
3130{
3131	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
3132}
3133static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
3134					   const char * buf, size_t count)
3135{
3136	int n;
3137
3138	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3139		scsi_debug_vpd_use_hostno = n;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3140		return count;
3141	}
3142	return -EINVAL;
3143}
3144DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
3145	    sdebug_vpd_use_hostno_store);
3146
3147static ssize_t sdebug_sector_size_show(struct device_driver * ddp, char * buf)
3148{
3149	return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_sector_size);
3150}
3151DRIVER_ATTR(sector_size, S_IRUGO, sdebug_sector_size_show, NULL);
3152
3153static ssize_t sdebug_dix_show(struct device_driver *ddp, char *buf)
3154{
3155	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dix);
3156}
3157DRIVER_ATTR(dix, S_IRUGO, sdebug_dix_show, NULL);
3158
3159static ssize_t sdebug_dif_show(struct device_driver *ddp, char *buf)
3160{
3161	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dif);
3162}
3163DRIVER_ATTR(dif, S_IRUGO, sdebug_dif_show, NULL);
3164
3165static ssize_t sdebug_guard_show(struct device_driver *ddp, char *buf)
3166{
3167	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_guard);
3168}
3169DRIVER_ATTR(guard, S_IRUGO, sdebug_guard_show, NULL);
3170
3171static ssize_t sdebug_ato_show(struct device_driver *ddp, char *buf)
3172{
3173	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ato);
3174}
3175DRIVER_ATTR(ato, S_IRUGO, sdebug_ato_show, NULL);
3176
3177static ssize_t sdebug_map_show(struct device_driver *ddp, char *buf)
3178{
3179	ssize_t count;
 
 
 
 
 
 
3180
3181	if (!scsi_debug_lbp())
3182		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
3183				 sdebug_store_sectors);
3184
3185	count = bitmap_scnlistprintf(buf, PAGE_SIZE, map_storep, map_size);
 
3186
 
 
 
 
3187	buf[count++] = '\n';
3188	buf[count++] = 0;
3189
3190	return count;
3191}
3192DRIVER_ATTR(map, S_IRUGO, sdebug_map_show, NULL);
 
 
 
 
 
3193
 
 
 
 
3194
3195/* Note: The following function creates attribute files in the
3196   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
3197   files (over those found in the /sys/module/scsi_debug/parameters
3198   directory) is that auxiliary actions can be triggered when an attribute
3199   is changed. For example see: sdebug_add_host_store() above.
3200 */
3201static int do_create_driverfs_files(void)
 
 
3202{
3203	int ret;
 
 
 
 
 
3204
3205	ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3206	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
3207	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3208	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3209	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3210	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3211	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3212	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_queue);
3213	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3214	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_uld);
3215	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3216	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3217	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3218	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
3219	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3220	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3221	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3222	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3223	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dix);
3224	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dif);
3225	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_guard);
3226	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ato);
3227	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_map);
3228	return ret;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3229}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3230
3231static void do_remove_driverfs_files(void)
3232{
3233	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_map);
3234	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ato);
3235	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_guard);
3236	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dif);
3237	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dix);
3238	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3239	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3240	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3241	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3242	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
3243	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3244	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3245	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3246	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_uld);
3247	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3248	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_queue);
3249	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3250	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3251	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3252	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3253	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3254	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
3255	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3256}
 
3257
3258struct device *pseudo_primary;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3259
3260static int __init scsi_debug_init(void)
3261{
 
3262	unsigned long sz;
3263	int host_to_add;
3264	int k;
3265	int ret;
3266
3267	switch (scsi_debug_sector_size) {
 
 
 
 
 
 
 
 
 
 
3268	case  512:
3269	case 1024:
3270	case 2048:
3271	case 4096:
3272		break;
3273	default:
3274		printk(KERN_ERR "scsi_debug_init: invalid sector_size %d\n",
3275		       scsi_debug_sector_size);
3276		return -EINVAL;
3277	}
3278
3279	switch (scsi_debug_dif) {
3280
3281	case SD_DIF_TYPE0_PROTECTION:
3282	case SD_DIF_TYPE1_PROTECTION:
3283	case SD_DIF_TYPE2_PROTECTION:
3284	case SD_DIF_TYPE3_PROTECTION:
 
3285		break;
3286
3287	default:
3288		printk(KERN_ERR "scsi_debug_init: dif must be 0, 1, 2 or 3\n");
 
 
 
 
 
3289		return -EINVAL;
3290	}
3291
3292	if (scsi_debug_guard > 1) {
3293		printk(KERN_ERR "scsi_debug_init: guard must be 0 or 1\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3294		return -EINVAL;
3295	}
3296
3297	if (scsi_debug_ato > 1) {
3298		printk(KERN_ERR "scsi_debug_init: ato must be 0 or 1\n");
3299		return -EINVAL;
3300	}
3301
3302	if (scsi_debug_physblk_exp > 15) {
3303		printk(KERN_ERR "scsi_debug_init: invalid physblk_exp %u\n",
3304		       scsi_debug_physblk_exp);
3305		return -EINVAL;
3306	}
3307
3308	if (scsi_debug_lowest_aligned > 0x3fff) {
3309		printk(KERN_ERR "scsi_debug_init: lowest_aligned too big: %u\n",
3310		       scsi_debug_lowest_aligned);
 
3311		return -EINVAL;
3312	}
3313
3314	if (scsi_debug_dev_size_mb < 1)
3315		scsi_debug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
3316	sz = (unsigned long)scsi_debug_dev_size_mb * 1048576;
3317	sdebug_store_sectors = sz / scsi_debug_sector_size;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3318	sdebug_capacity = get_sdebug_capacity();
3319
3320	/* play around with geometry, don't waste too much on track 0 */
3321	sdebug_heads = 8;
3322	sdebug_sectors_per = 32;
3323	if (scsi_debug_dev_size_mb >= 16)
3324		sdebug_heads = 32;
3325	else if (scsi_debug_dev_size_mb >= 256)
3326		sdebug_heads = 64;
 
 
3327	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3328			       (sdebug_sectors_per * sdebug_heads);
3329	if (sdebug_cylinders_per >= 1024) {
3330		/* other LLDs do this; implies >= 1GB ram disk ... */
3331		sdebug_heads = 255;
3332		sdebug_sectors_per = 63;
3333		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3334			       (sdebug_sectors_per * sdebug_heads);
3335	}
3336
3337	fake_storep = vmalloc(sz);
3338	if (NULL == fake_storep) {
3339		printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
3340		return -ENOMEM;
3341	}
3342	memset(fake_storep, 0, sz);
3343	if (scsi_debug_num_parts > 0)
3344		sdebug_build_parts(fake_storep, sz);
3345
3346	if (scsi_debug_dif) {
3347		int dif_size;
3348
3349		dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
3350		dif_storep = vmalloc(dif_size);
3351
3352		printk(KERN_ERR "scsi_debug_init: dif_storep %u bytes @ %p\n",
3353		       dif_size, dif_storep);
3354
3355		if (dif_storep == NULL) {
3356			printk(KERN_ERR "scsi_debug_init: out of mem. (DIX)\n");
3357			ret = -ENOMEM;
3358			goto free_vm;
3359		}
3360
3361		memset(dif_storep, 0xff, dif_size);
3362	}
3363
3364	/* Logical Block Provisioning */
3365	if (scsi_debug_lbp()) {
3366		unsigned int map_bytes;
3367
3368		scsi_debug_unmap_max_blocks =
3369			clamp(scsi_debug_unmap_max_blocks, 0U, 0xffffffffU);
3370
3371		scsi_debug_unmap_max_desc =
3372			clamp(scsi_debug_unmap_max_desc, 0U, 256U);
3373
3374		scsi_debug_unmap_granularity =
3375			clamp(scsi_debug_unmap_granularity, 1U, 0xffffffffU);
3376
3377		if (scsi_debug_unmap_alignment &&
3378		    scsi_debug_unmap_granularity < scsi_debug_unmap_alignment) {
3379			printk(KERN_ERR
3380			       "%s: ERR: unmap_granularity < unmap_alignment\n",
3381			       __func__);
3382			return -EINVAL;
3383		}
3384
3385		map_size = (sdebug_store_sectors / scsi_debug_unmap_granularity);
3386		map_bytes = map_size >> 3;
3387		map_storep = vmalloc(map_bytes);
3388
3389		printk(KERN_INFO "scsi_debug_init: %lu provisioning blocks\n",
3390		       map_size);
3391
3392		if (map_storep == NULL) {
3393			printk(KERN_ERR "scsi_debug_init: out of mem. (MAP)\n");
3394			ret = -ENOMEM;
3395			goto free_vm;
 
 
 
 
 
 
 
 
 
 
3396		}
3397
3398		memset(map_storep, 0x0, map_bytes);
3399
3400		/* Map first 1KB for partition table */
3401		if (scsi_debug_num_parts)
3402			map_region(0, 2);
3403	}
3404
3405	pseudo_primary = root_device_register("pseudo_0");
3406	if (IS_ERR(pseudo_primary)) {
3407		printk(KERN_WARNING "scsi_debug: root_device_register() error\n");
3408		ret = PTR_ERR(pseudo_primary);
3409		goto free_vm;
3410	}
3411	ret = bus_register(&pseudo_lld_bus);
3412	if (ret < 0) {
3413		printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
3414			ret);
3415		goto dev_unreg;
3416	}
3417	ret = driver_register(&sdebug_driverfs_driver);
3418	if (ret < 0) {
3419		printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
3420			ret);
3421		goto bus_unreg;
3422	}
3423	ret = do_create_driverfs_files();
3424	if (ret < 0) {
3425		printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
3426			ret);
3427		goto del_files;
3428	}
3429
3430	init_all_queued();
3431
3432	host_to_add = scsi_debug_add_host;
3433        scsi_debug_add_host = 0;
3434
3435        for (k = 0; k < host_to_add; k++) {
3436                if (sdebug_add_adapter()) {
3437                        printk(KERN_ERR "scsi_debug_init: "
3438                               "sdebug_add_adapter failed k=%d\n", k);
3439                        break;
3440                }
3441        }
3442
3443	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
3444		printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
3445		       scsi_debug_add_host);
3446	}
 
 
 
3447	return 0;
3448
3449del_files:
3450	do_remove_driverfs_files();
3451	driver_unregister(&sdebug_driverfs_driver);
3452bus_unreg:
3453	bus_unregister(&pseudo_lld_bus);
3454dev_unreg:
3455	root_device_unregister(pseudo_primary);
3456free_vm:
3457	if (map_storep)
3458		vfree(map_storep);
3459	if (dif_storep)
3460		vfree(dif_storep);
3461	vfree(fake_storep);
3462
3463	return ret;
3464}
3465
3466static void __exit scsi_debug_exit(void)
3467{
3468	int k = scsi_debug_add_host;
3469
3470	stop_all_queued();
3471	for (; k; k--)
3472		sdebug_remove_adapter();
3473	do_remove_driverfs_files();
3474	driver_unregister(&sdebug_driverfs_driver);
3475	bus_unregister(&pseudo_lld_bus);
3476	root_device_unregister(pseudo_primary);
3477
3478	if (dif_storep)
3479		vfree(dif_storep);
3480
3481	vfree(fake_storep);
3482}
3483
3484device_initcall(scsi_debug_init);
3485module_exit(scsi_debug_exit);
3486
3487static void sdebug_release_adapter(struct device * dev)
3488{
3489        struct sdebug_host_info *sdbg_host;
3490
3491	sdbg_host = to_sdebug_host(dev);
3492        kfree(sdbg_host);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3493}
3494
3495static int sdebug_add_adapter(void)
3496{
3497	int k, devs_per_host;
3498        int error = 0;
3499        struct sdebug_host_info *sdbg_host;
3500	struct sdebug_dev_info *sdbg_devinfo, *tmp;
3501
3502        sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
3503        if (NULL == sdbg_host) {
3504                printk(KERN_ERR "%s: out of memory at line %d\n",
3505                       __func__, __LINE__);
3506                return -ENOMEM;
3507        }
 
3508
3509        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
3510
3511	devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
3512        for (k = 0; k < devs_per_host; k++) {
3513		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
3514		if (!sdbg_devinfo) {
3515                        printk(KERN_ERR "%s: out of memory at line %d\n",
3516                               __func__, __LINE__);
3517                        error = -ENOMEM;
3518			goto clean;
3519                }
3520        }
3521
3522        spin_lock(&sdebug_host_list_lock);
3523        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
3524        spin_unlock(&sdebug_host_list_lock);
3525
3526        sdbg_host->dev.bus = &pseudo_lld_bus;
3527        sdbg_host->dev.parent = pseudo_primary;
3528        sdbg_host->dev.release = &sdebug_release_adapter;
3529        dev_set_name(&sdbg_host->dev, "adapter%d", scsi_debug_add_host);
3530
3531        error = device_register(&sdbg_host->dev);
 
 
3532
3533        if (error)
 
 
 
 
 
 
 
 
 
3534		goto clean;
 
3535
3536	++scsi_debug_add_host;
3537        return error;
3538
3539clean:
3540	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3541				 dev_list) {
3542		list_del(&sdbg_devinfo->dev_list);
 
3543		kfree(sdbg_devinfo);
3544	}
 
 
 
 
 
 
 
3545
3546	kfree(sdbg_host);
3547        return error;
 
 
 
 
 
 
 
 
3548}
3549
3550static void sdebug_remove_adapter(void)
3551{
3552        struct sdebug_host_info * sdbg_host = NULL;
 
 
3553
3554        spin_lock(&sdebug_host_list_lock);
3555        if (!list_empty(&sdebug_host_list)) {
3556                sdbg_host = list_entry(sdebug_host_list.prev,
3557                                       struct sdebug_host_info, host_list);
3558		list_del(&sdbg_host->host_list);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3559	}
3560        spin_unlock(&sdebug_host_list_lock);
 
 
3561
3562	if (!sdbg_host)
3563		return;
3564
3565        device_unregister(&sdbg_host->dev);
3566        --scsi_debug_add_host;
3567}
3568
3569static
3570int scsi_debug_queuecommand_lck(struct scsi_cmnd *SCpnt, done_funct_t done)
3571{
3572	unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
3573	int len, k;
3574	unsigned int num;
3575	unsigned long long lba;
3576	u32 ei_lba;
3577	int errsts = 0;
3578	int target = SCpnt->device->id;
3579	struct sdebug_dev_info *devip = NULL;
3580	int inj_recovered = 0;
3581	int inj_transport = 0;
3582	int inj_dif = 0;
3583	int inj_dix = 0;
3584	int delay_override = 0;
3585	int unmap = 0;
3586
3587	scsi_set_resid(SCpnt, 0);
3588	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
3589		printk(KERN_INFO "scsi_debug: cmd ");
3590		for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
3591			printk("%02x ", (int)cmd[k]);
3592		printk("\n");
3593	}
3594
3595	if (target == SCpnt->device->host->hostt->this_id) {
3596		printk(KERN_INFO "scsi_debug: initiator's id used as "
3597		       "target!\n");
3598		return schedule_resp(SCpnt, NULL, done,
3599				     DID_NO_CONNECT << 16, 0);
3600	}
3601
3602	if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
3603	    (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
3604		return schedule_resp(SCpnt, NULL, done,
3605				     DID_NO_CONNECT << 16, 0);
3606	devip = devInfoReg(SCpnt->device);
3607	if (NULL == devip)
3608		return schedule_resp(SCpnt, NULL, done,
3609				     DID_NO_CONNECT << 16, 0);
3610
3611	if ((scsi_debug_every_nth != 0) &&
3612	    (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
3613		scsi_debug_cmnd_count = 0;
3614		if (scsi_debug_every_nth < -1)
3615			scsi_debug_every_nth = -1;
3616		if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
3617			return 0; /* ignore command causing timeout */
3618		else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
3619			inj_recovered = 1; /* to reads and writes below */
3620		else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
3621			inj_transport = 1; /* to reads and writes below */
3622		else if (SCSI_DEBUG_OPT_DIF_ERR & scsi_debug_opts)
3623			inj_dif = 1; /* to reads and writes below */
3624		else if (SCSI_DEBUG_OPT_DIX_ERR & scsi_debug_opts)
3625			inj_dix = 1; /* to reads and writes below */
3626	}
3627
3628	if (devip->wlun) {
3629		switch (*cmd) {
3630		case INQUIRY:
3631		case REQUEST_SENSE:
3632		case TEST_UNIT_READY:
3633		case REPORT_LUNS:
3634			break;  /* only allowable wlun commands */
3635		default:
3636			if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3637				printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
3638				       "not supported for wlun\n", *cmd);
3639			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3640					INVALID_OPCODE, 0);
3641			errsts = check_condition_result;
3642			return schedule_resp(SCpnt, devip, done, errsts,
3643					     0);
 
 
 
 
 
3644		}
3645	}
 
 
 
 
 
 
3646
3647	switch (*cmd) {
3648	case INQUIRY:     /* mandatory, ignore unit attention */
3649		delay_override = 1;
3650		errsts = resp_inquiry(SCpnt, target, devip);
3651		break;
3652	case REQUEST_SENSE:	/* mandatory, ignore unit attention */
3653		delay_override = 1;
3654		errsts = resp_requests(SCpnt, devip);
3655		break;
3656	case REZERO_UNIT:	/* actually this is REWIND for SSC */
3657	case START_STOP:
3658		errsts = resp_start_stop(SCpnt, devip);
3659		break;
3660	case ALLOW_MEDIUM_REMOVAL:
3661		errsts = check_readiness(SCpnt, 1, devip);
3662		if (errsts)
3663			break;
3664		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3665			printk(KERN_INFO "scsi_debug: Medium removal %s\n",
3666			       cmd[4] ? "inhibited" : "enabled");
3667		break;
3668	case SEND_DIAGNOSTIC:     /* mandatory */
3669		errsts = check_readiness(SCpnt, 1, devip);
3670		break;
3671	case TEST_UNIT_READY:     /* mandatory */
3672		delay_override = 1;
3673		errsts = check_readiness(SCpnt, 0, devip);
3674		break;
3675	case RESERVE:
3676		errsts = check_readiness(SCpnt, 1, devip);
3677		break;
3678	case RESERVE_10:
3679		errsts = check_readiness(SCpnt, 1, devip);
3680		break;
3681	case RELEASE:
3682		errsts = check_readiness(SCpnt, 1, devip);
3683		break;
3684	case RELEASE_10:
3685		errsts = check_readiness(SCpnt, 1, devip);
3686		break;
3687	case READ_CAPACITY:
3688		errsts = resp_readcap(SCpnt, devip);
3689		break;
3690	case SERVICE_ACTION_IN:
3691		if (cmd[1] == SAI_READ_CAPACITY_16)
3692			errsts = resp_readcap16(SCpnt, devip);
3693		else if (cmd[1] == SAI_GET_LBA_STATUS) {
3694
3695			if (scsi_debug_lbp() == 0) {
3696				mk_sense_buffer(devip, ILLEGAL_REQUEST,
3697						INVALID_COMMAND_OPCODE, 0);
3698				errsts = check_condition_result;
3699			} else
3700				errsts = resp_get_lba_status(SCpnt, devip);
3701		} else {
3702			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3703					INVALID_OPCODE, 0);
3704			errsts = check_condition_result;
3705		}
3706		break;
3707	case MAINTENANCE_IN:
3708		if (MI_REPORT_TARGET_PGS != cmd[1]) {
3709			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3710					INVALID_OPCODE, 0);
3711			errsts = check_condition_result;
3712			break;
3713		}
3714		errsts = resp_report_tgtpgs(SCpnt, devip);
3715		break;
3716	case READ_16:
3717	case READ_12:
3718	case READ_10:
3719		/* READ{10,12,16} and DIF Type 2 are natural enemies */
3720		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3721		    cmd[1] & 0xe0) {
3722			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3723					INVALID_COMMAND_OPCODE, 0);
3724			errsts = check_condition_result;
3725			break;
3726		}
3727
3728		if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3729		     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3730		    (cmd[1] & 0xe0) == 0)
3731			printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3732
3733		/* fall through */
3734	case READ_6:
3735read:
3736		errsts = check_readiness(SCpnt, 0, devip);
3737		if (errsts)
3738			break;
3739		if (scsi_debug_fake_rw)
3740			break;
3741		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3742		errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3743		if (inj_recovered && (0 == errsts)) {
3744			mk_sense_buffer(devip, RECOVERED_ERROR,
3745					THRESHOLD_EXCEEDED, 0);
3746			errsts = check_condition_result;
3747		} else if (inj_transport && (0 == errsts)) {
3748			mk_sense_buffer(devip, ABORTED_COMMAND,
3749					TRANSPORT_PROBLEM, ACK_NAK_TO);
3750			errsts = check_condition_result;
3751		} else if (inj_dif && (0 == errsts)) {
3752			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3753			errsts = illegal_condition_result;
3754		} else if (inj_dix && (0 == errsts)) {
3755			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3756			errsts = illegal_condition_result;
3757		}
3758		break;
3759	case REPORT_LUNS:	/* mandatory, ignore unit attention */
3760		delay_override = 1;
3761		errsts = resp_report_luns(SCpnt, devip);
3762		break;
3763	case VERIFY:		/* 10 byte SBC-2 command */
3764		errsts = check_readiness(SCpnt, 0, devip);
3765		break;
3766	case WRITE_16:
3767	case WRITE_12:
3768	case WRITE_10:
3769		/* WRITE{10,12,16} and DIF Type 2 are natural enemies */
3770		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3771		    cmd[1] & 0xe0) {
3772			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3773					INVALID_COMMAND_OPCODE, 0);
3774			errsts = check_condition_result;
3775			break;
3776		}
3777
3778		if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3779		     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3780		    (cmd[1] & 0xe0) == 0)
3781			printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3782
3783		/* fall through */
3784	case WRITE_6:
3785write:
3786		errsts = check_readiness(SCpnt, 0, devip);
3787		if (errsts)
3788			break;
3789		if (scsi_debug_fake_rw)
3790			break;
3791		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3792		errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3793		if (inj_recovered && (0 == errsts)) {
3794			mk_sense_buffer(devip, RECOVERED_ERROR,
3795					THRESHOLD_EXCEEDED, 0);
3796			errsts = check_condition_result;
3797		} else if (inj_dif && (0 == errsts)) {
3798			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3799			errsts = illegal_condition_result;
3800		} else if (inj_dix && (0 == errsts)) {
3801			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3802			errsts = illegal_condition_result;
3803		}
3804		break;
3805	case WRITE_SAME_16:
3806	case WRITE_SAME:
3807		if (cmd[1] & 0x8) {
3808			if ((*cmd == WRITE_SAME_16 && scsi_debug_lbpws == 0) ||
3809			    (*cmd == WRITE_SAME && scsi_debug_lbpws10 == 0)) {
3810				mk_sense_buffer(devip, ILLEGAL_REQUEST,
3811						INVALID_FIELD_IN_CDB, 0);
3812				errsts = check_condition_result;
3813			} else
3814				unmap = 1;
 
3815		}
3816		if (errsts)
3817			break;
3818		errsts = check_readiness(SCpnt, 0, devip);
3819		if (errsts)
3820			break;
3821		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3822		errsts = resp_write_same(SCpnt, lba, num, devip, ei_lba, unmap);
3823		break;
3824	case UNMAP:
3825		errsts = check_readiness(SCpnt, 0, devip);
3826		if (errsts)
3827			break;
3828
3829		if (scsi_debug_unmap_max_desc == 0 || scsi_debug_lbpu == 0) {
3830			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3831					INVALID_COMMAND_OPCODE, 0);
3832			errsts = check_condition_result;
3833		} else
3834			errsts = resp_unmap(SCpnt, devip);
3835		break;
3836	case MODE_SENSE:
3837	case MODE_SENSE_10:
3838		errsts = resp_mode_sense(SCpnt, target, devip);
3839		break;
3840	case MODE_SELECT:
3841		errsts = resp_mode_select(SCpnt, 1, devip);
3842		break;
3843	case MODE_SELECT_10:
3844		errsts = resp_mode_select(SCpnt, 0, devip);
3845		break;
3846	case LOG_SENSE:
3847		errsts = resp_log_sense(SCpnt, devip);
3848		break;
3849	case SYNCHRONIZE_CACHE:
3850		delay_override = 1;
3851		errsts = check_readiness(SCpnt, 0, devip);
3852		break;
3853	case WRITE_BUFFER:
3854		errsts = check_readiness(SCpnt, 1, devip);
3855		break;
3856	case XDWRITEREAD_10:
3857		if (!scsi_bidi_cmnd(SCpnt)) {
3858			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3859					INVALID_FIELD_IN_CDB, 0);
3860			errsts = check_condition_result;
3861			break;
3862		}
 
 
 
3863
3864		errsts = check_readiness(SCpnt, 0, devip);
3865		if (errsts)
3866			break;
3867		if (scsi_debug_fake_rw)
3868			break;
3869		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3870		errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3871		if (errsts)
 
 
 
 
 
 
3872			break;
3873		errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3874		if (errsts)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3875			break;
3876		errsts = resp_xdwriteread(SCpnt, lba, num, devip);
3877		break;
3878	case VARIABLE_LENGTH_CMD:
3879		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION) {
3880
3881			if ((cmd[10] & 0xe0) == 0)
3882				printk(KERN_ERR
3883				       "Unprotected RD/WR to DIF device\n");
3884
3885			if (cmd[9] == READ_32) {
3886				BUG_ON(SCpnt->cmd_len < 32);
3887				goto read;
3888			}
3889
3890			if (cmd[9] == WRITE_32) {
3891				BUG_ON(SCpnt->cmd_len < 32);
3892				goto write;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3893			}
3894		}
3895
3896		mk_sense_buffer(devip, ILLEGAL_REQUEST,
3897				INVALID_FIELD_IN_CDB, 0);
3898		errsts = check_condition_result;
3899		break;
3900
3901	default:
3902		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3903			printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
3904			       "supported\n", *cmd);
3905		errsts = check_readiness(SCpnt, 1, devip);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3906		if (errsts)
3907			break;	/* Unit attention takes precedence */
3908		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
3909		errsts = check_condition_result;
3910		break;
3911	}
3912	return schedule_resp(SCpnt, devip, done, errsts,
3913			     (delay_override ? 0 : scsi_debug_delay));
3914}
 
 
 
 
 
 
 
 
 
 
 
 
 
3915
3916static DEF_SCSI_QCMD(scsi_debug_queuecommand)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3917
3918static struct scsi_host_template sdebug_driver_template = {
3919	.proc_info =		scsi_debug_proc_info,
 
3920	.proc_name =		sdebug_proc_name,
3921	.name =			"SCSI DEBUG",
3922	.info =			scsi_debug_info,
3923	.slave_alloc =		scsi_debug_slave_alloc,
3924	.slave_configure =	scsi_debug_slave_configure,
3925	.slave_destroy =	scsi_debug_slave_destroy,
3926	.ioctl =		scsi_debug_ioctl,
3927	.queuecommand =		scsi_debug_queuecommand,
 
 
 
3928	.eh_abort_handler =	scsi_debug_abort,
3929	.eh_bus_reset_handler = scsi_debug_bus_reset,
3930	.eh_device_reset_handler = scsi_debug_device_reset,
 
 
3931	.eh_host_reset_handler = scsi_debug_host_reset,
3932	.bios_param =		scsi_debug_biosparam,
3933	.can_queue =		SCSI_DEBUG_CANQUEUE,
3934	.this_id =		7,
3935	.sg_tablesize =		256,
3936	.cmd_per_lun =		16,
3937	.max_sectors =		0xffff,
3938	.use_clustering = 	DISABLE_CLUSTERING,
3939	.module =		THIS_MODULE,
 
3940};
3941
3942static int sdebug_driver_probe(struct device * dev)
3943{
3944        int error = 0;
3945        struct sdebug_host_info *sdbg_host;
3946        struct Scsi_Host *hpnt;
3947	int host_prot;
3948
3949	sdbg_host = to_sdebug_host(dev);
3950
3951	sdebug_driver_template.can_queue = scsi_debug_max_queue;
 
 
 
 
3952	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3953	if (NULL == hpnt) {
3954		printk(KERN_ERR "%s: scsi_register failed\n", __func__);
3955		error = -ENODEV;
3956		return error;
3957	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3958
3959        sdbg_host->shost = hpnt;
3960	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
3961	if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
3962		hpnt->max_id = scsi_debug_num_tgts + 1;
3963	else
3964		hpnt->max_id = scsi_debug_num_tgts;
3965	hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;	/* = scsi_debug_max_luns; */
 
3966
3967	host_prot = 0;
3968
3969	switch (scsi_debug_dif) {
3970
3971	case SD_DIF_TYPE1_PROTECTION:
3972		host_prot = SHOST_DIF_TYPE1_PROTECTION;
3973		if (scsi_debug_dix)
3974			host_prot |= SHOST_DIX_TYPE1_PROTECTION;
3975		break;
3976
3977	case SD_DIF_TYPE2_PROTECTION:
3978		host_prot = SHOST_DIF_TYPE2_PROTECTION;
3979		if (scsi_debug_dix)
3980			host_prot |= SHOST_DIX_TYPE2_PROTECTION;
3981		break;
3982
3983	case SD_DIF_TYPE3_PROTECTION:
3984		host_prot = SHOST_DIF_TYPE3_PROTECTION;
3985		if (scsi_debug_dix)
3986			host_prot |= SHOST_DIX_TYPE3_PROTECTION;
3987		break;
3988
3989	default:
3990		if (scsi_debug_dix)
3991			host_prot |= SHOST_DIX_TYPE0_PROTECTION;
3992		break;
3993	}
3994
3995	scsi_host_set_prot(hpnt, host_prot);
3996
3997	printk(KERN_INFO "scsi_debug: host protection%s%s%s%s%s%s%s\n",
3998	       (host_prot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
3999	       (host_prot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
4000	       (host_prot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
4001	       (host_prot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
4002	       (host_prot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
4003	       (host_prot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
4004	       (host_prot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
 
4005
4006	if (scsi_debug_guard == 1)
4007		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
4008	else
4009		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
4010
4011        error = scsi_add_host(hpnt, &sdbg_host->dev);
4012        if (error) {
4013                printk(KERN_ERR "%s: scsi_add_host failed\n", __func__);
4014                error = -ENODEV;
 
 
 
 
4015		scsi_host_put(hpnt);
4016        } else
4017		scsi_scan_host(hpnt);
 
4018
4019
4020        return error;
4021}
4022
4023static int sdebug_driver_remove(struct device * dev)
4024{
4025        struct sdebug_host_info *sdbg_host;
4026	struct sdebug_dev_info *sdbg_devinfo, *tmp;
4027
4028	sdbg_host = to_sdebug_host(dev);
4029
4030	if (!sdbg_host) {
4031		printk(KERN_ERR "%s: Unable to locate host info\n",
4032		       __func__);
4033		return -ENODEV;
4034	}
4035
4036        scsi_remove_host(sdbg_host->shost);
4037
4038	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
4039				 dev_list) {
4040                list_del(&sdbg_devinfo->dev_list);
4041                kfree(sdbg_devinfo);
4042        }
 
4043
4044        scsi_host_put(sdbg_host->shost);
4045        return 0;
4046}
4047
4048static int pseudo_lld_bus_match(struct device *dev,
4049				struct device_driver *dev_driver)
4050{
4051	return 1;
4052}
4053
4054static struct bus_type pseudo_lld_bus = {
4055	.name = "pseudo",
4056	.match = pseudo_lld_bus_match,
4057	.probe = sdebug_driver_probe,
4058	.remove = sdebug_driver_remove,
 
4059};
v6.2
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
   4 *  Copyright (C) 1992  Eric Youngdale
   5 *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
   6 *  to make sure that we are not getting blocks mixed up, and PANIC if
   7 *  anything out of the ordinary is seen.
   8 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   9 *
  10 * Copyright (C) 2001 - 2021 Douglas Gilbert
 
 
 
  11 *
  12 *  For documentation see http://sg.danny.cz/sg/scsi_debug.html
 
 
 
 
 
 
 
 
 
 
 
  13 */
  14
 
  15
  16#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
  17
  18#include <linux/module.h>
  19#include <linux/align.h>
  20#include <linux/kernel.h>
  21#include <linux/errno.h>
  22#include <linux/jiffies.h>
  23#include <linux/slab.h>
  24#include <linux/types.h>
  25#include <linux/string.h>
 
  26#include <linux/fs.h>
  27#include <linux/init.h>
  28#include <linux/proc_fs.h>
  29#include <linux/vmalloc.h>
  30#include <linux/moduleparam.h>
  31#include <linux/scatterlist.h>
  32#include <linux/blkdev.h>
  33#include <linux/crc-t10dif.h>
  34#include <linux/spinlock.h>
  35#include <linux/interrupt.h>
  36#include <linux/atomic.h>
  37#include <linux/hrtimer.h>
  38#include <linux/uuid.h>
  39#include <linux/t10-pi.h>
  40#include <linux/msdos_partition.h>
  41#include <linux/random.h>
  42#include <linux/xarray.h>
  43#include <linux/prefetch.h>
  44
  45#include <net/checksum.h>
  46
  47#include <asm/unaligned.h>
  48
  49#include <scsi/scsi.h>
  50#include <scsi/scsi_cmnd.h>
  51#include <scsi/scsi_device.h>
  52#include <scsi/scsi_host.h>
  53#include <scsi/scsicam.h>
  54#include <scsi/scsi_eh.h>
  55#include <scsi/scsi_tcq.h>
  56#include <scsi/scsi_dbg.h>
  57
  58#include "sd.h"
  59#include "scsi_logging.h"
  60
  61/* make sure inq_product_rev string corresponds to this version */
  62#define SDEBUG_VERSION "0191"	/* format to fit INQUIRY revision field */
  63static const char *sdebug_version_date = "20210520";
  64
  65#define MY_NAME "scsi_debug"
  66
  67/* Additional Sense Code (ASC) */
  68#define NO_ADDITIONAL_SENSE 0x0
  69#define LOGICAL_UNIT_NOT_READY 0x4
  70#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
  71#define UNRECOVERED_READ_ERR 0x11
  72#define PARAMETER_LIST_LENGTH_ERR 0x1a
  73#define INVALID_OPCODE 0x20
  74#define LBA_OUT_OF_RANGE 0x21
 
  75#define INVALID_FIELD_IN_CDB 0x24
  76#define INVALID_FIELD_IN_PARAM_LIST 0x26
  77#define WRITE_PROTECTED 0x27
  78#define UA_RESET_ASC 0x29
  79#define UA_CHANGED_ASC 0x2a
  80#define TARGET_CHANGED_ASC 0x3f
  81#define LUNS_CHANGED_ASCQ 0x0e
  82#define INSUFF_RES_ASC 0x55
  83#define INSUFF_RES_ASCQ 0x3
  84#define POWER_ON_RESET_ASCQ 0x0
  85#define POWER_ON_OCCURRED_ASCQ 0x1
  86#define BUS_RESET_ASCQ 0x2	/* scsi bus reset occurred */
  87#define MODE_CHANGED_ASCQ 0x1	/* mode parameters changed */
  88#define CAPACITY_CHANGED_ASCQ 0x9
  89#define SAVING_PARAMS_UNSUP 0x39
  90#define TRANSPORT_PROBLEM 0x4b
  91#define THRESHOLD_EXCEEDED 0x5d
  92#define LOW_POWER_COND_ON 0x5e
  93#define MISCOMPARE_VERIFY_ASC 0x1d
  94#define MICROCODE_CHANGED_ASCQ 0x1	/* with TARGET_CHANGED_ASC */
  95#define MICROCODE_CHANGED_WO_RESET_ASCQ 0x16
  96#define WRITE_ERROR_ASC 0xc
  97#define UNALIGNED_WRITE_ASCQ 0x4
  98#define WRITE_BOUNDARY_ASCQ 0x5
  99#define READ_INVDATA_ASCQ 0x6
 100#define READ_BOUNDARY_ASCQ 0x7
 101#define ATTEMPT_ACCESS_GAP 0x9
 102#define INSUFF_ZONE_ASCQ 0xe
 103
 104/* Additional Sense Code Qualifier (ASCQ) */
 105#define ACK_NAK_TO 0x3
 106
 
 
 107/* Default values for driver parameters */
 108#define DEF_NUM_HOST   1
 109#define DEF_NUM_TGTS   1
 110#define DEF_MAX_LUNS   1
 111/* With these defaults, this driver will make 1 host with 1 target
 112 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
 113 */
 114#define DEF_ATO 1
 115#define DEF_CDB_LEN 10
 116#define DEF_JDELAY   1		/* if > 0 unit is a jiffy */
 117#define DEF_DEV_SIZE_PRE_INIT   0
 118#define DEF_DEV_SIZE_MB   8
 119#define DEF_ZBC_DEV_SIZE_MB   128
 120#define DEF_DIF 0
 121#define DEF_DIX 0
 122#define DEF_PER_HOST_STORE false
 123#define DEF_D_SENSE   0
 124#define DEF_EVERY_NTH   0
 125#define DEF_FAKE_RW	0
 126#define DEF_GUARD 0
 127#define DEF_HOST_LOCK 0
 128#define DEF_LBPU 0
 129#define DEF_LBPWS 0
 130#define DEF_LBPWS10 0
 131#define DEF_LBPRZ 1
 132#define DEF_LOWEST_ALIGNED 0
 133#define DEF_NDELAY   0		/* if > 0 unit is a nanosecond */
 134#define DEF_NO_LUN_0   0
 135#define DEF_NUM_PARTS   0
 136#define DEF_OPTS   0
 137#define DEF_OPT_BLKS 1024
 138#define DEF_PHYSBLK_EXP 0
 139#define DEF_OPT_XFERLEN_EXP 0
 140#define DEF_PTYPE   TYPE_DISK
 141#define DEF_RANDOM false
 142#define DEF_REMOVABLE false
 143#define DEF_SCSI_LEVEL   7    /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
 144#define DEF_SECTOR_SIZE 512
 145#define DEF_UNMAP_ALIGNMENT 0
 146#define DEF_UNMAP_GRANULARITY 1
 147#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
 148#define DEF_UNMAP_MAX_DESC 256
 149#define DEF_VIRTUAL_GB   0
 150#define DEF_VPD_USE_HOSTNO 1
 151#define DEF_WRITESAME_LENGTH 0xFFFF
 152#define DEF_STRICT 0
 153#define DEF_STATISTICS false
 154#define DEF_SUBMIT_QUEUES 1
 155#define DEF_TUR_MS_TO_READY 0
 156#define DEF_UUID_CTL 0
 157#define JDELAY_OVERRIDDEN -9999
 158
 159/* Default parameters for ZBC drives */
 160#define DEF_ZBC_ZONE_SIZE_MB	128
 161#define DEF_ZBC_MAX_OPEN_ZONES	8
 162#define DEF_ZBC_NR_CONV_ZONES	1
 163
 164#define SDEBUG_LUN_0_VAL 0
 165
 166/* bit mask values for sdebug_opts */
 167#define SDEBUG_OPT_NOISE		1
 168#define SDEBUG_OPT_MEDIUM_ERR		2
 169#define SDEBUG_OPT_TIMEOUT		4
 170#define SDEBUG_OPT_RECOVERED_ERR	8
 171#define SDEBUG_OPT_TRANSPORT_ERR	16
 172#define SDEBUG_OPT_DIF_ERR		32
 173#define SDEBUG_OPT_DIX_ERR		64
 174#define SDEBUG_OPT_MAC_TIMEOUT		128
 175#define SDEBUG_OPT_SHORT_TRANSFER	0x100
 176#define SDEBUG_OPT_Q_NOISE		0x200
 177#define SDEBUG_OPT_ALL_TSF		0x400	/* ignore */
 178#define SDEBUG_OPT_RARE_TSF		0x800
 179#define SDEBUG_OPT_N_WCE		0x1000
 180#define SDEBUG_OPT_RESET_NOISE		0x2000
 181#define SDEBUG_OPT_NO_CDB_NOISE		0x4000
 182#define SDEBUG_OPT_HOST_BUSY		0x8000
 183#define SDEBUG_OPT_CMD_ABORT		0x10000
 184#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
 185			      SDEBUG_OPT_RESET_NOISE)
 186#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
 187				  SDEBUG_OPT_TRANSPORT_ERR | \
 188				  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
 189				  SDEBUG_OPT_SHORT_TRANSFER | \
 190				  SDEBUG_OPT_HOST_BUSY | \
 191				  SDEBUG_OPT_CMD_ABORT)
 192#define SDEBUG_OPT_RECOV_DIF_DIX (SDEBUG_OPT_RECOVERED_ERR | \
 193				  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR)
 194
 195/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
 196 * priority order. In the subset implemented here lower numbers have higher
 197 * priority. The UA numbers should be a sequence starting from 0 with
 198 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
 199#define SDEBUG_UA_POR 0		/* Power on, reset, or bus device reset */
 200#define SDEBUG_UA_POOCCUR 1	/* Power on occurred */
 201#define SDEBUG_UA_BUS_RESET 2
 202#define SDEBUG_UA_MODE_CHANGED 3
 203#define SDEBUG_UA_CAPACITY_CHANGED 4
 204#define SDEBUG_UA_LUNS_CHANGED 5
 205#define SDEBUG_UA_MICROCODE_CHANGED 6	/* simulate firmware change */
 206#define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 7
 207#define SDEBUG_NUM_UAS 8
 208
 209/* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 210 * sector on read commands: */
 211#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 212#define OPT_MEDIUM_ERR_NUM    10     /* number of consecutive medium errs */
 213
 214/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
 215 * (for response) per submit queue at one time. Can be reduced by max_queue
 216 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
 217 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
 218 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
 219 * but cannot exceed SDEBUG_CANQUEUE .
 220 */
 221#define SDEBUG_CANQUEUE_WORDS  3	/* a WORD is bits in a long */
 222#define SDEBUG_CANQUEUE  (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
 223#define DEF_CMD_PER_LUN  SDEBUG_CANQUEUE
 224
 225/* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */
 226#define F_D_IN			1	/* Data-in command (e.g. READ) */
 227#define F_D_OUT			2	/* Data-out command (e.g. WRITE) */
 228#define F_D_OUT_MAYBE		4	/* WRITE SAME, NDOB bit */
 229#define F_D_UNKN		8
 230#define F_RL_WLUN_OK		0x10	/* allowed with REPORT LUNS W-LUN */
 231#define F_SKIP_UA		0x20	/* bypass UAs (e.g. INQUIRY command) */
 232#define F_DELAY_OVERR		0x40	/* for commands like INQUIRY */
 233#define F_SA_LOW		0x80	/* SA is in cdb byte 1, bits 4 to 0 */
 234#define F_SA_HIGH		0x100	/* SA is in cdb bytes 8 and 9 */
 235#define F_INV_OP		0x200	/* invalid opcode (not supported) */
 236#define F_FAKE_RW		0x400	/* bypass resp_*() when fake_rw set */
 237#define F_M_ACCESS		0x800	/* media access, reacts to SSU state */
 238#define F_SSU_DELAY		0x1000	/* SSU command delay (long-ish) */
 239#define F_SYNC_DELAY		0x2000	/* SYNCHRONIZE CACHE delay */
 240
 241/* Useful combinations of the above flags */
 242#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
 243#define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
 244#define FF_SA (F_SA_HIGH | F_SA_LOW)
 245#define F_LONG_DELAY		(F_SSU_DELAY | F_SYNC_DELAY)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 246
 247#define SDEBUG_MAX_PARTS 4
 
 248
 249#define SDEBUG_MAX_CMD_LEN 32
 
 
 
 
 250
 251#define SDEB_XA_NOT_IN_USE XA_MARK_1
 252
 253/* Zone types (zbcr05 table 25) */
 254enum sdebug_z_type {
 255	ZBC_ZTYPE_CNV	= 0x1,
 256	ZBC_ZTYPE_SWR	= 0x2,
 257	ZBC_ZTYPE_SWP	= 0x3,
 258	/* ZBC_ZTYPE_SOBR = 0x4, */
 259	ZBC_ZTYPE_GAP	= 0x5,
 260};
 261
 262/* enumeration names taken from table 26, zbcr05 */
 263enum sdebug_z_cond {
 264	ZBC_NOT_WRITE_POINTER	= 0x0,
 265	ZC1_EMPTY		= 0x1,
 266	ZC2_IMPLICIT_OPEN	= 0x2,
 267	ZC3_EXPLICIT_OPEN	= 0x3,
 268	ZC4_CLOSED		= 0x4,
 269	ZC6_READ_ONLY		= 0xd,
 270	ZC5_FULL		= 0xe,
 271	ZC7_OFFLINE		= 0xf,
 272};
 273
 274struct sdeb_zone_state {	/* ZBC: per zone state */
 275	enum sdebug_z_type z_type;
 276	enum sdebug_z_cond z_cond;
 277	bool z_non_seq_resource;
 278	unsigned int z_size;
 279	sector_t z_start;
 280	sector_t z_wp;
 281};
 282
 283struct sdebug_dev_info {
 284	struct list_head dev_list;
 
 285	unsigned int channel;
 286	unsigned int target;
 287	u64 lun;
 288	uuid_t lu_name;
 289	struct sdebug_host_info *sdbg_host;
 290	unsigned long uas_bm[1];
 291	atomic_t num_in_q;
 292	atomic_t stopped;	/* 1: by SSU, 2: device start */
 293	bool used;
 294
 295	/* For ZBC devices */
 296	enum blk_zoned_model zmodel;
 297	unsigned int zcap;
 298	unsigned int zsize;
 299	unsigned int zsize_shift;
 300	unsigned int nr_zones;
 301	unsigned int nr_conv_zones;
 302	unsigned int nr_seq_zones;
 303	unsigned int nr_imp_open;
 304	unsigned int nr_exp_open;
 305	unsigned int nr_closed;
 306	unsigned int max_open;
 307	ktime_t create_ts;	/* time since bootup that this device was created */
 308	struct sdeb_zone_state *zstate;
 309};
 310
 311struct sdebug_host_info {
 312	struct list_head host_list;
 313	int si_idx;	/* sdeb_store_info (per host) xarray index */
 314	struct Scsi_Host *shost;
 315	struct device dev;
 316	struct list_head dev_info_list;
 317};
 318
 319/* There is an xarray of pointers to this struct's objects, one per host */
 320struct sdeb_store_info {
 321	rwlock_t macc_lck;	/* for atomic media access on this store */
 322	u8 *storep;		/* user data storage (ram) */
 323	struct t10_pi_tuple *dif_storep; /* protection info */
 324	void *map_storep;	/* provisioning map */
 325};
 326
 327#define to_sdebug_host(d)	\
 328	container_of(d, struct sdebug_host_info, dev)
 329
 330enum sdeb_defer_type {SDEB_DEFER_NONE = 0, SDEB_DEFER_HRT = 1,
 331		      SDEB_DEFER_WQ = 2, SDEB_DEFER_POLL = 3};
 332
 333struct sdebug_defer {
 334	struct hrtimer hrt;
 335	struct execute_work ew;
 336	ktime_t cmpl_ts;/* time since boot to complete this cmd */
 337	int sqa_idx;	/* index of sdebug_queue array */
 338	int qc_idx;	/* index of sdebug_queued_cmd array within sqa_idx */
 339	int hc_idx;	/* hostwide tag index */
 340	int issuing_cpu;
 341	bool init_hrt;
 342	bool init_wq;
 343	bool init_poll;
 344	bool aborted;	/* true when blk_abort_request() already called */
 345	enum sdeb_defer_type defer_t;
 346};
 347
 348struct sdebug_queued_cmd {
 349	/* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
 350	 * instance indicates this slot is in use.
 351	 */
 352	struct sdebug_defer *sd_dp;
 353	struct scsi_cmnd *a_cmnd;
 354};
 355
 356struct sdebug_queue {
 357	struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
 358	unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
 359	spinlock_t qc_lock;
 360	atomic_t blocked;	/* to temporarily stop more being queued */
 361};
 362
 363static atomic_t sdebug_cmnd_count;   /* number of incoming commands */
 364static atomic_t sdebug_completions;  /* count of deferred completions */
 365static atomic_t sdebug_miss_cpus;    /* submission + completion cpus differ */
 366static atomic_t sdebug_a_tsf;	     /* 'almost task set full' counter */
 367static atomic_t sdeb_inject_pending;
 368static atomic_t sdeb_mq_poll_count;  /* bumped when mq_poll returns > 0 */
 369
 370struct opcode_info_t {
 371	u8 num_attached;	/* 0 if this is it (i.e. a leaf); use 0xff */
 372				/* for terminating element */
 373	u8 opcode;		/* if num_attached > 0, preferred */
 374	u16 sa;			/* service action */
 375	u32 flags;		/* OR-ed set of SDEB_F_* */
 376	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
 377	const struct opcode_info_t *arrp;  /* num_attached elements or NULL */
 378	u8 len_mask[16];	/* len_mask[0]-->cdb_len, then mask for cdb */
 379				/* 1 to min(cdb_len, 15); ignore cdb[15...] */
 380};
 381
 382/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
 383enum sdeb_opcode_index {
 384	SDEB_I_INVALID_OPCODE =	0,
 385	SDEB_I_INQUIRY = 1,
 386	SDEB_I_REPORT_LUNS = 2,
 387	SDEB_I_REQUEST_SENSE = 3,
 388	SDEB_I_TEST_UNIT_READY = 4,
 389	SDEB_I_MODE_SENSE = 5,		/* 6, 10 */
 390	SDEB_I_MODE_SELECT = 6,		/* 6, 10 */
 391	SDEB_I_LOG_SENSE = 7,
 392	SDEB_I_READ_CAPACITY = 8,	/* 10; 16 is in SA_IN(16) */
 393	SDEB_I_READ = 9,		/* 6, 10, 12, 16 */
 394	SDEB_I_WRITE = 10,		/* 6, 10, 12, 16 */
 395	SDEB_I_START_STOP = 11,
 396	SDEB_I_SERV_ACT_IN_16 = 12,	/* add ...SERV_ACT_IN_12 if needed */
 397	SDEB_I_SERV_ACT_OUT_16 = 13,	/* add ...SERV_ACT_OUT_12 if needed */
 398	SDEB_I_MAINT_IN = 14,
 399	SDEB_I_MAINT_OUT = 15,
 400	SDEB_I_VERIFY = 16,		/* VERIFY(10), VERIFY(16) */
 401	SDEB_I_VARIABLE_LEN = 17,	/* READ(32), WRITE(32), WR_SCAT(32) */
 402	SDEB_I_RESERVE = 18,		/* 6, 10 */
 403	SDEB_I_RELEASE = 19,		/* 6, 10 */
 404	SDEB_I_ALLOW_REMOVAL = 20,	/* PREVENT ALLOW MEDIUM REMOVAL */
 405	SDEB_I_REZERO_UNIT = 21,	/* REWIND in SSC */
 406	SDEB_I_ATA_PT = 22,		/* 12, 16 */
 407	SDEB_I_SEND_DIAG = 23,
 408	SDEB_I_UNMAP = 24,
 409	SDEB_I_WRITE_BUFFER = 25,
 410	SDEB_I_WRITE_SAME = 26,		/* 10, 16 */
 411	SDEB_I_SYNC_CACHE = 27,		/* 10, 16 */
 412	SDEB_I_COMP_WRITE = 28,
 413	SDEB_I_PRE_FETCH = 29,		/* 10, 16 */
 414	SDEB_I_ZONE_OUT = 30,		/* 0x94+SA; includes no data xfer */
 415	SDEB_I_ZONE_IN = 31,		/* 0x95+SA; all have data-in */
 416	SDEB_I_LAST_ELEM_P1 = 32,	/* keep this last (previous + 1) */
 417};
 418
 419
 420static const unsigned char opcode_ind_arr[256] = {
 421/* 0x0; 0x0->0x1f: 6 byte cdbs */
 422	SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
 423	    0, 0, 0, 0,
 424	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 425	0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 426	    SDEB_I_RELEASE,
 427	0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
 428	    SDEB_I_ALLOW_REMOVAL, 0,
 429/* 0x20; 0x20->0x3f: 10 byte cdbs */
 430	0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
 431	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
 432	0, 0, 0, 0, SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, 0,
 433	0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
 434/* 0x40; 0x40->0x5f: 10 byte cdbs */
 435	0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
 436	0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
 437	0, 0, 0, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 438	    SDEB_I_RELEASE,
 439	0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
 440/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
 441	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 442	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 443	0, SDEB_I_VARIABLE_LEN,
 444/* 0x80; 0x80->0x9f: 16 byte cdbs */
 445	0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
 446	SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0,
 447	0, 0, 0, SDEB_I_VERIFY,
 448	SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, SDEB_I_WRITE_SAME,
 449	SDEB_I_ZONE_OUT, SDEB_I_ZONE_IN, 0, 0,
 450	0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
 451/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
 452	SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
 453	     SDEB_I_MAINT_OUT, 0, 0, 0,
 454	SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
 455	     0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
 456	0, 0, 0, 0, 0, 0, 0, 0,
 457	0, 0, 0, 0, 0, 0, 0, 0,
 458/* 0xc0; 0xc0->0xff: vendor specific */
 459	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 460	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 461	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 462	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 463};
 464
 465/*
 466 * The following "response" functions return the SCSI mid-level's 4 byte
 467 * tuple-in-an-int. To handle commands with an IMMED bit, for a faster
 468 * command completion, they can mask their return value with
 469 * SDEG_RES_IMMED_MASK .
 470 */
 471#define SDEG_RES_IMMED_MASK 0x40000000
 472
 473static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
 474static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
 475static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
 476static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 477static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
 478static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 479static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
 480static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 481static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 482static int resp_write_scat(struct scsi_cmnd *, struct sdebug_dev_info *);
 483static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
 484static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
 485static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
 486static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
 487static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
 488static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
 489static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
 490static int resp_verify(struct scsi_cmnd *, struct sdebug_dev_info *);
 491static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
 492static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
 493static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
 494static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
 495static int resp_sync_cache(struct scsi_cmnd *, struct sdebug_dev_info *);
 496static int resp_pre_fetch(struct scsi_cmnd *, struct sdebug_dev_info *);
 497static int resp_report_zones(struct scsi_cmnd *, struct sdebug_dev_info *);
 498static int resp_open_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 499static int resp_close_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 500static int resp_finish_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 501static int resp_rwp_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 502
 503static int sdebug_do_add_host(bool mk_new_store);
 504static int sdebug_add_host_helper(int per_host_idx);
 505static void sdebug_do_remove_host(bool the_end);
 506static int sdebug_add_store(void);
 507static void sdebug_erase_store(int idx, struct sdeb_store_info *sip);
 508static void sdebug_erase_all_stores(bool apart_from_first);
 509
 510/*
 511 * The following are overflow arrays for cdbs that "hit" the same index in
 512 * the opcode_info_arr array. The most time sensitive (or commonly used) cdb
 513 * should be placed in opcode_info_arr[], the others should be placed here.
 514 */
 515static const struct opcode_info_t msense_iarr[] = {
 516	{0, 0x1a, 0, F_D_IN, NULL, NULL,
 517	    {6,  0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 518};
 519
 520static const struct opcode_info_t mselect_iarr[] = {
 521	{0, 0x15, 0, F_D_OUT, NULL, NULL,
 522	    {6,  0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 523};
 524
 525static const struct opcode_info_t read_iarr[] = {
 526	{0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
 527	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 528	     0, 0, 0, 0} },
 529	{0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
 530	    {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 531	{0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
 532	    {12,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
 533	     0xc7, 0, 0, 0, 0} },
 534};
 535
 536static const struct opcode_info_t write_iarr[] = {
 537	{0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(10) */
 538	    NULL, {10,  0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
 539		   0, 0, 0, 0, 0, 0} },
 540	{0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,   /* WRITE(6) */
 541	    NULL, {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
 542		   0, 0, 0} },
 543	{0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(12) */
 544	    NULL, {12,  0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 545		   0xbf, 0xc7, 0, 0, 0, 0} },
 546};
 547
 548static const struct opcode_info_t verify_iarr[] = {
 549	{0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,/* VERIFY(10) */
 550	    NULL, {10,  0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc7,
 551		   0, 0, 0, 0, 0, 0} },
 552};
 553
 554static const struct opcode_info_t sa_in_16_iarr[] = {
 555	{0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
 556	    {16,  0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 557	     0xff, 0xff, 0xff, 0, 0xc7} },	/* GET LBA STATUS(16) */
 558};
 559
 560static const struct opcode_info_t vl_iarr[] = {	/* VARIABLE LENGTH */
 561	{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
 562	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
 563		   0, 0xff, 0xff, 0xff, 0xff} },	/* WRITE(32) */
 564	{0, 0x7f, 0x11, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 565	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x11, 0xf8,
 566		   0, 0xff, 0xff, 0x0, 0x0} },	/* WRITE SCATTERED(32) */
 567};
 568
 569static const struct opcode_info_t maint_in_iarr[] = {	/* MAINT IN */
 570	{0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
 571	    {12,  0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
 572	     0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
 573	{0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
 574	    {12,  0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 575	     0, 0} },	/* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
 576};
 577
 578static const struct opcode_info_t write_same_iarr[] = {
 579	{0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
 580	    {16,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 581	     0xff, 0xff, 0xff, 0x3f, 0xc7} },		/* WRITE SAME(16) */
 582};
 583
 584static const struct opcode_info_t reserve_iarr[] = {
 585	{0, 0x16, 0, F_D_OUT, NULL, NULL,		/* RESERVE(6) */
 586	    {6,  0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 587};
 588
 589static const struct opcode_info_t release_iarr[] = {
 590	{0, 0x17, 0, F_D_OUT, NULL, NULL,		/* RELEASE(6) */
 591	    {6,  0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 592};
 593
 594static const struct opcode_info_t sync_cache_iarr[] = {
 595	{0, 0x91, 0, F_SYNC_DELAY | F_M_ACCESS, resp_sync_cache, NULL,
 596	    {16,  0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 597	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* SYNC_CACHE (16) */
 598};
 599
 600static const struct opcode_info_t pre_fetch_iarr[] = {
 601	{0, 0x90, 0, F_SYNC_DELAY | FF_MEDIA_IO, resp_pre_fetch, NULL,
 602	    {16,  0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 603	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* PRE-FETCH (16) */
 604};
 605
 606static const struct opcode_info_t zone_out_iarr[] = {	/* ZONE OUT(16) */
 607	{0, 0x94, 0x1, F_SA_LOW | F_M_ACCESS, resp_close_zone, NULL,
 608	    {16, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 609	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },	/* CLOSE ZONE */
 610	{0, 0x94, 0x2, F_SA_LOW | F_M_ACCESS, resp_finish_zone, NULL,
 611	    {16, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 612	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },	/* FINISH ZONE */
 613	{0, 0x94, 0x4, F_SA_LOW | F_M_ACCESS, resp_rwp_zone, NULL,
 614	    {16, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 615	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },  /* RESET WRITE POINTER */
 616};
 617
 618static const struct opcode_info_t zone_in_iarr[] = {	/* ZONE IN(16) */
 619	{0, 0x95, 0x6, F_SA_LOW | F_D_IN | F_M_ACCESS, NULL, NULL,
 620	    {16, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 621	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* REPORT ZONES */
 622};
 623
 624
 625/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
 626 * plus the terminating elements for logic that scans this table such as
 627 * REPORT SUPPORTED OPERATION CODES. */
 628static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEM_P1 + 1] = {
 629/* 0 */
 630	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,	/* unknown opcodes */
 631	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 632	{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
 633	    {6,  0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 634	{0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
 635	    {12,  0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 636	     0, 0} },					/* REPORT LUNS */
 637	{0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
 638	    {6,  0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 639	{0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
 640	    {6,  0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 641/* 5 */
 642	{ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN,	/* MODE SENSE(10) */
 643	    resp_mode_sense, msense_iarr, {10,  0xf8, 0xff, 0xff, 0, 0, 0,
 644		0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 645	{ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT,	/* MODE SELECT(10) */
 646	    resp_mode_select, mselect_iarr, {10,  0xf1, 0, 0, 0, 0, 0, 0xff,
 647		0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 648	{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,	/* LOG SENSE */
 649	    {10,  0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
 650	     0, 0, 0} },
 651	{0, 0x25, 0, F_D_IN, resp_readcap, NULL,    /* READ CAPACITY(10) */
 652	    {10,  0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
 653	     0, 0} },
 654	{ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
 655	    resp_read_dt0, read_iarr, {16,  0xfe, 0xff, 0xff, 0xff, 0xff,
 656	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 657/* 10 */
 658	{ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
 659	    resp_write_dt0, write_iarr,			/* WRITE(16) */
 660		{16,  0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 661		 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 662	{0, 0x1b, 0, F_SSU_DELAY, resp_start_stop, NULL,/* START STOP UNIT */
 663	    {6,  0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 664	{ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
 665	    resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
 666		{16,  0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 667		 0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
 668	{0, 0x9f, 0x12, F_SA_LOW | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 669	    NULL, {16,  0x12, 0xf9, 0x0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff,
 670	    0xff, 0xff, 0xff, 0xff, 0xc7} },  /* SA_OUT(16), WRITE SCAT(16) */
 671	{ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
 672	    resp_report_tgtpgs,	/* MAINT IN, REPORT TARGET PORT GROUPS */
 673		maint_in_iarr, {12,  0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
 674				0xff, 0, 0xc7, 0, 0, 0, 0} },
 675/* 15 */
 676	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
 677	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 678	{ARRAY_SIZE(verify_iarr), 0x8f, 0,
 679	    F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,	/* VERIFY(16) */
 680	    verify_iarr, {16,  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 681			  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },
 682	{ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
 683	    resp_read_dt0, vl_iarr,	/* VARIABLE LENGTH, READ(32) */
 684	    {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
 685	     0xff, 0xff} },
 686	{ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
 687	    NULL, reserve_iarr,	/* RESERVE(10) <no response function> */
 688	    {10,  0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 689	     0} },
 690	{ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
 691	    NULL, release_iarr, /* RELEASE(10) <no response function> */
 692	    {10,  0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 693	     0} },
 694/* 20 */
 695	{0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
 696	    {6,  0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 697	{0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
 698	    {6,  0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 699	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
 700	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 701	{0, 0x1d, F_D_OUT, 0, NULL, NULL,	/* SEND DIAGNOSTIC */
 702	    {6,  0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 703	{0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
 704	    {10,  0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 705/* 25 */
 706	{0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
 707	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
 708	     0, 0, 0, 0} },			/* WRITE_BUFFER */
 709	{ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
 710	    resp_write_same_10, write_same_iarr,	/* WRITE SAME(10) */
 711		{10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
 712		 0, 0, 0, 0, 0} },
 713	{ARRAY_SIZE(sync_cache_iarr), 0x35, 0, F_SYNC_DELAY | F_M_ACCESS,
 714	    resp_sync_cache, sync_cache_iarr,
 715	    {10,  0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 716	     0, 0, 0, 0} },			/* SYNC_CACHE (10) */
 717	{0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
 718	    {16,  0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
 719	     0, 0xff, 0x3f, 0xc7} },		/* COMPARE AND WRITE */
 720	{ARRAY_SIZE(pre_fetch_iarr), 0x34, 0, F_SYNC_DELAY | FF_MEDIA_IO,
 721	    resp_pre_fetch, pre_fetch_iarr,
 722	    {10,  0x2, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 723	     0, 0, 0, 0} },			/* PRE-FETCH (10) */
 724
 725/* 30 */
 726	{ARRAY_SIZE(zone_out_iarr), 0x94, 0x3, F_SA_LOW | F_M_ACCESS,
 727	    resp_open_zone, zone_out_iarr, /* ZONE_OUT(16), OPEN ZONE) */
 728		{16,  0x3 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 729		 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x1, 0xc7} },
 730	{ARRAY_SIZE(zone_in_iarr), 0x95, 0x0, F_SA_LOW | F_M_ACCESS,
 731	    resp_report_zones, zone_in_iarr, /* ZONE_IN(16), REPORT ZONES) */
 732		{16,  0x0 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 733		 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc7} },
 734/* sentinel */
 735	{0xff, 0, 0, 0, NULL, NULL,		/* terminating element */
 736	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 737};
 738
 739static int sdebug_num_hosts;
 740static int sdebug_add_host = DEF_NUM_HOST;  /* in sysfs this is relative */
 741static int sdebug_ato = DEF_ATO;
 742static int sdebug_cdb_len = DEF_CDB_LEN;
 743static int sdebug_jdelay = DEF_JDELAY;	/* if > 0 then unit is jiffies */
 744static int sdebug_dev_size_mb = DEF_DEV_SIZE_PRE_INIT;
 745static int sdebug_dif = DEF_DIF;
 746static int sdebug_dix = DEF_DIX;
 747static int sdebug_dsense = DEF_D_SENSE;
 748static int sdebug_every_nth = DEF_EVERY_NTH;
 749static int sdebug_fake_rw = DEF_FAKE_RW;
 750static unsigned int sdebug_guard = DEF_GUARD;
 751static int sdebug_host_max_queue;	/* per host */
 752static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
 753static int sdebug_max_luns = DEF_MAX_LUNS;
 754static int sdebug_max_queue = SDEBUG_CANQUEUE;	/* per submit queue */
 755static unsigned int sdebug_medium_error_start = OPT_MEDIUM_ERR_ADDR;
 756static int sdebug_medium_error_count = OPT_MEDIUM_ERR_NUM;
 757static atomic_t retired_max_queue;	/* if > 0 then was prior max_queue */
 758static int sdebug_ndelay = DEF_NDELAY;	/* if > 0 then unit is nanoseconds */
 759static int sdebug_no_lun_0 = DEF_NO_LUN_0;
 760static int sdebug_no_uld;
 761static int sdebug_num_parts = DEF_NUM_PARTS;
 762static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 763static int sdebug_opt_blks = DEF_OPT_BLKS;
 764static int sdebug_opts = DEF_OPTS;
 765static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
 766static int sdebug_opt_xferlen_exp = DEF_OPT_XFERLEN_EXP;
 767static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
 768static int sdebug_scsi_level = DEF_SCSI_LEVEL;
 769static int sdebug_sector_size = DEF_SECTOR_SIZE;
 770static int sdeb_tur_ms_to_ready = DEF_TUR_MS_TO_READY;
 771static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
 772static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 773static unsigned int sdebug_lbpu = DEF_LBPU;
 774static unsigned int sdebug_lbpws = DEF_LBPWS;
 775static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
 776static unsigned int sdebug_lbprz = DEF_LBPRZ;
 777static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 778static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 779static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 780static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 781static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
 782static int sdebug_uuid_ctl = DEF_UUID_CTL;
 783static bool sdebug_random = DEF_RANDOM;
 784static bool sdebug_per_host_store = DEF_PER_HOST_STORE;
 785static bool sdebug_removable = DEF_REMOVABLE;
 786static bool sdebug_clustering;
 787static bool sdebug_host_lock = DEF_HOST_LOCK;
 788static bool sdebug_strict = DEF_STRICT;
 789static bool sdebug_any_injecting_opt;
 790static bool sdebug_no_rwlock;
 791static bool sdebug_verbose;
 792static bool have_dif_prot;
 793static bool write_since_sync;
 794static bool sdebug_statistics = DEF_STATISTICS;
 795static bool sdebug_wp;
 796/* Following enum: 0: no zbc, def; 1: host aware; 2: host managed */
 797static enum blk_zoned_model sdeb_zbc_model = BLK_ZONED_NONE;
 798static char *sdeb_zbc_model_s;
 799
 800enum sam_lun_addr_method {SAM_LUN_AM_PERIPHERAL = 0x0,
 801			  SAM_LUN_AM_FLAT = 0x1,
 802			  SAM_LUN_AM_LOGICAL_UNIT = 0x2,
 803			  SAM_LUN_AM_EXTENDED = 0x3};
 804static enum sam_lun_addr_method sdebug_lun_am = SAM_LUN_AM_PERIPHERAL;
 805static int sdebug_lun_am_i = (int)SAM_LUN_AM_PERIPHERAL;
 806
 807static unsigned int sdebug_store_sectors;
 808static sector_t sdebug_capacity;	/* in sectors */
 809
 810/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 811   may still need them */
 812static int sdebug_heads;		/* heads per disk */
 813static int sdebug_cylinders_per;	/* cylinders per surface */
 814static int sdebug_sectors_per;		/* sectors per cylinder */
 815
 816static LIST_HEAD(sdebug_host_list);
 817static DEFINE_SPINLOCK(sdebug_host_list_lock);
 818
 819static struct xarray per_store_arr;
 820static struct xarray *per_store_ap = &per_store_arr;
 821static int sdeb_first_idx = -1;		/* invalid index ==> none created */
 822static int sdeb_most_recent_idx = -1;
 823static DEFINE_RWLOCK(sdeb_fake_rw_lck);	/* need a RW lock when fake_rw=1 */
 824
 825static unsigned long map_size;
 826static int num_aborts;
 827static int num_dev_resets;
 828static int num_target_resets;
 829static int num_bus_resets;
 830static int num_host_resets;
 831static int dix_writes;
 832static int dix_reads;
 833static int dif_errors;
 834
 835/* ZBC global data */
 836static bool sdeb_zbc_in_use;	/* true for host-aware and host-managed disks */
 837static int sdeb_zbc_zone_cap_mb;
 838static int sdeb_zbc_zone_size_mb;
 839static int sdeb_zbc_max_open = DEF_ZBC_MAX_OPEN_ZONES;
 840static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
 841
 842static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
 843static int poll_queues; /* iouring iopoll interface.*/
 844static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
 845
 846static DEFINE_RWLOCK(atomic_rw);
 847static DEFINE_RWLOCK(atomic_rw2);
 848
 849static rwlock_t *ramdisk_lck_a[2];
 850
 851static char sdebug_proc_name[] = MY_NAME;
 852static const char *my_name = MY_NAME;
 853
 854static struct bus_type pseudo_lld_bus;
 
 
 
 855
 856static struct device_driver sdebug_driverfs_driver = {
 857	.name 		= sdebug_proc_name,
 858	.bus		= &pseudo_lld_bus,
 859};
 860
 861static const int check_condition_result =
 862	SAM_STAT_CHECK_CONDITION;
 863
 864static const int illegal_condition_result =
 865	(DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 866
 867static const int device_qfull_result =
 868	(DID_ABORT << 16) | SAM_STAT_TASK_SET_FULL;
 869
 870static const int condition_met_result = SAM_STAT_CONDITION_MET;
 871
 872
 873/* Only do the extra work involved in logical block provisioning if one or
 874 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
 875 * real reads and writes (i.e. not skipping them for speed).
 876 */
 877static inline bool scsi_debug_lbp(void)
 878{
 879	return 0 == sdebug_fake_rw &&
 880		(sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
 881}
 882
 883static void *lba2fake_store(struct sdeb_store_info *sip,
 884			    unsigned long long lba)
 885{
 886	struct sdeb_store_info *lsip = sip;
 887
 888	lba = do_div(lba, sdebug_store_sectors);
 889	if (!sip || !sip->storep) {
 890		WARN_ON_ONCE(true);
 891		lsip = xa_load(per_store_ap, 0);  /* should never be NULL */
 892	}
 893	return lsip->storep + lba * sdebug_sector_size;
 894}
 895
 896static struct t10_pi_tuple *dif_store(struct sdeb_store_info *sip,
 897				      sector_t sector)
 898{
 899	sector = sector_div(sector, sdebug_store_sectors);
 900
 901	return sip->dif_storep + sector;
 902}
 903
 904static void sdebug_max_tgts_luns(void)
 905{
 906	struct sdebug_host_info *sdbg_host;
 907	struct Scsi_Host *hpnt;
 908
 909	spin_lock(&sdebug_host_list_lock);
 910	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 911		hpnt = sdbg_host->shost;
 912		if ((hpnt->this_id >= 0) &&
 913		    (sdebug_num_tgts > hpnt->this_id))
 914			hpnt->max_id = sdebug_num_tgts + 1;
 915		else
 916			hpnt->max_id = sdebug_num_tgts;
 917		/* sdebug_max_luns; */
 918		hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
 919	}
 920	spin_unlock(&sdebug_host_list_lock);
 921}
 922
 923enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
 924
 925/* Set in_bit to -1 to indicate no bit position of invalid field */
 926static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
 927				 enum sdeb_cmd_data c_d,
 928				 int in_byte, int in_bit)
 929{
 930	unsigned char *sbuff;
 931	u8 sks[4];
 932	int sl, asc;
 933
 934	sbuff = scp->sense_buffer;
 935	if (!sbuff) {
 936		sdev_printk(KERN_ERR, scp->device,
 937			    "%s: sense_buffer is NULL\n", __func__);
 938		return;
 939	}
 940	asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
 941	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 942	scsi_build_sense(scp, sdebug_dsense, ILLEGAL_REQUEST, asc, 0);
 943	memset(sks, 0, sizeof(sks));
 944	sks[0] = 0x80;
 945	if (c_d)
 946		sks[0] |= 0x40;
 947	if (in_bit >= 0) {
 948		sks[0] |= 0x8;
 949		sks[0] |= 0x7 & in_bit;
 950	}
 951	put_unaligned_be16(in_byte, sks + 1);
 952	if (sdebug_dsense) {
 953		sl = sbuff[7] + 8;
 954		sbuff[7] = sl;
 955		sbuff[sl] = 0x2;
 956		sbuff[sl + 1] = 0x6;
 957		memcpy(sbuff + sl + 4, sks, 3);
 958	} else
 959		memcpy(sbuff + 15, sks, 3);
 960	if (sdebug_verbose)
 961		sdev_printk(KERN_INFO, scp->device, "%s:  [sense_key,asc,ascq"
 962			    "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
 963			    my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
 964}
 965
 966static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
 967{
 968	if (!scp->sense_buffer) {
 969		sdev_printk(KERN_ERR, scp->device,
 970			    "%s: sense_buffer is NULL\n", __func__);
 971		return;
 972	}
 973	memset(scp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
 974
 975	scsi_build_sense(scp, sdebug_dsense, key, asc, asq);
 976
 977	if (sdebug_verbose)
 978		sdev_printk(KERN_INFO, scp->device,
 979			    "%s:  [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
 980			    my_name, key, asc, asq);
 981}
 982
 983static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
 
 
 984{
 985	mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
 986}
 
 
 
 
 
 
 987
 988static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
 989			    void __user *arg)
 990{
 991	if (sdebug_verbose) {
 992		if (0x1261 == cmd)
 993			sdev_printk(KERN_INFO, dev,
 994				    "%s: BLKFLSBUF [0x1261]\n", __func__);
 995		else if (0x5331 == cmd)
 996			sdev_printk(KERN_INFO, dev,
 997				    "%s: CDROM_GET_CAPABILITY [0x5331]\n",
 998				    __func__);
 999		else
1000			sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
1001				    __func__, cmd);
1002	}
1003	return -EINVAL;
1004	/* return -ENOTTY; // correct return but upsets fdisk */
1005}
1006
1007static void config_cdb_len(struct scsi_device *sdev)
1008{
1009	switch (sdebug_cdb_len) {
1010	case 6:	/* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
1011		sdev->use_10_for_rw = false;
1012		sdev->use_16_for_rw = false;
1013		sdev->use_10_for_ms = false;
1014		break;
1015	case 10: /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
1016		sdev->use_10_for_rw = true;
1017		sdev->use_16_for_rw = false;
1018		sdev->use_10_for_ms = false;
1019		break;
1020	case 12: /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
1021		sdev->use_10_for_rw = true;
1022		sdev->use_16_for_rw = false;
1023		sdev->use_10_for_ms = true;
1024		break;
1025	case 16:
1026		sdev->use_10_for_rw = false;
1027		sdev->use_16_for_rw = true;
1028		sdev->use_10_for_ms = true;
1029		break;
1030	case 32: /* No knobs to suggest this so same as 16 for now */
1031		sdev->use_10_for_rw = false;
1032		sdev->use_16_for_rw = true;
1033		sdev->use_10_for_ms = true;
1034		break;
1035	default:
1036		pr_warn("unexpected cdb_len=%d, force to 10\n",
1037			sdebug_cdb_len);
1038		sdev->use_10_for_rw = true;
1039		sdev->use_16_for_rw = false;
1040		sdev->use_10_for_ms = false;
1041		sdebug_cdb_len = 10;
 
 
 
 
1042		break;
1043	}
1044}
 
 
1045
1046static void all_config_cdb_len(void)
1047{
1048	struct sdebug_host_info *sdbg_host;
1049	struct Scsi_Host *shost;
1050	struct scsi_device *sdev;
 
 
 
 
1051
1052	spin_lock(&sdebug_host_list_lock);
1053	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1054		shost = sdbg_host->shost;
1055		shost_for_each_device(sdev, shost) {
1056			config_cdb_len(sdev);
1057		}
 
 
 
 
1058	}
1059	spin_unlock(&sdebug_host_list_lock);
1060}
1061
1062static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
1063{
1064	struct sdebug_host_info *sdhp;
1065	struct sdebug_dev_info *dp;
1066
1067	spin_lock(&sdebug_host_list_lock);
1068	list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
1069		list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
1070			if ((devip->sdbg_host == dp->sdbg_host) &&
1071			    (devip->target == dp->target))
1072				clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
1073		}
1074	}
1075	spin_unlock(&sdebug_host_list_lock);
 
1076}
1077
1078static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
1079{
1080	int k;
1081
1082	k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
1083	if (k != SDEBUG_NUM_UAS) {
1084		const char *cp = NULL;
1085
1086		switch (k) {
1087		case SDEBUG_UA_POR:
1088			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1089					POWER_ON_RESET_ASCQ);
1090			if (sdebug_verbose)
1091				cp = "power on reset";
1092			break;
1093		case SDEBUG_UA_POOCCUR:
1094			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1095					POWER_ON_OCCURRED_ASCQ);
1096			if (sdebug_verbose)
1097				cp = "power on occurred";
1098			break;
1099		case SDEBUG_UA_BUS_RESET:
1100			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1101					BUS_RESET_ASCQ);
1102			if (sdebug_verbose)
1103				cp = "bus reset";
1104			break;
1105		case SDEBUG_UA_MODE_CHANGED:
1106			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1107					MODE_CHANGED_ASCQ);
1108			if (sdebug_verbose)
1109				cp = "mode parameters changed";
1110			break;
1111		case SDEBUG_UA_CAPACITY_CHANGED:
1112			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1113					CAPACITY_CHANGED_ASCQ);
1114			if (sdebug_verbose)
1115				cp = "capacity data changed";
1116			break;
1117		case SDEBUG_UA_MICROCODE_CHANGED:
1118			mk_sense_buffer(scp, UNIT_ATTENTION,
1119					TARGET_CHANGED_ASC,
1120					MICROCODE_CHANGED_ASCQ);
1121			if (sdebug_verbose)
1122				cp = "microcode has been changed";
1123			break;
1124		case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
1125			mk_sense_buffer(scp, UNIT_ATTENTION,
1126					TARGET_CHANGED_ASC,
1127					MICROCODE_CHANGED_WO_RESET_ASCQ);
1128			if (sdebug_verbose)
1129				cp = "microcode has been changed without reset";
1130			break;
1131		case SDEBUG_UA_LUNS_CHANGED:
1132			/*
1133			 * SPC-3 behavior is to report a UNIT ATTENTION with
1134			 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
1135			 * on the target, until a REPORT LUNS command is
1136			 * received.  SPC-4 behavior is to report it only once.
1137			 * NOTE:  sdebug_scsi_level does not use the same
1138			 * values as struct scsi_device->scsi_level.
1139			 */
1140			if (sdebug_scsi_level >= 6)	/* SPC-4 and above */
1141				clear_luns_changed_on_target(devip);
1142			mk_sense_buffer(scp, UNIT_ATTENTION,
1143					TARGET_CHANGED_ASC,
1144					LUNS_CHANGED_ASCQ);
1145			if (sdebug_verbose)
1146				cp = "reported luns data has changed";
1147			break;
1148		default:
1149			pr_warn("unexpected unit attention code=%d\n", k);
1150			if (sdebug_verbose)
1151				cp = "unknown";
1152			break;
1153		}
1154		clear_bit(k, devip->uas_bm);
1155		if (sdebug_verbose)
1156			sdev_printk(KERN_INFO, scp->device,
1157				   "%s reports: Unit attention: %s\n",
1158				   my_name, cp);
1159		return check_condition_result;
1160	}
1161	return 0;
1162}
1163
1164/* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
1165static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1166				int arr_len)
1167{
1168	int act_len;
1169	struct scsi_data_buffer *sdb = &scp->sdb;
1170
1171	if (!sdb->length)
1172		return 0;
1173	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1174		return DID_ERROR << 16;
1175
1176	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
1177				      arr, arr_len);
1178	scsi_set_resid(scp, scsi_bufflen(scp) - act_len);
1179
1180	return 0;
1181}
1182
1183/* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
1184 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
1185 * calls, not required to write in ascending offset order. Assumes resid
1186 * set to scsi_bufflen() prior to any calls.
1187 */
1188static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
1189				  int arr_len, unsigned int off_dst)
1190{
1191	unsigned int act_len, n;
1192	struct scsi_data_buffer *sdb = &scp->sdb;
1193	off_t skip = off_dst;
1194
1195	if (sdb->length <= off_dst)
1196		return 0;
1197	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1198		return DID_ERROR << 16;
1199
1200	act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
1201				       arr, arr_len, skip);
1202	pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
1203		 __func__, off_dst, scsi_bufflen(scp), act_len,
1204		 scsi_get_resid(scp));
1205	n = scsi_bufflen(scp) - (off_dst + act_len);
1206	scsi_set_resid(scp, min_t(u32, scsi_get_resid(scp), n));
1207	return 0;
1208}
1209
1210/* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
1211 * 'arr' or -1 if error.
1212 */
1213static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1214			       int arr_len)
1215{
1216	if (!scsi_bufflen(scp))
1217		return 0;
1218	if (scp->sc_data_direction != DMA_TO_DEVICE)
1219		return -1;
1220
1221	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1222}
1223
1224
1225static char sdebug_inq_vendor_id[9] = "Linux   ";
1226static char sdebug_inq_product_id[17] = "scsi_debug      ";
1227static char sdebug_inq_product_rev[5] = SDEBUG_VERSION;
1228/* Use some locally assigned NAAs for SAS addresses. */
1229static const u64 naa3_comp_a = 0x3222222000000000ULL;
1230static const u64 naa3_comp_b = 0x3333333000000000ULL;
1231static const u64 naa3_comp_c = 0x3111111000000000ULL;
1232
1233/* Device identification VPD page. Returns number of bytes placed in arr */
1234static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
1235			  int target_dev_id, int dev_id_num,
1236			  const char *dev_id_str, int dev_id_str_len,
1237			  const uuid_t *lu_name)
1238{
1239	int num, port_a;
1240	char b[32];
1241
1242	port_a = target_dev_id + 1;
1243	/* T10 vendor identifier field format (faked) */
1244	arr[0] = 0x2;	/* ASCII */
1245	arr[1] = 0x1;
1246	arr[2] = 0x0;
1247	memcpy(&arr[4], sdebug_inq_vendor_id, 8);
1248	memcpy(&arr[12], sdebug_inq_product_id, 16);
1249	memcpy(&arr[28], dev_id_str, dev_id_str_len);
1250	num = 8 + 16 + dev_id_str_len;
1251	arr[3] = num;
1252	num += 4;
1253	if (dev_id_num >= 0) {
1254		if (sdebug_uuid_ctl) {
1255			/* Locally assigned UUID */
1256			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1257			arr[num++] = 0xa;  /* PIV=0, lu, naa */
1258			arr[num++] = 0x0;
1259			arr[num++] = 0x12;
1260			arr[num++] = 0x10; /* uuid type=1, locally assigned */
1261			arr[num++] = 0x0;
1262			memcpy(arr + num, lu_name, 16);
1263			num += 16;
1264		} else {
1265			/* NAA-3, Logical unit identifier (binary) */
1266			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1267			arr[num++] = 0x3;  /* PIV=0, lu, naa */
1268			arr[num++] = 0x0;
1269			arr[num++] = 0x8;
1270			put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
1271			num += 8;
1272		}
1273		/* Target relative port number */
1274		arr[num++] = 0x61;	/* proto=sas, binary */
1275		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
1276		arr[num++] = 0x0;	/* reserved */
1277		arr[num++] = 0x4;	/* length */
1278		arr[num++] = 0x0;	/* reserved */
1279		arr[num++] = 0x0;	/* reserved */
1280		arr[num++] = 0x0;
1281		arr[num++] = 0x1;	/* relative port A */
1282	}
1283	/* NAA-3, Target port identifier */
1284	arr[num++] = 0x61;	/* proto=sas, binary */
1285	arr[num++] = 0x93;	/* piv=1, target port, naa */
1286	arr[num++] = 0x0;
1287	arr[num++] = 0x8;
1288	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1289	num += 8;
1290	/* NAA-3, Target port group identifier */
 
 
 
 
 
 
1291	arr[num++] = 0x61;	/* proto=sas, binary */
1292	arr[num++] = 0x95;	/* piv=1, target port group id */
1293	arr[num++] = 0x0;
1294	arr[num++] = 0x4;
1295	arr[num++] = 0;
1296	arr[num++] = 0;
1297	put_unaligned_be16(port_group_id, arr + num);
1298	num += 2;
1299	/* NAA-3, Target device identifier */
1300	arr[num++] = 0x61;	/* proto=sas, binary */
1301	arr[num++] = 0xa3;	/* piv=1, target device, naa */
1302	arr[num++] = 0x0;
1303	arr[num++] = 0x8;
1304	put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
1305	num += 8;
 
 
 
 
 
 
1306	/* SCSI name string: Target device identifier */
1307	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
1308	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
1309	arr[num++] = 0x0;
1310	arr[num++] = 24;
1311	memcpy(arr + num, "naa.32222220", 12);
1312	num += 12;
1313	snprintf(b, sizeof(b), "%08X", target_dev_id);
1314	memcpy(arr + num, b, 8);
1315	num += 8;
1316	memset(arr + num, 0, 4);
1317	num += 4;
1318	return num;
1319}
1320
 
1321static unsigned char vpd84_data[] = {
1322/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1323    0x22,0x22,0x22,0x0,0xbb,0x1,
1324    0x22,0x22,0x22,0x0,0xbb,0x2,
1325};
1326
1327/*  Software interface identification VPD page */
1328static int inquiry_vpd_84(unsigned char *arr)
1329{
1330	memcpy(arr, vpd84_data, sizeof(vpd84_data));
1331	return sizeof(vpd84_data);
1332}
1333
1334/* Management network addresses VPD page */
1335static int inquiry_vpd_85(unsigned char *arr)
1336{
1337	int num = 0;
1338	const char *na1 = "https://www.kernel.org/config";
1339	const char *na2 = "http://www.kernel.org/log";
1340	int plen, olen;
1341
1342	arr[num++] = 0x1;	/* lu, storage config */
1343	arr[num++] = 0x0;	/* reserved */
1344	arr[num++] = 0x0;
1345	olen = strlen(na1);
1346	plen = olen + 1;
1347	if (plen % 4)
1348		plen = ((plen / 4) + 1) * 4;
1349	arr[num++] = plen;	/* length, null termianted, padded */
1350	memcpy(arr + num, na1, olen);
1351	memset(arr + num + olen, 0, plen - olen);
1352	num += plen;
1353
1354	arr[num++] = 0x4;	/* lu, logging */
1355	arr[num++] = 0x0;	/* reserved */
1356	arr[num++] = 0x0;
1357	olen = strlen(na2);
1358	plen = olen + 1;
1359	if (plen % 4)
1360		plen = ((plen / 4) + 1) * 4;
1361	arr[num++] = plen;	/* length, null terminated, padded */
1362	memcpy(arr + num, na2, olen);
1363	memset(arr + num + olen, 0, plen - olen);
1364	num += plen;
1365
1366	return num;
1367}
1368
1369/* SCSI ports VPD page */
1370static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
1371{
1372	int num = 0;
1373	int port_a, port_b;
1374
1375	port_a = target_dev_id + 1;
1376	port_b = port_a + 1;
1377	arr[num++] = 0x0;	/* reserved */
1378	arr[num++] = 0x0;	/* reserved */
1379	arr[num++] = 0x0;
1380	arr[num++] = 0x1;	/* relative port 1 (primary) */
1381	memset(arr + num, 0, 6);
1382	num += 6;
1383	arr[num++] = 0x0;
1384	arr[num++] = 12;	/* length tp descriptor */
1385	/* naa-5 target port identifier (A) */
1386	arr[num++] = 0x61;	/* proto=sas, binary */
1387	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1388	arr[num++] = 0x0;	/* reserved */
1389	arr[num++] = 0x8;	/* length */
1390	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1391	num += 8;
 
 
 
 
 
 
 
1392	arr[num++] = 0x0;	/* reserved */
1393	arr[num++] = 0x0;	/* reserved */
1394	arr[num++] = 0x0;
1395	arr[num++] = 0x2;	/* relative port 2 (secondary) */
1396	memset(arr + num, 0, 6);
1397	num += 6;
1398	arr[num++] = 0x0;
1399	arr[num++] = 12;	/* length tp descriptor */
1400	/* naa-5 target port identifier (B) */
1401	arr[num++] = 0x61;	/* proto=sas, binary */
1402	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1403	arr[num++] = 0x0;	/* reserved */
1404	arr[num++] = 0x8;	/* length */
1405	put_unaligned_be64(naa3_comp_a + port_b, arr + num);
1406	num += 8;
 
 
 
 
 
 
1407
1408	return num;
1409}
1410
1411
1412static unsigned char vpd89_data[] = {
1413/* from 4th byte */ 0,0,0,0,
1414'l','i','n','u','x',' ',' ',' ',
1415'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1416'1','2','3','4',
14170x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
14180xec,0,0,0,
14190x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
14200,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
14210x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
14220x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
14230x53,0x41,
14240x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14250x20,0x20,
14260x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14270x10,0x80,
14280,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
14290x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
14300x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
14310,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
14320x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
14330x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
14340,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
14350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14380x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
14390,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
14400xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
14410,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
14420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14450,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14530,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1454};
1455
1456/* ATA Information VPD page */
1457static int inquiry_vpd_89(unsigned char *arr)
1458{
1459	memcpy(arr, vpd89_data, sizeof(vpd89_data));
1460	return sizeof(vpd89_data);
1461}
1462
1463
 
1464static unsigned char vpdb0_data[] = {
1465	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1466	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1467	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1468	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1469};
1470
1471/* Block limits VPD page (SBC-3) */
1472static int inquiry_vpd_b0(unsigned char *arr)
1473{
1474	unsigned int gran;
1475
1476	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
1477
1478	/* Optimal transfer length granularity */
1479	if (sdebug_opt_xferlen_exp != 0 &&
1480	    sdebug_physblk_exp < sdebug_opt_xferlen_exp)
1481		gran = 1 << sdebug_opt_xferlen_exp;
1482	else
1483		gran = 1 << sdebug_physblk_exp;
1484	put_unaligned_be16(gran, arr + 2);
1485
1486	/* Maximum Transfer Length */
1487	if (sdebug_store_sectors > 0x400)
1488		put_unaligned_be32(sdebug_store_sectors, arr + 4);
 
 
 
 
1489
1490	/* Optimal Transfer Length */
1491	put_unaligned_be32(sdebug_opt_blks, &arr[8]);
1492
1493	if (sdebug_lbpu) {
1494		/* Maximum Unmap LBA Count */
1495		put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
1496
1497		/* Maximum Unmap Block Descriptor Count */
1498		put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
1499	}
1500
1501	/* Unmap Granularity Alignment */
1502	if (sdebug_unmap_alignment) {
1503		put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
1504		arr[28] |= 0x80; /* UGAVALID */
1505	}
1506
1507	/* Optimal Unmap Granularity */
1508	put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
1509
1510	/* Maximum WRITE SAME Length */
1511	put_unaligned_be64(sdebug_write_same_length, &arr[32]);
1512
1513	return 0x3c; /* Mandatory page length for Logical Block Provisioning */
 
 
1514}
1515
1516/* Block device characteristics VPD page (SBC-3) */
1517static int inquiry_vpd_b1(struct sdebug_dev_info *devip, unsigned char *arr)
1518{
1519	memset(arr, 0, 0x3c);
1520	arr[0] = 0;
1521	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
1522	arr[2] = 0;
1523	arr[3] = 5;	/* less than 1.8" */
1524	if (devip->zmodel == BLK_ZONED_HA)
1525		arr[4] = 1 << 4;	/* zoned field = 01b */
1526
1527	return 0x3c;
1528}
1529
1530/* Logical block provisioning VPD page (SBC-4) */
1531static int inquiry_vpd_b2(unsigned char *arr)
1532{
1533	memset(arr, 0, 0x4);
1534	arr[0] = 0;			/* threshold exponent */
1535	if (sdebug_lbpu)
 
1536		arr[1] = 1 << 7;
1537	if (sdebug_lbpws)
 
1538		arr[1] |= 1 << 6;
1539	if (sdebug_lbpws10)
 
1540		arr[1] |= 1 << 5;
1541	if (sdebug_lbprz && scsi_debug_lbp())
1542		arr[1] |= (sdebug_lbprz & 0x7) << 2;  /* sbc4r07 and later */
1543	/* anc_sup=0; dp=0 (no provisioning group descriptor) */
1544	/* minimum_percentage=0; provisioning_type=0 (unknown) */
1545	/* threshold_percentage=0 */
1546	return 0x4;
1547}
1548
1549/* Zoned block device characteristics VPD page (ZBC mandatory) */
1550static int inquiry_vpd_b6(struct sdebug_dev_info *devip, unsigned char *arr)
1551{
1552	memset(arr, 0, 0x3c);
1553	arr[0] = 0x1; /* set URSWRZ (unrestricted read in seq. wr req zone) */
1554	/*
1555	 * Set Optimal number of open sequential write preferred zones and
1556	 * Optimal number of non-sequentially written sequential write
1557	 * preferred zones fields to 'not reported' (0xffffffff). Leave other
1558	 * fields set to zero, apart from Max. number of open swrz_s field.
1559	 */
1560	put_unaligned_be32(0xffffffff, &arr[4]);
1561	put_unaligned_be32(0xffffffff, &arr[8]);
1562	if (sdeb_zbc_model == BLK_ZONED_HM && devip->max_open)
1563		put_unaligned_be32(devip->max_open, &arr[12]);
1564	else
1565		put_unaligned_be32(0xffffffff, &arr[12]);
1566	if (devip->zcap < devip->zsize) {
1567		arr[19] = ZBC_CONSTANT_ZONE_START_OFFSET;
1568		put_unaligned_be64(devip->zsize, &arr[20]);
1569	} else {
1570		arr[19] = 0;
1571	}
1572	return 0x3c;
1573}
1574
1575#define SDEBUG_LONG_INQ_SZ 96
1576#define SDEBUG_MAX_INQ_ARR_SZ 584
1577
1578static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
1579{
1580	unsigned char pq_pdt;
1581	unsigned char *arr;
1582	unsigned char *cmd = scp->cmnd;
1583	u32 alloc_len, n;
1584	int ret;
1585	bool have_wlun, is_disk, is_zbc, is_disk_zbc;
1586
1587	alloc_len = get_unaligned_be16(cmd + 3);
1588	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1589	if (! arr)
1590		return DID_REQUEUE << 16;
1591	is_disk = (sdebug_ptype == TYPE_DISK);
1592	is_zbc = (devip->zmodel != BLK_ZONED_NONE);
1593	is_disk_zbc = (is_disk || is_zbc);
1594	have_wlun = scsi_is_wlun(scp->device->lun);
1595	if (have_wlun)
1596		pq_pdt = TYPE_WLUN;	/* present, wlun */
1597	else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1598		pq_pdt = 0x7f;	/* not present, PQ=3, PDT=0x1f */
1599	else
1600		pq_pdt = (sdebug_ptype & 0x1f);
1601	arr[0] = pq_pdt;
1602	if (0x2 & cmd[1]) {  /* CMDDT bit set */
1603		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
 
1604		kfree(arr);
1605		return check_condition_result;
1606	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
1607		int lu_id_num, port_group_id, target_dev_id;
1608		u32 len;
1609		char lu_id_str[6];
1610		int host_no = devip->sdbg_host->shost->host_no;
1611		
1612		port_group_id = (((host_no + 1) & 0x7f) << 8) +
1613		    (devip->channel & 0x7f);
1614		if (sdebug_vpd_use_hostno == 0)
1615			host_no = 0;
1616		lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
1617			    (devip->target * 1000) + devip->lun);
1618		target_dev_id = ((host_no + 1) * 2000) +
1619				 (devip->target * 1000) - 3;
1620		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1621		if (0 == cmd[2]) { /* supported vital product data pages */
1622			arr[1] = cmd[2];	/*sanity */
1623			n = 4;
1624			arr[n++] = 0x0;   /* this page */
1625			arr[n++] = 0x80;  /* unit serial number */
1626			arr[n++] = 0x83;  /* device identification */
1627			arr[n++] = 0x84;  /* software interface ident. */
1628			arr[n++] = 0x85;  /* management network addresses */
1629			arr[n++] = 0x86;  /* extended inquiry */
1630			arr[n++] = 0x87;  /* mode page policy */
1631			arr[n++] = 0x88;  /* SCSI ports */
1632			if (is_disk_zbc) {	  /* SBC or ZBC */
1633				arr[n++] = 0x89;  /* ATA information */
1634				arr[n++] = 0xb0;  /* Block limits */
1635				arr[n++] = 0xb1;  /* Block characteristics */
1636				if (is_disk)
1637					arr[n++] = 0xb2;  /* LB Provisioning */
1638				if (is_zbc)
1639					arr[n++] = 0xb6;  /* ZB dev. char. */
1640			}
1641			arr[3] = n - 4;	  /* number of supported VPD pages */
1642		} else if (0x80 == cmd[2]) { /* unit serial number */
1643			arr[1] = cmd[2];	/*sanity */
1644			arr[3] = len;
1645			memcpy(&arr[4], lu_id_str, len);
1646		} else if (0x83 == cmd[2]) { /* device identification */
1647			arr[1] = cmd[2];	/*sanity */
1648			arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1649						target_dev_id, lu_id_num,
1650						lu_id_str, len,
1651						&devip->lu_name);
1652		} else if (0x84 == cmd[2]) { /* Software interface ident. */
1653			arr[1] = cmd[2];	/*sanity */
1654			arr[3] = inquiry_vpd_84(&arr[4]);
1655		} else if (0x85 == cmd[2]) { /* Management network addresses */
1656			arr[1] = cmd[2];	/*sanity */
1657			arr[3] = inquiry_vpd_85(&arr[4]);
1658		} else if (0x86 == cmd[2]) { /* extended inquiry */
1659			arr[1] = cmd[2];	/*sanity */
1660			arr[3] = 0x3c;	/* number of following entries */
1661			if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
1662				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
1663			else if (have_dif_prot)
1664				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
1665			else
1666				arr[4] = 0x0;   /* no protection stuff */
1667			arr[5] = 0x7;   /* head of q, ordered + simple q's */
1668		} else if (0x87 == cmd[2]) { /* mode page policy */
1669			arr[1] = cmd[2];	/*sanity */
1670			arr[3] = 0x8;	/* number of following entries */
1671			arr[4] = 0x2;	/* disconnect-reconnect mp */
1672			arr[6] = 0x80;	/* mlus, shared */
1673			arr[8] = 0x18;	 /* protocol specific lu */
1674			arr[10] = 0x82;	 /* mlus, per initiator port */
1675		} else if (0x88 == cmd[2]) { /* SCSI Ports */
1676			arr[1] = cmd[2];	/*sanity */
1677			arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1678		} else if (is_disk_zbc && 0x89 == cmd[2]) { /* ATA info */
1679			arr[1] = cmd[2];        /*sanity */
1680			n = inquiry_vpd_89(&arr[4]);
1681			put_unaligned_be16(n, arr + 2);
1682		} else if (is_disk_zbc && 0xb0 == cmd[2]) { /* Block limits */
 
1683			arr[1] = cmd[2];        /*sanity */
1684			arr[3] = inquiry_vpd_b0(&arr[4]);
1685		} else if (is_disk_zbc && 0xb1 == cmd[2]) { /* Block char. */
1686			arr[1] = cmd[2];        /*sanity */
1687			arr[3] = inquiry_vpd_b1(devip, &arr[4]);
1688		} else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
1689			arr[1] = cmd[2];        /*sanity */
1690			arr[3] = inquiry_vpd_b2(&arr[4]);
1691		} else if (is_zbc && cmd[2] == 0xb6) { /* ZB dev. charact. */
1692			arr[1] = cmd[2];        /*sanity */
1693			arr[3] = inquiry_vpd_b6(devip, &arr[4]);
1694		} else {
1695			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
 
 
1696			kfree(arr);
1697			return check_condition_result;
1698		}
1699		len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
1700		ret = fill_from_dev_buffer(scp, arr,
1701			    min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
1702		kfree(arr);
1703		return ret;
1704	}
1705	/* drops through here for a standard inquiry */
1706	arr[1] = sdebug_removable ? 0x80 : 0;	/* Removable disk */
1707	arr[2] = sdebug_scsi_level;
1708	arr[3] = 2;    /* response_data_format==2 */
1709	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1710	arr[5] = (int)have_dif_prot;	/* PROTECT bit */
1711	if (sdebug_vpd_use_hostno == 0)
1712		arr[5] |= 0x10; /* claim: implicit TPGS */
1713	arr[6] = 0x10; /* claim: MultiP */
1714	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1715	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1716	memcpy(&arr[8], sdebug_inq_vendor_id, 8);
1717	memcpy(&arr[16], sdebug_inq_product_id, 16);
1718	memcpy(&arr[32], sdebug_inq_product_rev, 4);
1719	/* Use Vendor Specific area to place driver date in ASCII hex */
1720	memcpy(&arr[36], sdebug_version_date, 8);
1721	/* version descriptors (2 bytes each) follow */
1722	put_unaligned_be16(0xc0, arr + 58);   /* SAM-6 no version claimed */
1723	put_unaligned_be16(0x5c0, arr + 60);  /* SPC-5 no version claimed */
1724	n = 62;
1725	if (is_disk) {		/* SBC-4 no version claimed */
1726		put_unaligned_be16(0x600, arr + n);
1727		n += 2;
1728	} else if (sdebug_ptype == TYPE_TAPE) {	/* SSC-4 rev 3 */
1729		put_unaligned_be16(0x525, arr + n);
1730		n += 2;
1731	} else if (is_zbc) {	/* ZBC BSR INCITS 536 revision 05 */
1732		put_unaligned_be16(0x624, arr + n);
1733		n += 2;
1734	}
1735	put_unaligned_be16(0x2100, arr + n);	/* SPL-4 no version claimed */
1736	ret = fill_from_dev_buffer(scp, arr,
1737			    min_t(u32, alloc_len, SDEBUG_LONG_INQ_SZ));
1738	kfree(arr);
1739	return ret;
1740}
1741
1742/* See resp_iec_m_pg() for how this data is manipulated */
1743static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1744				   0, 0, 0x0, 0x0};
1745
1746static int resp_requests(struct scsi_cmnd *scp,
1747			 struct sdebug_dev_info *devip)
1748{
1749	unsigned char *cmd = scp->cmnd;
1750	unsigned char arr[SCSI_SENSE_BUFFERSIZE];	/* assume >= 18 bytes */
1751	bool dsense = !!(cmd[1] & 1);
1752	u32 alloc_len = cmd[4];
1753	u32 len = 18;
1754	int stopped_state = atomic_read(&devip->stopped);
1755
1756	memset(arr, 0, sizeof(arr));
1757	if (stopped_state > 0) {	/* some "pollable" data [spc6r02: 5.12.2] */
1758		if (dsense) {
1759			arr[0] = 0x72;
1760			arr[1] = NOT_READY;
1761			arr[2] = LOGICAL_UNIT_NOT_READY;
1762			arr[3] = (stopped_state == 2) ? 0x1 : 0x2;
1763			len = 8;
1764		} else {
1765			arr[0] = 0x70;
1766			arr[2] = NOT_READY;		/* NO_SENSE in sense_key */
1767			arr[7] = 0xa;			/* 18 byte sense buffer */
1768			arr[12] = LOGICAL_UNIT_NOT_READY;
1769			arr[13] = (stopped_state == 2) ? 0x1 : 0x2;
1770		}
1771	} else if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1772		/* Information exceptions control mode page: TEST=1, MRIE=6 */
1773		if (dsense) {
1774			arr[0] = 0x72;
1775			arr[1] = 0x0;		/* NO_SENSE in sense_key */
1776			arr[2] = THRESHOLD_EXCEEDED;
1777			arr[3] = 0xff;		/* Failure prediction(false) */
1778			len = 8;
1779		} else {
1780			arr[0] = 0x70;
1781			arr[2] = 0x0;		/* NO_SENSE in sense_key */
1782			arr[7] = 0xa;   	/* 18 byte sense buffer */
1783			arr[12] = THRESHOLD_EXCEEDED;
1784			arr[13] = 0xff;		/* Failure prediction(false) */
1785		}
1786	} else {	/* nothing to report */
1787		if (dsense) {
 
 
 
 
 
 
 
1788			len = 8;
1789			memset(arr, 0, len);
1790			arr[0] = 0x72;
1791		} else {
1792			memset(arr, 0, len);
1793			arr[0] = 0x70;
1794			arr[7] = 0xa;
1795		}
1796	}
1797	return fill_from_dev_buffer(scp, arr, min_t(u32, len, alloc_len));
 
1798}
1799
1800static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
1801{
1802	unsigned char *cmd = scp->cmnd;
1803	int power_cond, want_stop, stopped_state;
1804	bool changing;
1805
 
 
1806	power_cond = (cmd[4] & 0xf0) >> 4;
1807	if (power_cond) {
1808		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
 
1809		return check_condition_result;
1810	}
1811	want_stop = !(cmd[4] & 1);
1812	stopped_state = atomic_read(&devip->stopped);
1813	if (stopped_state == 2) {
1814		ktime_t now_ts = ktime_get_boottime();
1815
1816		if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
1817			u64 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
1818
1819			if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
1820				/* tur_ms_to_ready timer extinguished */
1821				atomic_set(&devip->stopped, 0);
1822				stopped_state = 0;
1823			}
1824		}
1825		if (stopped_state == 2) {
1826			if (want_stop) {
1827				stopped_state = 1;	/* dummy up success */
1828			} else {	/* Disallow tur_ms_to_ready delay to be overridden */
1829				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 0 /* START bit */);
1830				return check_condition_result;
1831			}
1832		}
1833	}
1834	changing = (stopped_state != want_stop);
1835	if (changing)
1836		atomic_xchg(&devip->stopped, want_stop);
1837	if (!changing || (cmd[1] & 0x1))  /* state unchanged or IMMED bit set in cdb */
1838		return SDEG_RES_IMMED_MASK;
1839	else
1840		return 0;
1841}
1842
1843static sector_t get_sdebug_capacity(void)
1844{
1845	static const unsigned int gibibyte = 1073741824;
1846
1847	if (sdebug_virtual_gb > 0)
1848		return (sector_t)sdebug_virtual_gb *
1849			(gibibyte / sdebug_sector_size);
1850	else
1851		return sdebug_store_sectors;
1852}
1853
1854#define SDEBUG_READCAP_ARR_SZ 8
1855static int resp_readcap(struct scsi_cmnd *scp,
1856			struct sdebug_dev_info *devip)
1857{
1858	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1859	unsigned int capac;
 
1860
 
 
1861	/* following just in case virtual_gb changed */
1862	sdebug_capacity = get_sdebug_capacity();
1863	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1864	if (sdebug_capacity < 0xffffffff) {
1865		capac = (unsigned int)sdebug_capacity - 1;
1866		put_unaligned_be32(capac, arr + 0);
1867	} else
1868		put_unaligned_be32(0xffffffff, arr + 0);
1869	put_unaligned_be16(sdebug_sector_size, arr + 6);
 
 
 
 
 
 
 
 
1870	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1871}
1872
1873#define SDEBUG_READCAP16_ARR_SZ 32
1874static int resp_readcap16(struct scsi_cmnd *scp,
1875			  struct sdebug_dev_info *devip)
1876{
1877	unsigned char *cmd = scp->cmnd;
1878	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1879	u32 alloc_len;
 
1880
1881	alloc_len = get_unaligned_be32(cmd + 10);
 
 
 
1882	/* following just in case virtual_gb changed */
1883	sdebug_capacity = get_sdebug_capacity();
1884	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1885	put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1886	put_unaligned_be32(sdebug_sector_size, arr + 8);
1887	arr[13] = sdebug_physblk_exp & 0xf;
1888	arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
 
 
 
 
 
1889
1890	if (scsi_debug_lbp()) {
1891		arr[14] |= 0x80; /* LBPME */
1892		/* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1893		 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1894		 * in the wider field maps to 0 in this field.
1895		 */
1896		if (sdebug_lbprz & 1)	/* precisely what the draft requires */
1897			arr[14] |= 0x40;
1898	}
1899
1900	/*
1901	 * Since the scsi_debug READ CAPACITY implementation always reports the
1902	 * total disk capacity, set RC BASIS = 1 for host-managed ZBC devices.
1903	 */
1904	if (devip->zmodel == BLK_ZONED_HM)
1905		arr[12] |= 1 << 4;
1906
1907	arr[15] = sdebug_lowest_aligned & 0xff;
1908
1909	if (have_dif_prot) {
1910		arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
1911		arr[12] |= 1; /* PROT_EN */
1912	}
1913
1914	return fill_from_dev_buffer(scp, arr,
1915			    min_t(u32, alloc_len, SDEBUG_READCAP16_ARR_SZ));
1916}
1917
1918#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1919
1920static int resp_report_tgtpgs(struct scsi_cmnd *scp,
1921			      struct sdebug_dev_info *devip)
1922{
1923	unsigned char *cmd = scp->cmnd;
1924	unsigned char *arr;
1925	int host_no = devip->sdbg_host->shost->host_no;
 
1926	int port_group_a, port_group_b, port_a, port_b;
1927	u32 alen, n, rlen;
1928	int ret;
1929
1930	alen = get_unaligned_be32(cmd + 6);
 
 
1931	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1932	if (! arr)
1933		return DID_REQUEUE << 16;
1934	/*
1935	 * EVPD page 0x88 states we have two ports, one
1936	 * real and a fake port with no device connected.
1937	 * So we create two port groups with one port each
1938	 * and set the group with port B to unavailable.
1939	 */
1940	port_a = 0x1; /* relative port A */
1941	port_b = 0x2; /* relative port B */
1942	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1943			(devip->channel & 0x7f);
1944	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1945			(devip->channel & 0x7f) + 0x80;
1946
1947	/*
1948	 * The asymmetric access state is cycled according to the host_id.
1949	 */
1950	n = 4;
1951	if (sdebug_vpd_use_hostno == 0) {
1952		arr[n++] = host_no % 3; /* Asymm access state */
1953		arr[n++] = 0x0F; /* claim: all states are supported */
1954	} else {
1955		arr[n++] = 0x0; /* Active/Optimized path */
1956		arr[n++] = 0x01; /* only support active/optimized paths */
1957	}
1958	put_unaligned_be16(port_group_a, arr + n);
1959	n += 2;
1960	arr[n++] = 0;    /* Reserved */
1961	arr[n++] = 0;    /* Status code */
1962	arr[n++] = 0;    /* Vendor unique */
1963	arr[n++] = 0x1;  /* One port per group */
1964	arr[n++] = 0;    /* Reserved */
1965	arr[n++] = 0;    /* Reserved */
1966	put_unaligned_be16(port_a, arr + n);
1967	n += 2;
1968	arr[n++] = 3;    /* Port unavailable */
1969	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1970	put_unaligned_be16(port_group_b, arr + n);
1971	n += 2;
1972	arr[n++] = 0;    /* Reserved */
1973	arr[n++] = 0;    /* Status code */
1974	arr[n++] = 0;    /* Vendor unique */
1975	arr[n++] = 0x1;  /* One port per group */
1976	arr[n++] = 0;    /* Reserved */
1977	arr[n++] = 0;    /* Reserved */
1978	put_unaligned_be16(port_b, arr + n);
1979	n += 2;
1980
1981	rlen = n - 4;
1982	put_unaligned_be32(rlen, arr + 0);
 
 
 
1983
1984	/*
1985	 * Return the smallest value of either
1986	 * - The allocated length
1987	 * - The constructed command length
1988	 * - The maximum array size
1989	 */
1990	rlen = min(alen, n);
1991	ret = fill_from_dev_buffer(scp, arr,
1992			   min_t(u32, rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1993	kfree(arr);
1994	return ret;
1995}
1996
1997static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1998			     struct sdebug_dev_info *devip)
1999{
2000	bool rctd;
2001	u8 reporting_opts, req_opcode, sdeb_i, supp;
2002	u16 req_sa, u;
2003	u32 alloc_len, a_len;
2004	int k, offset, len, errsts, count, bump, na;
2005	const struct opcode_info_t *oip;
2006	const struct opcode_info_t *r_oip;
2007	u8 *arr;
2008	u8 *cmd = scp->cmnd;
2009
2010	rctd = !!(cmd[2] & 0x80);
2011	reporting_opts = cmd[2] & 0x7;
2012	req_opcode = cmd[3];
2013	req_sa = get_unaligned_be16(cmd + 4);
2014	alloc_len = get_unaligned_be32(cmd + 6);
2015	if (alloc_len < 4 || alloc_len > 0xffff) {
2016		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
2017		return check_condition_result;
2018	}
2019	if (alloc_len > 8192)
2020		a_len = 8192;
2021	else
2022		a_len = alloc_len;
2023	arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
2024	if (NULL == arr) {
2025		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
2026				INSUFF_RES_ASCQ);
2027		return check_condition_result;
2028	}
2029	switch (reporting_opts) {
2030	case 0:	/* all commands */
2031		/* count number of commands */
2032		for (count = 0, oip = opcode_info_arr;
2033		     oip->num_attached != 0xff; ++oip) {
2034			if (F_INV_OP & oip->flags)
2035				continue;
2036			count += (oip->num_attached + 1);
2037		}
2038		bump = rctd ? 20 : 8;
2039		put_unaligned_be32(count * bump, arr);
2040		for (offset = 4, oip = opcode_info_arr;
2041		     oip->num_attached != 0xff && offset < a_len; ++oip) {
2042			if (F_INV_OP & oip->flags)
2043				continue;
2044			na = oip->num_attached;
2045			arr[offset] = oip->opcode;
2046			put_unaligned_be16(oip->sa, arr + offset + 2);
2047			if (rctd)
2048				arr[offset + 5] |= 0x2;
2049			if (FF_SA & oip->flags)
2050				arr[offset + 5] |= 0x1;
2051			put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
2052			if (rctd)
2053				put_unaligned_be16(0xa, arr + offset + 8);
2054			r_oip = oip;
2055			for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
2056				if (F_INV_OP & oip->flags)
2057					continue;
2058				offset += bump;
2059				arr[offset] = oip->opcode;
2060				put_unaligned_be16(oip->sa, arr + offset + 2);
2061				if (rctd)
2062					arr[offset + 5] |= 0x2;
2063				if (FF_SA & oip->flags)
2064					arr[offset + 5] |= 0x1;
2065				put_unaligned_be16(oip->len_mask[0],
2066						   arr + offset + 6);
2067				if (rctd)
2068					put_unaligned_be16(0xa,
2069							   arr + offset + 8);
2070			}
2071			oip = r_oip;
2072			offset += bump;
2073		}
2074		break;
2075	case 1:	/* one command: opcode only */
2076	case 2:	/* one command: opcode plus service action */
2077	case 3:	/* one command: if sa==0 then opcode only else opcode+sa */
2078		sdeb_i = opcode_ind_arr[req_opcode];
2079		oip = &opcode_info_arr[sdeb_i];
2080		if (F_INV_OP & oip->flags) {
2081			supp = 1;
2082			offset = 4;
2083		} else {
2084			if (1 == reporting_opts) {
2085				if (FF_SA & oip->flags) {
2086					mk_sense_invalid_fld(scp, SDEB_IN_CDB,
2087							     2, 2);
2088					kfree(arr);
2089					return check_condition_result;
2090				}
2091				req_sa = 0;
2092			} else if (2 == reporting_opts &&
2093				   0 == (FF_SA & oip->flags)) {
2094				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
2095				kfree(arr);	/* point at requested sa */
2096				return check_condition_result;
2097			}
2098			if (0 == (FF_SA & oip->flags) &&
2099			    req_opcode == oip->opcode)
2100				supp = 3;
2101			else if (0 == (FF_SA & oip->flags)) {
2102				na = oip->num_attached;
2103				for (k = 0, oip = oip->arrp; k < na;
2104				     ++k, ++oip) {
2105					if (req_opcode == oip->opcode)
2106						break;
2107				}
2108				supp = (k >= na) ? 1 : 3;
2109			} else if (req_sa != oip->sa) {
2110				na = oip->num_attached;
2111				for (k = 0, oip = oip->arrp; k < na;
2112				     ++k, ++oip) {
2113					if (req_sa == oip->sa)
2114						break;
2115				}
2116				supp = (k >= na) ? 1 : 3;
2117			} else
2118				supp = 3;
2119			if (3 == supp) {
2120				u = oip->len_mask[0];
2121				put_unaligned_be16(u, arr + 2);
2122				arr[4] = oip->opcode;
2123				for (k = 1; k < u; ++k)
2124					arr[4 + k] = (k < 16) ?
2125						 oip->len_mask[k] : 0xff;
2126				offset = 4 + u;
2127			} else
2128				offset = 4;
2129		}
2130		arr[1] = (rctd ? 0x80 : 0) | supp;
2131		if (rctd) {
2132			put_unaligned_be16(0xa, arr + offset);
2133			offset += 12;
2134		}
2135		break;
2136	default:
2137		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
2138		kfree(arr);
2139		return check_condition_result;
2140	}
2141	offset = (offset < a_len) ? offset : a_len;
2142	len = (offset < alloc_len) ? offset : alloc_len;
2143	errsts = fill_from_dev_buffer(scp, arr, len);
2144	kfree(arr);
2145	return errsts;
2146}
2147
2148static int resp_rsup_tmfs(struct scsi_cmnd *scp,
2149			  struct sdebug_dev_info *devip)
2150{
2151	bool repd;
2152	u32 alloc_len, len;
2153	u8 arr[16];
2154	u8 *cmd = scp->cmnd;
2155
2156	memset(arr, 0, sizeof(arr));
2157	repd = !!(cmd[2] & 0x80);
2158	alloc_len = get_unaligned_be32(cmd + 6);
2159	if (alloc_len < 4) {
2160		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
2161		return check_condition_result;
2162	}
2163	arr[0] = 0xc8;		/* ATS | ATSS | LURS */
2164	arr[1] = 0x1;		/* ITNRS */
2165	if (repd) {
2166		arr[3] = 0xc;
2167		len = 16;
2168	} else
2169		len = 4;
2170
2171	len = (len < alloc_len) ? len : alloc_len;
2172	return fill_from_dev_buffer(scp, arr, len);
2173}
2174
2175/* <<Following mode page info copied from ST318451LW>> */
2176
2177static int resp_err_recov_pg(unsigned char *p, int pcontrol, int target)
2178{	/* Read-Write Error Recovery page for mode_sense */
2179	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
2180					5, 0, 0xff, 0xff};
2181
2182	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
2183	if (1 == pcontrol)
2184		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
2185	return sizeof(err_recov_pg);
2186}
2187
2188static int resp_disconnect_pg(unsigned char *p, int pcontrol, int target)
2189{ 	/* Disconnect-Reconnect page for mode_sense */
2190	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
2191					 0, 0, 0, 0, 0, 0, 0, 0};
2192
2193	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
2194	if (1 == pcontrol)
2195		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
2196	return sizeof(disconnect_pg);
2197}
2198
2199static int resp_format_pg(unsigned char *p, int pcontrol, int target)
2200{       /* Format device page for mode_sense */
2201	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
2202				     0, 0, 0, 0, 0, 0, 0, 0,
2203				     0, 0, 0, 0, 0x40, 0, 0, 0};
2204
2205	memcpy(p, format_pg, sizeof(format_pg));
2206	put_unaligned_be16(sdebug_sectors_per, p + 10);
2207	put_unaligned_be16(sdebug_sector_size, p + 12);
2208	if (sdebug_removable)
 
 
2209		p[20] |= 0x20; /* should agree with INQUIRY */
2210	if (1 == pcontrol)
2211		memset(p + 2, 0, sizeof(format_pg) - 2);
2212	return sizeof(format_pg);
2213}
2214
2215static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2216				     0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
2217				     0, 0, 0, 0};
2218
2219static int resp_caching_pg(unsigned char *p, int pcontrol, int target)
2220{ 	/* Caching page for mode_sense */
2221	unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
2222		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2223	unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2224		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
2225
2226	if (SDEBUG_OPT_N_WCE & sdebug_opts)
2227		caching_pg[2] &= ~0x4;	/* set WCE=0 (default WCE=1) */
2228	memcpy(p, caching_pg, sizeof(caching_pg));
2229	if (1 == pcontrol)
2230		memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
2231	else if (2 == pcontrol)
2232		memcpy(p, d_caching_pg, sizeof(d_caching_pg));
2233	return sizeof(caching_pg);
2234}
2235
2236static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2237				    0, 0, 0x2, 0x4b};
2238
2239static int resp_ctrl_m_pg(unsigned char *p, int pcontrol, int target)
2240{ 	/* Control mode page for mode_sense */
2241	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
2242					0, 0, 0, 0};
2243	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2244				     0, 0, 0x2, 0x4b};
2245
2246	if (sdebug_dsense)
2247		ctrl_m_pg[2] |= 0x4;
2248	else
2249		ctrl_m_pg[2] &= ~0x4;
2250
2251	if (sdebug_ato)
2252		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
2253
2254	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
2255	if (1 == pcontrol)
2256		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
2257	else if (2 == pcontrol)
2258		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
2259	return sizeof(ctrl_m_pg);
2260}
2261
2262
2263static int resp_iec_m_pg(unsigned char *p, int pcontrol, int target)
2264{	/* Informational Exceptions control mode page for mode_sense */
2265	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
2266				       0, 0, 0x0, 0x0};
2267	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
2268				      0, 0, 0x0, 0x0};
2269
2270	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
2271	if (1 == pcontrol)
2272		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
2273	else if (2 == pcontrol)
2274		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
2275	return sizeof(iec_m_pg);
2276}
2277
2278static int resp_sas_sf_m_pg(unsigned char *p, int pcontrol, int target)
2279{	/* SAS SSP mode page - short format for mode_sense */
2280	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
2281		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
2282
2283	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
2284	if (1 == pcontrol)
2285		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
2286	return sizeof(sas_sf_m_pg);
2287}
2288
2289
2290static int resp_sas_pcd_m_spg(unsigned char *p, int pcontrol, int target,
2291			      int target_dev_id)
2292{	/* SAS phy control and discover mode page for mode_sense */
2293	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
2294		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
2295		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2296		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2297		    0x2, 0, 0, 0, 0, 0, 0, 0,
2298		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2299		    0, 0, 0, 0, 0, 0, 0, 0,
2300		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
2301		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2302		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2303		    0x3, 0, 0, 0, 0, 0, 0, 0,
2304		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2305		    0, 0, 0, 0, 0, 0, 0, 0,
2306		};
2307	int port_a, port_b;
2308
2309	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
2310	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
2311	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
2312	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
2313	port_a = target_dev_id + 1;
2314	port_b = port_a + 1;
2315	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
2316	put_unaligned_be32(port_a, p + 20);
2317	put_unaligned_be32(port_b, p + 48 + 20);
 
 
 
 
 
 
2318	if (1 == pcontrol)
2319		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
2320	return sizeof(sas_pcd_m_pg);
2321}
2322
2323static int resp_sas_sha_m_spg(unsigned char *p, int pcontrol)
2324{	/* SAS SSP shared protocol specific port mode subpage */
2325	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
2326		    0, 0, 0, 0, 0, 0, 0, 0,
2327		};
2328
2329	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
2330	if (1 == pcontrol)
2331		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
2332	return sizeof(sas_sha_m_pg);
2333}
2334
2335#define SDEBUG_MAX_MSENSE_SZ 256
2336
2337static int resp_mode_sense(struct scsi_cmnd *scp,
2338			   struct sdebug_dev_info *devip)
2339{
 
2340	int pcontrol, pcode, subpcode, bd_len;
2341	unsigned char dev_spec;
2342	u32 alloc_len, offset, len;
2343	int target_dev_id;
2344	int target = scp->device->id;
2345	unsigned char *ap;
2346	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
2347	unsigned char *cmd = scp->cmnd;
2348	bool dbd, llbaa, msense_6, is_disk, is_zbc, bad_pcode;
2349
2350	dbd = !!(cmd[1] & 0x8);		/* disable block descriptors */
 
 
2351	pcontrol = (cmd[2] & 0xc0) >> 6;
2352	pcode = cmd[2] & 0x3f;
2353	subpcode = cmd[3];
2354	msense_6 = (MODE_SENSE == cmd[0]);
2355	llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2356	is_disk = (sdebug_ptype == TYPE_DISK);
2357	is_zbc = (devip->zmodel != BLK_ZONED_NONE);
2358	if ((is_disk || is_zbc) && !dbd)
2359		bd_len = llbaa ? 16 : 8;
2360	else
2361		bd_len = 0;
2362	alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2363	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2364	if (0x3 == pcontrol) {  /* Saving values not supported */
2365		mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
 
2366		return check_condition_result;
2367	}
2368	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2369			(devip->target * 1000) - 3;
2370	/* for disks+zbc set DPOFUA bit and clear write protect (WP) bit */
2371	if (is_disk || is_zbc) {
2372		dev_spec = 0x10;	/* =0x90 if WP=1 implies read-only */
2373		if (sdebug_wp)
2374			dev_spec |= 0x80;
2375	} else
2376		dev_spec = 0x0;
2377	if (msense_6) {
2378		arr[2] = dev_spec;
2379		arr[3] = bd_len;
2380		offset = 4;
2381	} else {
2382		arr[3] = dev_spec;
2383		if (16 == bd_len)
2384			arr[4] = 0x1;	/* set LONGLBA bit */
2385		arr[7] = bd_len;	/* assume 255 or less */
2386		offset = 8;
2387	}
2388	ap = arr + offset;
2389	if ((bd_len > 0) && (!sdebug_capacity))
2390		sdebug_capacity = get_sdebug_capacity();
2391
2392	if (8 == bd_len) {
2393		if (sdebug_capacity > 0xfffffffe)
2394			put_unaligned_be32(0xffffffff, ap + 0);
2395		else
2396			put_unaligned_be32(sdebug_capacity, ap + 0);
2397		put_unaligned_be16(sdebug_sector_size, ap + 6);
 
 
 
 
 
 
 
 
2398		offset += bd_len;
2399		ap = arr + offset;
2400	} else if (16 == bd_len) {
2401		put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2402		put_unaligned_be32(sdebug_sector_size, ap + 12);
 
 
 
 
 
 
2403		offset += bd_len;
2404		ap = arr + offset;
2405	}
2406
2407	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2408		/* TODO: Control Extension page */
2409		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
 
2410		return check_condition_result;
2411	}
2412	bad_pcode = false;
2413
2414	switch (pcode) {
2415	case 0x1:	/* Read-Write error recovery page, direct access */
2416		len = resp_err_recov_pg(ap, pcontrol, target);
2417		offset += len;
2418		break;
2419	case 0x2:	/* Disconnect-Reconnect page, all devices */
2420		len = resp_disconnect_pg(ap, pcontrol, target);
2421		offset += len;
2422		break;
2423	case 0x3:       /* Format device page, direct access */
2424		if (is_disk) {
2425			len = resp_format_pg(ap, pcontrol, target);
2426			offset += len;
2427		} else
2428			bad_pcode = true;
2429		break;
2430	case 0x8:	/* Caching page, direct access */
2431		if (is_disk || is_zbc) {
2432			len = resp_caching_pg(ap, pcontrol, target);
2433			offset += len;
2434		} else
2435			bad_pcode = true;
2436		break;
2437	case 0xa:	/* Control Mode page, all devices */
2438		len = resp_ctrl_m_pg(ap, pcontrol, target);
2439		offset += len;
2440		break;
2441	case 0x19:	/* if spc==1 then sas phy, control+discover */
2442		if ((subpcode > 0x2) && (subpcode < 0xff)) {
2443			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
 
2444			return check_condition_result;
2445		}
2446		len = 0;
2447		if ((0x0 == subpcode) || (0xff == subpcode))
2448			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2449		if ((0x1 == subpcode) || (0xff == subpcode))
2450			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2451						  target_dev_id);
2452		if ((0x2 == subpcode) || (0xff == subpcode))
2453			len += resp_sas_sha_m_spg(ap + len, pcontrol);
2454		offset += len;
2455		break;
2456	case 0x1c:	/* Informational Exceptions Mode page, all devices */
2457		len = resp_iec_m_pg(ap, pcontrol, target);
2458		offset += len;
2459		break;
2460	case 0x3f:	/* Read all Mode pages */
2461		if ((0 == subpcode) || (0xff == subpcode)) {
2462			len = resp_err_recov_pg(ap, pcontrol, target);
2463			len += resp_disconnect_pg(ap + len, pcontrol, target);
2464			if (is_disk) {
2465				len += resp_format_pg(ap + len, pcontrol,
2466						      target);
2467				len += resp_caching_pg(ap + len, pcontrol,
2468						       target);
2469			} else if (is_zbc) {
2470				len += resp_caching_pg(ap + len, pcontrol,
2471						       target);
2472			}
2473			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2474			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2475			if (0xff == subpcode) {
2476				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2477						  target, target_dev_id);
2478				len += resp_sas_sha_m_spg(ap + len, pcontrol);
2479			}
2480			len += resp_iec_m_pg(ap + len, pcontrol, target);
2481			offset += len;
2482		} else {
2483			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
 
2484			return check_condition_result;
2485		}
 
2486		break;
2487	default:
2488		bad_pcode = true;
2489		break;
2490	}
2491	if (bad_pcode) {
2492		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2493		return check_condition_result;
2494	}
2495	if (msense_6)
2496		arr[0] = offset - 1;
2497	else
2498		put_unaligned_be16((offset - 2), arr + 0);
2499	return fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, offset));
 
 
2500}
2501
2502#define SDEBUG_MAX_MSELECT_SZ 512
2503
2504static int resp_mode_select(struct scsi_cmnd *scp,
2505			    struct sdebug_dev_info *devip)
2506{
2507	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
2508	int param_len, res, mpage;
2509	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
2510	unsigned char *cmd = scp->cmnd;
2511	int mselect6 = (MODE_SELECT == cmd[0]);
2512
 
 
2513	memset(arr, 0, sizeof(arr));
2514	pf = cmd[1] & 0x10;
2515	sp = cmd[1] & 0x1;
2516	param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2517	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
2518		mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
 
2519		return check_condition_result;
2520	}
2521	res = fetch_to_dev_buffer(scp, arr, param_len);
2522	if (-1 == res)
2523		return DID_ERROR << 16;
2524	else if (sdebug_verbose && (res < param_len))
2525		sdev_printk(KERN_INFO, scp->device,
2526			    "%s: cdb indicated=%d, IO sent=%d bytes\n",
2527			    __func__, param_len, res);
2528	md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2529	bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
2530	off = bd_len + (mselect6 ? 4 : 8);
2531	if (md_len > 2 || off >= res) {
2532		mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
2533		return check_condition_result;
2534	}
 
2535	mpage = arr[off] & 0x3f;
2536	ps = !!(arr[off] & 0x80);
2537	if (ps) {
2538		mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
 
2539		return check_condition_result;
2540	}
2541	spf = !!(arr[off] & 0x40);
2542	pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
2543		       (arr[off + 1] + 2);
2544	if ((pg_len + off) > param_len) {
2545		mk_sense_buffer(scp, ILLEGAL_REQUEST,
2546				PARAMETER_LIST_LENGTH_ERR, 0);
2547		return check_condition_result;
2548	}
2549	switch (mpage) {
2550	case 0x8:      /* Caching Mode page */
2551		if (caching_pg[1] == arr[off + 1]) {
2552			memcpy(caching_pg + 2, arr + off + 2,
2553			       sizeof(caching_pg) - 2);
2554			goto set_mode_changed_ua;
2555		}
2556		break;
2557	case 0xa:      /* Control Mode page */
2558		if (ctrl_m_pg[1] == arr[off + 1]) {
2559			memcpy(ctrl_m_pg + 2, arr + off + 2,
2560			       sizeof(ctrl_m_pg) - 2);
2561			if (ctrl_m_pg[4] & 0x8)
2562				sdebug_wp = true;
2563			else
2564				sdebug_wp = false;
2565			sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
2566			goto set_mode_changed_ua;
2567		}
2568		break;
2569	case 0x1c:      /* Informational Exceptions Mode page */
2570		if (iec_m_pg[1] == arr[off + 1]) {
2571			memcpy(iec_m_pg + 2, arr + off + 2,
2572			       sizeof(iec_m_pg) - 2);
2573			goto set_mode_changed_ua;
2574		}
2575		break;
2576	default:
2577		break;
2578	}
2579	mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
 
2580	return check_condition_result;
2581set_mode_changed_ua:
2582	set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2583	return 0;
2584}
2585
2586static int resp_temp_l_pg(unsigned char *arr)
2587{
2588	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2589				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
2590		};
2591
2592	memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2593	return sizeof(temp_l_pg);
2594}
2595
2596static int resp_ie_l_pg(unsigned char *arr)
2597{
2598	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2599		};
2600
2601	memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2602	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
2603		arr[4] = THRESHOLD_EXCEEDED;
2604		arr[5] = 0xff;
2605	}
2606	return sizeof(ie_l_pg);
2607}
2608
2609static int resp_env_rep_l_spg(unsigned char *arr)
2610{
2611	unsigned char env_rep_l_spg[] = {0x0, 0x0, 0x23, 0x8,
2612					 0x0, 40, 72, 0xff, 45, 18, 0, 0,
2613					 0x1, 0x0, 0x23, 0x8,
2614					 0x0, 55, 72, 35, 55, 45, 0, 0,
2615		};
2616
2617	memcpy(arr, env_rep_l_spg, sizeof(env_rep_l_spg));
2618	return sizeof(env_rep_l_spg);
2619}
2620
2621#define SDEBUG_MAX_LSENSE_SZ 512
2622
2623static int resp_log_sense(struct scsi_cmnd *scp,
2624			  struct sdebug_dev_info *devip)
2625{
2626	int ppc, sp, pcode, subpcode;
2627	u32 alloc_len, len, n;
2628	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
2629	unsigned char *cmd = scp->cmnd;
2630
 
 
2631	memset(arr, 0, sizeof(arr));
2632	ppc = cmd[1] & 0x2;
2633	sp = cmd[1] & 0x1;
2634	if (ppc || sp) {
2635		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
 
2636		return check_condition_result;
2637	}
 
2638	pcode = cmd[2] & 0x3f;
2639	subpcode = cmd[3] & 0xff;
2640	alloc_len = get_unaligned_be16(cmd + 7);
2641	arr[0] = pcode;
2642	if (0 == subpcode) {
2643		switch (pcode) {
2644		case 0x0:	/* Supported log pages log page */
2645			n = 4;
2646			arr[n++] = 0x0;		/* this page */
2647			arr[n++] = 0xd;		/* Temperature */
2648			arr[n++] = 0x2f;	/* Informational exceptions */
2649			arr[3] = n - 4;
2650			break;
2651		case 0xd:	/* Temperature log page */
2652			arr[3] = resp_temp_l_pg(arr + 4);
2653			break;
2654		case 0x2f:	/* Informational exceptions log page */
2655			arr[3] = resp_ie_l_pg(arr + 4);
2656			break;
2657		default:
2658			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
 
2659			return check_condition_result;
2660		}
2661	} else if (0xff == subpcode) {
2662		arr[0] |= 0x40;
2663		arr[1] = subpcode;
2664		switch (pcode) {
2665		case 0x0:	/* Supported log pages and subpages log page */
2666			n = 4;
2667			arr[n++] = 0x0;
2668			arr[n++] = 0x0;		/* 0,0 page */
2669			arr[n++] = 0x0;
2670			arr[n++] = 0xff;	/* this page */
2671			arr[n++] = 0xd;
2672			arr[n++] = 0x0;		/* Temperature */
2673			arr[n++] = 0xd;
2674			arr[n++] = 0x1;		/* Environment reporting */
2675			arr[n++] = 0xd;
2676			arr[n++] = 0xff;	/* all 0xd subpages */
2677			arr[n++] = 0x2f;
2678			arr[n++] = 0x0;	/* Informational exceptions */
2679			arr[n++] = 0x2f;
2680			arr[n++] = 0xff;	/* all 0x2f subpages */
2681			arr[3] = n - 4;
2682			break;
2683		case 0xd:	/* Temperature subpages */
2684			n = 4;
2685			arr[n++] = 0xd;
2686			arr[n++] = 0x0;		/* Temperature */
2687			arr[n++] = 0xd;
2688			arr[n++] = 0x1;		/* Environment reporting */
2689			arr[n++] = 0xd;
2690			arr[n++] = 0xff;	/* these subpages */
2691			arr[3] = n - 4;
2692			break;
2693		case 0x2f:	/* Informational exceptions subpages */
2694			n = 4;
2695			arr[n++] = 0x2f;
2696			arr[n++] = 0x0;		/* Informational exceptions */
2697			arr[n++] = 0x2f;
2698			arr[n++] = 0xff;	/* these subpages */
2699			arr[3] = n - 4;
2700			break;
2701		default:
2702			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2703			return check_condition_result;
2704		}
2705	} else if (subpcode > 0) {
2706		arr[0] |= 0x40;
2707		arr[1] = subpcode;
2708		if (pcode == 0xd && subpcode == 1)
2709			arr[3] = resp_env_rep_l_spg(arr + 4);
2710		else {
2711			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2712			return check_condition_result;
2713		}
2714	} else {
2715		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
 
2716		return check_condition_result;
2717	}
2718	len = min_t(u32, get_unaligned_be16(arr + 2) + 4, alloc_len);
2719	return fill_from_dev_buffer(scp, arr,
2720		    min_t(u32, len, SDEBUG_MAX_INQ_ARR_SZ));
2721}
2722
2723static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip)
2724{
2725	return devip->nr_zones != 0;
2726}
2727
2728static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip,
2729					unsigned long long lba)
2730{
2731	u32 zno = lba >> devip->zsize_shift;
2732	struct sdeb_zone_state *zsp;
2733
2734	if (devip->zcap == devip->zsize || zno < devip->nr_conv_zones)
2735		return &devip->zstate[zno];
2736
2737	/*
2738	 * If the zone capacity is less than the zone size, adjust for gap
2739	 * zones.
2740	 */
2741	zno = 2 * zno - devip->nr_conv_zones;
2742	WARN_ONCE(zno >= devip->nr_zones, "%u > %u\n", zno, devip->nr_zones);
2743	zsp = &devip->zstate[zno];
2744	if (lba >= zsp->z_start + zsp->z_size)
2745		zsp++;
2746	WARN_ON_ONCE(lba >= zsp->z_start + zsp->z_size);
2747	return zsp;
2748}
2749
2750static inline bool zbc_zone_is_conv(struct sdeb_zone_state *zsp)
2751{
2752	return zsp->z_type == ZBC_ZTYPE_CNV;
2753}
2754
2755static inline bool zbc_zone_is_gap(struct sdeb_zone_state *zsp)
2756{
2757	return zsp->z_type == ZBC_ZTYPE_GAP;
2758}
2759
2760static inline bool zbc_zone_is_seq(struct sdeb_zone_state *zsp)
2761{
2762	return !zbc_zone_is_conv(zsp) && !zbc_zone_is_gap(zsp);
2763}
2764
2765static void zbc_close_zone(struct sdebug_dev_info *devip,
2766			   struct sdeb_zone_state *zsp)
2767{
2768	enum sdebug_z_cond zc;
2769
2770	if (!zbc_zone_is_seq(zsp))
2771		return;
2772
2773	zc = zsp->z_cond;
2774	if (!(zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN))
2775		return;
2776
2777	if (zc == ZC2_IMPLICIT_OPEN)
2778		devip->nr_imp_open--;
2779	else
2780		devip->nr_exp_open--;
2781
2782	if (zsp->z_wp == zsp->z_start) {
2783		zsp->z_cond = ZC1_EMPTY;
2784	} else {
2785		zsp->z_cond = ZC4_CLOSED;
2786		devip->nr_closed++;
2787	}
2788}
2789
2790static void zbc_close_imp_open_zone(struct sdebug_dev_info *devip)
2791{
2792	struct sdeb_zone_state *zsp = &devip->zstate[0];
2793	unsigned int i;
2794
2795	for (i = 0; i < devip->nr_zones; i++, zsp++) {
2796		if (zsp->z_cond == ZC2_IMPLICIT_OPEN) {
2797			zbc_close_zone(devip, zsp);
2798			return;
2799		}
2800	}
2801}
2802
2803static void zbc_open_zone(struct sdebug_dev_info *devip,
2804			  struct sdeb_zone_state *zsp, bool explicit)
2805{
2806	enum sdebug_z_cond zc;
2807
2808	if (!zbc_zone_is_seq(zsp))
2809		return;
2810
2811	zc = zsp->z_cond;
2812	if ((explicit && zc == ZC3_EXPLICIT_OPEN) ||
2813	    (!explicit && zc == ZC2_IMPLICIT_OPEN))
2814		return;
2815
2816	/* Close an implicit open zone if necessary */
2817	if (explicit && zsp->z_cond == ZC2_IMPLICIT_OPEN)
2818		zbc_close_zone(devip, zsp);
2819	else if (devip->max_open &&
2820		 devip->nr_imp_open + devip->nr_exp_open >= devip->max_open)
2821		zbc_close_imp_open_zone(devip);
2822
2823	if (zsp->z_cond == ZC4_CLOSED)
2824		devip->nr_closed--;
2825	if (explicit) {
2826		zsp->z_cond = ZC3_EXPLICIT_OPEN;
2827		devip->nr_exp_open++;
2828	} else {
2829		zsp->z_cond = ZC2_IMPLICIT_OPEN;
2830		devip->nr_imp_open++;
2831	}
2832}
2833
2834static inline void zbc_set_zone_full(struct sdebug_dev_info *devip,
2835				     struct sdeb_zone_state *zsp)
2836{
2837	switch (zsp->z_cond) {
2838	case ZC2_IMPLICIT_OPEN:
2839		devip->nr_imp_open--;
2840		break;
2841	case ZC3_EXPLICIT_OPEN:
2842		devip->nr_exp_open--;
2843		break;
2844	default:
2845		WARN_ONCE(true, "Invalid zone %llu condition %x\n",
2846			  zsp->z_start, zsp->z_cond);
2847		break;
2848	}
2849	zsp->z_cond = ZC5_FULL;
2850}
2851
2852static void zbc_inc_wp(struct sdebug_dev_info *devip,
2853		       unsigned long long lba, unsigned int num)
2854{
2855	struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2856	unsigned long long n, end, zend = zsp->z_start + zsp->z_size;
2857
2858	if (!zbc_zone_is_seq(zsp))
2859		return;
2860
2861	if (zsp->z_type == ZBC_ZTYPE_SWR) {
2862		zsp->z_wp += num;
2863		if (zsp->z_wp >= zend)
2864			zbc_set_zone_full(devip, zsp);
2865		return;
2866	}
2867
2868	while (num) {
2869		if (lba != zsp->z_wp)
2870			zsp->z_non_seq_resource = true;
2871
2872		end = lba + num;
2873		if (end >= zend) {
2874			n = zend - lba;
2875			zsp->z_wp = zend;
2876		} else if (end > zsp->z_wp) {
2877			n = num;
2878			zsp->z_wp = end;
2879		} else {
2880			n = num;
2881		}
2882		if (zsp->z_wp >= zend)
2883			zbc_set_zone_full(devip, zsp);
2884
2885		num -= n;
2886		lba += n;
2887		if (num) {
2888			zsp++;
2889			zend = zsp->z_start + zsp->z_size;
2890		}
2891	}
2892}
2893
2894static int check_zbc_access_params(struct scsi_cmnd *scp,
2895			unsigned long long lba, unsigned int num, bool write)
2896{
2897	struct scsi_device *sdp = scp->device;
2898	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2899	struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2900	struct sdeb_zone_state *zsp_end = zbc_zone(devip, lba + num - 1);
2901
2902	if (!write) {
2903		if (devip->zmodel == BLK_ZONED_HA)
2904			return 0;
2905		/* For host-managed, reads cannot cross zone types boundaries */
2906		if (zsp->z_type != zsp_end->z_type) {
2907			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2908					LBA_OUT_OF_RANGE,
2909					READ_INVDATA_ASCQ);
2910			return check_condition_result;
2911		}
2912		return 0;
2913	}
2914
2915	/* Writing into a gap zone is not allowed */
2916	if (zbc_zone_is_gap(zsp)) {
2917		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE,
2918				ATTEMPT_ACCESS_GAP);
2919		return check_condition_result;
2920	}
2921
2922	/* No restrictions for writes within conventional zones */
2923	if (zbc_zone_is_conv(zsp)) {
2924		if (!zbc_zone_is_conv(zsp_end)) {
2925			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2926					LBA_OUT_OF_RANGE,
2927					WRITE_BOUNDARY_ASCQ);
2928			return check_condition_result;
2929		}
2930		return 0;
2931	}
2932
2933	if (zsp->z_type == ZBC_ZTYPE_SWR) {
2934		/* Writes cannot cross sequential zone boundaries */
2935		if (zsp_end != zsp) {
2936			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2937					LBA_OUT_OF_RANGE,
2938					WRITE_BOUNDARY_ASCQ);
2939			return check_condition_result;
2940		}
2941		/* Cannot write full zones */
2942		if (zsp->z_cond == ZC5_FULL) {
2943			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2944					INVALID_FIELD_IN_CDB, 0);
2945			return check_condition_result;
2946		}
2947		/* Writes must be aligned to the zone WP */
2948		if (lba != zsp->z_wp) {
2949			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2950					LBA_OUT_OF_RANGE,
2951					UNALIGNED_WRITE_ASCQ);
2952			return check_condition_result;
2953		}
2954	}
2955
2956	/* Handle implicit open of closed and empty zones */
2957	if (zsp->z_cond == ZC1_EMPTY || zsp->z_cond == ZC4_CLOSED) {
2958		if (devip->max_open &&
2959		    devip->nr_exp_open >= devip->max_open) {
2960			mk_sense_buffer(scp, DATA_PROTECT,
2961					INSUFF_RES_ASC,
2962					INSUFF_ZONE_ASCQ);
2963			return check_condition_result;
2964		}
2965		zbc_open_zone(devip, zsp, false);
2966	}
2967
2968	return 0;
2969}
2970
2971static inline int check_device_access_params
2972			(struct scsi_cmnd *scp, unsigned long long lba,
2973			 unsigned int num, bool write)
2974{
2975	struct scsi_device *sdp = scp->device;
2976	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2977
2978	if (lba + num > sdebug_capacity) {
2979		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2980		return check_condition_result;
2981	}
2982	/* transfer length excessive (tie in to block limits VPD page) */
2983	if (num > sdebug_store_sectors) {
2984		/* needs work to find which cdb byte 'num' comes from */
2985		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2986		return check_condition_result;
2987	}
2988	if (write && unlikely(sdebug_wp)) {
2989		mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
2990		return check_condition_result;
2991	}
2992	if (sdebug_dev_is_zoned(devip))
2993		return check_zbc_access_params(scp, lba, num, write);
2994
2995	return 0;
2996}
2997
2998/*
2999 * Note: if BUG_ON() fires it usually indicates a problem with the parser
3000 * tables. Perhaps a missing F_FAKE_RW or FF_MEDIA_IO flag. Response functions
3001 * that access any of the "stores" in struct sdeb_store_info should call this
3002 * function with bug_if_fake_rw set to true.
3003 */
3004static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip,
3005						bool bug_if_fake_rw)
3006{
3007	if (sdebug_fake_rw) {
3008		BUG_ON(bug_if_fake_rw);	/* See note above */
3009		return NULL;
3010	}
3011	return xa_load(per_store_ap, devip->sdbg_host->si_idx);
3012}
3013
3014/* Returns number of bytes copied or -1 if error. */
3015static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
3016			    u32 sg_skip, u64 lba, u32 num, bool do_write)
3017{
3018	int ret;
3019	u64 block, rest = 0;
3020	enum dma_data_direction dir;
3021	struct scsi_data_buffer *sdb = &scp->sdb;
3022	u8 *fsp;
3023
3024	if (do_write) {
3025		dir = DMA_TO_DEVICE;
3026		write_since_sync = true;
3027	} else {
3028		dir = DMA_FROM_DEVICE;
3029	}
3030
3031	if (!sdb->length || !sip)
3032		return 0;
3033	if (scp->sc_data_direction != dir)
3034		return -1;
3035	fsp = sip->storep;
3036
3037	block = do_div(lba, sdebug_store_sectors);
3038	if (block + num > sdebug_store_sectors)
3039		rest = block + num - sdebug_store_sectors;
3040
3041	ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
3042		   fsp + (block * sdebug_sector_size),
3043		   (num - rest) * sdebug_sector_size, sg_skip, do_write);
3044	if (ret != (num - rest) * sdebug_sector_size)
3045		return ret;
3046
3047	if (rest) {
3048		ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
3049			    fsp, rest * sdebug_sector_size,
3050			    sg_skip + ((num - rest) * sdebug_sector_size),
3051			    do_write);
3052	}
3053
3054	return ret;
3055}
3056
3057/* Returns number of bytes copied or -1 if error. */
3058static int do_dout_fetch(struct scsi_cmnd *scp, u32 num, u8 *doutp)
3059{
3060	struct scsi_data_buffer *sdb = &scp->sdb;
 
 
 
 
 
3061
3062	if (!sdb->length)
3063		return 0;
3064	if (scp->sc_data_direction != DMA_TO_DEVICE)
3065		return -1;
3066	return sg_copy_buffer(sdb->table.sgl, sdb->table.nents, doutp,
3067			      num * sdebug_sector_size, 0, true);
3068}
3069
3070/* If sip->storep+lba compares equal to arr(num), then copy top half of
3071 * arr into sip->storep+lba and return true. If comparison fails then
3072 * return false. */
3073static bool comp_write_worker(struct sdeb_store_info *sip, u64 lba, u32 num,
3074			      const u8 *arr, bool compare_only)
3075{
3076	bool res;
3077	u64 block, rest = 0;
3078	u32 store_blks = sdebug_store_sectors;
3079	u32 lb_size = sdebug_sector_size;
3080	u8 *fsp = sip->storep;
3081
3082	block = do_div(lba, store_blks);
3083	if (block + num > store_blks)
3084		rest = block + num - store_blks;
3085
3086	res = !memcmp(fsp + (block * lb_size), arr, (num - rest) * lb_size);
3087	if (!res)
3088		return res;
3089	if (rest)
3090		res = memcmp(fsp, arr + ((num - rest) * lb_size),
3091			     rest * lb_size);
3092	if (!res)
3093		return res;
3094	if (compare_only)
3095		return true;
3096	arr += num * lb_size;
3097	memcpy(fsp + (block * lb_size), arr, (num - rest) * lb_size);
3098	if (rest)
3099		memcpy(fsp, arr + ((num - rest) * lb_size), rest * lb_size);
3100	return res;
3101}
3102
3103static __be16 dif_compute_csum(const void *buf, int len)
3104{
3105	__be16 csum;
3106
3107	if (sdebug_guard)
3108		csum = (__force __be16)ip_compute_csum(buf, len);
3109	else
3110		csum = cpu_to_be16(crc_t10dif(buf, len));
3111
3112	return csum;
3113}
3114
3115static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
3116		      sector_t sector, u32 ei_lba)
3117{
3118	__be16 csum = dif_compute_csum(data, sdebug_sector_size);
3119
3120	if (sdt->guard_tag != csum) {
3121		pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
3122			(unsigned long)sector,
3123			be16_to_cpu(sdt->guard_tag),
3124			be16_to_cpu(csum));
3125		return 0x01;
3126	}
3127	if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
3128	    be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
3129		pr_err("REF check failed on sector %lu\n",
3130			(unsigned long)sector);
3131		return 0x03;
3132	}
3133	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3134	    be32_to_cpu(sdt->ref_tag) != ei_lba) {
3135		pr_err("REF check failed on sector %lu\n",
3136			(unsigned long)sector);
3137		return 0x03;
3138	}
3139	return 0;
3140}
3141
3142static void dif_copy_prot(struct scsi_cmnd *scp, sector_t sector,
3143			  unsigned int sectors, bool read)
3144{
3145	size_t resid;
3146	void *paddr;
3147	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3148						scp->device->hostdata, true);
3149	struct t10_pi_tuple *dif_storep = sip->dif_storep;
3150	const void *dif_store_end = dif_storep + sdebug_store_sectors;
3151	struct sg_mapping_iter miter;
3152
3153	/* Bytes of protection data to copy into sgl */
3154	resid = sectors * sizeof(*dif_storep);
3155
3156	sg_miter_start(&miter, scsi_prot_sglist(scp),
3157		       scsi_prot_sg_count(scp), SG_MITER_ATOMIC |
3158		       (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
3159
3160	while (sg_miter_next(&miter) && resid > 0) {
3161		size_t len = min_t(size_t, miter.length, resid);
3162		void *start = dif_store(sip, sector);
3163		size_t rest = 0;
3164
3165		if (dif_store_end < start + len)
3166			rest = start + len - dif_store_end;
3167
3168		paddr = miter.addr;
3169
3170		if (read)
3171			memcpy(paddr, start, len - rest);
3172		else
3173			memcpy(start, paddr, len - rest);
3174
3175		if (rest) {
3176			if (read)
3177				memcpy(paddr + len - rest, dif_storep, rest);
3178			else
3179				memcpy(dif_storep, paddr + len - rest, rest);
 
3180		}
3181
3182		sector += len / sizeof(*dif_storep);
3183		resid -= len;
3184	}
3185	sg_miter_stop(&miter);
3186}
3187
3188static int prot_verify_read(struct scsi_cmnd *scp, sector_t start_sec,
3189			    unsigned int sectors, u32 ei_lba)
3190{
3191	int ret = 0;
3192	unsigned int i;
3193	sector_t sector;
3194	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3195						scp->device->hostdata, true);
3196	struct t10_pi_tuple *sdt;
3197
3198	for (i = 0; i < sectors; i++, ei_lba++) {
3199		sector = start_sec + i;
3200		sdt = dif_store(sip, sector);
3201
3202		if (sdt->app_tag == cpu_to_be16(0xffff))
3203			continue;
3204
3205		/*
3206		 * Because scsi_debug acts as both initiator and
3207		 * target we proceed to verify the PI even if
3208		 * RDPROTECT=3. This is done so the "initiator" knows
3209		 * which type of error to return. Otherwise we would
3210		 * have to iterate over the PI twice.
3211		 */
3212		if (scp->cmnd[1] >> 5) { /* RDPROTECT */
3213			ret = dif_verify(sdt, lba2fake_store(sip, sector),
3214					 sector, ei_lba);
3215			if (ret) {
3216				dif_errors++;
3217				break;
3218			}
3219		}
 
 
3220	}
3221
3222	dif_copy_prot(scp, start_sec, sectors, true);
3223	dix_reads++;
3224
3225	return ret;
3226}
3227
3228static inline void
3229sdeb_read_lock(struct sdeb_store_info *sip)
 
3230{
3231	if (sdebug_no_rwlock) {
3232		if (sip)
3233			__acquire(&sip->macc_lck);
3234		else
3235			__acquire(&sdeb_fake_rw_lck);
3236	} else {
3237		if (sip)
3238			read_lock(&sip->macc_lck);
3239		else
3240			read_lock(&sdeb_fake_rw_lck);
3241	}
3242}
3243
3244static inline void
3245sdeb_read_unlock(struct sdeb_store_info *sip)
3246{
3247	if (sdebug_no_rwlock) {
3248		if (sip)
3249			__release(&sip->macc_lck);
3250		else
3251			__release(&sdeb_fake_rw_lck);
3252	} else {
3253		if (sip)
3254			read_unlock(&sip->macc_lck);
3255		else
3256			read_unlock(&sdeb_fake_rw_lck);
3257	}
3258}
3259
3260static inline void
3261sdeb_write_lock(struct sdeb_store_info *sip)
3262{
3263	if (sdebug_no_rwlock) {
3264		if (sip)
3265			__acquire(&sip->macc_lck);
3266		else
3267			__acquire(&sdeb_fake_rw_lck);
3268	} else {
3269		if (sip)
3270			write_lock(&sip->macc_lck);
3271		else
3272			write_lock(&sdeb_fake_rw_lck);
3273	}
3274}
3275
3276static inline void
3277sdeb_write_unlock(struct sdeb_store_info *sip)
3278{
3279	if (sdebug_no_rwlock) {
3280		if (sip)
3281			__release(&sip->macc_lck);
3282		else
3283			__release(&sdeb_fake_rw_lck);
3284	} else {
3285		if (sip)
3286			write_unlock(&sip->macc_lck);
3287		else
3288			write_unlock(&sdeb_fake_rw_lck);
3289	}
3290}
3291
3292static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3293{
3294	bool check_prot;
3295	u32 num;
3296	u32 ei_lba;
3297	int ret;
3298	u64 lba;
3299	struct sdeb_store_info *sip = devip2sip(devip, true);
3300	u8 *cmd = scp->cmnd;
3301
3302	switch (cmd[0]) {
3303	case READ_16:
3304		ei_lba = 0;
3305		lba = get_unaligned_be64(cmd + 2);
3306		num = get_unaligned_be32(cmd + 10);
3307		check_prot = true;
3308		break;
3309	case READ_10:
3310		ei_lba = 0;
3311		lba = get_unaligned_be32(cmd + 2);
3312		num = get_unaligned_be16(cmd + 7);
3313		check_prot = true;
3314		break;
3315	case READ_6:
3316		ei_lba = 0;
3317		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3318		      (u32)(cmd[1] & 0x1f) << 16;
3319		num = (0 == cmd[4]) ? 256 : cmd[4];
3320		check_prot = true;
3321		break;
3322	case READ_12:
3323		ei_lba = 0;
3324		lba = get_unaligned_be32(cmd + 2);
3325		num = get_unaligned_be32(cmd + 6);
3326		check_prot = true;
3327		break;
3328	case XDWRITEREAD_10:
3329		ei_lba = 0;
3330		lba = get_unaligned_be32(cmd + 2);
3331		num = get_unaligned_be16(cmd + 7);
3332		check_prot = false;
3333		break;
3334	default:	/* assume READ(32) */
3335		lba = get_unaligned_be64(cmd + 12);
3336		ei_lba = get_unaligned_be32(cmd + 20);
3337		num = get_unaligned_be32(cmd + 28);
3338		check_prot = false;
3339		break;
3340	}
3341	if (unlikely(have_dif_prot && check_prot)) {
3342		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3343		    (cmd[1] & 0xe0)) {
3344			mk_sense_invalid_opcode(scp);
3345			return check_condition_result;
3346		}
3347		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3348		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3349		    (cmd[1] & 0xe0) == 0)
3350			sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
3351				    "to DIF device\n");
3352	}
3353	if (unlikely((sdebug_opts & SDEBUG_OPT_SHORT_TRANSFER) &&
3354		     atomic_read(&sdeb_inject_pending))) {
3355		num /= 2;
3356		atomic_set(&sdeb_inject_pending, 0);
3357	}
3358
3359	ret = check_device_access_params(scp, lba, num, false);
3360	if (ret)
3361		return ret;
3362	if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
3363		     (lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
3364		     ((lba + num) > sdebug_medium_error_start))) {
 
3365		/* claim unrecoverable read error */
3366		mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
3367		/* set info field and valid bit for fixed descriptor */
3368		if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
3369			scp->sense_buffer[0] |= 0x80;	/* Valid bit */
3370			ret = (lba < OPT_MEDIUM_ERR_ADDR)
3371			      ? OPT_MEDIUM_ERR_ADDR : (int)lba;
3372			put_unaligned_be32(ret, scp->sense_buffer + 3);
 
 
 
3373		}
3374		scsi_set_resid(scp, scsi_bufflen(scp));
3375		return check_condition_result;
3376	}
3377
3378	sdeb_read_lock(sip);
 
 
3379
3380	/* DIX + T10 DIF */
3381	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3382		switch (prot_verify_read(scp, lba, num, ei_lba)) {
3383		case 1: /* Guard tag error */
3384			if (cmd[1] >> 5 != 3) { /* RDPROTECT != 3 */
3385				sdeb_read_unlock(sip);
3386				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3387				return check_condition_result;
3388			} else if (scp->prot_flags & SCSI_PROT_GUARD_CHECK) {
3389				sdeb_read_unlock(sip);
3390				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3391				return illegal_condition_result;
3392			}
3393			break;
3394		case 3: /* Reference tag error */
3395			if (cmd[1] >> 5 != 3) { /* RDPROTECT != 3 */
3396				sdeb_read_unlock(sip);
3397				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 3);
3398				return check_condition_result;
3399			} else if (scp->prot_flags & SCSI_PROT_REF_CHECK) {
3400				sdeb_read_unlock(sip);
3401				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 3);
3402				return illegal_condition_result;
3403			}
3404			break;
3405		}
3406	}
3407
3408	ret = do_device_access(sip, scp, 0, lba, num, false);
3409	sdeb_read_unlock(sip);
3410	if (unlikely(ret == -1))
3411		return DID_ERROR << 16;
3412
3413	scsi_set_resid(scp, scsi_bufflen(scp) - ret);
3414
3415	if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3416		     atomic_read(&sdeb_inject_pending))) {
3417		if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3418			mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3419			atomic_set(&sdeb_inject_pending, 0);
3420			return check_condition_result;
3421		} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3422			/* Logical block guard check failed */
3423			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3424			atomic_set(&sdeb_inject_pending, 0);
3425			return illegal_condition_result;
3426		} else if (SDEBUG_OPT_DIX_ERR & sdebug_opts) {
3427			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3428			atomic_set(&sdeb_inject_pending, 0);
3429			return illegal_condition_result;
3430		}
 
 
3431	}
3432	return 0;
3433}
3434
3435static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
3436			     unsigned int sectors, u32 ei_lba)
3437{
3438	int ret;
3439	struct t10_pi_tuple *sdt;
3440	void *daddr;
3441	sector_t sector = start_sec;
 
 
 
3442	int ppage_offset;
3443	int dpage_offset;
3444	struct sg_mapping_iter diter;
3445	struct sg_mapping_iter piter;
3446
3447	BUG_ON(scsi_sg_count(SCpnt) == 0);
3448	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
3449
3450	sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
3451			scsi_prot_sg_count(SCpnt),
3452			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3453	sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
3454			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3455
3456	/* For each protection page */
3457	while (sg_miter_next(&piter)) {
3458		dpage_offset = 0;
3459		if (WARN_ON(!sg_miter_next(&diter))) {
3460			ret = 0x01;
3461			goto out;
3462		}
3463
3464		for (ppage_offset = 0; ppage_offset < piter.length;
3465		     ppage_offset += sizeof(struct t10_pi_tuple)) {
3466			/* If we're at the end of the current
3467			 * data page advance to the next one
3468			 */
3469			if (dpage_offset >= diter.length) {
3470				if (WARN_ON(!sg_miter_next(&diter))) {
3471					ret = 0x01;
3472					goto out;
3473				}
3474				dpage_offset = 0;
 
3475			}
3476
3477			sdt = piter.addr + ppage_offset;
3478			daddr = diter.addr + dpage_offset;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3479
3480			if (SCpnt->cmnd[1] >> 5 != 3) { /* WRPROTECT */
3481				ret = dif_verify(sdt, daddr, sector, ei_lba);
3482				if (ret)
3483					goto out;
3484			}
3485
3486			sector++;
3487			ei_lba++;
3488			dpage_offset += sdebug_sector_size;
 
3489		}
3490		diter.consumed = dpage_offset;
3491		sg_miter_stop(&diter);
3492	}
3493	sg_miter_stop(&piter);
3494
3495	dif_copy_prot(SCpnt, start_sec, sectors, false);
 
3496	dix_writes++;
3497
3498	return 0;
3499
3500out:
3501	dif_errors++;
3502	sg_miter_stop(&diter);
3503	sg_miter_stop(&piter);
3504	return ret;
3505}
3506
3507static unsigned long lba_to_map_index(sector_t lba)
3508{
3509	if (sdebug_unmap_alignment)
3510		lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
3511	sector_div(lba, sdebug_unmap_granularity);
3512	return lba;
3513}
3514
3515static sector_t map_index_to_lba(unsigned long index)
3516{
3517	sector_t lba = index * sdebug_unmap_granularity;
3518
3519	if (sdebug_unmap_alignment)
3520		lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
3521	return lba;
3522}
3523
3524static unsigned int map_state(struct sdeb_store_info *sip, sector_t lba,
3525			      unsigned int *num)
3526{
3527	sector_t end;
3528	unsigned int mapped;
3529	unsigned long index;
3530	unsigned long next;
3531
3532	index = lba_to_map_index(lba);
3533	mapped = test_bit(index, sip->map_storep);
3534
3535	if (mapped)
3536		next = find_next_zero_bit(sip->map_storep, map_size, index);
3537	else
3538		next = find_next_bit(sip->map_storep, map_size, index);
3539
3540	end = min_t(sector_t, sdebug_store_sectors,  map_index_to_lba(next));
3541	*num = end - lba;
 
3542	return mapped;
3543}
3544
3545static void map_region(struct sdeb_store_info *sip, sector_t lba,
3546		       unsigned int len)
3547{
 
3548	sector_t end = lba + len;
3549
 
 
 
3550	while (lba < end) {
3551		unsigned long index = lba_to_map_index(lba);
 
 
 
3552
3553		if (index < map_size)
3554			set_bit(index, sip->map_storep);
3555
3556		lba = map_index_to_lba(index + 1);
3557	}
3558}
3559
3560static void unmap_region(struct sdeb_store_info *sip, sector_t lba,
3561			 unsigned int len)
3562{
 
3563	sector_t end = lba + len;
3564	u8 *fsp = sip->storep;
 
 
3565
3566	while (lba < end) {
3567		unsigned long index = lba_to_map_index(lba);
 
 
 
 
 
 
 
3568
3569		if (lba == map_index_to_lba(index) &&
3570		    lba + sdebug_unmap_granularity <= end &&
3571		    index < map_size) {
3572			clear_bit(index, sip->map_storep);
3573			if (sdebug_lbprz) {  /* for LBPRZ=2 return 0xff_s */
3574				memset(fsp + lba * sdebug_sector_size,
3575				       (sdebug_lbprz & 1) ? 0 : 0xff,
3576				       sdebug_sector_size *
3577				       sdebug_unmap_granularity);
3578			}
3579			if (sip->dif_storep) {
3580				memset(sip->dif_storep + lba, 0xff,
3581				       sizeof(*sip->dif_storep) *
3582				       sdebug_unmap_granularity);
3583			}
3584		}
3585		lba = map_index_to_lba(index + 1);
3586	}
3587}
3588
3589static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
 
3590{
3591	bool check_prot;
3592	u32 num;
3593	u32 ei_lba;
3594	int ret;
3595	u64 lba;
3596	struct sdeb_store_info *sip = devip2sip(devip, true);
3597	u8 *cmd = scp->cmnd;
3598
3599	switch (cmd[0]) {
3600	case WRITE_16:
3601		ei_lba = 0;
3602		lba = get_unaligned_be64(cmd + 2);
3603		num = get_unaligned_be32(cmd + 10);
3604		check_prot = true;
3605		break;
3606	case WRITE_10:
3607		ei_lba = 0;
3608		lba = get_unaligned_be32(cmd + 2);
3609		num = get_unaligned_be16(cmd + 7);
3610		check_prot = true;
3611		break;
3612	case WRITE_6:
3613		ei_lba = 0;
3614		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3615		      (u32)(cmd[1] & 0x1f) << 16;
3616		num = (0 == cmd[4]) ? 256 : cmd[4];
3617		check_prot = true;
3618		break;
3619	case WRITE_12:
3620		ei_lba = 0;
3621		lba = get_unaligned_be32(cmd + 2);
3622		num = get_unaligned_be32(cmd + 6);
3623		check_prot = true;
3624		break;
3625	case 0x53:	/* XDWRITEREAD(10) */
3626		ei_lba = 0;
3627		lba = get_unaligned_be32(cmd + 2);
3628		num = get_unaligned_be16(cmd + 7);
3629		check_prot = false;
3630		break;
3631	default:	/* assume WRITE(32) */
3632		lba = get_unaligned_be64(cmd + 12);
3633		ei_lba = get_unaligned_be32(cmd + 20);
3634		num = get_unaligned_be32(cmd + 28);
3635		check_prot = false;
3636		break;
3637	}
3638	if (unlikely(have_dif_prot && check_prot)) {
3639		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3640		    (cmd[1] & 0xe0)) {
3641			mk_sense_invalid_opcode(scp);
3642			return check_condition_result;
3643		}
3644		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3645		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3646		    (cmd[1] & 0xe0) == 0)
3647			sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3648				    "to DIF device\n");
3649	}
3650
3651	sdeb_write_lock(sip);
3652	ret = check_device_access_params(scp, lba, num, true);
3653	if (ret) {
3654		sdeb_write_unlock(sip);
3655		return ret;
3656	}
3657
3658	/* DIX + T10 DIF */
3659	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3660		switch (prot_verify_write(scp, lba, num, ei_lba)) {
3661		case 1: /* Guard tag error */
3662			if (scp->prot_flags & SCSI_PROT_GUARD_CHECK) {
3663				sdeb_write_unlock(sip);
3664				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3665				return illegal_condition_result;
3666			} else if (scp->cmnd[1] >> 5 != 3) { /* WRPROTECT != 3 */
3667				sdeb_write_unlock(sip);
3668				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3669				return check_condition_result;
3670			}
3671			break;
3672		case 3: /* Reference tag error */
3673			if (scp->prot_flags & SCSI_PROT_REF_CHECK) {
3674				sdeb_write_unlock(sip);
3675				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 3);
3676				return illegal_condition_result;
3677			} else if (scp->cmnd[1] >> 5 != 3) { /* WRPROTECT != 3 */
3678				sdeb_write_unlock(sip);
3679				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 3);
3680				return check_condition_result;
3681			}
3682			break;
3683		}
3684	}
3685
3686	ret = do_device_access(sip, scp, 0, lba, num, true);
3687	if (unlikely(scsi_debug_lbp()))
3688		map_region(sip, lba, num);
3689	/* If ZBC zone then bump its write pointer */
3690	if (sdebug_dev_is_zoned(devip))
3691		zbc_inc_wp(devip, lba, num);
3692	sdeb_write_unlock(sip);
3693	if (unlikely(-1 == ret))
3694		return DID_ERROR << 16;
3695	else if (unlikely(sdebug_verbose &&
3696			  (ret < (num * sdebug_sector_size))))
3697		sdev_printk(KERN_INFO, scp->device,
3698			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3699			    my_name, num * sdebug_sector_size, ret);
3700
3701	if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3702		     atomic_read(&sdeb_inject_pending))) {
3703		if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3704			mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3705			atomic_set(&sdeb_inject_pending, 0);
3706			return check_condition_result;
3707		} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3708			/* Logical block guard check failed */
3709			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3710			atomic_set(&sdeb_inject_pending, 0);
3711			return illegal_condition_result;
3712		} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3713			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3714			atomic_set(&sdeb_inject_pending, 0);
3715			return illegal_condition_result;
3716		}
3717	}
3718	return 0;
3719}
3720
3721/*
3722 * T10 has only specified WRITE SCATTERED(16) and WRITE SCATTERED(32).
3723 * No READ GATHERED yet (requires bidi or long cdb holding gather list).
3724 */
3725static int resp_write_scat(struct scsi_cmnd *scp,
3726			   struct sdebug_dev_info *devip)
3727{
3728	u8 *cmd = scp->cmnd;
3729	u8 *lrdp = NULL;
3730	u8 *up;
3731	struct sdeb_store_info *sip = devip2sip(devip, true);
3732	u8 wrprotect;
3733	u16 lbdof, num_lrd, k;
3734	u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
3735	u32 lb_size = sdebug_sector_size;
3736	u32 ei_lba;
3737	u64 lba;
3738	int ret, res;
3739	bool is_16;
3740	static const u32 lrd_size = 32; /* + parameter list header size */
3741
3742	if (cmd[0] == VARIABLE_LENGTH_CMD) {
3743		is_16 = false;
3744		wrprotect = (cmd[10] >> 5) & 0x7;
3745		lbdof = get_unaligned_be16(cmd + 12);
3746		num_lrd = get_unaligned_be16(cmd + 16);
3747		bt_len = get_unaligned_be32(cmd + 28);
3748	} else {        /* that leaves WRITE SCATTERED(16) */
3749		is_16 = true;
3750		wrprotect = (cmd[2] >> 5) & 0x7;
3751		lbdof = get_unaligned_be16(cmd + 4);
3752		num_lrd = get_unaligned_be16(cmd + 8);
3753		bt_len = get_unaligned_be32(cmd + 10);
3754		if (unlikely(have_dif_prot)) {
3755			if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3756			    wrprotect) {
3757				mk_sense_invalid_opcode(scp);
3758				return illegal_condition_result;
3759			}
3760			if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3761			     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3762			     wrprotect == 0)
3763				sdev_printk(KERN_ERR, scp->device,
3764					    "Unprotected WR to DIF device\n");
3765		}
3766	}
3767	if ((num_lrd == 0) || (bt_len == 0))
3768		return 0;       /* T10 says these do-nothings are not errors */
3769	if (lbdof == 0) {
3770		if (sdebug_verbose)
3771			sdev_printk(KERN_INFO, scp->device,
3772				"%s: %s: LB Data Offset field bad\n",
3773				my_name, __func__);
3774		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3775		return illegal_condition_result;
3776	}
3777	lbdof_blen = lbdof * lb_size;
3778	if ((lrd_size + (num_lrd * lrd_size)) > lbdof_blen) {
3779		if (sdebug_verbose)
3780			sdev_printk(KERN_INFO, scp->device,
3781				"%s: %s: LBA range descriptors don't fit\n",
3782				my_name, __func__);
3783		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3784		return illegal_condition_result;
3785	}
3786	lrdp = kzalloc(lbdof_blen, GFP_ATOMIC | __GFP_NOWARN);
3787	if (lrdp == NULL)
3788		return SCSI_MLQUEUE_HOST_BUSY;
3789	if (sdebug_verbose)
3790		sdev_printk(KERN_INFO, scp->device,
3791			"%s: %s: Fetch header+scatter_list, lbdof_blen=%u\n",
3792			my_name, __func__, lbdof_blen);
3793	res = fetch_to_dev_buffer(scp, lrdp, lbdof_blen);
3794	if (res == -1) {
3795		ret = DID_ERROR << 16;
3796		goto err_out;
3797	}
3798
3799	sdeb_write_lock(sip);
3800	sg_off = lbdof_blen;
3801	/* Spec says Buffer xfer Length field in number of LBs in dout */
3802	cum_lb = 0;
3803	for (k = 0, up = lrdp + lrd_size; k < num_lrd; ++k, up += lrd_size) {
3804		lba = get_unaligned_be64(up + 0);
3805		num = get_unaligned_be32(up + 8);
3806		if (sdebug_verbose)
3807			sdev_printk(KERN_INFO, scp->device,
3808				"%s: %s: k=%d  LBA=0x%llx num=%u  sg_off=%u\n",
3809				my_name, __func__, k, lba, num, sg_off);
3810		if (num == 0)
3811			continue;
3812		ret = check_device_access_params(scp, lba, num, true);
3813		if (ret)
3814			goto err_out_unlock;
3815		num_by = num * lb_size;
3816		ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
3817
3818		if ((cum_lb + num) > bt_len) {
3819			if (sdebug_verbose)
3820				sdev_printk(KERN_INFO, scp->device,
3821				    "%s: %s: sum of blocks > data provided\n",
3822				    my_name, __func__);
3823			mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
3824					0);
3825			ret = illegal_condition_result;
3826			goto err_out_unlock;
3827		}
3828
3829		/* DIX + T10 DIF */
3830		if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3831			int prot_ret = prot_verify_write(scp, lba, num,
3832							 ei_lba);
3833
3834			if (prot_ret) {
3835				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
3836						prot_ret);
3837				ret = illegal_condition_result;
3838				goto err_out_unlock;
3839			}
3840		}
3841
3842		ret = do_device_access(sip, scp, sg_off, lba, num, true);
3843		/* If ZBC zone then bump its write pointer */
3844		if (sdebug_dev_is_zoned(devip))
3845			zbc_inc_wp(devip, lba, num);
3846		if (unlikely(scsi_debug_lbp()))
3847			map_region(sip, lba, num);
3848		if (unlikely(-1 == ret)) {
3849			ret = DID_ERROR << 16;
3850			goto err_out_unlock;
3851		} else if (unlikely(sdebug_verbose && (ret < num_by)))
3852			sdev_printk(KERN_INFO, scp->device,
3853			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3854			    my_name, num_by, ret);
3855
3856		if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3857			     atomic_read(&sdeb_inject_pending))) {
3858			if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3859				mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3860				atomic_set(&sdeb_inject_pending, 0);
3861				ret = check_condition_result;
3862				goto err_out_unlock;
3863			} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3864				/* Logical block guard check failed */
3865				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3866				atomic_set(&sdeb_inject_pending, 0);
3867				ret = illegal_condition_result;
3868				goto err_out_unlock;
3869			} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3870				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3871				atomic_set(&sdeb_inject_pending, 0);
3872				ret = illegal_condition_result;
3873				goto err_out_unlock;
3874			}
3875		}
3876		sg_off += num_by;
3877		cum_lb += num;
3878	}
3879	ret = 0;
3880err_out_unlock:
3881	sdeb_write_unlock(sip);
3882err_out:
3883	kfree(lrdp);
3884	return ret;
3885}
3886
3887static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
3888			   u32 ei_lba, bool unmap, bool ndob)
 
3889{
3890	struct scsi_device *sdp = scp->device;
3891	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
3892	unsigned long long i;
3893	u64 block, lbaa;
3894	u32 lb_size = sdebug_sector_size;
3895	int ret;
3896	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3897						scp->device->hostdata, true);
3898	u8 *fs1p;
3899	u8 *fsp;
3900
3901	sdeb_write_lock(sip);
3902
3903	ret = check_device_access_params(scp, lba, num, true);
3904	if (ret) {
3905		sdeb_write_unlock(sip);
3906		return ret;
 
 
 
 
 
3907	}
3908
3909	if (unmap && scsi_debug_lbp()) {
3910		unmap_region(sip, lba, num);
 
 
3911		goto out;
3912	}
3913	lbaa = lba;
3914	block = do_div(lbaa, sdebug_store_sectors);
3915	/* if ndob then zero 1 logical block, else fetch 1 logical block */
3916	fsp = sip->storep;
3917	fs1p = fsp + (block * lb_size);
3918	if (ndob) {
3919		memset(fs1p, 0, lb_size);
3920		ret = 0;
3921	} else
3922		ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
3923
3924	if (-1 == ret) {
3925		sdeb_write_unlock(sip);
3926		return DID_ERROR << 16;
3927	} else if (sdebug_verbose && !ndob && (ret < lb_size))
3928		sdev_printk(KERN_INFO, scp->device,
3929			    "%s: %s: lb size=%u, IO sent=%d bytes\n",
3930			    my_name, "write same", lb_size, ret);
3931
3932	/* Copy first sector to remaining blocks */
3933	for (i = 1 ; i < num ; i++) {
3934		lbaa = lba + i;
3935		block = do_div(lbaa, sdebug_store_sectors);
3936		memmove(fsp + (block * lb_size), fs1p, lb_size);
3937	}
3938	if (scsi_debug_lbp())
3939		map_region(sip, lba, num);
3940	/* If ZBC zone then bump its write pointer */
3941	if (sdebug_dev_is_zoned(devip))
3942		zbc_inc_wp(devip, lba, num);
3943out:
3944	sdeb_write_unlock(sip);
3945
3946	return 0;
3947}
3948
3949static int resp_write_same_10(struct scsi_cmnd *scp,
3950			      struct sdebug_dev_info *devip)
3951{
3952	u8 *cmd = scp->cmnd;
3953	u32 lba;
3954	u16 num;
3955	u32 ei_lba = 0;
3956	bool unmap = false;
3957
3958	if (cmd[1] & 0x8) {
3959		if (sdebug_lbpws10 == 0) {
3960			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3961			return check_condition_result;
3962		} else
3963			unmap = true;
3964	}
3965	lba = get_unaligned_be32(cmd + 2);
3966	num = get_unaligned_be16(cmd + 7);
3967	if (num > sdebug_write_same_length) {
3968		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3969		return check_condition_result;
3970	}
3971	return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3972}
3973
3974static int resp_write_same_16(struct scsi_cmnd *scp,
3975			      struct sdebug_dev_info *devip)
3976{
3977	u8 *cmd = scp->cmnd;
3978	u64 lba;
3979	u32 num;
3980	u32 ei_lba = 0;
3981	bool unmap = false;
3982	bool ndob = false;
3983
3984	if (cmd[1] & 0x8) {	/* UNMAP */
3985		if (sdebug_lbpws == 0) {
3986			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3987			return check_condition_result;
3988		} else
3989			unmap = true;
3990	}
3991	if (cmd[1] & 0x1)  /* NDOB (no data-out buffer, assumes zeroes) */
3992		ndob = true;
3993	lba = get_unaligned_be64(cmd + 2);
3994	num = get_unaligned_be32(cmd + 10);
3995	if (num > sdebug_write_same_length) {
3996		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3997		return check_condition_result;
3998	}
3999	return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
4000}
4001
4002/* Note the mode field is in the same position as the (lower) service action
4003 * field. For the Report supported operation codes command, SPC-4 suggests
4004 * each mode of this command should be reported separately; for future. */
4005static int resp_write_buffer(struct scsi_cmnd *scp,
4006			     struct sdebug_dev_info *devip)
4007{
4008	u8 *cmd = scp->cmnd;
4009	struct scsi_device *sdp = scp->device;
4010	struct sdebug_dev_info *dp;
4011	u8 mode;
4012
4013	mode = cmd[1] & 0x1f;
4014	switch (mode) {
4015	case 0x4:	/* download microcode (MC) and activate (ACT) */
4016		/* set UAs on this device only */
4017		set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4018		set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
4019		break;
4020	case 0x5:	/* download MC, save and ACT */
4021		set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
4022		break;
4023	case 0x6:	/* download MC with offsets and ACT */
4024		/* set UAs on most devices (LUs) in this target */
4025		list_for_each_entry(dp,
4026				    &devip->sdbg_host->dev_info_list,
4027				    dev_list)
4028			if (dp->target == sdp->id) {
4029				set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
4030				if (devip != dp)
4031					set_bit(SDEBUG_UA_MICROCODE_CHANGED,
4032						dp->uas_bm);
4033			}
4034		break;
4035	case 0x7:	/* download MC with offsets, save, and ACT */
4036		/* set UA on all devices (LUs) in this target */
4037		list_for_each_entry(dp,
4038				    &devip->sdbg_host->dev_info_list,
4039				    dev_list)
4040			if (dp->target == sdp->id)
4041				set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
4042					dp->uas_bm);
4043		break;
4044	default:
4045		/* do nothing for this command for other mode values */
4046		break;
4047	}
4048	return 0;
4049}
4050
4051static int resp_comp_write(struct scsi_cmnd *scp,
4052			   struct sdebug_dev_info *devip)
4053{
4054	u8 *cmd = scp->cmnd;
4055	u8 *arr;
4056	struct sdeb_store_info *sip = devip2sip(devip, true);
4057	u64 lba;
4058	u32 dnum;
4059	u32 lb_size = sdebug_sector_size;
4060	u8 num;
4061	int ret;
4062	int retval = 0;
4063
4064	lba = get_unaligned_be64(cmd + 2);
4065	num = cmd[13];		/* 1 to a maximum of 255 logical blocks */
4066	if (0 == num)
4067		return 0;	/* degenerate case, not an error */
4068	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
4069	    (cmd[1] & 0xe0)) {
4070		mk_sense_invalid_opcode(scp);
4071		return check_condition_result;
4072	}
4073	if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
4074	     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
4075	    (cmd[1] & 0xe0) == 0)
4076		sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
4077			    "to DIF device\n");
4078	ret = check_device_access_params(scp, lba, num, false);
4079	if (ret)
4080		return ret;
4081	dnum = 2 * num;
4082	arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
4083	if (NULL == arr) {
4084		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4085				INSUFF_RES_ASCQ);
4086		return check_condition_result;
4087	}
4088
4089	sdeb_write_lock(sip);
4090
4091	ret = do_dout_fetch(scp, dnum, arr);
4092	if (ret == -1) {
4093		retval = DID_ERROR << 16;
4094		goto cleanup;
4095	} else if (sdebug_verbose && (ret < (dnum * lb_size)))
4096		sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
4097			    "indicated=%u, IO sent=%d bytes\n", my_name,
4098			    dnum * lb_size, ret);
4099	if (!comp_write_worker(sip, lba, num, arr, false)) {
4100		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
4101		retval = check_condition_result;
4102		goto cleanup;
4103	}
4104	if (scsi_debug_lbp())
4105		map_region(sip, lba, num);
4106cleanup:
4107	sdeb_write_unlock(sip);
4108	kfree(arr);
4109	return retval;
4110}
4111
4112struct unmap_block_desc {
4113	__be64	lba;
4114	__be32	blocks;
4115	__be32	__reserved;
4116};
4117
4118static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4119{
4120	unsigned char *buf;
4121	struct unmap_block_desc *desc;
4122	struct sdeb_store_info *sip = devip2sip(devip, true);
4123	unsigned int i, payload_len, descriptors;
4124	int ret;
4125
4126	if (!scsi_debug_lbp())
4127		return 0;	/* fib and say its done */
4128	payload_len = get_unaligned_be16(scp->cmnd + 7);
4129	BUG_ON(scsi_bufflen(scp) != payload_len);
 
 
4130
4131	descriptors = (payload_len - 8) / 16;
4132	if (descriptors > sdebug_unmap_max_desc) {
4133		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
4134		return check_condition_result;
4135	}
4136
4137	buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
4138	if (!buf) {
4139		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4140				INSUFF_RES_ASCQ);
4141		return check_condition_result;
4142	}
4143
4144	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
4145
4146	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
4147	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
4148
4149	desc = (void *)&buf[8];
4150
4151	sdeb_write_lock(sip);
4152
4153	for (i = 0 ; i < descriptors ; i++) {
4154		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
4155		unsigned int num = get_unaligned_be32(&desc[i].blocks);
4156
4157		ret = check_device_access_params(scp, lba, num, true);
4158		if (ret)
4159			goto out;
4160
4161		unmap_region(sip, lba, num);
4162	}
4163
4164	ret = 0;
4165
4166out:
4167	sdeb_write_unlock(sip);
4168	kfree(buf);
4169
4170	return ret;
4171}
4172
4173#define SDEBUG_GET_LBA_STATUS_LEN 32
4174
4175static int resp_get_lba_status(struct scsi_cmnd *scp,
4176			       struct sdebug_dev_info *devip)
4177{
4178	u8 *cmd = scp->cmnd;
4179	u64 lba;
4180	u32 alloc_len, mapped, num;
4181	int ret;
4182	u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
4183
4184	lba = get_unaligned_be64(cmd + 2);
4185	alloc_len = get_unaligned_be32(cmd + 10);
 
 
 
 
4186
4187	if (alloc_len < 24)
4188		return 0;
4189
4190	ret = check_device_access_params(scp, lba, 1, false);
4191	if (ret)
4192		return ret;
4193
4194	if (scsi_debug_lbp()) {
4195		struct sdeb_store_info *sip = devip2sip(devip, true);
4196
4197		mapped = map_state(sip, lba, &num);
4198	} else {
4199		mapped = 1;
4200		/* following just in case virtual_gb changed */
4201		sdebug_capacity = get_sdebug_capacity();
4202		if (sdebug_capacity - lba <= 0xffffffff)
4203			num = sdebug_capacity - lba;
4204		else
4205			num = 0xffffffff;
4206	}
4207
4208	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
4209	put_unaligned_be32(20, arr);		/* Parameter Data Length */
4210	put_unaligned_be64(lba, arr + 8);	/* LBA */
4211	put_unaligned_be32(num, arr + 16);	/* Number of blocks */
4212	arr[20] = !mapped;		/* prov_stat=0: mapped; 1: dealloc */
4213
4214	return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
4215}
4216
4217static int resp_sync_cache(struct scsi_cmnd *scp,
4218			   struct sdebug_dev_info *devip)
4219{
4220	int res = 0;
4221	u64 lba;
4222	u32 num_blocks;
4223	u8 *cmd = scp->cmnd;
4224
4225	if (cmd[0] == SYNCHRONIZE_CACHE) {	/* 10 byte cdb */
4226		lba = get_unaligned_be32(cmd + 2);
4227		num_blocks = get_unaligned_be16(cmd + 7);
4228	} else {				/* SYNCHRONIZE_CACHE(16) */
4229		lba = get_unaligned_be64(cmd + 2);
4230		num_blocks = get_unaligned_be32(cmd + 10);
4231	}
4232	if (lba + num_blocks > sdebug_capacity) {
4233		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4234		return check_condition_result;
4235	}
4236	if (!write_since_sync || (cmd[1] & 0x2))
4237		res = SDEG_RES_IMMED_MASK;
4238	else		/* delay if write_since_sync and IMMED clear */
4239		write_since_sync = false;
4240	return res;
4241}
4242
4243/*
4244 * Assuming the LBA+num_blocks is not out-of-range, this function will return
4245 * CONDITION MET if the specified blocks will/have fitted in the cache, and
4246 * a GOOD status otherwise. Model a disk with a big cache and yield
4247 * CONDITION MET. Actually tries to bring range in main memory into the
4248 * cache associated with the CPU(s).
4249 */
4250static int resp_pre_fetch(struct scsi_cmnd *scp,
4251			  struct sdebug_dev_info *devip)
4252{
4253	int res = 0;
4254	u64 lba;
4255	u64 block, rest = 0;
4256	u32 nblks;
4257	u8 *cmd = scp->cmnd;
4258	struct sdeb_store_info *sip = devip2sip(devip, true);
4259	u8 *fsp = sip->storep;
4260
4261	if (cmd[0] == PRE_FETCH) {	/* 10 byte cdb */
4262		lba = get_unaligned_be32(cmd + 2);
4263		nblks = get_unaligned_be16(cmd + 7);
4264	} else {			/* PRE-FETCH(16) */
4265		lba = get_unaligned_be64(cmd + 2);
4266		nblks = get_unaligned_be32(cmd + 10);
4267	}
4268	if (lba + nblks > sdebug_capacity) {
4269		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4270		return check_condition_result;
4271	}
4272	if (!fsp)
4273		goto fini;
4274	/* PRE-FETCH spec says nothing about LBP or PI so skip them */
4275	block = do_div(lba, sdebug_store_sectors);
4276	if (block + nblks > sdebug_store_sectors)
4277		rest = block + nblks - sdebug_store_sectors;
4278
4279	/* Try to bring the PRE-FETCH range into CPU's cache */
4280	sdeb_read_lock(sip);
4281	prefetch_range(fsp + (sdebug_sector_size * block),
4282		       (nblks - rest) * sdebug_sector_size);
4283	if (rest)
4284		prefetch_range(fsp, rest * sdebug_sector_size);
4285	sdeb_read_unlock(sip);
4286fini:
4287	if (cmd[1] & 0x2)
4288		res = SDEG_RES_IMMED_MASK;
4289	return res | condition_met_result;
4290}
4291
4292#define RL_BUCKET_ELEMS 8
4293
4294/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
4295 * (W-LUN), the normal Linux scanning logic does not associate it with a
4296 * device (e.g. /dev/sg7). The following magic will make that association:
4297 *   "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
4298 * where <n> is a host number. If there are multiple targets in a host then
4299 * the above will associate a W-LUN to each target. To only get a W-LUN
4300 * for target 2, then use "echo '- 2 49409' > scan" .
4301 */
4302static int resp_report_luns(struct scsi_cmnd *scp,
4303			    struct sdebug_dev_info *devip)
4304{
4305	unsigned char *cmd = scp->cmnd;
4306	unsigned int alloc_len;
4307	unsigned char select_report;
4308	u64 lun;
4309	struct scsi_lun *lun_p;
4310	u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
4311	unsigned int lun_cnt;	/* normal LUN count (max: 256) */
4312	unsigned int wlun_cnt;	/* report luns W-LUN count */
4313	unsigned int tlun_cnt;	/* total LUN count */
4314	unsigned int rlen;	/* response length (in bytes) */
4315	int k, j, n, res;
4316	unsigned int off_rsp = 0;
4317	const int sz_lun = sizeof(struct scsi_lun);
4318
4319	clear_luns_changed_on_target(devip);
4320
4321	select_report = cmd[2];
4322	alloc_len = get_unaligned_be32(cmd + 6);
4323
4324	if (alloc_len < 4) {
4325		pr_err("alloc len too small %d\n", alloc_len);
4326		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
4327		return check_condition_result;
4328	}
4329
4330	switch (select_report) {
4331	case 0:		/* all LUNs apart from W-LUNs */
4332		lun_cnt = sdebug_max_luns;
4333		wlun_cnt = 0;
4334		break;
4335	case 1:		/* only W-LUNs */
4336		lun_cnt = 0;
4337		wlun_cnt = 1;
4338		break;
4339	case 2:		/* all LUNs */
4340		lun_cnt = sdebug_max_luns;
4341		wlun_cnt = 1;
4342		break;
4343	case 0x10:	/* only administrative LUs */
4344	case 0x11:	/* see SPC-5 */
4345	case 0x12:	/* only subsiduary LUs owned by referenced LU */
4346	default:
4347		pr_debug("select report invalid %d\n", select_report);
4348		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
4349		return check_condition_result;
4350	}
4351
4352	if (sdebug_no_lun_0 && (lun_cnt > 0))
4353		--lun_cnt;
4354
4355	tlun_cnt = lun_cnt + wlun_cnt;
4356	rlen = tlun_cnt * sz_lun;	/* excluding 8 byte header */
4357	scsi_set_resid(scp, scsi_bufflen(scp));
4358	pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
4359		 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
4360
4361	/* loops rely on sizeof response header same as sizeof lun (both 8) */
4362	lun = sdebug_no_lun_0 ? 1 : 0;
4363	for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
4364		memset(arr, 0, sizeof(arr));
4365		lun_p = (struct scsi_lun *)&arr[0];
4366		if (k == 0) {
4367			put_unaligned_be32(rlen, &arr[0]);
4368			++lun_p;
4369			j = 1;
4370		}
4371		for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
4372			if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
4373				break;
4374			int_to_scsilun(lun++, lun_p);
4375			if (lun > 1 && sdebug_lun_am == SAM_LUN_AM_FLAT)
4376				lun_p->scsi_lun[0] |= 0x40;
4377		}
4378		if (j < RL_BUCKET_ELEMS)
4379			break;
4380		n = j * sz_lun;
4381		res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
4382		if (res)
4383			return res;
4384		off_rsp += n;
4385	}
4386	if (wlun_cnt) {
4387		int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
4388		++j;
4389	}
4390	if (j > 0)
4391		res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
4392	return res;
4393}
4394
4395static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4396{
4397	bool is_bytchk3 = false;
4398	u8 bytchk;
4399	int ret, j;
4400	u32 vnum, a_num, off;
4401	const u32 lb_size = sdebug_sector_size;
4402	u64 lba;
4403	u8 *arr;
4404	u8 *cmd = scp->cmnd;
4405	struct sdeb_store_info *sip = devip2sip(devip, true);
4406
4407	bytchk = (cmd[1] >> 1) & 0x3;
4408	if (bytchk == 0) {
4409		return 0;	/* always claim internal verify okay */
4410	} else if (bytchk == 2) {
4411		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
4412		return check_condition_result;
4413	} else if (bytchk == 3) {
4414		is_bytchk3 = true;	/* 1 block sent, compared repeatedly */
4415	}
4416	switch (cmd[0]) {
4417	case VERIFY_16:
4418		lba = get_unaligned_be64(cmd + 2);
4419		vnum = get_unaligned_be32(cmd + 10);
4420		break;
4421	case VERIFY:		/* is VERIFY(10) */
4422		lba = get_unaligned_be32(cmd + 2);
4423		vnum = get_unaligned_be16(cmd + 7);
4424		break;
4425	default:
4426		mk_sense_invalid_opcode(scp);
4427		return check_condition_result;
4428	}
4429	if (vnum == 0)
4430		return 0;	/* not an error */
4431	a_num = is_bytchk3 ? 1 : vnum;
4432	/* Treat following check like one for read (i.e. no write) access */
4433	ret = check_device_access_params(scp, lba, a_num, false);
4434	if (ret)
4435		return ret;
4436
4437	arr = kcalloc(lb_size, vnum, GFP_ATOMIC | __GFP_NOWARN);
4438	if (!arr) {
4439		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4440				INSUFF_RES_ASCQ);
4441		return check_condition_result;
4442	}
4443	/* Not changing store, so only need read access */
4444	sdeb_read_lock(sip);
4445
4446	ret = do_dout_fetch(scp, a_num, arr);
4447	if (ret == -1) {
4448		ret = DID_ERROR << 16;
4449		goto cleanup;
4450	} else if (sdebug_verbose && (ret < (a_num * lb_size))) {
4451		sdev_printk(KERN_INFO, scp->device,
4452			    "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
4453			    my_name, __func__, a_num * lb_size, ret);
4454	}
4455	if (is_bytchk3) {
4456		for (j = 1, off = lb_size; j < vnum; ++j, off += lb_size)
4457			memcpy(arr + off, arr, lb_size);
4458	}
4459	ret = 0;
4460	if (!comp_write_worker(sip, lba, vnum, arr, true)) {
4461		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
4462		ret = check_condition_result;
4463		goto cleanup;
4464	}
4465cleanup:
4466	sdeb_read_unlock(sip);
4467	kfree(arr);
4468	return ret;
4469}
4470
4471#define RZONES_DESC_HD 64
 
 
 
 
 
 
 
4472
4473/* Report zones depending on start LBA and reporting options */
4474static int resp_report_zones(struct scsi_cmnd *scp,
4475			     struct sdebug_dev_info *devip)
4476{
4477	unsigned int rep_max_zones, nrz = 0;
4478	int ret = 0;
4479	u32 alloc_len, rep_opts, rep_len;
4480	bool partial;
4481	u64 lba, zs_lba;
4482	u8 *arr = NULL, *desc;
4483	u8 *cmd = scp->cmnd;
4484	struct sdeb_zone_state *zsp = NULL;
4485	struct sdeb_store_info *sip = devip2sip(devip, false);
4486
4487	if (!sdebug_dev_is_zoned(devip)) {
4488		mk_sense_invalid_opcode(scp);
4489		return check_condition_result;
4490	}
4491	zs_lba = get_unaligned_be64(cmd + 2);
4492	alloc_len = get_unaligned_be32(cmd + 10);
4493	if (alloc_len == 0)
4494		return 0;	/* not an error */
4495	rep_opts = cmd[14] & 0x3f;
4496	partial = cmd[14] & 0x80;
4497
4498	if (zs_lba >= sdebug_capacity) {
4499		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4500		return check_condition_result;
4501	}
 
4502
4503	rep_max_zones = (alloc_len - 64) >> ilog2(RZONES_DESC_HD);
 
4504
4505	arr = kzalloc(alloc_len, GFP_ATOMIC | __GFP_NOWARN);
4506	if (!arr) {
4507		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4508				INSUFF_RES_ASCQ);
4509		return check_condition_result;
4510	}
 
 
 
4511
4512	sdeb_read_lock(sip);
4513
4514	desc = arr + 64;
4515	for (lba = zs_lba; lba < sdebug_capacity;
4516	     lba = zsp->z_start + zsp->z_size) {
4517		if (WARN_ONCE(zbc_zone(devip, lba) == zsp, "lba = %llu\n", lba))
4518			break;
4519		zsp = zbc_zone(devip, lba);
4520		switch (rep_opts) {
4521		case 0x00:
4522			/* All zones */
4523			break;
4524		case 0x01:
4525			/* Empty zones */
4526			if (zsp->z_cond != ZC1_EMPTY)
4527				continue;
4528			break;
4529		case 0x02:
4530			/* Implicit open zones */
4531			if (zsp->z_cond != ZC2_IMPLICIT_OPEN)
4532				continue;
4533			break;
4534		case 0x03:
4535			/* Explicit open zones */
4536			if (zsp->z_cond != ZC3_EXPLICIT_OPEN)
4537				continue;
4538			break;
4539		case 0x04:
4540			/* Closed zones */
4541			if (zsp->z_cond != ZC4_CLOSED)
4542				continue;
4543			break;
4544		case 0x05:
4545			/* Full zones */
4546			if (zsp->z_cond != ZC5_FULL)
4547				continue;
4548			break;
4549		case 0x06:
4550		case 0x07:
4551		case 0x10:
4552			/*
4553			 * Read-only, offline, reset WP recommended are
4554			 * not emulated: no zones to report;
4555			 */
4556			continue;
4557		case 0x11:
4558			/* non-seq-resource set */
4559			if (!zsp->z_non_seq_resource)
4560				continue;
4561			break;
4562		case 0x3e:
4563			/* All zones except gap zones. */
4564			if (zbc_zone_is_gap(zsp))
4565				continue;
4566			break;
4567		case 0x3f:
4568			/* Not write pointer (conventional) zones */
4569			if (zbc_zone_is_seq(zsp))
4570				continue;
4571			break;
4572		default:
4573			mk_sense_buffer(scp, ILLEGAL_REQUEST,
4574					INVALID_FIELD_IN_CDB, 0);
4575			ret = check_condition_result;
4576			goto fini;
4577		}
4578
4579		if (nrz < rep_max_zones) {
4580			/* Fill zone descriptor */
4581			desc[0] = zsp->z_type;
4582			desc[1] = zsp->z_cond << 4;
4583			if (zsp->z_non_seq_resource)
4584				desc[1] |= 1 << 1;
4585			put_unaligned_be64((u64)zsp->z_size, desc + 8);
4586			put_unaligned_be64((u64)zsp->z_start, desc + 16);
4587			put_unaligned_be64((u64)zsp->z_wp, desc + 24);
4588			desc += 64;
4589		}
4590
4591		if (partial && nrz >= rep_max_zones)
4592			break;
4593
4594		nrz++;
4595	}
4596
4597	/* Report header */
4598	/* Zone list length. */
4599	put_unaligned_be32(nrz * RZONES_DESC_HD, arr + 0);
4600	/* Maximum LBA */
4601	put_unaligned_be64(sdebug_capacity - 1, arr + 8);
4602	/* Zone starting LBA granularity. */
4603	if (devip->zcap < devip->zsize)
4604		put_unaligned_be64(devip->zsize, arr + 16);
4605
4606	rep_len = (unsigned long)desc - (unsigned long)arr;
4607	ret = fill_from_dev_buffer(scp, arr, min_t(u32, alloc_len, rep_len));
4608
4609fini:
4610	sdeb_read_unlock(sip);
4611	kfree(arr);
4612	return ret;
4613}
4614
4615/* Logic transplanted from tcmu-runner, file_zbc.c */
4616static void zbc_open_all(struct sdebug_dev_info *devip)
4617{
4618	struct sdeb_zone_state *zsp = &devip->zstate[0];
4619	unsigned int i;
4620
4621	for (i = 0; i < devip->nr_zones; i++, zsp++) {
4622		if (zsp->z_cond == ZC4_CLOSED)
4623			zbc_open_zone(devip, &devip->zstate[i], true);
4624	}
4625}
4626
4627static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4628{
4629	int res = 0;
4630	u64 z_id;
4631	enum sdebug_z_cond zc;
4632	u8 *cmd = scp->cmnd;
4633	struct sdeb_zone_state *zsp;
4634	bool all = cmd[14] & 0x01;
4635	struct sdeb_store_info *sip = devip2sip(devip, false);
4636
4637	if (!sdebug_dev_is_zoned(devip)) {
4638		mk_sense_invalid_opcode(scp);
4639		return check_condition_result;
4640	}
4641
4642	sdeb_write_lock(sip);
4643
4644	if (all) {
4645		/* Check if all closed zones can be open */
4646		if (devip->max_open &&
4647		    devip->nr_exp_open + devip->nr_closed > devip->max_open) {
4648			mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4649					INSUFF_ZONE_ASCQ);
4650			res = check_condition_result;
4651			goto fini;
4652		}
4653		/* Open all closed zones */
4654		zbc_open_all(devip);
4655		goto fini;
4656	}
4657
4658	/* Open the specified zone */
4659	z_id = get_unaligned_be64(cmd + 2);
4660	if (z_id >= sdebug_capacity) {
4661		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4662		res = check_condition_result;
4663		goto fini;
4664	}
4665
4666	zsp = zbc_zone(devip, z_id);
4667	if (z_id != zsp->z_start) {
4668		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4669		res = check_condition_result;
4670		goto fini;
4671	}
4672	if (zbc_zone_is_conv(zsp)) {
4673		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4674		res = check_condition_result;
4675		goto fini;
4676	}
4677
4678	zc = zsp->z_cond;
4679	if (zc == ZC3_EXPLICIT_OPEN || zc == ZC5_FULL)
4680		goto fini;
4681
4682	if (devip->max_open && devip->nr_exp_open >= devip->max_open) {
4683		mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4684				INSUFF_ZONE_ASCQ);
4685		res = check_condition_result;
4686		goto fini;
4687	}
4688
4689	zbc_open_zone(devip, zsp, true);
4690fini:
4691	sdeb_write_unlock(sip);
4692	return res;
4693}
4694
4695static void zbc_close_all(struct sdebug_dev_info *devip)
4696{
4697	unsigned int i;
4698
4699	for (i = 0; i < devip->nr_zones; i++)
4700		zbc_close_zone(devip, &devip->zstate[i]);
4701}
4702
4703static int resp_close_zone(struct scsi_cmnd *scp,
4704			   struct sdebug_dev_info *devip)
4705{
4706	int res = 0;
4707	u64 z_id;
4708	u8 *cmd = scp->cmnd;
4709	struct sdeb_zone_state *zsp;
4710	bool all = cmd[14] & 0x01;
4711	struct sdeb_store_info *sip = devip2sip(devip, false);
4712
4713	if (!sdebug_dev_is_zoned(devip)) {
4714		mk_sense_invalid_opcode(scp);
4715		return check_condition_result;
4716	}
4717
4718	sdeb_write_lock(sip);
4719
4720	if (all) {
4721		zbc_close_all(devip);
4722		goto fini;
4723	}
4724
4725	/* Close specified zone */
4726	z_id = get_unaligned_be64(cmd + 2);
4727	if (z_id >= sdebug_capacity) {
4728		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4729		res = check_condition_result;
4730		goto fini;
4731	}
4732
4733	zsp = zbc_zone(devip, z_id);
4734	if (z_id != zsp->z_start) {
4735		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4736		res = check_condition_result;
4737		goto fini;
4738	}
4739	if (zbc_zone_is_conv(zsp)) {
4740		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4741		res = check_condition_result;
4742		goto fini;
4743	}
4744
4745	zbc_close_zone(devip, zsp);
4746fini:
4747	sdeb_write_unlock(sip);
4748	return res;
4749}
4750
4751static void zbc_finish_zone(struct sdebug_dev_info *devip,
4752			    struct sdeb_zone_state *zsp, bool empty)
4753{
4754	enum sdebug_z_cond zc = zsp->z_cond;
4755
4756	if (zc == ZC4_CLOSED || zc == ZC2_IMPLICIT_OPEN ||
4757	    zc == ZC3_EXPLICIT_OPEN || (empty && zc == ZC1_EMPTY)) {
4758		if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4759			zbc_close_zone(devip, zsp);
4760		if (zsp->z_cond == ZC4_CLOSED)
4761			devip->nr_closed--;
4762		zsp->z_wp = zsp->z_start + zsp->z_size;
4763		zsp->z_cond = ZC5_FULL;
4764	}
4765}
4766
4767static void zbc_finish_all(struct sdebug_dev_info *devip)
4768{
4769	unsigned int i;
4770
4771	for (i = 0; i < devip->nr_zones; i++)
4772		zbc_finish_zone(devip, &devip->zstate[i], false);
4773}
4774
4775static int resp_finish_zone(struct scsi_cmnd *scp,
4776			    struct sdebug_dev_info *devip)
4777{
4778	struct sdeb_zone_state *zsp;
4779	int res = 0;
4780	u64 z_id;
4781	u8 *cmd = scp->cmnd;
4782	bool all = cmd[14] & 0x01;
4783	struct sdeb_store_info *sip = devip2sip(devip, false);
4784
4785	if (!sdebug_dev_is_zoned(devip)) {
4786		mk_sense_invalid_opcode(scp);
4787		return check_condition_result;
4788	}
4789
4790	sdeb_write_lock(sip);
4791
4792	if (all) {
4793		zbc_finish_all(devip);
4794		goto fini;
4795	}
4796
4797	/* Finish the specified zone */
4798	z_id = get_unaligned_be64(cmd + 2);
4799	if (z_id >= sdebug_capacity) {
4800		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4801		res = check_condition_result;
4802		goto fini;
4803	}
4804
4805	zsp = zbc_zone(devip, z_id);
4806	if (z_id != zsp->z_start) {
4807		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4808		res = check_condition_result;
4809		goto fini;
4810	}
4811	if (zbc_zone_is_conv(zsp)) {
4812		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4813		res = check_condition_result;
4814		goto fini;
4815	}
4816
4817	zbc_finish_zone(devip, zsp, true);
4818fini:
4819	sdeb_write_unlock(sip);
4820	return res;
4821}
4822
4823static void zbc_rwp_zone(struct sdebug_dev_info *devip,
4824			 struct sdeb_zone_state *zsp)
4825{
4826	enum sdebug_z_cond zc;
4827	struct sdeb_store_info *sip = devip2sip(devip, false);
4828
4829	if (!zbc_zone_is_seq(zsp))
4830		return;
4831
4832	zc = zsp->z_cond;
4833	if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4834		zbc_close_zone(devip, zsp);
4835
4836	if (zsp->z_cond == ZC4_CLOSED)
4837		devip->nr_closed--;
4838
4839	if (zsp->z_wp > zsp->z_start)
4840		memset(sip->storep + zsp->z_start * sdebug_sector_size, 0,
4841		       (zsp->z_wp - zsp->z_start) * sdebug_sector_size);
4842
4843	zsp->z_non_seq_resource = false;
4844	zsp->z_wp = zsp->z_start;
4845	zsp->z_cond = ZC1_EMPTY;
4846}
4847
4848static void zbc_rwp_all(struct sdebug_dev_info *devip)
4849{
4850	unsigned int i;
4851
4852	for (i = 0; i < devip->nr_zones; i++)
4853		zbc_rwp_zone(devip, &devip->zstate[i]);
4854}
4855
4856static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4857{
4858	struct sdeb_zone_state *zsp;
4859	int res = 0;
4860	u64 z_id;
4861	u8 *cmd = scp->cmnd;
4862	bool all = cmd[14] & 0x01;
4863	struct sdeb_store_info *sip = devip2sip(devip, false);
4864
4865	if (!sdebug_dev_is_zoned(devip)) {
4866		mk_sense_invalid_opcode(scp);
4867		return check_condition_result;
4868	}
4869
4870	sdeb_write_lock(sip);
4871
4872	if (all) {
4873		zbc_rwp_all(devip);
4874		goto fini;
4875	}
4876
4877	z_id = get_unaligned_be64(cmd + 2);
4878	if (z_id >= sdebug_capacity) {
4879		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4880		res = check_condition_result;
4881		goto fini;
4882	}
4883
4884	zsp = zbc_zone(devip, z_id);
4885	if (z_id != zsp->z_start) {
4886		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4887		res = check_condition_result;
4888		goto fini;
4889	}
4890	if (zbc_zone_is_conv(zsp)) {
4891		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4892		res = check_condition_result;
4893		goto fini;
4894	}
4895
4896	zbc_rwp_zone(devip, zsp);
4897fini:
4898	sdeb_write_unlock(sip);
4899	return res;
4900}
4901
4902static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
4903{
4904	u16 hwq;
4905	u32 tag = blk_mq_unique_tag(scsi_cmd_to_rq(cmnd));
4906
4907	hwq = blk_mq_unique_tag_to_hwq(tag);
4908
4909	pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
4910	if (WARN_ON_ONCE(hwq >= submit_queues))
4911		hwq = 0;
4912
4913	return sdebug_q_arr + hwq;
4914}
4915
4916static u32 get_tag(struct scsi_cmnd *cmnd)
4917{
4918	return blk_mq_unique_tag(scsi_cmd_to_rq(cmnd));
4919}
4920
4921/* Queued (deferred) command completions converge here. */
4922static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
4923{
4924	bool aborted = sd_dp->aborted;
4925	int qc_idx;
4926	int retiring = 0;
4927	unsigned long iflags;
4928	struct sdebug_queue *sqp;
4929	struct sdebug_queued_cmd *sqcp;
4930	struct scsi_cmnd *scp;
4931	struct sdebug_dev_info *devip;
4932
4933	if (unlikely(aborted))
4934		sd_dp->aborted = false;
4935	qc_idx = sd_dp->qc_idx;
4936	sqp = sdebug_q_arr + sd_dp->sqa_idx;
4937	if (sdebug_statistics) {
4938		atomic_inc(&sdebug_completions);
4939		if (raw_smp_processor_id() != sd_dp->issuing_cpu)
4940			atomic_inc(&sdebug_miss_cpus);
4941	}
4942	if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
4943		pr_err("wild qc_idx=%d\n", qc_idx);
4944		return;
4945	}
4946	spin_lock_irqsave(&sqp->qc_lock, iflags);
4947	WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
4948	sqcp = &sqp->qc_arr[qc_idx];
4949	scp = sqcp->a_cmnd;
4950	if (unlikely(scp == NULL)) {
4951		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4952		pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d, hc_idx=%d\n",
4953		       sd_dp->sqa_idx, qc_idx, sd_dp->hc_idx);
4954		return;
4955	}
4956	devip = (struct sdebug_dev_info *)scp->device->hostdata;
4957	if (likely(devip))
4958		atomic_dec(&devip->num_in_q);
4959	else
4960		pr_err("devip=NULL\n");
4961	if (unlikely(atomic_read(&retired_max_queue) > 0))
4962		retiring = 1;
4963
4964	sqcp->a_cmnd = NULL;
4965	if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
4966		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4967		pr_err("Unexpected completion\n");
4968		return;
4969	}
4970
4971	if (unlikely(retiring)) {	/* user has reduced max_queue */
4972		int k, retval;
4973
4974		retval = atomic_read(&retired_max_queue);
4975		if (qc_idx >= retval) {
4976			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4977			pr_err("index %d too large\n", retval);
4978			return;
4979		}
4980		k = find_last_bit(sqp->in_use_bm, retval);
4981		if ((k < sdebug_max_queue) || (k == retval))
4982			atomic_set(&retired_max_queue, 0);
4983		else
4984			atomic_set(&retired_max_queue, k + 1);
4985	}
4986	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4987	if (unlikely(aborted)) {
4988		if (sdebug_verbose)
4989			pr_info("bypassing scsi_done() due to aborted cmd\n");
4990		return;
4991	}
4992	scsi_done(scp); /* callback to mid level */
 
4993}
4994
4995/* When high resolution timer goes off this function is called. */
4996static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
4997{
4998	struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
4999						  hrt);
5000	sdebug_q_cmd_complete(sd_dp);
5001	return HRTIMER_NORESTART;
5002}
5003
5004/* When work queue schedules work, it calls this function. */
5005static void sdebug_q_cmd_wq_complete(struct work_struct *work)
5006{
5007	struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
5008						  ew.work);
5009	sdebug_q_cmd_complete(sd_dp);
5010}
5011
5012static bool got_shared_uuid;
5013static uuid_t shared_uuid;
5014
5015static int sdebug_device_create_zones(struct sdebug_dev_info *devip)
5016{
5017	struct sdeb_zone_state *zsp;
5018	sector_t capacity = get_sdebug_capacity();
5019	sector_t conv_capacity;
5020	sector_t zstart = 0;
5021	unsigned int i;
5022
5023	/*
5024	 * Set the zone size: if sdeb_zbc_zone_size_mb is not set, figure out
5025	 * a zone size allowing for at least 4 zones on the device. Otherwise,
5026	 * use the specified zone size checking that at least 2 zones can be
5027	 * created for the device.
5028	 */
5029	if (!sdeb_zbc_zone_size_mb) {
5030		devip->zsize = (DEF_ZBC_ZONE_SIZE_MB * SZ_1M)
5031			>> ilog2(sdebug_sector_size);
5032		while (capacity < devip->zsize << 2 && devip->zsize >= 2)
5033			devip->zsize >>= 1;
5034		if (devip->zsize < 2) {
5035			pr_err("Device capacity too small\n");
5036			return -EINVAL;
5037		}
5038	} else {
5039		if (!is_power_of_2(sdeb_zbc_zone_size_mb)) {
5040			pr_err("Zone size is not a power of 2\n");
5041			return -EINVAL;
5042		}
5043		devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M)
5044			>> ilog2(sdebug_sector_size);
5045		if (devip->zsize >= capacity) {
5046			pr_err("Zone size too large for device capacity\n");
5047			return -EINVAL;
5048		}
5049	}
5050
5051	devip->zsize_shift = ilog2(devip->zsize);
5052	devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift;
5053
5054	if (sdeb_zbc_zone_cap_mb == 0) {
5055		devip->zcap = devip->zsize;
5056	} else {
5057		devip->zcap = (sdeb_zbc_zone_cap_mb * SZ_1M) >>
5058			      ilog2(sdebug_sector_size);
5059		if (devip->zcap > devip->zsize) {
5060			pr_err("Zone capacity too large\n");
5061			return -EINVAL;
5062		}
5063	}
5064
5065	conv_capacity = (sector_t)sdeb_zbc_nr_conv << devip->zsize_shift;
5066	if (conv_capacity >= capacity) {
5067		pr_err("Number of conventional zones too large\n");
5068		return -EINVAL;
5069	}
5070	devip->nr_conv_zones = sdeb_zbc_nr_conv;
5071	devip->nr_seq_zones = ALIGN(capacity - conv_capacity, devip->zsize) >>
5072			      devip->zsize_shift;
5073	devip->nr_zones = devip->nr_conv_zones + devip->nr_seq_zones;
5074
5075	/* Add gap zones if zone capacity is smaller than the zone size */
5076	if (devip->zcap < devip->zsize)
5077		devip->nr_zones += devip->nr_seq_zones;
5078
5079	if (devip->zmodel == BLK_ZONED_HM) {
5080		/* zbc_max_open_zones can be 0, meaning "not reported" */
5081		if (sdeb_zbc_max_open >= devip->nr_zones - 1)
5082			devip->max_open = (devip->nr_zones - 1) / 2;
5083		else
5084			devip->max_open = sdeb_zbc_max_open;
5085	}
5086
5087	devip->zstate = kcalloc(devip->nr_zones,
5088				sizeof(struct sdeb_zone_state), GFP_KERNEL);
5089	if (!devip->zstate)
5090		return -ENOMEM;
5091
5092	for (i = 0; i < devip->nr_zones; i++) {
5093		zsp = &devip->zstate[i];
5094
5095		zsp->z_start = zstart;
5096
5097		if (i < devip->nr_conv_zones) {
5098			zsp->z_type = ZBC_ZTYPE_CNV;
5099			zsp->z_cond = ZBC_NOT_WRITE_POINTER;
5100			zsp->z_wp = (sector_t)-1;
5101			zsp->z_size =
5102				min_t(u64, devip->zsize, capacity - zstart);
5103		} else if ((zstart & (devip->zsize - 1)) == 0) {
5104			if (devip->zmodel == BLK_ZONED_HM)
5105				zsp->z_type = ZBC_ZTYPE_SWR;
5106			else
5107				zsp->z_type = ZBC_ZTYPE_SWP;
5108			zsp->z_cond = ZC1_EMPTY;
5109			zsp->z_wp = zsp->z_start;
5110			zsp->z_size =
5111				min_t(u64, devip->zcap, capacity - zstart);
5112		} else {
5113			zsp->z_type = ZBC_ZTYPE_GAP;
5114			zsp->z_cond = ZBC_NOT_WRITE_POINTER;
5115			zsp->z_wp = (sector_t)-1;
5116			zsp->z_size = min_t(u64, devip->zsize - devip->zcap,
5117					    capacity - zstart);
5118		}
5119
5120		WARN_ON_ONCE((int)zsp->z_size <= 0);
5121		zstart += zsp->z_size;
5122	}
5123
5124	return 0;
5125}
5126
5127static struct sdebug_dev_info *sdebug_device_create(
5128			struct sdebug_host_info *sdbg_host, gfp_t flags)
5129{
5130	struct sdebug_dev_info *devip;
5131
5132	devip = kzalloc(sizeof(*devip), flags);
5133	if (devip) {
5134		if (sdebug_uuid_ctl == 1)
5135			uuid_gen(&devip->lu_name);
5136		else if (sdebug_uuid_ctl == 2) {
5137			if (got_shared_uuid)
5138				devip->lu_name = shared_uuid;
5139			else {
5140				uuid_gen(&shared_uuid);
5141				got_shared_uuid = true;
5142				devip->lu_name = shared_uuid;
5143			}
5144		}
5145		devip->sdbg_host = sdbg_host;
5146		if (sdeb_zbc_in_use) {
5147			devip->zmodel = sdeb_zbc_model;
5148			if (sdebug_device_create_zones(devip)) {
5149				kfree(devip);
5150				return NULL;
5151			}
5152		} else {
5153			devip->zmodel = BLK_ZONED_NONE;
5154		}
5155		devip->sdbg_host = sdbg_host;
5156		devip->create_ts = ktime_get_boottime();
5157		atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0));
5158		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
5159	}
5160	return devip;
5161}
5162
5163static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
5164{
5165	struct sdebug_host_info *sdbg_host;
5166	struct sdebug_dev_info *open_devip = NULL;
5167	struct sdebug_dev_info *devip;
 
5168
 
 
5169	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
5170	if (!sdbg_host) {
5171		pr_err("Host info NULL\n");
5172		return NULL;
5173	}
5174
5175	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
5176		if ((devip->used) && (devip->channel == sdev->channel) &&
5177		    (devip->target == sdev->id) &&
5178		    (devip->lun == sdev->lun))
5179			return devip;
5180		else {
5181			if ((!devip->used) && (!open_devip))
5182				open_devip = devip;
5183		}
5184	}
5185	if (!open_devip) { /* try and make a new one */
5186		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
5187		if (!open_devip) {
5188			pr_err("out of memory at line %d\n", __LINE__);
 
5189			return NULL;
5190		}
5191	}
5192
5193	open_devip->channel = sdev->channel;
5194	open_devip->target = sdev->id;
5195	open_devip->lun = sdev->lun;
5196	open_devip->sdbg_host = sdbg_host;
5197	atomic_set(&open_devip->num_in_q, 0);
5198	set_bit(SDEBUG_UA_POOCCUR, open_devip->uas_bm);
5199	open_devip->used = true;
 
 
 
 
 
 
 
 
 
5200	return open_devip;
5201}
5202
5203static int scsi_debug_slave_alloc(struct scsi_device *sdp)
5204{
5205	if (sdebug_verbose)
5206		pr_info("slave_alloc <%u %u %u %llu>\n",
5207		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
 
5208	return 0;
5209}
5210
5211static int scsi_debug_slave_configure(struct scsi_device *sdp)
5212{
5213	struct sdebug_dev_info *devip =
5214			(struct sdebug_dev_info *)sdp->hostdata;
5215
5216	if (sdebug_verbose)
5217		pr_info("slave_configure <%u %u %u %llu>\n",
5218		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
5219	if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
5220		sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
5221	if (devip == NULL) {
5222		devip = find_build_dev_info(sdp);
5223		if (devip == NULL)
5224			return 1;  /* no resources, will be marked offline */
5225	}
5226	sdp->hostdata = devip;
5227	if (sdebug_no_uld)
 
 
 
 
5228		sdp->no_uld_attach = 1;
5229	config_cdb_len(sdp);
5230	return 0;
5231}
5232
5233static void scsi_debug_slave_destroy(struct scsi_device *sdp)
5234{
5235	struct sdebug_dev_info *devip =
5236		(struct sdebug_dev_info *)sdp->hostdata;
5237
5238	if (sdebug_verbose)
5239		pr_info("slave_destroy <%u %u %u %llu>\n",
5240		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
5241	if (devip) {
5242		/* make this slot available for re-use */
5243		devip->used = false;
5244		sdp->hostdata = NULL;
5245	}
5246}
5247
5248static void stop_qc_helper(struct sdebug_defer *sd_dp,
5249			   enum sdeb_defer_type defer_t)
5250{
5251	if (!sd_dp)
5252		return;
5253	if (defer_t == SDEB_DEFER_HRT)
5254		hrtimer_cancel(&sd_dp->hrt);
5255	else if (defer_t == SDEB_DEFER_WQ)
5256		cancel_work_sync(&sd_dp->ew.work);
5257}
5258
5259/* If @cmnd found deletes its timer or work queue and returns true; else
5260   returns false */
5261static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
5262{
5263	unsigned long iflags;
5264	int j, k, qmax, r_qmax;
5265	enum sdeb_defer_type l_defer_t;
5266	struct sdebug_queue *sqp;
5267	struct sdebug_queued_cmd *sqcp;
5268	struct sdebug_dev_info *devip;
5269	struct sdebug_defer *sd_dp;
5270
5271	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5272		spin_lock_irqsave(&sqp->qc_lock, iflags);
5273		qmax = sdebug_max_queue;
5274		r_qmax = atomic_read(&retired_max_queue);
5275		if (r_qmax > qmax)
5276			qmax = r_qmax;
5277		for (k = 0; k < qmax; ++k) {
5278			if (test_bit(k, sqp->in_use_bm)) {
5279				sqcp = &sqp->qc_arr[k];
5280				if (cmnd != sqcp->a_cmnd)
5281					continue;
5282				/* found */
5283				devip = (struct sdebug_dev_info *)
5284						cmnd->device->hostdata;
5285				if (devip)
5286					atomic_dec(&devip->num_in_q);
5287				sqcp->a_cmnd = NULL;
5288				sd_dp = sqcp->sd_dp;
5289				if (sd_dp) {
5290					l_defer_t = READ_ONCE(sd_dp->defer_t);
5291					WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
5292				} else
5293					l_defer_t = SDEB_DEFER_NONE;
5294				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5295				stop_qc_helper(sd_dp, l_defer_t);
5296				clear_bit(k, sqp->in_use_bm);
5297				return true;
5298			}
5299		}
5300		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5301	}
5302	return false;
 
5303}
5304
5305/* Deletes (stops) timers or work queues of all queued commands */
5306static void stop_all_queued(void)
5307{
5308	unsigned long iflags;
5309	int j, k;
5310	enum sdeb_defer_type l_defer_t;
5311	struct sdebug_queue *sqp;
5312	struct sdebug_queued_cmd *sqcp;
5313	struct sdebug_dev_info *devip;
5314	struct sdebug_defer *sd_dp;
5315
5316	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5317		spin_lock_irqsave(&sqp->qc_lock, iflags);
5318		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5319			if (test_bit(k, sqp->in_use_bm)) {
5320				sqcp = &sqp->qc_arr[k];
5321				if (sqcp->a_cmnd == NULL)
5322					continue;
5323				devip = (struct sdebug_dev_info *)
5324					sqcp->a_cmnd->device->hostdata;
5325				if (devip)
5326					atomic_dec(&devip->num_in_q);
5327				sqcp->a_cmnd = NULL;
5328				sd_dp = sqcp->sd_dp;
5329				if (sd_dp) {
5330					l_defer_t = READ_ONCE(sd_dp->defer_t);
5331					WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
5332				} else
5333					l_defer_t = SDEB_DEFER_NONE;
5334				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5335				stop_qc_helper(sd_dp, l_defer_t);
5336				clear_bit(k, sqp->in_use_bm);
5337				spin_lock_irqsave(&sqp->qc_lock, iflags);
5338			}
5339		}
5340		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5341	}
 
5342}
5343
5344/* Free queued command memory on heap */
5345static void free_all_queued(void)
5346{
5347	int j, k;
5348	struct sdebug_queue *sqp;
5349	struct sdebug_queued_cmd *sqcp;
5350
5351	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5352		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5353			sqcp = &sqp->qc_arr[k];
5354			kfree(sqcp->sd_dp);
5355			sqcp->sd_dp = NULL;
5356		}
5357	}
5358}
5359
5360static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
 
5361{
5362	bool ok;
 
5363
5364	++num_aborts;
5365	if (SCpnt) {
5366		ok = stop_queued_cmnd(SCpnt);
5367		if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5368			sdev_printk(KERN_INFO, SCpnt->device,
5369				    "%s: command%s found\n", __func__,
5370				    ok ? "" : " not");
 
 
5371	}
5372	return SUCCESS;
 
 
 
5373}
5374
5375static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
5376{
 
 
 
 
5377	++num_dev_resets;
5378	if (SCpnt && SCpnt->device) {
5379		struct scsi_device *sdp = SCpnt->device;
5380		struct sdebug_dev_info *devip =
5381				(struct sdebug_dev_info *)sdp->hostdata;
5382
5383		if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5384			sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5385		if (devip)
5386			set_bit(SDEBUG_UA_POR, devip->uas_bm);
5387	}
5388	return SUCCESS;
5389}
5390
5391static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
5392{
5393	struct sdebug_host_info *sdbg_host;
5394	struct sdebug_dev_info *devip;
5395	struct scsi_device *sdp;
5396	struct Scsi_Host *hp;
5397	int k = 0;
5398
5399	++num_target_resets;
5400	if (!SCpnt)
5401		goto lie;
5402	sdp = SCpnt->device;
5403	if (!sdp)
5404		goto lie;
5405	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5406		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5407	hp = sdp->host;
5408	if (!hp)
5409		goto lie;
5410	sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5411	if (sdbg_host) {
5412		list_for_each_entry(devip,
5413				    &sdbg_host->dev_info_list,
5414				    dev_list)
5415			if (devip->target == sdp->id) {
5416				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5417				++k;
5418			}
5419	}
5420	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5421		sdev_printk(KERN_INFO, sdp,
5422			    "%s: %d device(s) found in target\n", __func__, k);
5423lie:
5424	return SUCCESS;
5425}
5426
5427static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt)
5428{
5429	struct sdebug_host_info *sdbg_host;
5430	struct sdebug_dev_info *devip;
5431	struct scsi_device *sdp;
5432	struct Scsi_Host *hp;
5433	int k = 0;
5434
 
 
5435	++num_bus_resets;
5436	if (!(SCpnt && SCpnt->device))
5437		goto lie;
5438	sdp = SCpnt->device;
5439	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5440		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5441	hp = sdp->host;
5442	if (hp) {
5443		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5444		if (sdbg_host) {
5445			list_for_each_entry(devip,
5446					    &sdbg_host->dev_info_list,
5447					    dev_list) {
5448				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5449				++k;
5450			}
5451		}
5452	}
5453	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5454		sdev_printk(KERN_INFO, sdp,
5455			    "%s: %d device(s) found in host\n", __func__, k);
5456lie:
5457	return SUCCESS;
5458}
5459
5460static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
5461{
5462	struct sdebug_host_info *sdbg_host;
5463	struct sdebug_dev_info *devip;
5464	int k = 0;
5465
 
 
5466	++num_host_resets;
5467	if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5468		sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
5469	spin_lock(&sdebug_host_list_lock);
5470	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
5471		list_for_each_entry(devip, &sdbg_host->dev_info_list,
5472				    dev_list) {
5473			set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5474			++k;
5475		}
5476	}
5477	spin_unlock(&sdebug_host_list_lock);
5478	stop_all_queued();
5479	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5480		sdev_printk(KERN_INFO, SCpnt->device,
5481			    "%s: %d device(s) found\n", __func__, k);
5482	return SUCCESS;
5483}
5484
5485static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5486{
5487	struct msdos_partition *pp;
5488	int starts[SDEBUG_MAX_PARTS + 2], max_part_secs;
5489	int sectors_per_part, num_sectors, k;
5490	int heads_by_sects, start_sec, end_sec;
5491
5492	/* assume partition table already zeroed */
5493	if ((sdebug_num_parts < 1) || (store_size < 1048576))
5494		return;
5495	if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
5496		sdebug_num_parts = SDEBUG_MAX_PARTS;
5497		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
 
5498	}
5499	num_sectors = (int)get_sdebug_capacity();
5500	sectors_per_part = (num_sectors - sdebug_sectors_per)
5501			   / sdebug_num_parts;
5502	heads_by_sects = sdebug_heads * sdebug_sectors_per;
5503	starts[0] = sdebug_sectors_per;
5504	max_part_secs = sectors_per_part;
5505	for (k = 1; k < sdebug_num_parts; ++k) {
5506		starts[k] = ((k * sectors_per_part) / heads_by_sects)
5507			    * heads_by_sects;
5508		if (starts[k] - starts[k - 1] < max_part_secs)
5509			max_part_secs = starts[k] - starts[k - 1];
5510	}
5511	starts[sdebug_num_parts] = num_sectors;
5512	starts[sdebug_num_parts + 1] = 0;
5513
5514	ramp[510] = 0x55;	/* magic partition markings */
5515	ramp[511] = 0xAA;
5516	pp = (struct msdos_partition *)(ramp + 0x1be);
5517	for (k = 0; starts[k + 1]; ++k, ++pp) {
5518		start_sec = starts[k];
5519		end_sec = starts[k] + max_part_secs - 1;
5520		pp->boot_ind = 0;
5521
5522		pp->cyl = start_sec / heads_by_sects;
5523		pp->head = (start_sec - (pp->cyl * heads_by_sects))
5524			   / sdebug_sectors_per;
5525		pp->sector = (start_sec % sdebug_sectors_per) + 1;
5526
5527		pp->end_cyl = end_sec / heads_by_sects;
5528		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
5529			       / sdebug_sectors_per;
5530		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
5531
5532		pp->start_sect = cpu_to_le32(start_sec);
5533		pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
5534		pp->sys_ind = 0x83;	/* plain Linux partition */
5535	}
5536}
5537
5538static void block_unblock_all_queues(bool block)
5539{
5540	int j;
5541	struct sdebug_queue *sqp;
5542
5543	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
5544		atomic_set(&sqp->blocked, (int)block);
5545}
5546
5547/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
5548 * commands will be processed normally before triggers occur.
5549 */
5550static void tweak_cmnd_count(void)
5551{
5552	int count, modulo;
5553
5554	modulo = abs(sdebug_every_nth);
5555	if (modulo < 2)
5556		return;
5557	block_unblock_all_queues(true);
5558	count = atomic_read(&sdebug_cmnd_count);
5559	atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
5560	block_unblock_all_queues(false);
5561}
5562
5563static void clear_queue_stats(void)
5564{
5565	atomic_set(&sdebug_cmnd_count, 0);
5566	atomic_set(&sdebug_completions, 0);
5567	atomic_set(&sdebug_miss_cpus, 0);
5568	atomic_set(&sdebug_a_tsf, 0);
5569}
5570
5571static bool inject_on_this_cmd(void)
5572{
5573	if (sdebug_every_nth == 0)
5574		return false;
5575	return (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) == 0;
5576}
5577
5578#define INCLUSIVE_TIMING_MAX_NS 1000000		/* 1 millisecond */
5579
5580/* Complete the processing of the thread that queued a SCSI command to this
5581 * driver. It either completes the command by calling cmnd_done() or
5582 * schedules a hr timer or work queue then returns 0. Returns
5583 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
5584 */
5585static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
5586			 int scsi_result,
5587			 int (*pfp)(struct scsi_cmnd *,
5588				    struct sdebug_dev_info *),
5589			 int delta_jiff, int ndelay)
5590{
5591	bool new_sd_dp;
5592	bool inject = false;
5593	bool polled = scsi_cmd_to_rq(cmnd)->cmd_flags & REQ_POLLED;
5594	int k, num_in_q, qdepth;
5595	unsigned long iflags;
5596	u64 ns_from_boot = 0;
5597	struct sdebug_queue *sqp;
5598	struct sdebug_queued_cmd *sqcp;
5599	struct scsi_device *sdp;
5600	struct sdebug_defer *sd_dp;
5601
5602	if (unlikely(devip == NULL)) {
5603		if (scsi_result == 0)
5604			scsi_result = DID_NO_CONNECT << 16;
5605		goto respond_in_thread;
5606	}
5607	sdp = cmnd->device;
5608
5609	if (delta_jiff == 0)
5610		goto respond_in_thread;
5611
5612	sqp = get_queue(cmnd);
5613	spin_lock_irqsave(&sqp->qc_lock, iflags);
5614	if (unlikely(atomic_read(&sqp->blocked))) {
5615		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5616		return SCSI_MLQUEUE_HOST_BUSY;
5617	}
5618	num_in_q = atomic_read(&devip->num_in_q);
5619	qdepth = cmnd->device->queue_depth;
5620	if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
5621		if (scsi_result) {
5622			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5623			goto respond_in_thread;
5624		} else
5625			scsi_result = device_qfull_result;
5626	} else if (unlikely(sdebug_every_nth &&
5627			    (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
5628			    (scsi_result == 0))) {
5629		if ((num_in_q == (qdepth - 1)) &&
5630		    (atomic_inc_return(&sdebug_a_tsf) >=
5631		     abs(sdebug_every_nth))) {
5632			atomic_set(&sdebug_a_tsf, 0);
5633			inject = true;
5634			scsi_result = device_qfull_result;
5635		}
5636	}
5637
5638	k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
5639	if (unlikely(k >= sdebug_max_queue)) {
5640		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5641		if (scsi_result)
5642			goto respond_in_thread;
5643		scsi_result = device_qfull_result;
5644		if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
5645			sdev_printk(KERN_INFO, sdp, "%s: max_queue=%d exceeded: TASK SET FULL\n",
5646				    __func__, sdebug_max_queue);
5647		goto respond_in_thread;
5648	}
5649	set_bit(k, sqp->in_use_bm);
5650	atomic_inc(&devip->num_in_q);
5651	sqcp = &sqp->qc_arr[k];
5652	sqcp->a_cmnd = cmnd;
5653	cmnd->host_scribble = (unsigned char *)sqcp;
5654	sd_dp = sqcp->sd_dp;
5655	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5656
5657	if (!sd_dp) {
5658		sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
5659		if (!sd_dp) {
5660			atomic_dec(&devip->num_in_q);
5661			clear_bit(k, sqp->in_use_bm);
5662			return SCSI_MLQUEUE_HOST_BUSY;
5663		}
5664		new_sd_dp = true;
5665	} else {
5666		new_sd_dp = false;
5667	}
5668
5669	/* Set the hostwide tag */
5670	if (sdebug_host_max_queue)
5671		sd_dp->hc_idx = get_tag(cmnd);
5672
5673	if (polled)
5674		ns_from_boot = ktime_get_boottime_ns();
5675
5676	/* one of the resp_*() response functions is called here */
5677	cmnd->result = pfp ? pfp(cmnd, devip) : 0;
5678	if (cmnd->result & SDEG_RES_IMMED_MASK) {
5679		cmnd->result &= ~SDEG_RES_IMMED_MASK;
5680		delta_jiff = ndelay = 0;
5681	}
5682	if (cmnd->result == 0 && scsi_result != 0)
5683		cmnd->result = scsi_result;
5684	if (cmnd->result == 0 && unlikely(sdebug_opts & SDEBUG_OPT_TRANSPORT_ERR)) {
5685		if (atomic_read(&sdeb_inject_pending)) {
5686			mk_sense_buffer(cmnd, ABORTED_COMMAND, TRANSPORT_PROBLEM, ACK_NAK_TO);
5687			atomic_set(&sdeb_inject_pending, 0);
5688			cmnd->result = check_condition_result;
5689		}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5690	}
5691
5692	if (unlikely(sdebug_verbose && cmnd->result))
5693		sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
5694			    __func__, cmnd->result);
5695
5696	if (delta_jiff > 0 || ndelay > 0) {
5697		ktime_t kt;
5698
5699		if (delta_jiff > 0) {
5700			u64 ns = jiffies_to_nsecs(delta_jiff);
5701
5702			if (sdebug_random && ns < U32_MAX) {
5703				ns = get_random_u32_below((u32)ns);
5704			} else if (sdebug_random) {
5705				ns >>= 12;	/* scale to 4 usec precision */
5706				if (ns < U32_MAX)	/* over 4 hours max */
5707					ns = get_random_u32_below((u32)ns);
5708				ns <<= 12;
5709			}
5710			kt = ns_to_ktime(ns);
5711		} else {	/* ndelay has a 4.2 second max */
5712			kt = sdebug_random ? get_random_u32_below((u32)ndelay) :
5713					     (u32)ndelay;
5714			if (ndelay < INCLUSIVE_TIMING_MAX_NS) {
5715				u64 d = ktime_get_boottime_ns() - ns_from_boot;
5716
5717				if (kt <= d) {	/* elapsed duration >= kt */
5718					spin_lock_irqsave(&sqp->qc_lock, iflags);
5719					sqcp->a_cmnd = NULL;
5720					atomic_dec(&devip->num_in_q);
5721					clear_bit(k, sqp->in_use_bm);
5722					spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5723					if (new_sd_dp)
5724						kfree(sd_dp);
5725					/* call scsi_done() from this thread */
5726					scsi_done(cmnd);
5727					return 0;
5728				}
5729				/* otherwise reduce kt by elapsed time */
5730				kt -= d;
5731			}
5732		}
5733		if (polled) {
5734			sd_dp->cmpl_ts = ktime_add(ns_to_ktime(ns_from_boot), kt);
5735			spin_lock_irqsave(&sqp->qc_lock, iflags);
5736			if (!sd_dp->init_poll) {
5737				sd_dp->init_poll = true;
5738				sqcp->sd_dp = sd_dp;
5739				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5740				sd_dp->qc_idx = k;
5741			}
5742			WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_POLL);
5743			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5744		} else {
5745			if (!sd_dp->init_hrt) {
5746				sd_dp->init_hrt = true;
5747				sqcp->sd_dp = sd_dp;
5748				hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
5749					     HRTIMER_MODE_REL_PINNED);
5750				sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
5751				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5752				sd_dp->qc_idx = k;
5753			}
5754			WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_HRT);
5755			/* schedule the invocation of scsi_done() for a later time */
5756			hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
5757		}
5758		if (sdebug_statistics)
5759			sd_dp->issuing_cpu = raw_smp_processor_id();
5760	} else {	/* jdelay < 0, use work queue */
5761		if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) &&
5762			     atomic_read(&sdeb_inject_pending)))
5763			sd_dp->aborted = true;
5764		if (polled) {
5765			sd_dp->cmpl_ts = ns_to_ktime(ns_from_boot);
5766			spin_lock_irqsave(&sqp->qc_lock, iflags);
5767			if (!sd_dp->init_poll) {
5768				sd_dp->init_poll = true;
5769				sqcp->sd_dp = sd_dp;
5770				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5771				sd_dp->qc_idx = k;
5772			}
5773			WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_POLL);
5774			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5775		} else {
5776			if (!sd_dp->init_wq) {
5777				sd_dp->init_wq = true;
5778				sqcp->sd_dp = sd_dp;
5779				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5780				sd_dp->qc_idx = k;
5781				INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
5782			}
5783			WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_WQ);
5784			schedule_work(&sd_dp->ew.work);
5785		}
5786		if (sdebug_statistics)
5787			sd_dp->issuing_cpu = raw_smp_processor_id();
5788		if (unlikely(sd_dp->aborted)) {
5789			sdev_printk(KERN_INFO, sdp, "abort request tag %d\n",
5790				    scsi_cmd_to_rq(cmnd)->tag);
5791			blk_abort_request(scsi_cmd_to_rq(cmnd));
5792			atomic_set(&sdeb_inject_pending, 0);
5793			sd_dp->aborted = false;
5794		}
5795	}
5796	if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) && scsi_result == device_qfull_result))
5797		sdev_printk(KERN_INFO, sdp, "%s: num_in_q=%d +1, %s%s\n", __func__,
5798			    num_in_q, (inject ? "<inject> " : ""), "status: TASK SET FULL");
5799	return 0;
5800
5801respond_in_thread:	/* call back to mid-layer using invocation thread */
5802	cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
5803	cmnd->result &= ~SDEG_RES_IMMED_MASK;
5804	if (cmnd->result == 0 && scsi_result != 0)
5805		cmnd->result = scsi_result;
5806	scsi_done(cmnd);
5807	return 0;
5808}
5809
5810/* Note: The following macros create attribute files in the
5811   /sys/module/scsi_debug/parameters directory. Unfortunately this
5812   driver is unaware of a change and cannot trigger auxiliary actions
5813   as it can when the corresponding attribute in the
5814   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
5815 */
5816module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
5817module_param_named(ato, sdebug_ato, int, S_IRUGO);
5818module_param_named(cdb_len, sdebug_cdb_len, int, 0644);
5819module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
5820module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
5821module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
5822module_param_named(dif, sdebug_dif, int, S_IRUGO);
5823module_param_named(dix, sdebug_dix, int, S_IRUGO);
5824module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
5825module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
5826module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
5827module_param_named(guard, sdebug_guard, uint, S_IRUGO);
5828module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
5829module_param_named(host_max_queue, sdebug_host_max_queue, int, S_IRUGO);
5830module_param_string(inq_product, sdebug_inq_product_id,
5831		    sizeof(sdebug_inq_product_id), S_IRUGO | S_IWUSR);
5832module_param_string(inq_rev, sdebug_inq_product_rev,
5833		    sizeof(sdebug_inq_product_rev), S_IRUGO | S_IWUSR);
5834module_param_string(inq_vendor, sdebug_inq_vendor_id,
5835		    sizeof(sdebug_inq_vendor_id), S_IRUGO | S_IWUSR);
5836module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
5837module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
5838module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
5839module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
5840module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
5841module_param_named(lun_format, sdebug_lun_am_i, int, S_IRUGO | S_IWUSR);
5842module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
5843module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
5844module_param_named(medium_error_count, sdebug_medium_error_count, int,
5845		   S_IRUGO | S_IWUSR);
5846module_param_named(medium_error_start, sdebug_medium_error_start, int,
 
5847		   S_IRUGO | S_IWUSR);
5848module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
5849module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
5850module_param_named(no_rwlock, sdebug_no_rwlock, bool, S_IRUGO | S_IWUSR);
5851module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
5852module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
5853module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
5854module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
5855module_param_named(opt_xferlen_exp, sdebug_opt_xferlen_exp, int, S_IRUGO);
5856module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
5857module_param_named(per_host_store, sdebug_per_host_store, bool,
5858		   S_IRUGO | S_IWUSR);
5859module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
5860module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
5861module_param_named(random, sdebug_random, bool, S_IRUGO | S_IWUSR);
5862module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
5863module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
5864module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
5865module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
5866module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
5867module_param_named(submit_queues, submit_queues, int, S_IRUGO);
5868module_param_named(poll_queues, poll_queues, int, S_IRUGO);
5869module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO);
5870module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
5871module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
5872module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
5873module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
5874module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
5875module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
5876module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
5877		   S_IRUGO | S_IWUSR);
5878module_param_named(wp, sdebug_wp, bool, S_IRUGO | S_IWUSR);
5879module_param_named(write_same_length, sdebug_write_same_length, int,
5880		   S_IRUGO | S_IWUSR);
5881module_param_named(zbc, sdeb_zbc_model_s, charp, S_IRUGO);
5882module_param_named(zone_cap_mb, sdeb_zbc_zone_cap_mb, int, S_IRUGO);
5883module_param_named(zone_max_open, sdeb_zbc_max_open, int, S_IRUGO);
5884module_param_named(zone_nr_conv, sdeb_zbc_nr_conv, int, S_IRUGO);
5885module_param_named(zone_size_mb, sdeb_zbc_zone_size_mb, int, S_IRUGO);
5886
5887MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
5888MODULE_DESCRIPTION("SCSI debug adapter driver");
5889MODULE_LICENSE("GPL");
5890MODULE_VERSION(SDEBUG_VERSION);
5891
5892MODULE_PARM_DESC(add_host, "add n hosts, in sysfs if negative remove host(s) (def=1)");
5893MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
5894MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
5895MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
5896MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
5897MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
5898MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
5899MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
5900MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
5901MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
5902MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
5903MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
5904MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
5905MODULE_PARM_DESC(host_max_queue,
5906		 "host max # of queued cmds (0 to max(def) [max_queue fixed equal for !0])");
5907MODULE_PARM_DESC(inq_product, "SCSI INQUIRY product string (def=\"scsi_debug\")");
5908MODULE_PARM_DESC(inq_rev, "SCSI INQUIRY revision string (def=\""
5909		 SDEBUG_VERSION "\")");
5910MODULE_PARM_DESC(inq_vendor, "SCSI INQUIRY vendor string (def=\"Linux\")");
5911MODULE_PARM_DESC(lbprz,
5912		 "on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
5913MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
5914MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
5915MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
5916MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
5917MODULE_PARM_DESC(lun_format, "LUN format: 0->peripheral (def); 1 --> flat address method");
5918MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
5919MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
5920MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
5921MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
5922MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
5923MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
5924MODULE_PARM_DESC(no_rwlock, "don't protect user data reads+writes (def=0)");
5925MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
5926MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
5927MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
5928MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
5929MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent (def=physblk_exp)");
5930MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
5931MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
5932MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
5933MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1))");
5934MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
5935MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
5936MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
5937MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
5938MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
5939MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
5940MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
5941MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
5942MODULE_PARM_DESC(tur_ms_to_ready, "TEST UNIT READY millisecs before initial good status (def=0)");
5943MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
5944MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
5945MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
5946MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
5947MODULE_PARM_DESC(uuid_ctl,
5948		 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
5949MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
5950MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
5951MODULE_PARM_DESC(wp, "Write Protect (def=0)");
5952MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
5953MODULE_PARM_DESC(zbc, "'none' [0]; 'aware' [1]; 'managed' [2] (def=0). Can have 'host-' prefix");
5954MODULE_PARM_DESC(zone_cap_mb, "Zone capacity in MiB (def=zone size)");
5955MODULE_PARM_DESC(zone_max_open, "Maximum number of open zones; [0] for no limit (def=auto)");
5956MODULE_PARM_DESC(zone_nr_conv, "Number of conventional zones (def=1)");
5957MODULE_PARM_DESC(zone_size_mb, "Zone size in MiB (def=auto)");
5958
5959#define SDEBUG_INFO_LEN 256
5960static char sdebug_info[SDEBUG_INFO_LEN];
5961
5962static const char *scsi_debug_info(struct Scsi_Host *shp)
5963{
5964	int k;
5965
5966	k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
5967		      my_name, SDEBUG_VERSION, sdebug_version_date);
5968	if (k >= (SDEBUG_INFO_LEN - 1))
5969		return sdebug_info;
5970	scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
5971		  "  dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
5972		  sdebug_dev_size_mb, sdebug_opts, submit_queues,
5973		  "statistics", (int)sdebug_statistics);
5974	return sdebug_info;
5975}
5976
5977/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
5978static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
5979				 int length)
5980{
5981	char arr[16];
5982	int opts;
5983	int minLen = length > 15 ? 15 : length;
5984
5985	if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
5986		return -EACCES;
5987	memcpy(arr, buffer, minLen);
5988	arr[minLen] = '\0';
5989	if (1 != sscanf(arr, "%d", &opts))
5990		return -EINVAL;
5991	sdebug_opts = opts;
5992	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
5993	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
5994	if (sdebug_every_nth != 0)
5995		tweak_cmnd_count();
5996	return length;
5997}
5998
5999/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
6000 * same for each scsi_debug host (if more than one). Some of the counters
6001 * output are not atomics so might be inaccurate in a busy system. */
6002static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
6003{
6004	int f, j, l;
6005	struct sdebug_queue *sqp;
6006	struct sdebug_host_info *sdhp;
6007
6008	seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
6009		   SDEBUG_VERSION, sdebug_version_date);
6010	seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
6011		   sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
6012		   sdebug_opts, sdebug_every_nth);
6013	seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
6014		   sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
6015		   sdebug_sector_size, "bytes");
6016	seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
6017		   sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
6018		   num_aborts);
6019	seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
6020		   num_dev_resets, num_target_resets, num_bus_resets,
6021		   num_host_resets);
6022	seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
6023		   dix_reads, dix_writes, dif_errors);
6024	seq_printf(m, "usec_in_jiffy=%lu, statistics=%d\n", TICK_NSEC / 1000,
6025		   sdebug_statistics);
6026	seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d, mq_polls=%d\n",
6027		   atomic_read(&sdebug_cmnd_count),
6028		   atomic_read(&sdebug_completions),
6029		   "miss_cpus", atomic_read(&sdebug_miss_cpus),
6030		   atomic_read(&sdebug_a_tsf),
6031		   atomic_read(&sdeb_mq_poll_count));
6032
6033	seq_printf(m, "submit_queues=%d\n", submit_queues);
6034	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
6035		seq_printf(m, "  queue %d:\n", j);
6036		f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
6037		if (f != sdebug_max_queue) {
6038			l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
6039			seq_printf(m, "    in_use_bm BUSY: %s: %d,%d\n",
6040				   "first,last bits", f, l);
6041		}
6042	}
6043
6044	seq_printf(m, "this host_no=%d\n", host->host_no);
6045	if (!xa_empty(per_store_ap)) {
6046		bool niu;
6047		int idx;
6048		unsigned long l_idx;
6049		struct sdeb_store_info *sip;
6050
6051		seq_puts(m, "\nhost list:\n");
6052		j = 0;
6053		list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
6054			idx = sdhp->si_idx;
6055			seq_printf(m, "  %d: host_no=%d, si_idx=%d\n", j,
6056				   sdhp->shost->host_no, idx);
6057			++j;
6058		}
6059		seq_printf(m, "\nper_store array [most_recent_idx=%d]:\n",
6060			   sdeb_most_recent_idx);
6061		j = 0;
6062		xa_for_each(per_store_ap, l_idx, sip) {
6063			niu = xa_get_mark(per_store_ap, l_idx,
6064					  SDEB_XA_NOT_IN_USE);
6065			idx = (int)l_idx;
6066			seq_printf(m, "  %d: idx=%d%s\n", j, idx,
6067				   (niu ? "  not_in_use" : ""));
6068			++j;
6069		}
6070	}
6071	return 0;
6072}
6073
6074static ssize_t delay_show(struct device_driver *ddp, char *buf)
6075{
6076	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
6077}
6078/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
6079 * of delay is jiffies.
6080 */
6081static ssize_t delay_store(struct device_driver *ddp, const char *buf,
6082			   size_t count)
6083{
6084	int jdelay, res;
 
6085
6086	if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
6087		res = count;
6088		if (sdebug_jdelay != jdelay) {
6089			int j, k;
6090			struct sdebug_queue *sqp;
6091
6092			block_unblock_all_queues(true);
6093			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6094			     ++j, ++sqp) {
6095				k = find_first_bit(sqp->in_use_bm,
6096						   sdebug_max_queue);
6097				if (k != sdebug_max_queue) {
6098					res = -EBUSY;   /* queued commands */
6099					break;
6100				}
6101			}
6102			if (res > 0) {
6103				sdebug_jdelay = jdelay;
6104				sdebug_ndelay = 0;
6105			}
6106			block_unblock_all_queues(false);
6107		}
6108		return res;
 
 
 
 
 
 
 
 
 
 
 
 
 
6109	}
6110	return -EINVAL;
 
 
 
 
6111}
6112static DRIVER_ATTR_RW(delay);
6113
6114static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
6115{
6116	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
6117}
6118/* Returns -EBUSY if ndelay is being changed and commands are queued */
6119/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
6120static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
6121			    size_t count)
6122{
6123	int ndelay, res;
6124
6125	if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
6126	    (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
6127		res = count;
6128		if (sdebug_ndelay != ndelay) {
6129			int j, k;
6130			struct sdebug_queue *sqp;
6131
6132			block_unblock_all_queues(true);
6133			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6134			     ++j, ++sqp) {
6135				k = find_first_bit(sqp->in_use_bm,
6136						   sdebug_max_queue);
6137				if (k != sdebug_max_queue) {
6138					res = -EBUSY;   /* queued commands */
6139					break;
6140				}
6141			}
6142			if (res > 0) {
6143				sdebug_ndelay = ndelay;
6144				sdebug_jdelay = ndelay  ? JDELAY_OVERRIDDEN
6145							: DEF_JDELAY;
6146			}
6147			block_unblock_all_queues(false);
6148		}
6149		return res;
6150	}
6151	return -EINVAL;
6152}
6153static DRIVER_ATTR_RW(ndelay);
 
6154
6155static ssize_t opts_show(struct device_driver *ddp, char *buf)
6156{
6157	return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
6158}
6159
6160static ssize_t opts_store(struct device_driver *ddp, const char *buf,
6161			  size_t count)
6162{
6163	int opts;
6164	char work[20];
6165
6166	if (sscanf(buf, "%10s", work) == 1) {
6167		if (strncasecmp(work, "0x", 2) == 0) {
6168			if (kstrtoint(work + 2, 16, &opts) == 0)
6169				goto opts_done;
6170		} else {
6171			if (kstrtoint(work, 10, &opts) == 0)
6172				goto opts_done;
6173		}
6174	}
6175	return -EINVAL;
6176opts_done:
6177	sdebug_opts = opts;
6178	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
6179	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
6180	tweak_cmnd_count();
6181	return count;
6182}
6183static DRIVER_ATTR_RW(opts);
 
6184
6185static ssize_t ptype_show(struct device_driver *ddp, char *buf)
6186{
6187	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
6188}
6189static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
6190			   size_t count)
6191{
6192	int n;
6193
6194	/* Cannot change from or to TYPE_ZBC with sysfs */
6195	if (sdebug_ptype == TYPE_ZBC)
6196		return -EINVAL;
6197
6198	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6199		if (n == TYPE_ZBC)
6200			return -EINVAL;
6201		sdebug_ptype = n;
6202		return count;
6203	}
6204	return -EINVAL;
6205}
6206static DRIVER_ATTR_RW(ptype);
6207
6208static ssize_t dsense_show(struct device_driver *ddp, char *buf)
6209{
6210	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
6211}
6212static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
6213			    size_t count)
6214{
6215	int n;
6216
6217	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6218		sdebug_dsense = n;
6219		return count;
6220	}
6221	return -EINVAL;
6222}
6223static DRIVER_ATTR_RW(dsense);
 
6224
6225static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
6226{
6227	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
6228}
6229static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
6230			     size_t count)
6231{
6232	int n, idx;
6233
6234	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6235		bool want_store = (n == 0);
6236		struct sdebug_host_info *sdhp;
6237
6238		n = (n > 0);
6239		sdebug_fake_rw = (sdebug_fake_rw > 0);
6240		if (sdebug_fake_rw == n)
6241			return count;	/* not transitioning so do nothing */
6242
6243		if (want_store) {	/* 1 --> 0 transition, set up store */
6244			if (sdeb_first_idx < 0) {
6245				idx = sdebug_add_store();
6246				if (idx < 0)
6247					return idx;
6248			} else {
6249				idx = sdeb_first_idx;
6250				xa_clear_mark(per_store_ap, idx,
6251					      SDEB_XA_NOT_IN_USE);
6252			}
6253			/* make all hosts use same store */
6254			list_for_each_entry(sdhp, &sdebug_host_list,
6255					    host_list) {
6256				if (sdhp->si_idx != idx) {
6257					xa_set_mark(per_store_ap, sdhp->si_idx,
6258						    SDEB_XA_NOT_IN_USE);
6259					sdhp->si_idx = idx;
6260				}
6261			}
6262			sdeb_most_recent_idx = idx;
6263		} else {	/* 0 --> 1 transition is trigger for shrink */
6264			sdebug_erase_all_stores(true /* apart from first */);
6265		}
6266		sdebug_fake_rw = n;
6267		return count;
6268	}
6269	return -EINVAL;
6270}
6271static DRIVER_ATTR_RW(fake_rw);
 
6272
6273static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
6274{
6275	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
6276}
6277static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
6278			      size_t count)
6279{
6280	int n;
6281
6282	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6283		sdebug_no_lun_0 = n;
6284		return count;
6285	}
6286	return -EINVAL;
6287}
6288static DRIVER_ATTR_RW(no_lun_0);
 
6289
6290static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
6291{
6292	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
6293}
6294static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
6295			      size_t count)
6296{
6297	int n;
6298
6299	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6300		sdebug_num_tgts = n;
6301		sdebug_max_tgts_luns();
6302		return count;
6303	}
6304	return -EINVAL;
6305}
6306static DRIVER_ATTR_RW(num_tgts);
 
6307
6308static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
6309{
6310	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
6311}
6312static DRIVER_ATTR_RO(dev_size_mb);
6313
6314static ssize_t per_host_store_show(struct device_driver *ddp, char *buf)
6315{
6316	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_per_host_store);
6317}
 
6318
6319static ssize_t per_host_store_store(struct device_driver *ddp, const char *buf,
6320				    size_t count)
6321{
6322	bool v;
6323
6324	if (kstrtobool(buf, &v))
6325		return -EINVAL;
6326
6327	sdebug_per_host_store = v;
6328	return count;
6329}
6330static DRIVER_ATTR_RW(per_host_store);
6331
6332static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
6333{
6334	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
6335}
6336static DRIVER_ATTR_RO(num_parts);
6337
6338static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
6339{
6340	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
6341}
6342static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
6343			       size_t count)
6344{
6345	int nth;
6346	char work[20];
6347
6348	if (sscanf(buf, "%10s", work) == 1) {
6349		if (strncasecmp(work, "0x", 2) == 0) {
6350			if (kstrtoint(work + 2, 16, &nth) == 0)
6351				goto every_nth_done;
6352		} else {
6353			if (kstrtoint(work, 10, &nth) == 0)
6354				goto every_nth_done;
6355		}
6356	}
6357	return -EINVAL;
6358
6359every_nth_done:
6360	sdebug_every_nth = nth;
6361	if (nth && !sdebug_statistics) {
6362		pr_info("every_nth needs statistics=1, set it\n");
6363		sdebug_statistics = true;
6364	}
6365	tweak_cmnd_count();
6366	return count;
6367}
6368static DRIVER_ATTR_RW(every_nth);
6369
6370static ssize_t lun_format_show(struct device_driver *ddp, char *buf)
6371{
6372	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_lun_am);
6373}
6374static ssize_t lun_format_store(struct device_driver *ddp, const char *buf,
6375				size_t count)
6376{
6377	int n;
6378	bool changed;
6379
6380	if (kstrtoint(buf, 0, &n))
6381		return -EINVAL;
6382	if (n >= 0) {
6383		if (n > (int)SAM_LUN_AM_FLAT) {
6384			pr_warn("only LUN address methods 0 and 1 are supported\n");
6385			return -EINVAL;
6386		}
6387		changed = ((int)sdebug_lun_am != n);
6388		sdebug_lun_am = n;
6389		if (changed && sdebug_scsi_level >= 5) {	/* >= SPC-3 */
6390			struct sdebug_host_info *sdhp;
6391			struct sdebug_dev_info *dp;
6392
6393			spin_lock(&sdebug_host_list_lock);
6394			list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
6395				list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
6396					set_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
6397				}
6398			}
6399			spin_unlock(&sdebug_host_list_lock);
6400		}
6401		return count;
6402	}
6403	return -EINVAL;
6404}
6405static DRIVER_ATTR_RW(lun_format);
 
6406
6407static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
6408{
6409	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
6410}
6411static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
6412			      size_t count)
6413{
6414	int n;
6415	bool changed;
6416
6417	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6418		if (n > 256) {
6419			pr_warn("max_luns can be no more than 256\n");
6420			return -EINVAL;
6421		}
6422		changed = (sdebug_max_luns != n);
6423		sdebug_max_luns = n;
6424		sdebug_max_tgts_luns();
6425		if (changed && (sdebug_scsi_level >= 5)) {	/* >= SPC-3 */
6426			struct sdebug_host_info *sdhp;
6427			struct sdebug_dev_info *dp;
6428
6429			spin_lock(&sdebug_host_list_lock);
6430			list_for_each_entry(sdhp, &sdebug_host_list,
6431					    host_list) {
6432				list_for_each_entry(dp, &sdhp->dev_info_list,
6433						    dev_list) {
6434					set_bit(SDEBUG_UA_LUNS_CHANGED,
6435						dp->uas_bm);
6436				}
6437			}
6438			spin_unlock(&sdebug_host_list_lock);
6439		}
6440		return count;
6441	}
6442	return -EINVAL;
6443}
6444static DRIVER_ATTR_RW(max_luns);
 
6445
6446static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
6447{
6448	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
6449}
6450/* N.B. max_queue can be changed while there are queued commands. In flight
6451 * commands beyond the new max_queue will be completed. */
6452static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
6453			       size_t count)
6454{
6455	int j, n, k, a;
6456	struct sdebug_queue *sqp;
6457
6458	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
6459	    (n <= SDEBUG_CANQUEUE) &&
6460	    (sdebug_host_max_queue == 0)) {
6461		block_unblock_all_queues(true);
6462		k = 0;
6463		for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6464		     ++j, ++sqp) {
6465			a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
6466			if (a > k)
6467				k = a;
6468		}
6469		sdebug_max_queue = n;
6470		if (k == SDEBUG_CANQUEUE)
6471			atomic_set(&retired_max_queue, 0);
6472		else if (k >= n)
6473			atomic_set(&retired_max_queue, k + 1);
6474		else
6475			atomic_set(&retired_max_queue, 0);
6476		block_unblock_all_queues(false);
6477		return count;
6478	}
6479	return -EINVAL;
6480}
6481static DRIVER_ATTR_RW(max_queue);
 
6482
6483static ssize_t host_max_queue_show(struct device_driver *ddp, char *buf)
6484{
6485	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_host_max_queue);
6486}
 
6487
6488static ssize_t no_rwlock_show(struct device_driver *ddp, char *buf)
6489{
6490	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_rwlock);
6491}
 
6492
6493static ssize_t no_rwlock_store(struct device_driver *ddp, const char *buf, size_t count)
6494{
6495	bool v;
6496
6497	if (kstrtobool(buf, &v))
6498		return -EINVAL;
6499
6500	sdebug_no_rwlock = v;
6501	return count;
6502}
6503static DRIVER_ATTR_RW(no_rwlock);
6504
6505/*
6506 * Since this is used for .can_queue, and we get the hc_idx tag from the bitmap
6507 * in range [0, sdebug_host_max_queue), we can't change it.
6508 */
6509static DRIVER_ATTR_RO(host_max_queue);
6510
6511static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
6512{
6513	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
6514}
6515static DRIVER_ATTR_RO(no_uld);
6516
6517static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
6518{
6519	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
6520}
6521static DRIVER_ATTR_RO(scsi_level);
6522
6523static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
6524{
6525	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
6526}
6527static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
6528				size_t count)
6529{
6530	int n;
6531	bool changed;
6532
6533	/* Ignore capacity change for ZBC drives for now */
6534	if (sdeb_zbc_in_use)
6535		return -ENOTSUPP;
6536
6537	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6538		changed = (sdebug_virtual_gb != n);
6539		sdebug_virtual_gb = n;
6540		sdebug_capacity = get_sdebug_capacity();
6541		if (changed) {
6542			struct sdebug_host_info *sdhp;
6543			struct sdebug_dev_info *dp;
6544
6545			spin_lock(&sdebug_host_list_lock);
6546			list_for_each_entry(sdhp, &sdebug_host_list,
6547					    host_list) {
6548				list_for_each_entry(dp, &sdhp->dev_info_list,
6549						    dev_list) {
6550					set_bit(SDEBUG_UA_CAPACITY_CHANGED,
6551						dp->uas_bm);
6552				}
6553			}
6554			spin_unlock(&sdebug_host_list_lock);
6555		}
6556		return count;
6557	}
6558	return -EINVAL;
6559}
6560static DRIVER_ATTR_RW(virtual_gb);
 
6561
6562static ssize_t add_host_show(struct device_driver *ddp, char *buf)
6563{
6564	/* absolute number of hosts currently active is what is shown */
6565	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_hosts);
6566}
6567
6568static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
6569			      size_t count)
6570{
6571	bool found;
6572	unsigned long idx;
6573	struct sdeb_store_info *sip;
6574	bool want_phs = (sdebug_fake_rw == 0) && sdebug_per_host_store;
6575	int delta_hosts;
6576
6577	if (sscanf(buf, "%d", &delta_hosts) != 1)
6578		return -EINVAL;
6579	if (delta_hosts > 0) {
6580		do {
6581			found = false;
6582			if (want_phs) {
6583				xa_for_each_marked(per_store_ap, idx, sip,
6584						   SDEB_XA_NOT_IN_USE) {
6585					sdeb_most_recent_idx = (int)idx;
6586					found = true;
6587					break;
6588				}
6589				if (found)	/* re-use case */
6590					sdebug_add_host_helper((int)idx);
6591				else
6592					sdebug_do_add_host(true);
6593			} else {
6594				sdebug_do_add_host(false);
6595			}
6596		} while (--delta_hosts);
6597	} else if (delta_hosts < 0) {
6598		do {
6599			sdebug_do_remove_host(false);
6600		} while (++delta_hosts);
6601	}
6602	return count;
6603}
6604static DRIVER_ATTR_RW(add_host);
 
6605
6606static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
 
6607{
6608	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
6609}
6610static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
6611				    size_t count)
6612{
6613	int n;
6614
6615	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6616		sdebug_vpd_use_hostno = n;
6617		return count;
6618	}
6619	return -EINVAL;
6620}
6621static DRIVER_ATTR_RW(vpd_use_hostno);
6622
6623static ssize_t statistics_show(struct device_driver *ddp, char *buf)
6624{
6625	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
6626}
6627static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
6628				size_t count)
6629{
6630	int n;
6631
6632	if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
6633		if (n > 0)
6634			sdebug_statistics = true;
6635		else {
6636			clear_queue_stats();
6637			sdebug_statistics = false;
6638		}
6639		return count;
6640	}
6641	return -EINVAL;
6642}
6643static DRIVER_ATTR_RW(statistics);
 
6644
6645static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
6646{
6647	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
6648}
6649static DRIVER_ATTR_RO(sector_size);
6650
6651static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
6652{
6653	return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
6654}
6655static DRIVER_ATTR_RO(submit_queues);
6656
6657static ssize_t dix_show(struct device_driver *ddp, char *buf)
6658{
6659	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
6660}
6661static DRIVER_ATTR_RO(dix);
6662
6663static ssize_t dif_show(struct device_driver *ddp, char *buf)
6664{
6665	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
6666}
6667static DRIVER_ATTR_RO(dif);
6668
6669static ssize_t guard_show(struct device_driver *ddp, char *buf)
6670{
6671	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
6672}
6673static DRIVER_ATTR_RO(guard);
6674
6675static ssize_t ato_show(struct device_driver *ddp, char *buf)
6676{
6677	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
6678}
6679static DRIVER_ATTR_RO(ato);
6680
6681static ssize_t map_show(struct device_driver *ddp, char *buf)
6682{
6683	ssize_t count = 0;
6684
6685	if (!scsi_debug_lbp())
6686		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
6687				 sdebug_store_sectors);
6688
6689	if (sdebug_fake_rw == 0 && !xa_empty(per_store_ap)) {
6690		struct sdeb_store_info *sip = xa_load(per_store_ap, 0);
6691
6692		if (sip)
6693			count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
6694					  (int)map_size, sip->map_storep);
6695	}
6696	buf[count++] = '\n';
6697	buf[count] = '\0';
6698
6699	return count;
6700}
6701static DRIVER_ATTR_RO(map);
6702
6703static ssize_t random_show(struct device_driver *ddp, char *buf)
6704{
6705	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_random);
6706}
6707
6708static ssize_t random_store(struct device_driver *ddp, const char *buf,
6709			    size_t count)
6710{
6711	bool v;
6712
6713	if (kstrtobool(buf, &v))
6714		return -EINVAL;
6715
6716	sdebug_random = v;
6717	return count;
6718}
6719static DRIVER_ATTR_RW(random);
6720
6721static ssize_t removable_show(struct device_driver *ddp, char *buf)
6722{
6723	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
6724}
6725static ssize_t removable_store(struct device_driver *ddp, const char *buf,
6726			       size_t count)
6727{
6728	int n;
6729
6730	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6731		sdebug_removable = (n > 0);
6732		return count;
6733	}
6734	return -EINVAL;
6735}
6736static DRIVER_ATTR_RW(removable);
6737
6738static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
6739{
6740	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
6741}
6742/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
6743static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
6744			       size_t count)
6745{
6746	int n;
6747
6748	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6749		sdebug_host_lock = (n > 0);
6750		return count;
6751	}
6752	return -EINVAL;
6753}
6754static DRIVER_ATTR_RW(host_lock);
6755
6756static ssize_t strict_show(struct device_driver *ddp, char *buf)
6757{
6758	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
6759}
6760static ssize_t strict_store(struct device_driver *ddp, const char *buf,
6761			    size_t count)
6762{
6763	int n;
6764
6765	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6766		sdebug_strict = (n > 0);
6767		return count;
6768	}
6769	return -EINVAL;
6770}
6771static DRIVER_ATTR_RW(strict);
6772
6773static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
6774{
6775	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
6776}
6777static DRIVER_ATTR_RO(uuid_ctl);
6778
6779static ssize_t cdb_len_show(struct device_driver *ddp, char *buf)
6780{
6781	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_cdb_len);
6782}
6783static ssize_t cdb_len_store(struct device_driver *ddp, const char *buf,
6784			     size_t count)
6785{
6786	int ret, n;
6787
6788	ret = kstrtoint(buf, 0, &n);
6789	if (ret)
6790		return ret;
6791	sdebug_cdb_len = n;
6792	all_config_cdb_len();
6793	return count;
6794}
6795static DRIVER_ATTR_RW(cdb_len);
6796
6797static const char * const zbc_model_strs_a[] = {
6798	[BLK_ZONED_NONE] = "none",
6799	[BLK_ZONED_HA]   = "host-aware",
6800	[BLK_ZONED_HM]   = "host-managed",
6801};
6802
6803static const char * const zbc_model_strs_b[] = {
6804	[BLK_ZONED_NONE] = "no",
6805	[BLK_ZONED_HA]   = "aware",
6806	[BLK_ZONED_HM]   = "managed",
6807};
6808
6809static const char * const zbc_model_strs_c[] = {
6810	[BLK_ZONED_NONE] = "0",
6811	[BLK_ZONED_HA]   = "1",
6812	[BLK_ZONED_HM]   = "2",
6813};
6814
6815static int sdeb_zbc_model_str(const char *cp)
6816{
6817	int res = sysfs_match_string(zbc_model_strs_a, cp);
6818
6819	if (res < 0) {
6820		res = sysfs_match_string(zbc_model_strs_b, cp);
6821		if (res < 0) {
6822			res = sysfs_match_string(zbc_model_strs_c, cp);
6823			if (res < 0)
6824				return -EINVAL;
6825		}
6826	}
6827	return res;
6828}
6829
6830static ssize_t zbc_show(struct device_driver *ddp, char *buf)
6831{
6832	return scnprintf(buf, PAGE_SIZE, "%s\n",
6833			 zbc_model_strs_a[sdeb_zbc_model]);
 
 
 
 
 
 
6834}
6835static DRIVER_ATTR_RO(zbc);
6836
6837static ssize_t tur_ms_to_ready_show(struct device_driver *ddp, char *buf)
6838{
6839	return scnprintf(buf, PAGE_SIZE, "%d\n", sdeb_tur_ms_to_ready);
6840}
6841static DRIVER_ATTR_RO(tur_ms_to_ready);
6842
6843/* Note: The following array creates attribute files in the
6844   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
6845   files (over those found in the /sys/module/scsi_debug/parameters
6846   directory) is that auxiliary actions can be triggered when an attribute
6847   is changed. For example see: add_host_store() above.
6848 */
6849
6850static struct attribute *sdebug_drv_attrs[] = {
6851	&driver_attr_delay.attr,
6852	&driver_attr_opts.attr,
6853	&driver_attr_ptype.attr,
6854	&driver_attr_dsense.attr,
6855	&driver_attr_fake_rw.attr,
6856	&driver_attr_host_max_queue.attr,
6857	&driver_attr_no_lun_0.attr,
6858	&driver_attr_num_tgts.attr,
6859	&driver_attr_dev_size_mb.attr,
6860	&driver_attr_num_parts.attr,
6861	&driver_attr_every_nth.attr,
6862	&driver_attr_lun_format.attr,
6863	&driver_attr_max_luns.attr,
6864	&driver_attr_max_queue.attr,
6865	&driver_attr_no_rwlock.attr,
6866	&driver_attr_no_uld.attr,
6867	&driver_attr_scsi_level.attr,
6868	&driver_attr_virtual_gb.attr,
6869	&driver_attr_add_host.attr,
6870	&driver_attr_per_host_store.attr,
6871	&driver_attr_vpd_use_hostno.attr,
6872	&driver_attr_sector_size.attr,
6873	&driver_attr_statistics.attr,
6874	&driver_attr_submit_queues.attr,
6875	&driver_attr_dix.attr,
6876	&driver_attr_dif.attr,
6877	&driver_attr_guard.attr,
6878	&driver_attr_ato.attr,
6879	&driver_attr_map.attr,
6880	&driver_attr_random.attr,
6881	&driver_attr_removable.attr,
6882	&driver_attr_host_lock.attr,
6883	&driver_attr_ndelay.attr,
6884	&driver_attr_strict.attr,
6885	&driver_attr_uuid_ctl.attr,
6886	&driver_attr_cdb_len.attr,
6887	&driver_attr_tur_ms_to_ready.attr,
6888	&driver_attr_zbc.attr,
6889	NULL,
6890};
6891ATTRIBUTE_GROUPS(sdebug_drv);
6892
6893static struct device *pseudo_primary;
6894
6895static int __init scsi_debug_init(void)
6896{
6897	bool want_store = (sdebug_fake_rw == 0);
6898	unsigned long sz;
6899	int k, ret, hosts_to_add;
6900	int idx = -1;
 
6901
6902	ramdisk_lck_a[0] = &atomic_rw;
6903	ramdisk_lck_a[1] = &atomic_rw2;
6904	atomic_set(&retired_max_queue, 0);
6905
6906	if (sdebug_ndelay >= 1000 * 1000 * 1000) {
6907		pr_warn("ndelay must be less than 1 second, ignored\n");
6908		sdebug_ndelay = 0;
6909	} else if (sdebug_ndelay > 0)
6910		sdebug_jdelay = JDELAY_OVERRIDDEN;
6911
6912	switch (sdebug_sector_size) {
6913	case  512:
6914	case 1024:
6915	case 2048:
6916	case 4096:
6917		break;
6918	default:
6919		pr_err("invalid sector_size %d\n", sdebug_sector_size);
 
6920		return -EINVAL;
6921	}
6922
6923	switch (sdebug_dif) {
6924	case T10_PI_TYPE0_PROTECTION:
6925		break;
6926	case T10_PI_TYPE1_PROTECTION:
6927	case T10_PI_TYPE2_PROTECTION:
6928	case T10_PI_TYPE3_PROTECTION:
6929		have_dif_prot = true;
6930		break;
6931
6932	default:
6933		pr_err("dif must be 0, 1, 2 or 3\n");
6934		return -EINVAL;
6935	}
6936
6937	if (sdebug_num_tgts < 0) {
6938		pr_err("num_tgts must be >= 0\n");
6939		return -EINVAL;
6940	}
6941
6942	if (sdebug_guard > 1) {
6943		pr_err("guard must be 0 or 1\n");
6944		return -EINVAL;
6945	}
6946
6947	if (sdebug_ato > 1) {
6948		pr_err("ato must be 0 or 1\n");
6949		return -EINVAL;
6950	}
6951
6952	if (sdebug_physblk_exp > 15) {
6953		pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
6954		return -EINVAL;
6955	}
6956
6957	sdebug_lun_am = sdebug_lun_am_i;
6958	if (sdebug_lun_am > SAM_LUN_AM_FLAT) {
6959		pr_warn("Invalid LUN format %u, using default\n", (int)sdebug_lun_am);
6960		sdebug_lun_am = SAM_LUN_AM_PERIPHERAL;
6961	}
6962
6963	if (sdebug_max_luns > 256) {
6964		if (sdebug_max_luns > 16384) {
6965			pr_warn("max_luns can be no more than 16384, use default\n");
6966			sdebug_max_luns = DEF_MAX_LUNS;
6967		}
6968		sdebug_lun_am = SAM_LUN_AM_FLAT;
6969	}
6970
6971	if (sdebug_lowest_aligned > 0x3fff) {
6972		pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
6973		return -EINVAL;
6974	}
6975
6976	if (submit_queues < 1) {
6977		pr_err("submit_queues must be 1 or more\n");
6978		return -EINVAL;
6979	}
6980
6981	if ((sdebug_max_queue > SDEBUG_CANQUEUE) || (sdebug_max_queue < 1)) {
6982		pr_err("max_queue must be in range [1, %d]\n", SDEBUG_CANQUEUE);
 
6983		return -EINVAL;
6984	}
6985
6986	if ((sdebug_host_max_queue > SDEBUG_CANQUEUE) ||
6987	    (sdebug_host_max_queue < 0)) {
6988		pr_err("host_max_queue must be in range [0 %d]\n",
6989		       SDEBUG_CANQUEUE);
6990		return -EINVAL;
6991	}
6992
6993	if (sdebug_host_max_queue &&
6994	    (sdebug_max_queue != sdebug_host_max_queue)) {
6995		sdebug_max_queue = sdebug_host_max_queue;
6996		pr_warn("fixing max submit queue depth to host max queue depth, %d\n",
6997			sdebug_max_queue);
6998	}
6999
7000	sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
7001			       GFP_KERNEL);
7002	if (sdebug_q_arr == NULL)
7003		return -ENOMEM;
7004	for (k = 0; k < submit_queues; ++k)
7005		spin_lock_init(&sdebug_q_arr[k].qc_lock);
7006
7007	/*
7008	 * check for host managed zoned block device specified with
7009	 * ptype=0x14 or zbc=XXX.
7010	 */
7011	if (sdebug_ptype == TYPE_ZBC) {
7012		sdeb_zbc_model = BLK_ZONED_HM;
7013	} else if (sdeb_zbc_model_s && *sdeb_zbc_model_s) {
7014		k = sdeb_zbc_model_str(sdeb_zbc_model_s);
7015		if (k < 0) {
7016			ret = k;
7017			goto free_q_arr;
7018		}
7019		sdeb_zbc_model = k;
7020		switch (sdeb_zbc_model) {
7021		case BLK_ZONED_NONE:
7022		case BLK_ZONED_HA:
7023			sdebug_ptype = TYPE_DISK;
7024			break;
7025		case BLK_ZONED_HM:
7026			sdebug_ptype = TYPE_ZBC;
7027			break;
7028		default:
7029			pr_err("Invalid ZBC model\n");
7030			ret = -EINVAL;
7031			goto free_q_arr;
7032		}
7033	}
7034	if (sdeb_zbc_model != BLK_ZONED_NONE) {
7035		sdeb_zbc_in_use = true;
7036		if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
7037			sdebug_dev_size_mb = DEF_ZBC_DEV_SIZE_MB;
7038	}
7039
7040	if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
7041		sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
7042	if (sdebug_dev_size_mb < 1)
7043		sdebug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
7044	sz = (unsigned long)sdebug_dev_size_mb * 1048576;
7045	sdebug_store_sectors = sz / sdebug_sector_size;
7046	sdebug_capacity = get_sdebug_capacity();
7047
7048	/* play around with geometry, don't waste too much on track 0 */
7049	sdebug_heads = 8;
7050	sdebug_sectors_per = 32;
7051	if (sdebug_dev_size_mb >= 256)
 
 
7052		sdebug_heads = 64;
7053	else if (sdebug_dev_size_mb >= 16)
7054		sdebug_heads = 32;
7055	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
7056			       (sdebug_sectors_per * sdebug_heads);
7057	if (sdebug_cylinders_per >= 1024) {
7058		/* other LLDs do this; implies >= 1GB ram disk ... */
7059		sdebug_heads = 255;
7060		sdebug_sectors_per = 63;
7061		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
7062			       (sdebug_sectors_per * sdebug_heads);
7063	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7064	if (scsi_debug_lbp()) {
7065		sdebug_unmap_max_blocks =
7066			clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7067
7068		sdebug_unmap_max_desc =
7069			clamp(sdebug_unmap_max_desc, 0U, 256U);
 
7070
7071		sdebug_unmap_granularity =
7072			clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
7073
7074		if (sdebug_unmap_alignment &&
7075		    sdebug_unmap_granularity <=
7076		    sdebug_unmap_alignment) {
7077			pr_err("ERR: unmap_granularity <= unmap_alignment\n");
7078			ret = -EINVAL;
7079			goto free_q_arr;
7080		}
7081	}
7082	xa_init_flags(per_store_ap, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
7083	if (want_store) {
7084		idx = sdebug_add_store();
7085		if (idx < 0) {
7086			ret = idx;
7087			goto free_q_arr;
7088		}
 
 
 
 
 
 
7089	}
7090
7091	pseudo_primary = root_device_register("pseudo_0");
7092	if (IS_ERR(pseudo_primary)) {
7093		pr_warn("root_device_register() error\n");
7094		ret = PTR_ERR(pseudo_primary);
7095		goto free_vm;
7096	}
7097	ret = bus_register(&pseudo_lld_bus);
7098	if (ret < 0) {
7099		pr_warn("bus_register error: %d\n", ret);
 
7100		goto dev_unreg;
7101	}
7102	ret = driver_register(&sdebug_driverfs_driver);
7103	if (ret < 0) {
7104		pr_warn("driver_register error: %d\n", ret);
 
7105		goto bus_unreg;
7106	}
7107
7108	hosts_to_add = sdebug_add_host;
7109	sdebug_add_host = 0;
7110
7111	for (k = 0; k < hosts_to_add; k++) {
7112		if (want_store && k == 0) {
7113			ret = sdebug_add_host_helper(idx);
7114			if (ret < 0) {
7115				pr_err("add_host_helper k=%d, error=%d\n",
7116				       k, -ret);
7117				break;
7118			}
7119		} else {
7120			ret = sdebug_do_add_host(want_store &&
7121						 sdebug_per_host_store);
7122			if (ret < 0) {
7123				pr_err("add_host k=%d error=%d\n", k, -ret);
7124				break;
7125			}
7126		}
 
 
 
7127	}
7128	if (sdebug_verbose)
7129		pr_info("built %d host(s)\n", sdebug_num_hosts);
7130
7131	return 0;
7132
 
 
 
7133bus_unreg:
7134	bus_unregister(&pseudo_lld_bus);
7135dev_unreg:
7136	root_device_unregister(pseudo_primary);
7137free_vm:
7138	sdebug_erase_store(idx, NULL);
7139free_q_arr:
7140	kfree(sdebug_q_arr);
 
 
 
7141	return ret;
7142}
7143
7144static void __exit scsi_debug_exit(void)
7145{
7146	int k = sdebug_num_hosts;
7147
7148	stop_all_queued();
7149	for (; k; k--)
7150		sdebug_do_remove_host(true);
7151	free_all_queued();
7152	driver_unregister(&sdebug_driverfs_driver);
7153	bus_unregister(&pseudo_lld_bus);
7154	root_device_unregister(pseudo_primary);
7155
7156	sdebug_erase_all_stores(false);
7157	xa_destroy(per_store_ap);
7158	kfree(sdebug_q_arr);
 
7159}
7160
7161device_initcall(scsi_debug_init);
7162module_exit(scsi_debug_exit);
7163
7164static void sdebug_release_adapter(struct device *dev)
7165{
7166	struct sdebug_host_info *sdbg_host;
7167
7168	sdbg_host = to_sdebug_host(dev);
7169	kfree(sdbg_host);
7170}
7171
7172/* idx must be valid, if sip is NULL then it will be obtained using idx */
7173static void sdebug_erase_store(int idx, struct sdeb_store_info *sip)
7174{
7175	if (idx < 0)
7176		return;
7177	if (!sip) {
7178		if (xa_empty(per_store_ap))
7179			return;
7180		sip = xa_load(per_store_ap, idx);
7181		if (!sip)
7182			return;
7183	}
7184	vfree(sip->map_storep);
7185	vfree(sip->dif_storep);
7186	vfree(sip->storep);
7187	xa_erase(per_store_ap, idx);
7188	kfree(sip);
7189}
7190
7191/* Assume apart_from_first==false only in shutdown case. */
7192static void sdebug_erase_all_stores(bool apart_from_first)
7193{
7194	unsigned long idx;
7195	struct sdeb_store_info *sip = NULL;
7196
7197	xa_for_each(per_store_ap, idx, sip) {
7198		if (apart_from_first)
7199			apart_from_first = false;
7200		else
7201			sdebug_erase_store(idx, sip);
7202	}
7203	if (apart_from_first)
7204		sdeb_most_recent_idx = sdeb_first_idx;
7205}
7206
7207/*
7208 * Returns store xarray new element index (idx) if >=0 else negated errno.
7209 * Limit the number of stores to 65536.
7210 */
7211static int sdebug_add_store(void)
7212{
7213	int res;
7214	u32 n_idx;
7215	unsigned long iflags;
7216	unsigned long sz = (unsigned long)sdebug_dev_size_mb * 1048576;
7217	struct sdeb_store_info *sip = NULL;
7218	struct xa_limit xal = { .max = 1 << 16, .min = 0 };
7219
7220	sip = kzalloc(sizeof(*sip), GFP_KERNEL);
7221	if (!sip)
7222		return -ENOMEM;
7223
7224	xa_lock_irqsave(per_store_ap, iflags);
7225	res = __xa_alloc(per_store_ap, &n_idx, sip, xal, GFP_ATOMIC);
7226	if (unlikely(res < 0)) {
7227		xa_unlock_irqrestore(per_store_ap, iflags);
7228		kfree(sip);
7229		pr_warn("%s: xa_alloc() errno=%d\n", __func__, -res);
7230		return res;
7231	}
7232	sdeb_most_recent_idx = n_idx;
7233	if (sdeb_first_idx < 0)
7234		sdeb_first_idx = n_idx;
7235	xa_unlock_irqrestore(per_store_ap, iflags);
7236
7237	res = -ENOMEM;
7238	sip->storep = vzalloc(sz);
7239	if (!sip->storep) {
7240		pr_err("user data oom\n");
7241		goto err;
7242	}
7243	if (sdebug_num_parts > 0)
7244		sdebug_build_parts(sip->storep, sz);
7245
7246	/* DIF/DIX: what T10 calls Protection Information (PI) */
7247	if (sdebug_dix) {
7248		int dif_size;
7249
7250		dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
7251		sip->dif_storep = vmalloc(dif_size);
7252
7253		pr_info("dif_storep %u bytes @ %pK\n", dif_size,
7254			sip->dif_storep);
7255
7256		if (!sip->dif_storep) {
7257			pr_err("DIX oom\n");
7258			goto err;
7259		}
7260		memset(sip->dif_storep, 0xff, dif_size);
7261	}
7262	/* Logical Block Provisioning */
7263	if (scsi_debug_lbp()) {
7264		map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
7265		sip->map_storep = vmalloc(array_size(sizeof(long),
7266						     BITS_TO_LONGS(map_size)));
7267
7268		pr_info("%lu provisioning blocks\n", map_size);
7269
7270		if (!sip->map_storep) {
7271			pr_err("LBP map oom\n");
7272			goto err;
7273		}
7274
7275		bitmap_zero(sip->map_storep, map_size);
7276
7277		/* Map first 1KB for partition table */
7278		if (sdebug_num_parts)
7279			map_region(sip, 0, 2);
7280	}
7281
7282	rwlock_init(&sip->macc_lck);
7283	return (int)n_idx;
7284err:
7285	sdebug_erase_store((int)n_idx, sip);
7286	pr_warn("%s: failed, errno=%d\n", __func__, -res);
7287	return res;
7288}
7289
7290static int sdebug_add_host_helper(int per_host_idx)
7291{
7292	int k, devs_per_host, idx;
7293	int error = -ENOMEM;
7294	struct sdebug_host_info *sdbg_host;
7295	struct sdebug_dev_info *sdbg_devinfo, *tmp;
7296
7297	sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL);
7298	if (!sdbg_host)
7299		return -ENOMEM;
7300	idx = (per_host_idx < 0) ? sdeb_first_idx : per_host_idx;
7301	if (xa_get_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE))
7302		xa_clear_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7303	sdbg_host->si_idx = idx;
7304
7305	INIT_LIST_HEAD(&sdbg_host->dev_info_list);
7306
7307	devs_per_host = sdebug_num_tgts * sdebug_max_luns;
7308	for (k = 0; k < devs_per_host; k++) {
7309		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
7310		if (!sdbg_devinfo)
 
 
 
7311			goto clean;
7312	}
 
 
 
 
 
 
 
 
 
 
7313
7314	spin_lock(&sdebug_host_list_lock);
7315	list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
7316	spin_unlock(&sdebug_host_list_lock);
7317
7318	sdbg_host->dev.bus = &pseudo_lld_bus;
7319	sdbg_host->dev.parent = pseudo_primary;
7320	sdbg_host->dev.release = &sdebug_release_adapter;
7321	dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_num_hosts);
7322
7323	error = device_register(&sdbg_host->dev);
7324	if (error) {
7325		spin_lock(&sdebug_host_list_lock);
7326		list_del(&sdbg_host->host_list);
7327		spin_unlock(&sdebug_host_list_lock);
7328		goto clean;
7329	}
7330
7331	++sdebug_num_hosts;
7332	return 0;
7333
7334clean:
7335	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7336				 dev_list) {
7337		list_del(&sdbg_devinfo->dev_list);
7338		kfree(sdbg_devinfo->zstate);
7339		kfree(sdbg_devinfo);
7340	}
7341	if (sdbg_host->dev.release)
7342		put_device(&sdbg_host->dev);
7343	else
7344		kfree(sdbg_host);
7345	pr_warn("%s: failed, errno=%d\n", __func__, -error);
7346	return error;
7347}
7348
7349static int sdebug_do_add_host(bool mk_new_store)
7350{
7351	int ph_idx = sdeb_most_recent_idx;
7352
7353	if (mk_new_store) {
7354		ph_idx = sdebug_add_store();
7355		if (ph_idx < 0)
7356			return ph_idx;
7357	}
7358	return sdebug_add_host_helper(ph_idx);
7359}
7360
7361static void sdebug_do_remove_host(bool the_end)
7362{
7363	int idx = -1;
7364	struct sdebug_host_info *sdbg_host = NULL;
7365	struct sdebug_host_info *sdbg_host2;
7366
7367	spin_lock(&sdebug_host_list_lock);
7368	if (!list_empty(&sdebug_host_list)) {
7369		sdbg_host = list_entry(sdebug_host_list.prev,
7370				       struct sdebug_host_info, host_list);
7371		idx = sdbg_host->si_idx;
7372	}
7373	if (!the_end && idx >= 0) {
7374		bool unique = true;
7375
7376		list_for_each_entry(sdbg_host2, &sdebug_host_list, host_list) {
7377			if (sdbg_host2 == sdbg_host)
7378				continue;
7379			if (idx == sdbg_host2->si_idx) {
7380				unique = false;
7381				break;
7382			}
7383		}
7384		if (unique) {
7385			xa_set_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7386			if (idx == sdeb_most_recent_idx)
7387				--sdeb_most_recent_idx;
7388		}
7389	}
7390	if (sdbg_host)
7391		list_del(&sdbg_host->host_list);
7392	spin_unlock(&sdebug_host_list_lock);
7393
7394	if (!sdbg_host)
7395		return;
7396
7397	device_unregister(&sdbg_host->dev);
7398	--sdebug_num_hosts;
7399}
7400
7401static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
 
7402{
7403	int num_in_q = 0;
7404	struct sdebug_dev_info *devip;
7405
7406	block_unblock_all_queues(true);
7407	devip = (struct sdebug_dev_info *)sdev->hostdata;
7408	if (NULL == devip) {
7409		block_unblock_all_queues(false);
7410		return	-ENODEV;
7411	}
7412	num_in_q = atomic_read(&devip->num_in_q);
7413
7414	if (qdepth > SDEBUG_CANQUEUE) {
7415		qdepth = SDEBUG_CANQUEUE;
7416		pr_warn("%s: requested qdepth [%d] exceeds canqueue [%d], trim\n", __func__,
7417			qdepth, SDEBUG_CANQUEUE);
7418	}
7419	if (qdepth < 1)
7420		qdepth = 1;
7421	if (qdepth != sdev->queue_depth)
7422		scsi_change_queue_depth(sdev, qdepth);
7423
7424	if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
7425		sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
7426			    __func__, qdepth, num_in_q);
7427	}
7428	block_unblock_all_queues(false);
7429	return sdev->queue_depth;
7430}
7431
7432static bool fake_timeout(struct scsi_cmnd *scp)
7433{
7434	if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
7435		if (sdebug_every_nth < -1)
7436			sdebug_every_nth = -1;
7437		if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
7438			return true; /* ignore command causing timeout */
7439		else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
7440			 scsi_medium_access_command(scp))
7441			return true; /* time out reads and writes */
7442	}
7443	return false;
7444}
7445
7446/* Response to TUR or media access command when device stopped */
7447static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
7448{
7449	int stopped_state;
7450	u64 diff_ns = 0;
7451	ktime_t now_ts = ktime_get_boottime();
7452	struct scsi_device *sdp = scp->device;
7453
7454	stopped_state = atomic_read(&devip->stopped);
7455	if (stopped_state == 2) {
7456		if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
7457			diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
7458			if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
7459				/* tur_ms_to_ready timer extinguished */
7460				atomic_set(&devip->stopped, 0);
7461				return 0;
7462			}
7463		}
7464		mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x1);
7465		if (sdebug_verbose)
7466			sdev_printk(KERN_INFO, sdp,
7467				    "%s: Not ready: in process of becoming ready\n", my_name);
7468		if (scp->cmnd[0] == TEST_UNIT_READY) {
7469			u64 tur_nanosecs_to_ready = (u64)sdeb_tur_ms_to_ready * 1000000;
7470
7471			if (diff_ns <= tur_nanosecs_to_ready)
7472				diff_ns = tur_nanosecs_to_ready - diff_ns;
7473			else
7474				diff_ns = tur_nanosecs_to_ready;
7475			/* As per 20-061r2 approved for spc6 by T10 on 20200716 */
7476			do_div(diff_ns, 1000000);	/* diff_ns becomes milliseconds */
7477			scsi_set_sense_information(scp->sense_buffer, SCSI_SENSE_BUFFERSIZE,
7478						   diff_ns);
7479			return check_condition_result;
7480		}
7481	}
7482	mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
7483	if (sdebug_verbose)
7484		sdev_printk(KERN_INFO, sdp, "%s: Not ready: initializing command required\n",
7485			    my_name);
7486	return check_condition_result;
7487}
7488
7489static void sdebug_map_queues(struct Scsi_Host *shost)
7490{
7491	int i, qoff;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7492
7493	if (shost->nr_hw_queues == 1)
7494		return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7495
7496	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
7497		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
 
 
7498
7499		map->nr_queues  = 0;
7500
7501		if (i == HCTX_TYPE_DEFAULT)
7502			map->nr_queues = submit_queues - poll_queues;
7503		else if (i == HCTX_TYPE_POLL)
7504			map->nr_queues = poll_queues;
7505
7506		if (!map->nr_queues) {
7507			BUG_ON(i == HCTX_TYPE_DEFAULT);
7508			continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7509		}
7510
7511		map->queue_offset = qoff;
7512		blk_mq_map_queues(map);
 
 
7513
7514		qoff += map->nr_queues;
7515	}
7516}
7517
7518static int sdebug_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
7519{
7520	bool first;
7521	bool retiring = false;
7522	int num_entries = 0;
7523	unsigned int qc_idx = 0;
7524	unsigned long iflags;
7525	ktime_t kt_from_boot = ktime_get_boottime();
7526	struct sdebug_queue *sqp;
7527	struct sdebug_queued_cmd *sqcp;
7528	struct scsi_cmnd *scp;
7529	struct sdebug_dev_info *devip;
7530	struct sdebug_defer *sd_dp;
7531
7532	sqp = sdebug_q_arr + queue_num;
7533
7534	spin_lock_irqsave(&sqp->qc_lock, iflags);
7535
7536	qc_idx = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
7537	if (qc_idx >= sdebug_max_queue)
7538		goto unlock;
7539
7540	for (first = true; first || qc_idx + 1 < sdebug_max_queue; )   {
7541		if (first) {
7542			first = false;
7543			if (!test_bit(qc_idx, sqp->in_use_bm))
7544				continue;
7545		} else {
7546			qc_idx = find_next_bit(sqp->in_use_bm, sdebug_max_queue, qc_idx + 1);
7547		}
7548		if (qc_idx >= sdebug_max_queue)
 
 
 
 
 
 
 
 
 
 
7549			break;
7550
7551		sqcp = &sqp->qc_arr[qc_idx];
7552		sd_dp = sqcp->sd_dp;
7553		if (unlikely(!sd_dp))
7554			continue;
7555		scp = sqcp->a_cmnd;
7556		if (unlikely(scp == NULL)) {
7557			pr_err("scp is NULL, queue_num=%d, qc_idx=%u from %s\n",
7558			       queue_num, qc_idx, __func__);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7559			break;
7560		}
7561		if (READ_ONCE(sd_dp->defer_t) == SDEB_DEFER_POLL) {
7562			if (kt_from_boot < sd_dp->cmpl_ts)
7563				continue;
7564
7565		} else		/* ignoring non REQ_POLLED requests */
7566			continue;
7567		devip = (struct sdebug_dev_info *)scp->device->hostdata;
7568		if (likely(devip))
7569			atomic_dec(&devip->num_in_q);
7570		else
7571			pr_err("devip=NULL from %s\n", __func__);
7572		if (unlikely(atomic_read(&retired_max_queue) > 0))
7573			retiring = true;
7574
7575		sqcp->a_cmnd = NULL;
7576		if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
7577			pr_err("Unexpected completion sqp %p queue_num=%d qc_idx=%u from %s\n",
7578				sqp, queue_num, qc_idx, __func__);
7579			break;
7580		}
7581		if (unlikely(retiring)) {	/* user has reduced max_queue */
7582			int k, retval;
7583
7584			retval = atomic_read(&retired_max_queue);
7585			if (qc_idx >= retval) {
7586				pr_err("index %d too large\n", retval);
7587				break;
7588			}
7589			k = find_last_bit(sqp->in_use_bm, retval);
7590			if ((k < sdebug_max_queue) || (k == retval))
7591				atomic_set(&retired_max_queue, 0);
7592			else
7593				atomic_set(&retired_max_queue, k + 1);
7594		}
7595		WRITE_ONCE(sd_dp->defer_t, SDEB_DEFER_NONE);
7596		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
7597		scsi_done(scp); /* callback to mid level */
7598		num_entries++;
7599		spin_lock_irqsave(&sqp->qc_lock, iflags);
7600		if (find_first_bit(sqp->in_use_bm, sdebug_max_queue) >= sdebug_max_queue)
7601			break;
7602	}
 
 
 
7603
7604unlock:
7605	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
 
7606
7607	if (num_entries > 0)
7608		atomic_add(num_entries, &sdeb_mq_poll_count);
7609	return num_entries;
7610}
7611
7612static int scsi_debug_queuecommand(struct Scsi_Host *shost,
7613				   struct scsi_cmnd *scp)
7614{
7615	u8 sdeb_i;
7616	struct scsi_device *sdp = scp->device;
7617	const struct opcode_info_t *oip;
7618	const struct opcode_info_t *r_oip;
7619	struct sdebug_dev_info *devip;
7620	u8 *cmd = scp->cmnd;
7621	int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
7622	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *) = NULL;
7623	int k, na;
7624	int errsts = 0;
7625	u64 lun_index = sdp->lun & 0x3FFF;
7626	u32 flags;
7627	u16 sa;
7628	u8 opcode = cmd[0];
7629	bool has_wlun_rl;
7630	bool inject_now;
7631
7632	scsi_set_resid(scp, 0);
7633	if (sdebug_statistics) {
7634		atomic_inc(&sdebug_cmnd_count);
7635		inject_now = inject_on_this_cmd();
7636	} else {
7637		inject_now = false;
7638	}
7639	if (unlikely(sdebug_verbose &&
7640		     !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
7641		char b[120];
7642		int n, len, sb;
7643
7644		len = scp->cmd_len;
7645		sb = (int)sizeof(b);
7646		if (len > 32)
7647			strcpy(b, "too long, over 32 bytes");
7648		else {
7649			for (k = 0, n = 0; k < len && n < sb; ++k)
7650				n += scnprintf(b + n, sb - n, "%02x ",
7651					       (u32)cmd[k]);
7652		}
7653		sdev_printk(KERN_INFO, sdp, "%s: tag=%#x, cmd %s\n", my_name,
7654			    blk_mq_unique_tag(scsi_cmd_to_rq(scp)), b);
7655	}
7656	if (unlikely(inject_now && (sdebug_opts & SDEBUG_OPT_HOST_BUSY)))
7657		return SCSI_MLQUEUE_HOST_BUSY;
7658	has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
7659	if (unlikely(lun_index >= sdebug_max_luns && !has_wlun_rl))
7660		goto err_out;
7661
7662	sdeb_i = opcode_ind_arr[opcode];	/* fully mapped */
7663	oip = &opcode_info_arr[sdeb_i];		/* safe if table consistent */
7664	devip = (struct sdebug_dev_info *)sdp->hostdata;
7665	if (unlikely(!devip)) {
7666		devip = find_build_dev_info(sdp);
7667		if (NULL == devip)
7668			goto err_out;
7669	}
7670	if (unlikely(inject_now && !atomic_read(&sdeb_inject_pending)))
7671		atomic_set(&sdeb_inject_pending, 1);
7672
7673	na = oip->num_attached;
7674	r_pfp = oip->pfp;
7675	if (na) {	/* multiple commands with this opcode */
7676		r_oip = oip;
7677		if (FF_SA & r_oip->flags) {
7678			if (F_SA_LOW & oip->flags)
7679				sa = 0x1f & cmd[1];
7680			else
7681				sa = get_unaligned_be16(cmd + 8);
7682			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7683				if (opcode == oip->opcode && sa == oip->sa)
7684					break;
7685			}
7686		} else {   /* since no service action only check opcode */
7687			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7688				if (opcode == oip->opcode)
7689					break;
7690			}
7691		}
7692		if (k > na) {
7693			if (F_SA_LOW & r_oip->flags)
7694				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
7695			else if (F_SA_HIGH & r_oip->flags)
7696				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
7697			else
7698				mk_sense_invalid_opcode(scp);
7699			goto check_cond;
7700		}
7701	}	/* else (when na==0) we assume the oip is a match */
7702	flags = oip->flags;
7703	if (unlikely(F_INV_OP & flags)) {
7704		mk_sense_invalid_opcode(scp);
7705		goto check_cond;
7706	}
7707	if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
7708		if (sdebug_verbose)
7709			sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
7710				    my_name, opcode, " supported for wlun");
7711		mk_sense_invalid_opcode(scp);
7712		goto check_cond;
7713	}
7714	if (unlikely(sdebug_strict)) {	/* check cdb against mask */
7715		u8 rem;
7716		int j;
7717
7718		for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
7719			rem = ~oip->len_mask[k] & cmd[k];
7720			if (rem) {
7721				for (j = 7; j >= 0; --j, rem <<= 1) {
7722					if (0x80 & rem)
7723						break;
7724				}
7725				mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
7726				goto check_cond;
7727			}
7728		}
7729	}
7730	if (unlikely(!(F_SKIP_UA & flags) &&
7731		     find_first_bit(devip->uas_bm,
7732				    SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
7733		errsts = make_ua(scp, devip);
7734		if (errsts)
7735			goto check_cond;
 
 
 
7736	}
7737	if (unlikely(((F_M_ACCESS & flags) || scp->cmnd[0] == TEST_UNIT_READY) &&
7738		     atomic_read(&devip->stopped))) {
7739		errsts = resp_not_ready(scp, devip);
7740		if (errsts)
7741			goto fini;
7742	}
7743	if (sdebug_fake_rw && (F_FAKE_RW & flags))
7744		goto fini;
7745	if (unlikely(sdebug_every_nth)) {
7746		if (fake_timeout(scp))
7747			return 0;	/* ignore command: make trouble */
7748	}
7749	if (likely(oip->pfp))
7750		pfp = oip->pfp;	/* calls a resp_* function */
7751	else
7752		pfp = r_pfp;    /* if leaf function ptr NULL, try the root's */
7753
7754fini:
7755	if (F_DELAY_OVERR & flags)	/* cmds like INQUIRY respond asap */
7756		return schedule_resp(scp, devip, errsts, pfp, 0, 0);
7757	else if ((flags & F_LONG_DELAY) && (sdebug_jdelay > 0 ||
7758					    sdebug_ndelay > 10000)) {
7759		/*
7760		 * Skip long delays if ndelay <= 10 microseconds. Otherwise
7761		 * for Start Stop Unit (SSU) want at least 1 second delay and
7762		 * if sdebug_jdelay>1 want a long delay of that many seconds.
7763		 * For Synchronize Cache want 1/20 of SSU's delay.
7764		 */
7765		int jdelay = (sdebug_jdelay < 2) ? 1 : sdebug_jdelay;
7766		int denom = (flags & F_SYNC_DELAY) ? 20 : 1;
7767
7768		jdelay = mult_frac(USER_HZ * jdelay, HZ, denom * USER_HZ);
7769		return schedule_resp(scp, devip, errsts, pfp, jdelay, 0);
7770	} else
7771		return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay,
7772				     sdebug_ndelay);
7773check_cond:
7774	return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0);
7775err_out:
7776	return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, NULL, 0, 0);
7777}
7778
7779static struct scsi_host_template sdebug_driver_template = {
7780	.show_info =		scsi_debug_show_info,
7781	.write_info =		scsi_debug_write_info,
7782	.proc_name =		sdebug_proc_name,
7783	.name =			"SCSI DEBUG",
7784	.info =			scsi_debug_info,
7785	.slave_alloc =		scsi_debug_slave_alloc,
7786	.slave_configure =	scsi_debug_slave_configure,
7787	.slave_destroy =	scsi_debug_slave_destroy,
7788	.ioctl =		scsi_debug_ioctl,
7789	.queuecommand =		scsi_debug_queuecommand,
7790	.change_queue_depth =	sdebug_change_qdepth,
7791	.map_queues =		sdebug_map_queues,
7792	.mq_poll =		sdebug_blk_mq_poll,
7793	.eh_abort_handler =	scsi_debug_abort,
 
7794	.eh_device_reset_handler = scsi_debug_device_reset,
7795	.eh_target_reset_handler = scsi_debug_target_reset,
7796	.eh_bus_reset_handler = scsi_debug_bus_reset,
7797	.eh_host_reset_handler = scsi_debug_host_reset,
7798	.can_queue =		SDEBUG_CANQUEUE,
 
7799	.this_id =		7,
7800	.sg_tablesize =		SG_MAX_SEGMENTS,
7801	.cmd_per_lun =		DEF_CMD_PER_LUN,
7802	.max_sectors =		-1U,
7803	.max_segment_size =	-1U,
7804	.module =		THIS_MODULE,
7805	.track_queue_depth =	1,
7806};
7807
7808static int sdebug_driver_probe(struct device *dev)
7809{
7810	int error = 0;
7811	struct sdebug_host_info *sdbg_host;
7812	struct Scsi_Host *hpnt;
7813	int hprot;
7814
7815	sdbg_host = to_sdebug_host(dev);
7816
7817	sdebug_driver_template.can_queue = sdebug_max_queue;
7818	sdebug_driver_template.cmd_per_lun = sdebug_max_queue;
7819	if (!sdebug_clustering)
7820		sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
7821
7822	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
7823	if (NULL == hpnt) {
7824		pr_err("scsi_host_alloc failed\n");
7825		error = -ENODEV;
7826		return error;
7827	}
7828	if (submit_queues > nr_cpu_ids) {
7829		pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%u\n",
7830			my_name, submit_queues, nr_cpu_ids);
7831		submit_queues = nr_cpu_ids;
7832	}
7833	/*
7834	 * Decide whether to tell scsi subsystem that we want mq. The
7835	 * following should give the same answer for each host.
7836	 */
7837	hpnt->nr_hw_queues = submit_queues;
7838	if (sdebug_host_max_queue)
7839		hpnt->host_tagset = 1;
7840
7841	/* poll queues are possible for nr_hw_queues > 1 */
7842	if (hpnt->nr_hw_queues == 1 || (poll_queues < 1)) {
7843		pr_warn("%s: trim poll_queues to 0. poll_q/nr_hw = (%d/%d)\n",
7844			 my_name, poll_queues, hpnt->nr_hw_queues);
7845		poll_queues = 0;
7846	}
7847
7848	/*
7849	 * Poll queues don't need interrupts, but we need at least one I/O queue
7850	 * left over for non-polled I/O.
7851	 * If condition not met, trim poll_queues to 1 (just for simplicity).
7852	 */
7853	if (poll_queues >= submit_queues) {
7854		if (submit_queues < 3)
7855			pr_warn("%s: trim poll_queues to 1\n", my_name);
7856		else
7857			pr_warn("%s: trim poll_queues to 1. Perhaps try poll_queues=%d\n",
7858				my_name, submit_queues - 1);
7859		poll_queues = 1;
7860	}
7861	if (poll_queues)
7862		hpnt->nr_maps = 3;
7863
7864	sdbg_host->shost = hpnt;
7865	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
7866	if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
7867		hpnt->max_id = sdebug_num_tgts + 1;
7868	else
7869		hpnt->max_id = sdebug_num_tgts;
7870	/* = sdebug_max_luns; */
7871	hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
7872
7873	hprot = 0;
7874
7875	switch (sdebug_dif) {
7876
7877	case T10_PI_TYPE1_PROTECTION:
7878		hprot = SHOST_DIF_TYPE1_PROTECTION;
7879		if (sdebug_dix)
7880			hprot |= SHOST_DIX_TYPE1_PROTECTION;
7881		break;
7882
7883	case T10_PI_TYPE2_PROTECTION:
7884		hprot = SHOST_DIF_TYPE2_PROTECTION;
7885		if (sdebug_dix)
7886			hprot |= SHOST_DIX_TYPE2_PROTECTION;
7887		break;
7888
7889	case T10_PI_TYPE3_PROTECTION:
7890		hprot = SHOST_DIF_TYPE3_PROTECTION;
7891		if (sdebug_dix)
7892			hprot |= SHOST_DIX_TYPE3_PROTECTION;
7893		break;
7894
7895	default:
7896		if (sdebug_dix)
7897			hprot |= SHOST_DIX_TYPE0_PROTECTION;
7898		break;
7899	}
7900
7901	scsi_host_set_prot(hpnt, hprot);
7902
7903	if (have_dif_prot || sdebug_dix)
7904		pr_info("host protection%s%s%s%s%s%s%s\n",
7905			(hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
7906			(hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
7907			(hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
7908			(hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
7909			(hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
7910			(hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
7911			(hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
7912
7913	if (sdebug_guard == 1)
7914		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
7915	else
7916		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
7917
7918	sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
7919	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
7920	if (sdebug_every_nth)	/* need stats counters for every_nth */
7921		sdebug_statistics = true;
7922	error = scsi_add_host(hpnt, &sdbg_host->dev);
7923	if (error) {
7924		pr_err("scsi_add_host failed\n");
7925		error = -ENODEV;
7926		scsi_host_put(hpnt);
7927	} else {
7928		scsi_scan_host(hpnt);
7929	}
7930
7931	return error;
 
7932}
7933
7934static void sdebug_driver_remove(struct device *dev)
7935{
7936	struct sdebug_host_info *sdbg_host;
7937	struct sdebug_dev_info *sdbg_devinfo, *tmp;
7938
7939	sdbg_host = to_sdebug_host(dev);
7940
7941	scsi_remove_host(sdbg_host->shost);
 
 
 
 
 
 
7942
7943	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7944				 dev_list) {
7945		list_del(&sdbg_devinfo->dev_list);
7946		kfree(sdbg_devinfo->zstate);
7947		kfree(sdbg_devinfo);
7948	}
7949
7950	scsi_host_put(sdbg_host->shost);
 
7951}
7952
7953static int pseudo_lld_bus_match(struct device *dev,
7954				struct device_driver *dev_driver)
7955{
7956	return 1;
7957}
7958
7959static struct bus_type pseudo_lld_bus = {
7960	.name = "pseudo",
7961	.match = pseudo_lld_bus_match,
7962	.probe = sdebug_driver_probe,
7963	.remove = sdebug_driver_remove,
7964	.drv_groups = sdebug_drv_groups,
7965};