Linux Audio

Check our new training course

Loading...
v5.14.15
   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 - 2020 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
  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/genhd.h>
  27#include <linux/fs.h>
  28#include <linux/init.h>
  29#include <linux/proc_fs.h>
  30#include <linux/vmalloc.h>
  31#include <linux/moduleparam.h>
  32#include <linux/scatterlist.h>
  33#include <linux/blkdev.h>
  34#include <linux/crc-t10dif.h>
  35#include <linux/spinlock.h>
  36#include <linux/interrupt.h>
  37#include <linux/atomic.h>
  38#include <linux/hrtimer.h>
  39#include <linux/uuid.h>
  40#include <linux/t10-pi.h>
  41#include <linux/msdos_partition.h>
  42#include <linux/random.h>
  43#include <linux/xarray.h>
  44#include <linux/prefetch.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_tcq.h>
  57#include <scsi/scsi_dbg.h>
  58
  59#include "sd.h"
  60#include "scsi_logging.h"
  61
  62/* make sure inq_product_rev string corresponds to this version */
  63#define SDEBUG_VERSION "0190"	/* format to fit INQUIRY revision field */
  64static const char *sdebug_version_date = "20200710";
  65
  66#define MY_NAME "scsi_debug"
  67
  68/* Additional Sense Code (ASC) */
  69#define NO_ADDITIONAL_SENSE 0x0
  70#define LOGICAL_UNIT_NOT_READY 0x4
  71#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
  72#define UNRECOVERED_READ_ERR 0x11
  73#define PARAMETER_LIST_LENGTH_ERR 0x1a
  74#define INVALID_OPCODE 0x20
  75#define LBA_OUT_OF_RANGE 0x21
  76#define INVALID_FIELD_IN_CDB 0x24
  77#define INVALID_FIELD_IN_PARAM_LIST 0x26
  78#define WRITE_PROTECTED 0x27
  79#define UA_RESET_ASC 0x29
  80#define UA_CHANGED_ASC 0x2a
  81#define TARGET_CHANGED_ASC 0x3f
  82#define LUNS_CHANGED_ASCQ 0x0e
  83#define INSUFF_RES_ASC 0x55
  84#define INSUFF_RES_ASCQ 0x3
  85#define POWER_ON_RESET_ASCQ 0x0
  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 INSUFF_ZONE_ASCQ 0xe
 102
 103/* Additional Sense Code Qualifier (ASCQ) */
 104#define ACK_NAK_TO 0x3
 105
 106/* Default values for driver parameters */
 107#define DEF_NUM_HOST   1
 108#define DEF_NUM_TGTS   1
 109#define DEF_MAX_LUNS   1
 110/* With these defaults, this driver will make 1 host with 1 target
 111 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
 112 */
 113#define DEF_ATO 1
 114#define DEF_CDB_LEN 10
 115#define DEF_JDELAY   1		/* if > 0 unit is a jiffy */
 116#define DEF_DEV_SIZE_PRE_INIT   0
 117#define DEF_DEV_SIZE_MB   8
 118#define DEF_ZBC_DEV_SIZE_MB   128
 119#define DEF_DIF 0
 120#define DEF_DIX 0
 121#define DEF_PER_HOST_STORE false
 122#define DEF_D_SENSE   0
 123#define DEF_EVERY_NTH   0
 124#define DEF_FAKE_RW	0
 125#define DEF_GUARD 0
 126#define DEF_HOST_LOCK 0
 127#define DEF_LBPU 0
 128#define DEF_LBPWS 0
 129#define DEF_LBPWS10 0
 130#define DEF_LBPRZ 1
 131#define DEF_LOWEST_ALIGNED 0
 132#define DEF_NDELAY   0		/* if > 0 unit is a nanosecond */
 133#define DEF_NO_LUN_0   0
 134#define DEF_NUM_PARTS   0
 135#define DEF_OPTS   0
 136#define DEF_OPT_BLKS 1024
 137#define DEF_PHYSBLK_EXP 0
 138#define DEF_OPT_XFERLEN_EXP 0
 139#define DEF_PTYPE   TYPE_DISK
 140#define DEF_RANDOM false
 141#define DEF_REMOVABLE false
 142#define DEF_SCSI_LEVEL   7    /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
 143#define DEF_SECTOR_SIZE 512
 144#define DEF_UNMAP_ALIGNMENT 0
 145#define DEF_UNMAP_GRANULARITY 1
 146#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
 147#define DEF_UNMAP_MAX_DESC 256
 148#define DEF_VIRTUAL_GB   0
 149#define DEF_VPD_USE_HOSTNO 1
 150#define DEF_WRITESAME_LENGTH 0xFFFF
 151#define DEF_STRICT 0
 152#define DEF_STATISTICS false
 153#define DEF_SUBMIT_QUEUES 1
 154#define DEF_TUR_MS_TO_READY 0
 155#define DEF_UUID_CTL 0
 156#define JDELAY_OVERRIDDEN -9999
 157
 158/* Default parameters for ZBC drives */
 159#define DEF_ZBC_ZONE_SIZE_MB	128
 160#define DEF_ZBC_MAX_OPEN_ZONES	8
 161#define DEF_ZBC_NR_CONV_ZONES	1
 162
 163#define SDEBUG_LUN_0_VAL 0
 164
 165/* bit mask values for sdebug_opts */
 166#define SDEBUG_OPT_NOISE		1
 167#define SDEBUG_OPT_MEDIUM_ERR		2
 168#define SDEBUG_OPT_TIMEOUT		4
 169#define SDEBUG_OPT_RECOVERED_ERR	8
 170#define SDEBUG_OPT_TRANSPORT_ERR	16
 171#define SDEBUG_OPT_DIF_ERR		32
 172#define SDEBUG_OPT_DIX_ERR		64
 173#define SDEBUG_OPT_MAC_TIMEOUT		128
 174#define SDEBUG_OPT_SHORT_TRANSFER	0x100
 175#define SDEBUG_OPT_Q_NOISE		0x200
 176#define SDEBUG_OPT_ALL_TSF		0x400
 177#define SDEBUG_OPT_RARE_TSF		0x800
 178#define SDEBUG_OPT_N_WCE		0x1000
 179#define SDEBUG_OPT_RESET_NOISE		0x2000
 180#define SDEBUG_OPT_NO_CDB_NOISE		0x4000
 181#define SDEBUG_OPT_HOST_BUSY		0x8000
 182#define SDEBUG_OPT_CMD_ABORT		0x10000
 183#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
 184			      SDEBUG_OPT_RESET_NOISE)
 185#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
 186				  SDEBUG_OPT_TRANSPORT_ERR | \
 187				  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
 188				  SDEBUG_OPT_SHORT_TRANSFER | \
 189				  SDEBUG_OPT_HOST_BUSY | \
 190				  SDEBUG_OPT_CMD_ABORT)
 191#define SDEBUG_OPT_RECOV_DIF_DIX (SDEBUG_OPT_RECOVERED_ERR | \
 192				  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR)
 
 
 
 
 
 
 
 
 
 
 
 
 
 193
 194/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
 195 * priority order. In the subset implemented here lower numbers have higher
 196 * priority. The UA numbers should be a sequence starting from 0 with
 197 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
 198#define SDEBUG_UA_POR 0		/* Power on, reset, or bus device reset */
 199#define SDEBUG_UA_BUS_RESET 1
 200#define SDEBUG_UA_MODE_CHANGED 2
 201#define SDEBUG_UA_CAPACITY_CHANGED 3
 202#define SDEBUG_UA_LUNS_CHANGED 4
 203#define SDEBUG_UA_MICROCODE_CHANGED 5	/* simulate firmware change */
 204#define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 6
 205#define SDEBUG_NUM_UAS 7
 206
 207/* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 208 * sector on read commands: */
 209#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 210#define OPT_MEDIUM_ERR_NUM    10     /* number of consecutive medium errs */
 211
 
 
 
 
 212/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
 213 * (for response) per submit queue at one time. Can be reduced by max_queue
 214 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
 215 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
 216 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
 217 * but cannot exceed SDEBUG_CANQUEUE .
 218 */
 219#define SDEBUG_CANQUEUE_WORDS  3	/* a WORD is bits in a long */
 220#define SDEBUG_CANQUEUE  (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
 221#define DEF_CMD_PER_LUN  SDEBUG_CANQUEUE
 222
 223/* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */
 224#define F_D_IN			1	/* Data-in command (e.g. READ) */
 225#define F_D_OUT			2	/* Data-out command (e.g. WRITE) */
 226#define F_D_OUT_MAYBE		4	/* WRITE SAME, NDOB bit */
 227#define F_D_UNKN		8
 228#define F_RL_WLUN_OK		0x10	/* allowed with REPORT LUNS W-LUN */
 229#define F_SKIP_UA		0x20	/* bypass UAs (e.g. INQUIRY command) */
 230#define F_DELAY_OVERR		0x40	/* for commands like INQUIRY */
 231#define F_SA_LOW		0x80	/* SA is in cdb byte 1, bits 4 to 0 */
 232#define F_SA_HIGH		0x100	/* SA is in cdb bytes 8 and 9 */
 233#define F_INV_OP		0x200	/* invalid opcode (not supported) */
 234#define F_FAKE_RW		0x400	/* bypass resp_*() when fake_rw set */
 235#define F_M_ACCESS		0x800	/* media access, reacts to SSU state */
 236#define F_SSU_DELAY		0x1000	/* SSU command delay (long-ish) */
 237#define F_SYNC_DELAY		0x2000	/* SYNCHRONIZE CACHE delay */
 238
 239/* Useful combinations of the above flags */
 240#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
 241#define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
 242#define FF_SA (F_SA_HIGH | F_SA_LOW)
 243#define F_LONG_DELAY		(F_SSU_DELAY | F_SYNC_DELAY)
 244
 245#define SDEBUG_MAX_PARTS 4
 246
 247#define SDEBUG_MAX_CMD_LEN 32
 248
 249#define SDEB_XA_NOT_IN_USE XA_MARK_1
 250
 251/* Zone types (zbcr05 table 25) */
 252enum sdebug_z_type {
 253	ZBC_ZONE_TYPE_CNV	= 0x1,
 254	ZBC_ZONE_TYPE_SWR	= 0x2,
 255	ZBC_ZONE_TYPE_SWP	= 0x3,
 256};
 257
 258/* enumeration names taken from table 26, zbcr05 */
 259enum sdebug_z_cond {
 260	ZBC_NOT_WRITE_POINTER	= 0x0,
 261	ZC1_EMPTY		= 0x1,
 262	ZC2_IMPLICIT_OPEN	= 0x2,
 263	ZC3_EXPLICIT_OPEN	= 0x3,
 264	ZC4_CLOSED		= 0x4,
 265	ZC6_READ_ONLY		= 0xd,
 266	ZC5_FULL		= 0xe,
 267	ZC7_OFFLINE		= 0xf,
 268};
 269
 270struct sdeb_zone_state {	/* ZBC: per zone state */
 271	enum sdebug_z_type z_type;
 272	enum sdebug_z_cond z_cond;
 273	bool z_non_seq_resource;
 274	unsigned int z_size;
 275	sector_t z_start;
 276	sector_t z_wp;
 277};
 278
 279struct sdebug_dev_info {
 280	struct list_head dev_list;
 281	unsigned int channel;
 282	unsigned int target;
 283	u64 lun;
 284	uuid_t lu_name;
 285	struct sdebug_host_info *sdbg_host;
 286	unsigned long uas_bm[1];
 287	atomic_t num_in_q;
 288	atomic_t stopped;	/* 1: by SSU, 2: device start */
 289	bool used;
 290
 291	/* For ZBC devices */
 292	enum blk_zoned_model zmodel;
 293	unsigned int zsize;
 294	unsigned int zsize_shift;
 295	unsigned int nr_zones;
 296	unsigned int nr_conv_zones;
 297	unsigned int nr_imp_open;
 298	unsigned int nr_exp_open;
 299	unsigned int nr_closed;
 300	unsigned int max_open;
 301	ktime_t create_ts;	/* time since bootup that this device was created */
 302	struct sdeb_zone_state *zstate;
 303};
 304
 305struct sdebug_host_info {
 306	struct list_head host_list;
 307	int si_idx;	/* sdeb_store_info (per host) xarray index */
 308	struct Scsi_Host *shost;
 309	struct device dev;
 310	struct list_head dev_info_list;
 311};
 312
 313/* There is an xarray of pointers to this struct's objects, one per host */
 314struct sdeb_store_info {
 315	rwlock_t macc_lck;	/* for atomic media access on this store */
 316	u8 *storep;		/* user data storage (ram) */
 317	struct t10_pi_tuple *dif_storep; /* protection info */
 318	void *map_storep;	/* provisioning map */
 319};
 320
 321#define to_sdebug_host(d)	\
 322	container_of(d, struct sdebug_host_info, dev)
 323
 324enum sdeb_defer_type {SDEB_DEFER_NONE = 0, SDEB_DEFER_HRT = 1,
 325		      SDEB_DEFER_WQ = 2, SDEB_DEFER_POLL = 3};
 326
 327struct sdebug_defer {
 328	struct hrtimer hrt;
 329	struct execute_work ew;
 330	ktime_t cmpl_ts;/* time since boot to complete this cmd */
 331	int sqa_idx;	/* index of sdebug_queue array */
 332	int qc_idx;	/* index of sdebug_queued_cmd array within sqa_idx */
 333	int hc_idx;	/* hostwide tag index */
 334	int issuing_cpu;
 335	bool init_hrt;
 336	bool init_wq;
 337	bool init_poll;
 338	bool aborted;	/* true when blk_abort_request() already called */
 339	enum sdeb_defer_type defer_t;
 340};
 341
 342struct sdebug_queued_cmd {
 343	/* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
 344	 * instance indicates this slot is in use.
 345	 */
 346	struct sdebug_defer *sd_dp;
 347	struct scsi_cmnd *a_cmnd;
 
 
 
 
 
 
 
 348};
 349
 350struct sdebug_queue {
 351	struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
 352	unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
 353	spinlock_t qc_lock;
 354	atomic_t blocked;	/* to temporarily stop more being queued */
 355};
 356
 357static atomic_t sdebug_cmnd_count;   /* number of incoming commands */
 358static atomic_t sdebug_completions;  /* count of deferred completions */
 359static atomic_t sdebug_miss_cpus;    /* submission + completion cpus differ */
 360static atomic_t sdebug_a_tsf;	     /* 'almost task set full' counter */
 361static atomic_t sdeb_inject_pending;
 362static atomic_t sdeb_mq_poll_count;  /* bumped when mq_poll returns > 0 */
 363
 364struct opcode_info_t {
 365	u8 num_attached;	/* 0 if this is it (i.e. a leaf); use 0xff */
 366				/* for terminating element */
 367	u8 opcode;		/* if num_attached > 0, preferred */
 368	u16 sa;			/* service action */
 369	u32 flags;		/* OR-ed set of SDEB_F_* */
 370	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
 371	const struct opcode_info_t *arrp;  /* num_attached elements or NULL */
 372	u8 len_mask[16];	/* len_mask[0]-->cdb_len, then mask for cdb */
 373				/* 1 to min(cdb_len, 15); ignore cdb[15...] */
 374};
 375
 376/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
 377enum sdeb_opcode_index {
 378	SDEB_I_INVALID_OPCODE =	0,
 379	SDEB_I_INQUIRY = 1,
 380	SDEB_I_REPORT_LUNS = 2,
 381	SDEB_I_REQUEST_SENSE = 3,
 382	SDEB_I_TEST_UNIT_READY = 4,
 383	SDEB_I_MODE_SENSE = 5,		/* 6, 10 */
 384	SDEB_I_MODE_SELECT = 6,		/* 6, 10 */
 385	SDEB_I_LOG_SENSE = 7,
 386	SDEB_I_READ_CAPACITY = 8,	/* 10; 16 is in SA_IN(16) */
 387	SDEB_I_READ = 9,		/* 6, 10, 12, 16 */
 388	SDEB_I_WRITE = 10,		/* 6, 10, 12, 16 */
 389	SDEB_I_START_STOP = 11,
 390	SDEB_I_SERV_ACT_IN_16 = 12,	/* add ...SERV_ACT_IN_12 if needed */
 391	SDEB_I_SERV_ACT_OUT_16 = 13,	/* add ...SERV_ACT_OUT_12 if needed */
 392	SDEB_I_MAINT_IN = 14,
 393	SDEB_I_MAINT_OUT = 15,
 394	SDEB_I_VERIFY = 16,		/* VERIFY(10), VERIFY(16) */
 395	SDEB_I_VARIABLE_LEN = 17,	/* READ(32), WRITE(32), WR_SCAT(32) */
 396	SDEB_I_RESERVE = 18,		/* 6, 10 */
 397	SDEB_I_RELEASE = 19,		/* 6, 10 */
 398	SDEB_I_ALLOW_REMOVAL = 20,	/* PREVENT ALLOW MEDIUM REMOVAL */
 399	SDEB_I_REZERO_UNIT = 21,	/* REWIND in SSC */
 400	SDEB_I_ATA_PT = 22,		/* 12, 16 */
 401	SDEB_I_SEND_DIAG = 23,
 402	SDEB_I_UNMAP = 24,
 403	SDEB_I_WRITE_BUFFER = 25,
 404	SDEB_I_WRITE_SAME = 26,		/* 10, 16 */
 405	SDEB_I_SYNC_CACHE = 27,		/* 10, 16 */
 406	SDEB_I_COMP_WRITE = 28,
 407	SDEB_I_PRE_FETCH = 29,		/* 10, 16 */
 408	SDEB_I_ZONE_OUT = 30,		/* 0x94+SA; includes no data xfer */
 409	SDEB_I_ZONE_IN = 31,		/* 0x95+SA; all have data-in */
 410	SDEB_I_LAST_ELEM_P1 = 32,	/* keep this last (previous + 1) */
 411};
 412
 413
 414static const unsigned char opcode_ind_arr[256] = {
 415/* 0x0; 0x0->0x1f: 6 byte cdbs */
 416	SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
 417	    0, 0, 0, 0,
 418	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 419	0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 420	    SDEB_I_RELEASE,
 421	0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
 422	    SDEB_I_ALLOW_REMOVAL, 0,
 423/* 0x20; 0x20->0x3f: 10 byte cdbs */
 424	0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
 425	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
 426	0, 0, 0, 0, SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, 0,
 427	0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
 428/* 0x40; 0x40->0x5f: 10 byte cdbs */
 429	0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
 430	0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
 431	0, 0, 0, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 432	    SDEB_I_RELEASE,
 433	0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
 434/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
 435	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 436	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 437	0, SDEB_I_VARIABLE_LEN,
 438/* 0x80; 0x80->0x9f: 16 byte cdbs */
 439	0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
 440	SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0,
 441	0, 0, 0, SDEB_I_VERIFY,
 442	SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, SDEB_I_WRITE_SAME,
 443	SDEB_I_ZONE_OUT, SDEB_I_ZONE_IN, 0, 0,
 444	0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
 445/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
 446	SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
 447	     SDEB_I_MAINT_OUT, 0, 0, 0,
 448	SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
 449	     0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
 450	0, 0, 0, 0, 0, 0, 0, 0,
 451	0, 0, 0, 0, 0, 0, 0, 0,
 452/* 0xc0; 0xc0->0xff: vendor specific */
 453	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 454	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 455	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 456	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 457};
 458
 459/*
 460 * The following "response" functions return the SCSI mid-level's 4 byte
 461 * tuple-in-an-int. To handle commands with an IMMED bit, for a faster
 462 * command completion, they can mask their return value with
 463 * SDEG_RES_IMMED_MASK .
 464 */
 465#define SDEG_RES_IMMED_MASK 0x40000000
 466
 467static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
 468static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
 469static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
 470static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 471static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
 472static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 473static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
 474static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 475static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 476static int resp_write_scat(struct scsi_cmnd *, struct sdebug_dev_info *);
 477static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
 478static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
 479static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
 480static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
 481static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
 482static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
 483static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
 484static int resp_verify(struct scsi_cmnd *, struct sdebug_dev_info *);
 485static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
 486static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
 487static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
 488static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
 489static int resp_sync_cache(struct scsi_cmnd *, struct sdebug_dev_info *);
 490static int resp_pre_fetch(struct scsi_cmnd *, struct sdebug_dev_info *);
 491static int resp_report_zones(struct scsi_cmnd *, struct sdebug_dev_info *);
 492static int resp_open_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 493static int resp_close_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 494static int resp_finish_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 495static int resp_rwp_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 496
 497static int sdebug_do_add_host(bool mk_new_store);
 498static int sdebug_add_host_helper(int per_host_idx);
 499static void sdebug_do_remove_host(bool the_end);
 500static int sdebug_add_store(void);
 501static void sdebug_erase_store(int idx, struct sdeb_store_info *sip);
 502static void sdebug_erase_all_stores(bool apart_from_first);
 503
 504/*
 505 * The following are overflow arrays for cdbs that "hit" the same index in
 506 * the opcode_info_arr array. The most time sensitive (or commonly used) cdb
 507 * should be placed in opcode_info_arr[], the others should be placed here.
 508 */
 509static const struct opcode_info_t msense_iarr[] = {
 510	{0, 0x1a, 0, F_D_IN, NULL, NULL,
 511	    {6,  0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 512};
 513
 514static const struct opcode_info_t mselect_iarr[] = {
 515	{0, 0x15, 0, F_D_OUT, NULL, NULL,
 516	    {6,  0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 517};
 518
 519static const struct opcode_info_t read_iarr[] = {
 520	{0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
 521	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 522	     0, 0, 0, 0} },
 523	{0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
 524	    {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 525	{0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
 526	    {12,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
 527	     0xc7, 0, 0, 0, 0} },
 528};
 529
 530static const struct opcode_info_t write_iarr[] = {
 531	{0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(10) */
 532	    NULL, {10,  0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
 533		   0, 0, 0, 0, 0, 0} },
 534	{0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,   /* WRITE(6) */
 535	    NULL, {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
 536		   0, 0, 0} },
 537	{0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(12) */
 538	    NULL, {12,  0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 539		   0xbf, 0xc7, 0, 0, 0, 0} },
 540};
 541
 542static const struct opcode_info_t verify_iarr[] = {
 543	{0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,/* VERIFY(10) */
 544	    NULL, {10,  0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc7,
 545		   0, 0, 0, 0, 0, 0} },
 546};
 547
 548static const struct opcode_info_t sa_in_16_iarr[] = {
 549	{0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
 550	    {16,  0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 551	     0xff, 0xff, 0xff, 0, 0xc7} },	/* GET LBA STATUS(16) */
 552};
 553
 554static const struct opcode_info_t vl_iarr[] = {	/* VARIABLE LENGTH */
 555	{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
 556	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
 557		   0, 0xff, 0xff, 0xff, 0xff} },	/* WRITE(32) */
 558	{0, 0x7f, 0x11, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 559	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x11, 0xf8,
 560		   0, 0xff, 0xff, 0x0, 0x0} },	/* WRITE SCATTERED(32) */
 561};
 562
 563static const struct opcode_info_t maint_in_iarr[] = {	/* MAINT IN */
 564	{0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
 565	    {12,  0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
 566	     0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
 567	{0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
 568	    {12,  0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 569	     0, 0} },	/* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
 570};
 571
 572static const struct opcode_info_t write_same_iarr[] = {
 573	{0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
 574	    {16,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 575	     0xff, 0xff, 0xff, 0x3f, 0xc7} },		/* WRITE SAME(16) */
 576};
 577
 578static const struct opcode_info_t reserve_iarr[] = {
 579	{0, 0x16, 0, F_D_OUT, NULL, NULL,		/* RESERVE(6) */
 580	    {6,  0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 581};
 582
 583static const struct opcode_info_t release_iarr[] = {
 584	{0, 0x17, 0, F_D_OUT, NULL, NULL,		/* RELEASE(6) */
 585	    {6,  0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 586};
 587
 588static const struct opcode_info_t sync_cache_iarr[] = {
 589	{0, 0x91, 0, F_SYNC_DELAY | F_M_ACCESS, resp_sync_cache, NULL,
 590	    {16,  0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 591	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* SYNC_CACHE (16) */
 592};
 593
 594static const struct opcode_info_t pre_fetch_iarr[] = {
 595	{0, 0x90, 0, F_SYNC_DELAY | FF_MEDIA_IO, resp_pre_fetch, NULL,
 596	    {16,  0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 597	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* PRE-FETCH (16) */
 598};
 599
 600static const struct opcode_info_t zone_out_iarr[] = {	/* ZONE OUT(16) */
 601	{0, 0x94, 0x1, F_SA_LOW | F_M_ACCESS, resp_close_zone, NULL,
 602	    {16, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 603	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },	/* CLOSE ZONE */
 604	{0, 0x94, 0x2, F_SA_LOW | F_M_ACCESS, resp_finish_zone, NULL,
 605	    {16, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 606	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },	/* FINISH ZONE */
 607	{0, 0x94, 0x4, F_SA_LOW | F_M_ACCESS, resp_rwp_zone, NULL,
 608	    {16, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 609	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },  /* RESET WRITE POINTER */
 610};
 611
 612static const struct opcode_info_t zone_in_iarr[] = {	/* ZONE IN(16) */
 613	{0, 0x95, 0x6, F_SA_LOW | F_D_IN | F_M_ACCESS, NULL, NULL,
 614	    {16, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 615	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* REPORT ZONES */
 616};
 617
 618
 619/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
 620 * plus the terminating elements for logic that scans this table such as
 621 * REPORT SUPPORTED OPERATION CODES. */
 622static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEM_P1 + 1] = {
 623/* 0 */
 624	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,	/* unknown opcodes */
 625	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 626	{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
 627	    {6,  0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 628	{0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
 629	    {12,  0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 630	     0, 0} },					/* REPORT LUNS */
 631	{0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
 632	    {6,  0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 633	{0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
 634	    {6,  0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 635/* 5 */
 636	{ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN,	/* MODE SENSE(10) */
 637	    resp_mode_sense, msense_iarr, {10,  0xf8, 0xff, 0xff, 0, 0, 0,
 638		0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 639	{ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT,	/* MODE SELECT(10) */
 640	    resp_mode_select, mselect_iarr, {10,  0xf1, 0, 0, 0, 0, 0, 0xff,
 641		0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 642	{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,	/* LOG SENSE */
 643	    {10,  0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
 644	     0, 0, 0} },
 645	{0, 0x25, 0, F_D_IN, resp_readcap, NULL,    /* READ CAPACITY(10) */
 646	    {10,  0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
 647	     0, 0} },
 648	{ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
 649	    resp_read_dt0, read_iarr, {16,  0xfe, 0xff, 0xff, 0xff, 0xff,
 650	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 651/* 10 */
 652	{ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
 653	    resp_write_dt0, write_iarr,			/* WRITE(16) */
 654		{16,  0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 655		 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 656	{0, 0x1b, 0, F_SSU_DELAY, resp_start_stop, NULL,/* START STOP UNIT */
 657	    {6,  0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 658	{ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
 659	    resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
 660		{16,  0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 661		 0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
 662	{0, 0x9f, 0x12, F_SA_LOW | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 663	    NULL, {16,  0x12, 0xf9, 0x0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff,
 664	    0xff, 0xff, 0xff, 0xff, 0xc7} },  /* SA_OUT(16), WRITE SCAT(16) */
 665	{ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
 666	    resp_report_tgtpgs,	/* MAINT IN, REPORT TARGET PORT GROUPS */
 667		maint_in_iarr, {12,  0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
 668				0xff, 0, 0xc7, 0, 0, 0, 0} },
 669/* 15 */
 670	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
 671	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 672	{ARRAY_SIZE(verify_iarr), 0x8f, 0,
 673	    F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,	/* VERIFY(16) */
 674	    verify_iarr, {16,  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 675			  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },
 676	{ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
 677	    resp_read_dt0, vl_iarr,	/* VARIABLE LENGTH, READ(32) */
 678	    {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
 679	     0xff, 0xff} },
 680	{ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
 681	    NULL, reserve_iarr,	/* RESERVE(10) <no response function> */
 682	    {10,  0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 683	     0} },
 684	{ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
 685	    NULL, release_iarr, /* RELEASE(10) <no response function> */
 686	    {10,  0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 687	     0} },
 688/* 20 */
 689	{0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
 690	    {6,  0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 691	{0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
 692	    {6,  0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 693	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
 694	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 695	{0, 0x1d, F_D_OUT, 0, NULL, NULL,	/* SEND DIAGNOSTIC */
 696	    {6,  0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 697	{0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
 698	    {10,  0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 699/* 25 */
 700	{0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
 701	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
 702	     0, 0, 0, 0} },			/* WRITE_BUFFER */
 703	{ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
 704	    resp_write_same_10, write_same_iarr,	/* WRITE SAME(10) */
 705		{10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
 706		 0, 0, 0, 0, 0} },
 707	{ARRAY_SIZE(sync_cache_iarr), 0x35, 0, F_SYNC_DELAY | F_M_ACCESS,
 708	    resp_sync_cache, sync_cache_iarr,
 709	    {10,  0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 710	     0, 0, 0, 0} },			/* SYNC_CACHE (10) */
 711	{0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
 712	    {16,  0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
 713	     0, 0xff, 0x3f, 0xc7} },		/* COMPARE AND WRITE */
 714	{ARRAY_SIZE(pre_fetch_iarr), 0x34, 0, F_SYNC_DELAY | FF_MEDIA_IO,
 715	    resp_pre_fetch, pre_fetch_iarr,
 716	    {10,  0x2, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 717	     0, 0, 0, 0} },			/* PRE-FETCH (10) */
 718
 719/* 30 */
 720	{ARRAY_SIZE(zone_out_iarr), 0x94, 0x3, F_SA_LOW | F_M_ACCESS,
 721	    resp_open_zone, zone_out_iarr, /* ZONE_OUT(16), OPEN ZONE) */
 722		{16,  0x3 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 723		 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x1, 0xc7} },
 724	{ARRAY_SIZE(zone_in_iarr), 0x95, 0x0, F_SA_LOW | F_M_ACCESS,
 725	    resp_report_zones, zone_in_iarr, /* ZONE_IN(16), REPORT ZONES) */
 726		{16,  0x0 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 727		 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc7} },
 728/* sentinel */
 729	{0xff, 0, 0, 0, NULL, NULL,		/* terminating element */
 730	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 731};
 732
 733static int sdebug_num_hosts;
 734static int sdebug_add_host = DEF_NUM_HOST;  /* in sysfs this is relative */
 735static int sdebug_ato = DEF_ATO;
 736static int sdebug_cdb_len = DEF_CDB_LEN;
 737static int sdebug_jdelay = DEF_JDELAY;	/* if > 0 then unit is jiffies */
 738static int sdebug_dev_size_mb = DEF_DEV_SIZE_PRE_INIT;
 739static int sdebug_dif = DEF_DIF;
 740static int sdebug_dix = DEF_DIX;
 741static int sdebug_dsense = DEF_D_SENSE;
 742static int sdebug_every_nth = DEF_EVERY_NTH;
 743static int sdebug_fake_rw = DEF_FAKE_RW;
 744static unsigned int sdebug_guard = DEF_GUARD;
 745static int sdebug_host_max_queue;	/* per host */
 746static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
 747static int sdebug_max_luns = DEF_MAX_LUNS;
 748static int sdebug_max_queue = SDEBUG_CANQUEUE;	/* per submit queue */
 749static unsigned int sdebug_medium_error_start = OPT_MEDIUM_ERR_ADDR;
 750static int sdebug_medium_error_count = OPT_MEDIUM_ERR_NUM;
 751static atomic_t retired_max_queue;	/* if > 0 then was prior max_queue */
 752static int sdebug_ndelay = DEF_NDELAY;	/* if > 0 then unit is nanoseconds */
 753static int sdebug_no_lun_0 = DEF_NO_LUN_0;
 754static int sdebug_no_uld;
 755static int sdebug_num_parts = DEF_NUM_PARTS;
 756static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 757static int sdebug_opt_blks = DEF_OPT_BLKS;
 758static int sdebug_opts = DEF_OPTS;
 759static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
 760static int sdebug_opt_xferlen_exp = DEF_OPT_XFERLEN_EXP;
 761static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
 762static int sdebug_scsi_level = DEF_SCSI_LEVEL;
 763static int sdebug_sector_size = DEF_SECTOR_SIZE;
 764static int sdeb_tur_ms_to_ready = DEF_TUR_MS_TO_READY;
 765static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
 766static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 767static unsigned int sdebug_lbpu = DEF_LBPU;
 768static unsigned int sdebug_lbpws = DEF_LBPWS;
 769static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
 770static unsigned int sdebug_lbprz = DEF_LBPRZ;
 771static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 772static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 773static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 774static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 775static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
 776static int sdebug_uuid_ctl = DEF_UUID_CTL;
 777static bool sdebug_random = DEF_RANDOM;
 778static bool sdebug_per_host_store = DEF_PER_HOST_STORE;
 779static bool sdebug_removable = DEF_REMOVABLE;
 780static bool sdebug_clustering;
 781static bool sdebug_host_lock = DEF_HOST_LOCK;
 782static bool sdebug_strict = DEF_STRICT;
 783static bool sdebug_any_injecting_opt;
 784static bool sdebug_verbose;
 785static bool have_dif_prot;
 786static bool write_since_sync;
 787static bool sdebug_statistics = DEF_STATISTICS;
 788static bool sdebug_wp;
 789/* Following enum: 0: no zbc, def; 1: host aware; 2: host managed */
 790static enum blk_zoned_model sdeb_zbc_model = BLK_ZONED_NONE;
 791static char *sdeb_zbc_model_s;
 792
 793enum sam_lun_addr_method {SAM_LUN_AM_PERIPHERAL = 0x0,
 794			  SAM_LUN_AM_FLAT = 0x1,
 795			  SAM_LUN_AM_LOGICAL_UNIT = 0x2,
 796			  SAM_LUN_AM_EXTENDED = 0x3};
 797static enum sam_lun_addr_method sdebug_lun_am = SAM_LUN_AM_PERIPHERAL;
 798static int sdebug_lun_am_i = (int)SAM_LUN_AM_PERIPHERAL;
 799
 800static unsigned int sdebug_store_sectors;
 801static sector_t sdebug_capacity;	/* in sectors */
 802
 803/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 804   may still need them */
 805static int sdebug_heads;		/* heads per disk */
 806static int sdebug_cylinders_per;	/* cylinders per surface */
 807static int sdebug_sectors_per;		/* sectors per cylinder */
 808
 809static LIST_HEAD(sdebug_host_list);
 810static DEFINE_SPINLOCK(sdebug_host_list_lock);
 811
 812static struct xarray per_store_arr;
 813static struct xarray *per_store_ap = &per_store_arr;
 814static int sdeb_first_idx = -1;		/* invalid index ==> none created */
 815static int sdeb_most_recent_idx = -1;
 816static DEFINE_RWLOCK(sdeb_fake_rw_lck);	/* need a RW lock when fake_rw=1 */
 817
 818static unsigned long map_size;
 819static int num_aborts;
 820static int num_dev_resets;
 821static int num_target_resets;
 822static int num_bus_resets;
 823static int num_host_resets;
 824static int dix_writes;
 825static int dix_reads;
 826static int dif_errors;
 827
 828/* ZBC global data */
 829static bool sdeb_zbc_in_use;	/* true for host-aware and host-managed disks */
 830static int sdeb_zbc_zone_size_mb;
 831static int sdeb_zbc_max_open = DEF_ZBC_MAX_OPEN_ZONES;
 832static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
 833
 834static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
 835static int poll_queues; /* iouring iopoll interface.*/
 836static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
 837
 838static DEFINE_RWLOCK(atomic_rw);
 839static DEFINE_RWLOCK(atomic_rw2);
 840
 841static rwlock_t *ramdisk_lck_a[2];
 842
 843static char sdebug_proc_name[] = MY_NAME;
 844static const char *my_name = MY_NAME;
 845
 846static struct bus_type pseudo_lld_bus;
 847
 848static struct device_driver sdebug_driverfs_driver = {
 849	.name 		= sdebug_proc_name,
 850	.bus		= &pseudo_lld_bus,
 851};
 852
 853static const int check_condition_result =
 854	SAM_STAT_CHECK_CONDITION;
 855
 856static const int illegal_condition_result =
 857	(DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 858
 859static const int device_qfull_result =
 860	(DID_OK << 16) | SAM_STAT_TASK_SET_FULL;
 861
 862static const int condition_met_result = SAM_STAT_CONDITION_MET;
 863
 864
 865/* Only do the extra work involved in logical block provisioning if one or
 866 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
 867 * real reads and writes (i.e. not skipping them for speed).
 868 */
 869static inline bool scsi_debug_lbp(void)
 870{
 871	return 0 == sdebug_fake_rw &&
 872		(sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
 873}
 874
 875static void *lba2fake_store(struct sdeb_store_info *sip,
 876			    unsigned long long lba)
 877{
 878	struct sdeb_store_info *lsip = sip;
 879
 880	lba = do_div(lba, sdebug_store_sectors);
 881	if (!sip || !sip->storep) {
 882		WARN_ON_ONCE(true);
 883		lsip = xa_load(per_store_ap, 0);  /* should never be NULL */
 884	}
 885	return lsip->storep + lba * sdebug_sector_size;
 886}
 887
 888static struct t10_pi_tuple *dif_store(struct sdeb_store_info *sip,
 889				      sector_t sector)
 890{
 891	sector = sector_div(sector, sdebug_store_sectors);
 892
 893	return sip->dif_storep + sector;
 894}
 895
 896static void sdebug_max_tgts_luns(void)
 897{
 898	struct sdebug_host_info *sdbg_host;
 899	struct Scsi_Host *hpnt;
 900
 901	spin_lock(&sdebug_host_list_lock);
 902	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 903		hpnt = sdbg_host->shost;
 904		if ((hpnt->this_id >= 0) &&
 905		    (sdebug_num_tgts > hpnt->this_id))
 906			hpnt->max_id = sdebug_num_tgts + 1;
 907		else
 908			hpnt->max_id = sdebug_num_tgts;
 909		/* sdebug_max_luns; */
 910		hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
 911	}
 912	spin_unlock(&sdebug_host_list_lock);
 913}
 914
 915enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
 916
 917/* Set in_bit to -1 to indicate no bit position of invalid field */
 918static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
 919				 enum sdeb_cmd_data c_d,
 920				 int in_byte, int in_bit)
 921{
 922	unsigned char *sbuff;
 923	u8 sks[4];
 924	int sl, asc;
 925
 926	sbuff = scp->sense_buffer;
 927	if (!sbuff) {
 928		sdev_printk(KERN_ERR, scp->device,
 929			    "%s: sense_buffer is NULL\n", __func__);
 930		return;
 931	}
 932	asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
 933	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 934	scsi_build_sense(scp, sdebug_dsense, ILLEGAL_REQUEST, asc, 0);
 935	memset(sks, 0, sizeof(sks));
 936	sks[0] = 0x80;
 937	if (c_d)
 938		sks[0] |= 0x40;
 939	if (in_bit >= 0) {
 940		sks[0] |= 0x8;
 941		sks[0] |= 0x7 & in_bit;
 942	}
 943	put_unaligned_be16(in_byte, sks + 1);
 944	if (sdebug_dsense) {
 945		sl = sbuff[7] + 8;
 946		sbuff[7] = sl;
 947		sbuff[sl] = 0x2;
 948		sbuff[sl + 1] = 0x6;
 949		memcpy(sbuff + sl + 4, sks, 3);
 950	} else
 951		memcpy(sbuff + 15, sks, 3);
 952	if (sdebug_verbose)
 953		sdev_printk(KERN_INFO, scp->device, "%s:  [sense_key,asc,ascq"
 954			    "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
 955			    my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
 956}
 957
 958static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
 959{
 960	if (!scp->sense_buffer) {
 
 
 
 961		sdev_printk(KERN_ERR, scp->device,
 962			    "%s: sense_buffer is NULL\n", __func__);
 963		return;
 964	}
 965	memset(scp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
 966
 967	scsi_build_sense(scp, sdebug_dsense, key, asc, asq);
 968
 969	if (sdebug_verbose)
 970		sdev_printk(KERN_INFO, scp->device,
 971			    "%s:  [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
 972			    my_name, key, asc, asq);
 973}
 974
 975static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
 976{
 977	mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
 978}
 979
 980static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
 981			    void __user *arg)
 982{
 983	if (sdebug_verbose) {
 984		if (0x1261 == cmd)
 985			sdev_printk(KERN_INFO, dev,
 986				    "%s: BLKFLSBUF [0x1261]\n", __func__);
 987		else if (0x5331 == cmd)
 988			sdev_printk(KERN_INFO, dev,
 989				    "%s: CDROM_GET_CAPABILITY [0x5331]\n",
 990				    __func__);
 991		else
 992			sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
 993				    __func__, cmd);
 994	}
 995	return -EINVAL;
 996	/* return -ENOTTY; // correct return but upsets fdisk */
 997}
 998
 999static void config_cdb_len(struct scsi_device *sdev)
1000{
1001	switch (sdebug_cdb_len) {
1002	case 6:	/* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
1003		sdev->use_10_for_rw = false;
1004		sdev->use_16_for_rw = false;
1005		sdev->use_10_for_ms = false;
1006		break;
1007	case 10: /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
1008		sdev->use_10_for_rw = true;
1009		sdev->use_16_for_rw = false;
1010		sdev->use_10_for_ms = false;
1011		break;
1012	case 12: /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
1013		sdev->use_10_for_rw = true;
1014		sdev->use_16_for_rw = false;
1015		sdev->use_10_for_ms = true;
1016		break;
1017	case 16:
1018		sdev->use_10_for_rw = false;
1019		sdev->use_16_for_rw = true;
1020		sdev->use_10_for_ms = true;
1021		break;
1022	case 32: /* No knobs to suggest this so same as 16 for now */
1023		sdev->use_10_for_rw = false;
1024		sdev->use_16_for_rw = true;
1025		sdev->use_10_for_ms = true;
1026		break;
1027	default:
1028		pr_warn("unexpected cdb_len=%d, force to 10\n",
1029			sdebug_cdb_len);
1030		sdev->use_10_for_rw = true;
1031		sdev->use_16_for_rw = false;
1032		sdev->use_10_for_ms = false;
1033		sdebug_cdb_len = 10;
1034		break;
1035	}
1036}
1037
1038static void all_config_cdb_len(void)
1039{
1040	struct sdebug_host_info *sdbg_host;
1041	struct Scsi_Host *shost;
1042	struct scsi_device *sdev;
1043
1044	spin_lock(&sdebug_host_list_lock);
1045	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1046		shost = sdbg_host->shost;
1047		shost_for_each_device(sdev, shost) {
1048			config_cdb_len(sdev);
1049		}
1050	}
1051	spin_unlock(&sdebug_host_list_lock);
1052}
1053
1054static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
1055{
1056	struct sdebug_host_info *sdhp;
1057	struct sdebug_dev_info *dp;
1058
1059	spin_lock(&sdebug_host_list_lock);
1060	list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
1061		list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
1062			if ((devip->sdbg_host == dp->sdbg_host) &&
1063			    (devip->target == dp->target))
1064				clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
1065		}
1066	}
1067	spin_unlock(&sdebug_host_list_lock);
1068}
1069
1070static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1071{
1072	int k;
1073
1074	k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
1075	if (k != SDEBUG_NUM_UAS) {
1076		const char *cp = NULL;
1077
1078		switch (k) {
1079		case SDEBUG_UA_POR:
1080			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1081					POWER_ON_RESET_ASCQ);
1082			if (sdebug_verbose)
1083				cp = "power on reset";
1084			break;
1085		case SDEBUG_UA_BUS_RESET:
1086			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1087					BUS_RESET_ASCQ);
1088			if (sdebug_verbose)
1089				cp = "bus reset";
1090			break;
1091		case SDEBUG_UA_MODE_CHANGED:
1092			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1093					MODE_CHANGED_ASCQ);
1094			if (sdebug_verbose)
1095				cp = "mode parameters changed";
1096			break;
1097		case SDEBUG_UA_CAPACITY_CHANGED:
1098			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1099					CAPACITY_CHANGED_ASCQ);
1100			if (sdebug_verbose)
1101				cp = "capacity data changed";
1102			break;
1103		case SDEBUG_UA_MICROCODE_CHANGED:
1104			mk_sense_buffer(scp, UNIT_ATTENTION,
1105					TARGET_CHANGED_ASC,
1106					MICROCODE_CHANGED_ASCQ);
1107			if (sdebug_verbose)
1108				cp = "microcode has been changed";
1109			break;
1110		case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
1111			mk_sense_buffer(scp, UNIT_ATTENTION,
1112					TARGET_CHANGED_ASC,
1113					MICROCODE_CHANGED_WO_RESET_ASCQ);
1114			if (sdebug_verbose)
1115				cp = "microcode has been changed without reset";
1116			break;
1117		case SDEBUG_UA_LUNS_CHANGED:
1118			/*
1119			 * SPC-3 behavior is to report a UNIT ATTENTION with
1120			 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
1121			 * on the target, until a REPORT LUNS command is
1122			 * received.  SPC-4 behavior is to report it only once.
1123			 * NOTE:  sdebug_scsi_level does not use the same
1124			 * values as struct scsi_device->scsi_level.
1125			 */
1126			if (sdebug_scsi_level >= 6)	/* SPC-4 and above */
1127				clear_luns_changed_on_target(devip);
1128			mk_sense_buffer(scp, UNIT_ATTENTION,
1129					TARGET_CHANGED_ASC,
1130					LUNS_CHANGED_ASCQ);
1131			if (sdebug_verbose)
1132				cp = "reported luns data has changed";
1133			break;
1134		default:
1135			pr_warn("unexpected unit attention code=%d\n", k);
1136			if (sdebug_verbose)
1137				cp = "unknown";
1138			break;
1139		}
1140		clear_bit(k, devip->uas_bm);
1141		if (sdebug_verbose)
1142			sdev_printk(KERN_INFO, scp->device,
1143				   "%s reports: Unit attention: %s\n",
1144				   my_name, cp);
1145		return check_condition_result;
1146	}
1147	return 0;
1148}
1149
1150/* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
1151static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1152				int arr_len)
1153{
1154	int act_len;
1155	struct scsi_data_buffer *sdb = &scp->sdb;
1156
1157	if (!sdb->length)
1158		return 0;
1159	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1160		return DID_ERROR << 16;
1161
1162	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
1163				      arr, arr_len);
1164	scsi_set_resid(scp, scsi_bufflen(scp) - act_len);
1165
1166	return 0;
1167}
1168
1169/* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
1170 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
1171 * calls, not required to write in ascending offset order. Assumes resid
1172 * set to scsi_bufflen() prior to any calls.
1173 */
1174static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
1175				  int arr_len, unsigned int off_dst)
1176{
1177	unsigned int act_len, n;
1178	struct scsi_data_buffer *sdb = &scp->sdb;
1179	off_t skip = off_dst;
1180
1181	if (sdb->length <= off_dst)
1182		return 0;
1183	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1184		return DID_ERROR << 16;
1185
1186	act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
1187				       arr, arr_len, skip);
1188	pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
1189		 __func__, off_dst, scsi_bufflen(scp), act_len,
1190		 scsi_get_resid(scp));
1191	n = scsi_bufflen(scp) - (off_dst + act_len);
1192	scsi_set_resid(scp, min_t(int, scsi_get_resid(scp), n));
1193	return 0;
1194}
1195
1196/* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
1197 * 'arr' or -1 if error.
1198 */
1199static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1200			       int arr_len)
1201{
1202	if (!scsi_bufflen(scp))
1203		return 0;
1204	if (scp->sc_data_direction != DMA_TO_DEVICE)
1205		return -1;
1206
1207	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1208}
1209
1210
1211static char sdebug_inq_vendor_id[9] = "Linux   ";
1212static char sdebug_inq_product_id[17] = "scsi_debug      ";
1213static char sdebug_inq_product_rev[5] = SDEBUG_VERSION;
1214/* Use some locally assigned NAAs for SAS addresses. */
1215static const u64 naa3_comp_a = 0x3222222000000000ULL;
1216static const u64 naa3_comp_b = 0x3333333000000000ULL;
1217static const u64 naa3_comp_c = 0x3111111000000000ULL;
1218
1219/* Device identification VPD page. Returns number of bytes placed in arr */
1220static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
1221			  int target_dev_id, int dev_id_num,
1222			  const char *dev_id_str, int dev_id_str_len,
1223			  const uuid_t *lu_name)
1224{
1225	int num, port_a;
1226	char b[32];
1227
1228	port_a = target_dev_id + 1;
1229	/* T10 vendor identifier field format (faked) */
1230	arr[0] = 0x2;	/* ASCII */
1231	arr[1] = 0x1;
1232	arr[2] = 0x0;
1233	memcpy(&arr[4], sdebug_inq_vendor_id, 8);
1234	memcpy(&arr[12], sdebug_inq_product_id, 16);
1235	memcpy(&arr[28], dev_id_str, dev_id_str_len);
1236	num = 8 + 16 + dev_id_str_len;
1237	arr[3] = num;
1238	num += 4;
1239	if (dev_id_num >= 0) {
1240		if (sdebug_uuid_ctl) {
1241			/* Locally assigned UUID */
1242			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1243			arr[num++] = 0xa;  /* PIV=0, lu, naa */
1244			arr[num++] = 0x0;
1245			arr[num++] = 0x12;
1246			arr[num++] = 0x10; /* uuid type=1, locally assigned */
1247			arr[num++] = 0x0;
1248			memcpy(arr + num, lu_name, 16);
1249			num += 16;
1250		} else {
1251			/* NAA-3, Logical unit identifier (binary) */
1252			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1253			arr[num++] = 0x3;  /* PIV=0, lu, naa */
1254			arr[num++] = 0x0;
1255			arr[num++] = 0x8;
1256			put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
1257			num += 8;
1258		}
1259		/* Target relative port number */
1260		arr[num++] = 0x61;	/* proto=sas, binary */
1261		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
1262		arr[num++] = 0x0;	/* reserved */
1263		arr[num++] = 0x4;	/* length */
1264		arr[num++] = 0x0;	/* reserved */
1265		arr[num++] = 0x0;	/* reserved */
1266		arr[num++] = 0x0;
1267		arr[num++] = 0x1;	/* relative port A */
1268	}
1269	/* NAA-3, Target port identifier */
1270	arr[num++] = 0x61;	/* proto=sas, binary */
1271	arr[num++] = 0x93;	/* piv=1, target port, naa */
1272	arr[num++] = 0x0;
1273	arr[num++] = 0x8;
1274	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1275	num += 8;
1276	/* NAA-3, Target port group identifier */
1277	arr[num++] = 0x61;	/* proto=sas, binary */
1278	arr[num++] = 0x95;	/* piv=1, target port group id */
1279	arr[num++] = 0x0;
1280	arr[num++] = 0x4;
1281	arr[num++] = 0;
1282	arr[num++] = 0;
1283	put_unaligned_be16(port_group_id, arr + num);
1284	num += 2;
1285	/* NAA-3, Target device identifier */
1286	arr[num++] = 0x61;	/* proto=sas, binary */
1287	arr[num++] = 0xa3;	/* piv=1, target device, naa */
1288	arr[num++] = 0x0;
1289	arr[num++] = 0x8;
1290	put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
1291	num += 8;
1292	/* SCSI name string: Target device identifier */
1293	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
1294	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
1295	arr[num++] = 0x0;
1296	arr[num++] = 24;
1297	memcpy(arr + num, "naa.32222220", 12);
1298	num += 12;
1299	snprintf(b, sizeof(b), "%08X", target_dev_id);
1300	memcpy(arr + num, b, 8);
1301	num += 8;
1302	memset(arr + num, 0, 4);
1303	num += 4;
1304	return num;
1305}
1306
1307static unsigned char vpd84_data[] = {
1308/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1309    0x22,0x22,0x22,0x0,0xbb,0x1,
1310    0x22,0x22,0x22,0x0,0xbb,0x2,
1311};
1312
1313/*  Software interface identification VPD page */
1314static int inquiry_vpd_84(unsigned char *arr)
1315{
1316	memcpy(arr, vpd84_data, sizeof(vpd84_data));
1317	return sizeof(vpd84_data);
1318}
1319
1320/* Management network addresses VPD page */
1321static int inquiry_vpd_85(unsigned char *arr)
1322{
1323	int num = 0;
1324	const char *na1 = "https://www.kernel.org/config";
1325	const char *na2 = "http://www.kernel.org/log";
1326	int plen, olen;
1327
1328	arr[num++] = 0x1;	/* lu, storage config */
1329	arr[num++] = 0x0;	/* reserved */
1330	arr[num++] = 0x0;
1331	olen = strlen(na1);
1332	plen = olen + 1;
1333	if (plen % 4)
1334		plen = ((plen / 4) + 1) * 4;
1335	arr[num++] = plen;	/* length, null termianted, padded */
1336	memcpy(arr + num, na1, olen);
1337	memset(arr + num + olen, 0, plen - olen);
1338	num += plen;
1339
1340	arr[num++] = 0x4;	/* lu, logging */
1341	arr[num++] = 0x0;	/* reserved */
1342	arr[num++] = 0x0;
1343	olen = strlen(na2);
1344	plen = olen + 1;
1345	if (plen % 4)
1346		plen = ((plen / 4) + 1) * 4;
1347	arr[num++] = plen;	/* length, null terminated, padded */
1348	memcpy(arr + num, na2, olen);
1349	memset(arr + num + olen, 0, plen - olen);
1350	num += plen;
1351
1352	return num;
1353}
1354
1355/* SCSI ports VPD page */
1356static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
1357{
1358	int num = 0;
1359	int port_a, port_b;
1360
1361	port_a = target_dev_id + 1;
1362	port_b = port_a + 1;
1363	arr[num++] = 0x0;	/* reserved */
1364	arr[num++] = 0x0;	/* reserved */
1365	arr[num++] = 0x0;
1366	arr[num++] = 0x1;	/* relative port 1 (primary) */
1367	memset(arr + num, 0, 6);
1368	num += 6;
1369	arr[num++] = 0x0;
1370	arr[num++] = 12;	/* length tp descriptor */
1371	/* naa-5 target port identifier (A) */
1372	arr[num++] = 0x61;	/* proto=sas, binary */
1373	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1374	arr[num++] = 0x0;	/* reserved */
1375	arr[num++] = 0x8;	/* length */
1376	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1377	num += 8;
1378	arr[num++] = 0x0;	/* reserved */
1379	arr[num++] = 0x0;	/* reserved */
1380	arr[num++] = 0x0;
1381	arr[num++] = 0x2;	/* relative port 2 (secondary) */
1382	memset(arr + num, 0, 6);
1383	num += 6;
1384	arr[num++] = 0x0;
1385	arr[num++] = 12;	/* length tp descriptor */
1386	/* naa-5 target port identifier (B) */
1387	arr[num++] = 0x61;	/* proto=sas, binary */
1388	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1389	arr[num++] = 0x0;	/* reserved */
1390	arr[num++] = 0x8;	/* length */
1391	put_unaligned_be64(naa3_comp_a + port_b, arr + num);
1392	num += 8;
1393
1394	return num;
1395}
1396
1397
1398static unsigned char vpd89_data[] = {
1399/* from 4th byte */ 0,0,0,0,
1400'l','i','n','u','x',' ',' ',' ',
1401'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1402'1','2','3','4',
14030x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
14040xec,0,0,0,
14050x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
14060,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
14070x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
14080x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
14090x53,0x41,
14100x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14110x20,0x20,
14120x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14130x10,0x80,
14140,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
14150x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
14160x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
14170,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
14180x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
14190x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
14200,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
14210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14240x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
14250,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
14260xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
14270,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
14280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14340,0,0,0,0,0,0,0,0,0,0,0,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,
14380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14390,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1440};
1441
1442/* ATA Information VPD page */
1443static int inquiry_vpd_89(unsigned char *arr)
1444{
1445	memcpy(arr, vpd89_data, sizeof(vpd89_data));
1446	return sizeof(vpd89_data);
1447}
1448
1449
1450static unsigned char vpdb0_data[] = {
1451	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1452	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1453	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1454	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1455};
1456
1457/* Block limits VPD page (SBC-3) */
1458static int inquiry_vpd_b0(unsigned char *arr)
1459{
1460	unsigned int gran;
1461
1462	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
1463
1464	/* Optimal transfer length granularity */
1465	if (sdebug_opt_xferlen_exp != 0 &&
1466	    sdebug_physblk_exp < sdebug_opt_xferlen_exp)
1467		gran = 1 << sdebug_opt_xferlen_exp;
1468	else
1469		gran = 1 << sdebug_physblk_exp;
1470	put_unaligned_be16(gran, arr + 2);
1471
1472	/* Maximum Transfer Length */
1473	if (sdebug_store_sectors > 0x400)
1474		put_unaligned_be32(sdebug_store_sectors, arr + 4);
1475
1476	/* Optimal Transfer Length */
1477	put_unaligned_be32(sdebug_opt_blks, &arr[8]);
1478
1479	if (sdebug_lbpu) {
1480		/* Maximum Unmap LBA Count */
1481		put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
1482
1483		/* Maximum Unmap Block Descriptor Count */
1484		put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
1485	}
1486
1487	/* Unmap Granularity Alignment */
1488	if (sdebug_unmap_alignment) {
1489		put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
1490		arr[28] |= 0x80; /* UGAVALID */
1491	}
1492
1493	/* Optimal Unmap Granularity */
1494	put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
1495
1496	/* Maximum WRITE SAME Length */
1497	put_unaligned_be64(sdebug_write_same_length, &arr[32]);
1498
1499	return 0x3c; /* Mandatory page length for Logical Block Provisioning */
1500
1501	return sizeof(vpdb0_data);
1502}
1503
1504/* Block device characteristics VPD page (SBC-3) */
1505static int inquiry_vpd_b1(struct sdebug_dev_info *devip, unsigned char *arr)
1506{
1507	memset(arr, 0, 0x3c);
1508	arr[0] = 0;
1509	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
1510	arr[2] = 0;
1511	arr[3] = 5;	/* less than 1.8" */
1512	if (devip->zmodel == BLK_ZONED_HA)
1513		arr[4] = 1 << 4;	/* zoned field = 01b */
1514
1515	return 0x3c;
1516}
1517
1518/* Logical block provisioning VPD page (SBC-4) */
1519static int inquiry_vpd_b2(unsigned char *arr)
1520{
1521	memset(arr, 0, 0x4);
1522	arr[0] = 0;			/* threshold exponent */
1523	if (sdebug_lbpu)
1524		arr[1] = 1 << 7;
1525	if (sdebug_lbpws)
1526		arr[1] |= 1 << 6;
1527	if (sdebug_lbpws10)
1528		arr[1] |= 1 << 5;
1529	if (sdebug_lbprz && scsi_debug_lbp())
1530		arr[1] |= (sdebug_lbprz & 0x7) << 2;  /* sbc4r07 and later */
1531	/* anc_sup=0; dp=0 (no provisioning group descriptor) */
1532	/* minimum_percentage=0; provisioning_type=0 (unknown) */
1533	/* threshold_percentage=0 */
1534	return 0x4;
1535}
1536
1537/* Zoned block device characteristics VPD page (ZBC mandatory) */
1538static int inquiry_vpd_b6(struct sdebug_dev_info *devip, unsigned char *arr)
1539{
1540	memset(arr, 0, 0x3c);
1541	arr[0] = 0x1; /* set URSWRZ (unrestricted read in seq. wr req zone) */
1542	/*
1543	 * Set Optimal number of open sequential write preferred zones and
1544	 * Optimal number of non-sequentially written sequential write
1545	 * preferred zones fields to 'not reported' (0xffffffff). Leave other
1546	 * fields set to zero, apart from Max. number of open swrz_s field.
1547	 */
1548	put_unaligned_be32(0xffffffff, &arr[4]);
1549	put_unaligned_be32(0xffffffff, &arr[8]);
1550	if (sdeb_zbc_model == BLK_ZONED_HM && devip->max_open)
1551		put_unaligned_be32(devip->max_open, &arr[12]);
1552	else
1553		put_unaligned_be32(0xffffffff, &arr[12]);
1554	return 0x3c;
1555}
1556
1557#define SDEBUG_LONG_INQ_SZ 96
1558#define SDEBUG_MAX_INQ_ARR_SZ 584
1559
1560static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1561{
1562	unsigned char pq_pdt;
1563	unsigned char *arr;
1564	unsigned char *cmd = scp->cmnd;
1565	int alloc_len, n, ret;
1566	bool have_wlun, is_disk, is_zbc, is_disk_zbc;
1567
1568	alloc_len = get_unaligned_be16(cmd + 3);
1569	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1570	if (! arr)
1571		return DID_REQUEUE << 16;
1572	is_disk = (sdebug_ptype == TYPE_DISK);
1573	is_zbc = (devip->zmodel != BLK_ZONED_NONE);
1574	is_disk_zbc = (is_disk || is_zbc);
1575	have_wlun = scsi_is_wlun(scp->device->lun);
1576	if (have_wlun)
1577		pq_pdt = TYPE_WLUN;	/* present, wlun */
1578	else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1579		pq_pdt = 0x7f;	/* not present, PQ=3, PDT=0x1f */
1580	else
1581		pq_pdt = (sdebug_ptype & 0x1f);
1582	arr[0] = pq_pdt;
1583	if (0x2 & cmd[1]) {  /* CMDDT bit set */
1584		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
1585		kfree(arr);
1586		return check_condition_result;
1587	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
1588		int lu_id_num, port_group_id, target_dev_id, len;
1589		char lu_id_str[6];
1590		int host_no = devip->sdbg_host->shost->host_no;
1591		
1592		port_group_id = (((host_no + 1) & 0x7f) << 8) +
1593		    (devip->channel & 0x7f);
1594		if (sdebug_vpd_use_hostno == 0)
1595			host_no = 0;
1596		lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
1597			    (devip->target * 1000) + devip->lun);
1598		target_dev_id = ((host_no + 1) * 2000) +
1599				 (devip->target * 1000) - 3;
1600		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1601		if (0 == cmd[2]) { /* supported vital product data pages */
1602			arr[1] = cmd[2];	/*sanity */
1603			n = 4;
1604			arr[n++] = 0x0;   /* this page */
1605			arr[n++] = 0x80;  /* unit serial number */
1606			arr[n++] = 0x83;  /* device identification */
1607			arr[n++] = 0x84;  /* software interface ident. */
1608			arr[n++] = 0x85;  /* management network addresses */
1609			arr[n++] = 0x86;  /* extended inquiry */
1610			arr[n++] = 0x87;  /* mode page policy */
1611			arr[n++] = 0x88;  /* SCSI ports */
1612			if (is_disk_zbc) {	  /* SBC or ZBC */
1613				arr[n++] = 0x89;  /* ATA information */
1614				arr[n++] = 0xb0;  /* Block limits */
1615				arr[n++] = 0xb1;  /* Block characteristics */
1616				if (is_disk)
1617					arr[n++] = 0xb2;  /* LB Provisioning */
1618				if (is_zbc)
1619					arr[n++] = 0xb6;  /* ZB dev. char. */
1620			}
1621			arr[3] = n - 4;	  /* number of supported VPD pages */
1622		} else if (0x80 == cmd[2]) { /* unit serial number */
1623			arr[1] = cmd[2];	/*sanity */
1624			arr[3] = len;
1625			memcpy(&arr[4], lu_id_str, len);
1626		} else if (0x83 == cmd[2]) { /* device identification */
1627			arr[1] = cmd[2];	/*sanity */
1628			arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1629						target_dev_id, lu_id_num,
1630						lu_id_str, len,
1631						&devip->lu_name);
1632		} else if (0x84 == cmd[2]) { /* Software interface ident. */
1633			arr[1] = cmd[2];	/*sanity */
1634			arr[3] = inquiry_vpd_84(&arr[4]);
1635		} else if (0x85 == cmd[2]) { /* Management network addresses */
1636			arr[1] = cmd[2];	/*sanity */
1637			arr[3] = inquiry_vpd_85(&arr[4]);
1638		} else if (0x86 == cmd[2]) { /* extended inquiry */
1639			arr[1] = cmd[2];	/*sanity */
1640			arr[3] = 0x3c;	/* number of following entries */
1641			if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
1642				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
1643			else if (have_dif_prot)
1644				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
1645			else
1646				arr[4] = 0x0;   /* no protection stuff */
1647			arr[5] = 0x7;   /* head of q, ordered + simple q's */
1648		} else if (0x87 == cmd[2]) { /* mode page policy */
1649			arr[1] = cmd[2];	/*sanity */
1650			arr[3] = 0x8;	/* number of following entries */
1651			arr[4] = 0x2;	/* disconnect-reconnect mp */
1652			arr[6] = 0x80;	/* mlus, shared */
1653			arr[8] = 0x18;	 /* protocol specific lu */
1654			arr[10] = 0x82;	 /* mlus, per initiator port */
1655		} else if (0x88 == cmd[2]) { /* SCSI Ports */
1656			arr[1] = cmd[2];	/*sanity */
1657			arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1658		} else if (is_disk_zbc && 0x89 == cmd[2]) { /* ATA info */
1659			arr[1] = cmd[2];        /*sanity */
1660			n = inquiry_vpd_89(&arr[4]);
1661			put_unaligned_be16(n, arr + 2);
1662		} else if (is_disk_zbc && 0xb0 == cmd[2]) { /* Block limits */
1663			arr[1] = cmd[2];        /*sanity */
1664			arr[3] = inquiry_vpd_b0(&arr[4]);
1665		} else if (is_disk_zbc && 0xb1 == cmd[2]) { /* Block char. */
1666			arr[1] = cmd[2];        /*sanity */
1667			arr[3] = inquiry_vpd_b1(devip, &arr[4]);
1668		} else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
1669			arr[1] = cmd[2];        /*sanity */
1670			arr[3] = inquiry_vpd_b2(&arr[4]);
1671		} else if (is_zbc && cmd[2] == 0xb6) { /* ZB dev. charact. */
1672			arr[1] = cmd[2];        /*sanity */
1673			arr[3] = inquiry_vpd_b6(devip, &arr[4]);
1674		} else {
1675			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
1676			kfree(arr);
1677			return check_condition_result;
1678		}
1679		len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
1680		ret = fill_from_dev_buffer(scp, arr,
1681			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1682		kfree(arr);
1683		return ret;
1684	}
1685	/* drops through here for a standard inquiry */
1686	arr[1] = sdebug_removable ? 0x80 : 0;	/* Removable disk */
1687	arr[2] = sdebug_scsi_level;
1688	arr[3] = 2;    /* response_data_format==2 */
1689	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1690	arr[5] = (int)have_dif_prot;	/* PROTECT bit */
1691	if (sdebug_vpd_use_hostno == 0)
1692		arr[5] |= 0x10; /* claim: implicit TPGS */
1693	arr[6] = 0x10; /* claim: MultiP */
1694	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1695	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1696	memcpy(&arr[8], sdebug_inq_vendor_id, 8);
1697	memcpy(&arr[16], sdebug_inq_product_id, 16);
1698	memcpy(&arr[32], sdebug_inq_product_rev, 4);
1699	/* Use Vendor Specific area to place driver date in ASCII hex */
1700	memcpy(&arr[36], sdebug_version_date, 8);
1701	/* version descriptors (2 bytes each) follow */
1702	put_unaligned_be16(0xc0, arr + 58);   /* SAM-6 no version claimed */
1703	put_unaligned_be16(0x5c0, arr + 60);  /* SPC-5 no version claimed */
1704	n = 62;
1705	if (is_disk) {		/* SBC-4 no version claimed */
1706		put_unaligned_be16(0x600, arr + n);
1707		n += 2;
1708	} else if (sdebug_ptype == TYPE_TAPE) {	/* SSC-4 rev 3 */
1709		put_unaligned_be16(0x525, arr + n);
1710		n += 2;
1711	} else if (is_zbc) {	/* ZBC BSR INCITS 536 revision 05 */
1712		put_unaligned_be16(0x624, arr + n);
1713		n += 2;
1714	}
1715	put_unaligned_be16(0x2100, arr + n);	/* SPL-4 no version claimed */
1716	ret = fill_from_dev_buffer(scp, arr,
1717			    min_t(int, alloc_len, SDEBUG_LONG_INQ_SZ));
1718	kfree(arr);
1719	return ret;
1720}
1721
1722/* See resp_iec_m_pg() for how this data is manipulated */
1723static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1724				   0, 0, 0x0, 0x0};
1725
1726static int resp_requests(struct scsi_cmnd *scp,
1727			 struct sdebug_dev_info *devip)
1728{
 
1729	unsigned char *cmd = scp->cmnd;
1730	unsigned char arr[SCSI_SENSE_BUFFERSIZE];	/* assume >= 18 bytes */
1731	bool dsense = !!(cmd[1] & 1);
1732	int alloc_len = cmd[4];
1733	int len = 18;
1734	int stopped_state = atomic_read(&devip->stopped);
1735
1736	memset(arr, 0, sizeof(arr));
1737	if (stopped_state > 0) {	/* some "pollable" data [spc6r02: 5.12.2] */
1738		if (dsense) {
1739			arr[0] = 0x72;
1740			arr[1] = NOT_READY;
1741			arr[2] = LOGICAL_UNIT_NOT_READY;
1742			arr[3] = (stopped_state == 2) ? 0x1 : 0x2;
1743			len = 8;
1744		} else {
1745			arr[0] = 0x70;
1746			arr[2] = NOT_READY;		/* NO_SENSE in sense_key */
1747			arr[7] = 0xa;			/* 18 byte sense buffer */
1748			arr[12] = LOGICAL_UNIT_NOT_READY;
1749			arr[13] = (stopped_state == 2) ? 0x1 : 0x2;
1750		}
1751	} else if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1752		/* Information exceptions control mode page: TEST=1, MRIE=6 */
1753		if (dsense) {
1754			arr[0] = 0x72;
1755			arr[1] = 0x0;		/* NO_SENSE in sense_key */
1756			arr[2] = THRESHOLD_EXCEEDED;
1757			arr[3] = 0xff;		/* Failure prediction(false) */
1758			len = 8;
1759		} else {
1760			arr[0] = 0x70;
1761			arr[2] = 0x0;		/* NO_SENSE in sense_key */
1762			arr[7] = 0xa;   	/* 18 byte sense buffer */
1763			arr[12] = THRESHOLD_EXCEEDED;
1764			arr[13] = 0xff;		/* Failure prediction(false) */
1765		}
1766	} else {	/* nothing to report */
1767		if (dsense) {
1768			len = 8;
1769			memset(arr, 0, len);
 
 
 
 
 
 
 
 
 
 
 
 
1770			arr[0] = 0x72;
 
 
 
 
1771		} else {
1772			memset(arr, 0, len);
1773			arr[0] = 0x70;
 
1774			arr[7] = 0xa;
 
 
1775		}
 
1776	}
1777	return fill_from_dev_buffer(scp, arr, min_t(int, len, alloc_len));
 
1778}
1779
1780static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
1781{
1782	unsigned char *cmd = scp->cmnd;
1783	int power_cond, want_stop, stopped_state;
1784	bool changing;
1785
1786	power_cond = (cmd[4] & 0xf0) >> 4;
1787	if (power_cond) {
1788		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
1789		return check_condition_result;
1790	}
1791	want_stop = !(cmd[4] & 1);
1792	stopped_state = atomic_read(&devip->stopped);
1793	if (stopped_state == 2) {
1794		ktime_t now_ts = ktime_get_boottime();
1795
1796		if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
1797			u64 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
1798
1799			if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
1800				/* tur_ms_to_ready timer extinguished */
1801				atomic_set(&devip->stopped, 0);
1802				stopped_state = 0;
1803			}
1804		}
1805		if (stopped_state == 2) {
1806			if (want_stop) {
1807				stopped_state = 1;	/* dummy up success */
1808			} else {	/* Disallow tur_ms_to_ready delay to be overridden */
1809				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 0 /* START bit */);
1810				return check_condition_result;
1811			}
1812		}
1813	}
1814	changing = (stopped_state != want_stop);
1815	if (changing)
1816		atomic_xchg(&devip->stopped, want_stop);
1817	if (!changing || (cmd[1] & 0x1))  /* state unchanged or IMMED bit set in cdb */
1818		return SDEG_RES_IMMED_MASK;
1819	else
1820		return 0;
1821}
1822
1823static sector_t get_sdebug_capacity(void)
1824{
1825	static const unsigned int gibibyte = 1073741824;
1826
1827	if (sdebug_virtual_gb > 0)
1828		return (sector_t)sdebug_virtual_gb *
1829			(gibibyte / sdebug_sector_size);
1830	else
1831		return sdebug_store_sectors;
1832}
1833
1834#define SDEBUG_READCAP_ARR_SZ 8
1835static int resp_readcap(struct scsi_cmnd *scp,
1836			struct sdebug_dev_info *devip)
1837{
1838	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1839	unsigned int capac;
1840
1841	/* following just in case virtual_gb changed */
1842	sdebug_capacity = get_sdebug_capacity();
1843	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1844	if (sdebug_capacity < 0xffffffff) {
1845		capac = (unsigned int)sdebug_capacity - 1;
1846		put_unaligned_be32(capac, arr + 0);
1847	} else
1848		put_unaligned_be32(0xffffffff, arr + 0);
1849	put_unaligned_be16(sdebug_sector_size, arr + 6);
1850	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1851}
1852
1853#define SDEBUG_READCAP16_ARR_SZ 32
1854static int resp_readcap16(struct scsi_cmnd *scp,
1855			  struct sdebug_dev_info *devip)
1856{
1857	unsigned char *cmd = scp->cmnd;
1858	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1859	int alloc_len;
1860
1861	alloc_len = get_unaligned_be32(cmd + 10);
1862	/* following just in case virtual_gb changed */
1863	sdebug_capacity = get_sdebug_capacity();
1864	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1865	put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1866	put_unaligned_be32(sdebug_sector_size, arr + 8);
1867	arr[13] = sdebug_physblk_exp & 0xf;
1868	arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
1869
1870	if (scsi_debug_lbp()) {
1871		arr[14] |= 0x80; /* LBPME */
1872		/* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1873		 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1874		 * in the wider field maps to 0 in this field.
1875		 */
1876		if (sdebug_lbprz & 1)	/* precisely what the draft requires */
1877			arr[14] |= 0x40;
1878	}
1879
1880	arr[15] = sdebug_lowest_aligned & 0xff;
1881
1882	if (have_dif_prot) {
1883		arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
1884		arr[12] |= 1; /* PROT_EN */
1885	}
1886
1887	return fill_from_dev_buffer(scp, arr,
1888			    min_t(int, alloc_len, SDEBUG_READCAP16_ARR_SZ));
1889}
1890
1891#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1892
1893static int resp_report_tgtpgs(struct scsi_cmnd *scp,
1894			      struct sdebug_dev_info *devip)
1895{
1896	unsigned char *cmd = scp->cmnd;
1897	unsigned char *arr;
1898	int host_no = devip->sdbg_host->shost->host_no;
1899	int n, ret, alen, rlen;
1900	int port_group_a, port_group_b, port_a, port_b;
1901
1902	alen = get_unaligned_be32(cmd + 6);
1903	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1904	if (! arr)
1905		return DID_REQUEUE << 16;
1906	/*
1907	 * EVPD page 0x88 states we have two ports, one
1908	 * real and a fake port with no device connected.
1909	 * So we create two port groups with one port each
1910	 * and set the group with port B to unavailable.
1911	 */
1912	port_a = 0x1; /* relative port A */
1913	port_b = 0x2; /* relative port B */
1914	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1915			(devip->channel & 0x7f);
1916	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1917			(devip->channel & 0x7f) + 0x80;
1918
1919	/*
1920	 * The asymmetric access state is cycled according to the host_id.
1921	 */
1922	n = 4;
1923	if (sdebug_vpd_use_hostno == 0) {
1924		arr[n++] = host_no % 3; /* Asymm access state */
1925		arr[n++] = 0x0F; /* claim: all states are supported */
1926	} else {
1927		arr[n++] = 0x0; /* Active/Optimized path */
1928		arr[n++] = 0x01; /* only support active/optimized paths */
1929	}
1930	put_unaligned_be16(port_group_a, arr + n);
1931	n += 2;
1932	arr[n++] = 0;    /* Reserved */
1933	arr[n++] = 0;    /* Status code */
1934	arr[n++] = 0;    /* Vendor unique */
1935	arr[n++] = 0x1;  /* One port per group */
1936	arr[n++] = 0;    /* Reserved */
1937	arr[n++] = 0;    /* Reserved */
1938	put_unaligned_be16(port_a, arr + n);
1939	n += 2;
1940	arr[n++] = 3;    /* Port unavailable */
1941	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1942	put_unaligned_be16(port_group_b, arr + n);
1943	n += 2;
1944	arr[n++] = 0;    /* Reserved */
1945	arr[n++] = 0;    /* Status code */
1946	arr[n++] = 0;    /* Vendor unique */
1947	arr[n++] = 0x1;  /* One port per group */
1948	arr[n++] = 0;    /* Reserved */
1949	arr[n++] = 0;    /* Reserved */
1950	put_unaligned_be16(port_b, arr + n);
1951	n += 2;
1952
1953	rlen = n - 4;
1954	put_unaligned_be32(rlen, arr + 0);
1955
1956	/*
1957	 * Return the smallest value of either
1958	 * - The allocated length
1959	 * - The constructed command length
1960	 * - The maximum array size
1961	 */
1962	rlen = min_t(int, alen, n);
1963	ret = fill_from_dev_buffer(scp, arr,
1964			   min_t(int, rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1965	kfree(arr);
1966	return ret;
1967}
1968
1969static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1970			     struct sdebug_dev_info *devip)
1971{
1972	bool rctd;
1973	u8 reporting_opts, req_opcode, sdeb_i, supp;
1974	u16 req_sa, u;
1975	u32 alloc_len, a_len;
1976	int k, offset, len, errsts, count, bump, na;
1977	const struct opcode_info_t *oip;
1978	const struct opcode_info_t *r_oip;
1979	u8 *arr;
1980	u8 *cmd = scp->cmnd;
1981
1982	rctd = !!(cmd[2] & 0x80);
1983	reporting_opts = cmd[2] & 0x7;
1984	req_opcode = cmd[3];
1985	req_sa = get_unaligned_be16(cmd + 4);
1986	alloc_len = get_unaligned_be32(cmd + 6);
1987	if (alloc_len < 4 || alloc_len > 0xffff) {
1988		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1989		return check_condition_result;
1990	}
1991	if (alloc_len > 8192)
1992		a_len = 8192;
1993	else
1994		a_len = alloc_len;
1995	arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
1996	if (NULL == arr) {
1997		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
1998				INSUFF_RES_ASCQ);
1999		return check_condition_result;
2000	}
2001	switch (reporting_opts) {
2002	case 0:	/* all commands */
2003		/* count number of commands */
2004		for (count = 0, oip = opcode_info_arr;
2005		     oip->num_attached != 0xff; ++oip) {
2006			if (F_INV_OP & oip->flags)
2007				continue;
2008			count += (oip->num_attached + 1);
2009		}
2010		bump = rctd ? 20 : 8;
2011		put_unaligned_be32(count * bump, arr);
2012		for (offset = 4, oip = opcode_info_arr;
2013		     oip->num_attached != 0xff && offset < a_len; ++oip) {
2014			if (F_INV_OP & oip->flags)
2015				continue;
2016			na = oip->num_attached;
2017			arr[offset] = oip->opcode;
2018			put_unaligned_be16(oip->sa, arr + offset + 2);
2019			if (rctd)
2020				arr[offset + 5] |= 0x2;
2021			if (FF_SA & oip->flags)
2022				arr[offset + 5] |= 0x1;
2023			put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
2024			if (rctd)
2025				put_unaligned_be16(0xa, arr + offset + 8);
2026			r_oip = oip;
2027			for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
2028				if (F_INV_OP & oip->flags)
2029					continue;
2030				offset += bump;
2031				arr[offset] = oip->opcode;
2032				put_unaligned_be16(oip->sa, arr + offset + 2);
2033				if (rctd)
2034					arr[offset + 5] |= 0x2;
2035				if (FF_SA & oip->flags)
2036					arr[offset + 5] |= 0x1;
2037				put_unaligned_be16(oip->len_mask[0],
2038						   arr + offset + 6);
2039				if (rctd)
2040					put_unaligned_be16(0xa,
2041							   arr + offset + 8);
2042			}
2043			oip = r_oip;
2044			offset += bump;
2045		}
2046		break;
2047	case 1:	/* one command: opcode only */
2048	case 2:	/* one command: opcode plus service action */
2049	case 3:	/* one command: if sa==0 then opcode only else opcode+sa */
2050		sdeb_i = opcode_ind_arr[req_opcode];
2051		oip = &opcode_info_arr[sdeb_i];
2052		if (F_INV_OP & oip->flags) {
2053			supp = 1;
2054			offset = 4;
2055		} else {
2056			if (1 == reporting_opts) {
2057				if (FF_SA & oip->flags) {
2058					mk_sense_invalid_fld(scp, SDEB_IN_CDB,
2059							     2, 2);
2060					kfree(arr);
2061					return check_condition_result;
2062				}
2063				req_sa = 0;
2064			} else if (2 == reporting_opts &&
2065				   0 == (FF_SA & oip->flags)) {
2066				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
2067				kfree(arr);	/* point at requested sa */
2068				return check_condition_result;
2069			}
2070			if (0 == (FF_SA & oip->flags) &&
2071			    req_opcode == oip->opcode)
2072				supp = 3;
2073			else if (0 == (FF_SA & oip->flags)) {
2074				na = oip->num_attached;
2075				for (k = 0, oip = oip->arrp; k < na;
2076				     ++k, ++oip) {
2077					if (req_opcode == oip->opcode)
2078						break;
2079				}
2080				supp = (k >= na) ? 1 : 3;
2081			} else if (req_sa != oip->sa) {
2082				na = oip->num_attached;
2083				for (k = 0, oip = oip->arrp; k < na;
2084				     ++k, ++oip) {
2085					if (req_sa == oip->sa)
2086						break;
2087				}
2088				supp = (k >= na) ? 1 : 3;
2089			} else
2090				supp = 3;
2091			if (3 == supp) {
2092				u = oip->len_mask[0];
2093				put_unaligned_be16(u, arr + 2);
2094				arr[4] = oip->opcode;
2095				for (k = 1; k < u; ++k)
2096					arr[4 + k] = (k < 16) ?
2097						 oip->len_mask[k] : 0xff;
2098				offset = 4 + u;
2099			} else
2100				offset = 4;
2101		}
2102		arr[1] = (rctd ? 0x80 : 0) | supp;
2103		if (rctd) {
2104			put_unaligned_be16(0xa, arr + offset);
2105			offset += 12;
2106		}
2107		break;
2108	default:
2109		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
2110		kfree(arr);
2111		return check_condition_result;
2112	}
2113	offset = (offset < a_len) ? offset : a_len;
2114	len = (offset < alloc_len) ? offset : alloc_len;
2115	errsts = fill_from_dev_buffer(scp, arr, len);
2116	kfree(arr);
2117	return errsts;
2118}
2119
2120static int resp_rsup_tmfs(struct scsi_cmnd *scp,
2121			  struct sdebug_dev_info *devip)
2122{
2123	bool repd;
2124	u32 alloc_len, len;
2125	u8 arr[16];
2126	u8 *cmd = scp->cmnd;
2127
2128	memset(arr, 0, sizeof(arr));
2129	repd = !!(cmd[2] & 0x80);
2130	alloc_len = get_unaligned_be32(cmd + 6);
2131	if (alloc_len < 4) {
2132		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
2133		return check_condition_result;
2134	}
2135	arr[0] = 0xc8;		/* ATS | ATSS | LURS */
2136	arr[1] = 0x1;		/* ITNRS */
2137	if (repd) {
2138		arr[3] = 0xc;
2139		len = 16;
2140	} else
2141		len = 4;
2142
2143	len = (len < alloc_len) ? len : alloc_len;
2144	return fill_from_dev_buffer(scp, arr, len);
2145}
2146
2147/* <<Following mode page info copied from ST318451LW>> */
2148
2149static int resp_err_recov_pg(unsigned char *p, int pcontrol, int target)
2150{	/* Read-Write Error Recovery page for mode_sense */
2151	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
2152					5, 0, 0xff, 0xff};
2153
2154	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
2155	if (1 == pcontrol)
2156		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
2157	return sizeof(err_recov_pg);
2158}
2159
2160static int resp_disconnect_pg(unsigned char *p, int pcontrol, int target)
2161{ 	/* Disconnect-Reconnect page for mode_sense */
2162	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
2163					 0, 0, 0, 0, 0, 0, 0, 0};
2164
2165	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
2166	if (1 == pcontrol)
2167		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
2168	return sizeof(disconnect_pg);
2169}
2170
2171static int resp_format_pg(unsigned char *p, int pcontrol, int target)
2172{       /* Format device page for mode_sense */
2173	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
2174				     0, 0, 0, 0, 0, 0, 0, 0,
2175				     0, 0, 0, 0, 0x40, 0, 0, 0};
2176
2177	memcpy(p, format_pg, sizeof(format_pg));
2178	put_unaligned_be16(sdebug_sectors_per, p + 10);
2179	put_unaligned_be16(sdebug_sector_size, p + 12);
2180	if (sdebug_removable)
2181		p[20] |= 0x20; /* should agree with INQUIRY */
2182	if (1 == pcontrol)
2183		memset(p + 2, 0, sizeof(format_pg) - 2);
2184	return sizeof(format_pg);
2185}
2186
2187static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2188				     0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
2189				     0, 0, 0, 0};
2190
2191static int resp_caching_pg(unsigned char *p, int pcontrol, int target)
2192{ 	/* Caching page for mode_sense */
2193	unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
2194		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2195	unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2196		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
2197
2198	if (SDEBUG_OPT_N_WCE & sdebug_opts)
2199		caching_pg[2] &= ~0x4;	/* set WCE=0 (default WCE=1) */
2200	memcpy(p, caching_pg, sizeof(caching_pg));
2201	if (1 == pcontrol)
2202		memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
2203	else if (2 == pcontrol)
2204		memcpy(p, d_caching_pg, sizeof(d_caching_pg));
2205	return sizeof(caching_pg);
2206}
2207
2208static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2209				    0, 0, 0x2, 0x4b};
2210
2211static int resp_ctrl_m_pg(unsigned char *p, int pcontrol, int target)
2212{ 	/* Control mode page for mode_sense */
2213	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
2214					0, 0, 0, 0};
2215	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2216				     0, 0, 0x2, 0x4b};
2217
2218	if (sdebug_dsense)
2219		ctrl_m_pg[2] |= 0x4;
2220	else
2221		ctrl_m_pg[2] &= ~0x4;
2222
2223	if (sdebug_ato)
2224		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
2225
2226	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
2227	if (1 == pcontrol)
2228		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
2229	else if (2 == pcontrol)
2230		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
2231	return sizeof(ctrl_m_pg);
2232}
2233
2234
2235static int resp_iec_m_pg(unsigned char *p, int pcontrol, int target)
2236{	/* Informational Exceptions control mode page for mode_sense */
2237	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
2238				       0, 0, 0x0, 0x0};
2239	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
2240				      0, 0, 0x0, 0x0};
2241
2242	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
2243	if (1 == pcontrol)
2244		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
2245	else if (2 == pcontrol)
2246		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
2247	return sizeof(iec_m_pg);
2248}
2249
2250static int resp_sas_sf_m_pg(unsigned char *p, int pcontrol, int target)
2251{	/* SAS SSP mode page - short format for mode_sense */
2252	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
2253		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
2254
2255	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
2256	if (1 == pcontrol)
2257		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
2258	return sizeof(sas_sf_m_pg);
2259}
2260
2261
2262static int resp_sas_pcd_m_spg(unsigned char *p, int pcontrol, int target,
2263			      int target_dev_id)
2264{	/* SAS phy control and discover mode page for mode_sense */
2265	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
2266		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
2267		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2268		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2269		    0x2, 0, 0, 0, 0, 0, 0, 0,
2270		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2271		    0, 0, 0, 0, 0, 0, 0, 0,
2272		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
2273		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2274		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2275		    0x3, 0, 0, 0, 0, 0, 0, 0,
2276		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2277		    0, 0, 0, 0, 0, 0, 0, 0,
2278		};
2279	int port_a, port_b;
2280
2281	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
2282	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
2283	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
2284	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
2285	port_a = target_dev_id + 1;
2286	port_b = port_a + 1;
2287	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
2288	put_unaligned_be32(port_a, p + 20);
2289	put_unaligned_be32(port_b, p + 48 + 20);
2290	if (1 == pcontrol)
2291		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
2292	return sizeof(sas_pcd_m_pg);
2293}
2294
2295static int resp_sas_sha_m_spg(unsigned char *p, int pcontrol)
2296{	/* SAS SSP shared protocol specific port mode subpage */
2297	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
2298		    0, 0, 0, 0, 0, 0, 0, 0,
2299		};
2300
2301	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
2302	if (1 == pcontrol)
2303		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
2304	return sizeof(sas_sha_m_pg);
2305}
2306
2307#define SDEBUG_MAX_MSENSE_SZ 256
2308
2309static int resp_mode_sense(struct scsi_cmnd *scp,
2310			   struct sdebug_dev_info *devip)
2311{
2312	int pcontrol, pcode, subpcode, bd_len;
2313	unsigned char dev_spec;
2314	int alloc_len, offset, len, target_dev_id;
2315	int target = scp->device->id;
2316	unsigned char *ap;
2317	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
2318	unsigned char *cmd = scp->cmnd;
2319	bool dbd, llbaa, msense_6, is_disk, is_zbc, bad_pcode;
2320
2321	dbd = !!(cmd[1] & 0x8);		/* disable block descriptors */
2322	pcontrol = (cmd[2] & 0xc0) >> 6;
2323	pcode = cmd[2] & 0x3f;
2324	subpcode = cmd[3];
2325	msense_6 = (MODE_SENSE == cmd[0]);
2326	llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2327	is_disk = (sdebug_ptype == TYPE_DISK);
2328	is_zbc = (devip->zmodel != BLK_ZONED_NONE);
2329	if ((is_disk || is_zbc) && !dbd)
2330		bd_len = llbaa ? 16 : 8;
2331	else
2332		bd_len = 0;
2333	alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2334	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2335	if (0x3 == pcontrol) {  /* Saving values not supported */
2336		mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
2337		return check_condition_result;
2338	}
2339	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2340			(devip->target * 1000) - 3;
2341	/* for disks+zbc set DPOFUA bit and clear write protect (WP) bit */
2342	if (is_disk || is_zbc) {
2343		dev_spec = 0x10;	/* =0x90 if WP=1 implies read-only */
2344		if (sdebug_wp)
2345			dev_spec |= 0x80;
2346	} else
2347		dev_spec = 0x0;
2348	if (msense_6) {
2349		arr[2] = dev_spec;
2350		arr[3] = bd_len;
2351		offset = 4;
2352	} else {
2353		arr[3] = dev_spec;
2354		if (16 == bd_len)
2355			arr[4] = 0x1;	/* set LONGLBA bit */
2356		arr[7] = bd_len;	/* assume 255 or less */
2357		offset = 8;
2358	}
2359	ap = arr + offset;
2360	if ((bd_len > 0) && (!sdebug_capacity))
2361		sdebug_capacity = get_sdebug_capacity();
2362
2363	if (8 == bd_len) {
2364		if (sdebug_capacity > 0xfffffffe)
2365			put_unaligned_be32(0xffffffff, ap + 0);
2366		else
2367			put_unaligned_be32(sdebug_capacity, ap + 0);
2368		put_unaligned_be16(sdebug_sector_size, ap + 6);
2369		offset += bd_len;
2370		ap = arr + offset;
2371	} else if (16 == bd_len) {
2372		put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2373		put_unaligned_be32(sdebug_sector_size, ap + 12);
2374		offset += bd_len;
2375		ap = arr + offset;
2376	}
2377
2378	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2379		/* TODO: Control Extension page */
2380		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2381		return check_condition_result;
2382	}
2383	bad_pcode = false;
2384
2385	switch (pcode) {
2386	case 0x1:	/* Read-Write error recovery page, direct access */
2387		len = resp_err_recov_pg(ap, pcontrol, target);
2388		offset += len;
2389		break;
2390	case 0x2:	/* Disconnect-Reconnect page, all devices */
2391		len = resp_disconnect_pg(ap, pcontrol, target);
2392		offset += len;
2393		break;
2394	case 0x3:       /* Format device page, direct access */
2395		if (is_disk) {
2396			len = resp_format_pg(ap, pcontrol, target);
2397			offset += len;
2398		} else
2399			bad_pcode = true;
2400		break;
2401	case 0x8:	/* Caching page, direct access */
2402		if (is_disk || is_zbc) {
2403			len = resp_caching_pg(ap, pcontrol, target);
2404			offset += len;
2405		} else
2406			bad_pcode = true;
2407		break;
2408	case 0xa:	/* Control Mode page, all devices */
2409		len = resp_ctrl_m_pg(ap, pcontrol, target);
2410		offset += len;
2411		break;
2412	case 0x19:	/* if spc==1 then sas phy, control+discover */
2413		if ((subpcode > 0x2) && (subpcode < 0xff)) {
2414			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2415			return check_condition_result;
2416		}
2417		len = 0;
2418		if ((0x0 == subpcode) || (0xff == subpcode))
2419			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2420		if ((0x1 == subpcode) || (0xff == subpcode))
2421			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2422						  target_dev_id);
2423		if ((0x2 == subpcode) || (0xff == subpcode))
2424			len += resp_sas_sha_m_spg(ap + len, pcontrol);
2425		offset += len;
2426		break;
2427	case 0x1c:	/* Informational Exceptions Mode page, all devices */
2428		len = resp_iec_m_pg(ap, pcontrol, target);
2429		offset += len;
2430		break;
2431	case 0x3f:	/* Read all Mode pages */
2432		if ((0 == subpcode) || (0xff == subpcode)) {
2433			len = resp_err_recov_pg(ap, pcontrol, target);
2434			len += resp_disconnect_pg(ap + len, pcontrol, target);
2435			if (is_disk) {
2436				len += resp_format_pg(ap + len, pcontrol,
2437						      target);
2438				len += resp_caching_pg(ap + len, pcontrol,
2439						       target);
2440			} else if (is_zbc) {
2441				len += resp_caching_pg(ap + len, pcontrol,
2442						       target);
2443			}
2444			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2445			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2446			if (0xff == subpcode) {
2447				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2448						  target, target_dev_id);
2449				len += resp_sas_sha_m_spg(ap + len, pcontrol);
2450			}
2451			len += resp_iec_m_pg(ap + len, pcontrol, target);
2452			offset += len;
2453		} else {
2454			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2455			return check_condition_result;
2456		}
2457		break;
2458	default:
2459		bad_pcode = true;
2460		break;
2461	}
2462	if (bad_pcode) {
2463		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2464		return check_condition_result;
2465	}
2466	if (msense_6)
2467		arr[0] = offset - 1;
2468	else
2469		put_unaligned_be16((offset - 2), arr + 0);
2470	return fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, offset));
2471}
2472
2473#define SDEBUG_MAX_MSELECT_SZ 512
2474
2475static int resp_mode_select(struct scsi_cmnd *scp,
2476			    struct sdebug_dev_info *devip)
2477{
2478	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
2479	int param_len, res, mpage;
2480	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
2481	unsigned char *cmd = scp->cmnd;
2482	int mselect6 = (MODE_SELECT == cmd[0]);
2483
2484	memset(arr, 0, sizeof(arr));
2485	pf = cmd[1] & 0x10;
2486	sp = cmd[1] & 0x1;
2487	param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2488	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
2489		mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
2490		return check_condition_result;
2491	}
2492	res = fetch_to_dev_buffer(scp, arr, param_len);
2493	if (-1 == res)
2494		return DID_ERROR << 16;
2495	else if (sdebug_verbose && (res < param_len))
2496		sdev_printk(KERN_INFO, scp->device,
2497			    "%s: cdb indicated=%d, IO sent=%d bytes\n",
2498			    __func__, param_len, res);
2499	md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2500	bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
2501	if (md_len > 2) {
2502		mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
2503		return check_condition_result;
2504	}
2505	off = bd_len + (mselect6 ? 4 : 8);
2506	mpage = arr[off] & 0x3f;
2507	ps = !!(arr[off] & 0x80);
2508	if (ps) {
2509		mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
2510		return check_condition_result;
2511	}
2512	spf = !!(arr[off] & 0x40);
2513	pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
2514		       (arr[off + 1] + 2);
2515	if ((pg_len + off) > param_len) {
2516		mk_sense_buffer(scp, ILLEGAL_REQUEST,
2517				PARAMETER_LIST_LENGTH_ERR, 0);
2518		return check_condition_result;
2519	}
2520	switch (mpage) {
2521	case 0x8:      /* Caching Mode page */
2522		if (caching_pg[1] == arr[off + 1]) {
2523			memcpy(caching_pg + 2, arr + off + 2,
2524			       sizeof(caching_pg) - 2);
2525			goto set_mode_changed_ua;
2526		}
2527		break;
2528	case 0xa:      /* Control Mode page */
2529		if (ctrl_m_pg[1] == arr[off + 1]) {
2530			memcpy(ctrl_m_pg + 2, arr + off + 2,
2531			       sizeof(ctrl_m_pg) - 2);
2532			if (ctrl_m_pg[4] & 0x8)
2533				sdebug_wp = true;
2534			else
2535				sdebug_wp = false;
2536			sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
2537			goto set_mode_changed_ua;
2538		}
2539		break;
2540	case 0x1c:      /* Informational Exceptions Mode page */
2541		if (iec_m_pg[1] == arr[off + 1]) {
2542			memcpy(iec_m_pg + 2, arr + off + 2,
2543			       sizeof(iec_m_pg) - 2);
2544			goto set_mode_changed_ua;
2545		}
2546		break;
2547	default:
2548		break;
2549	}
2550	mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
2551	return check_condition_result;
2552set_mode_changed_ua:
2553	set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2554	return 0;
2555}
2556
2557static int resp_temp_l_pg(unsigned char *arr)
2558{
2559	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2560				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
2561		};
2562
2563	memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2564	return sizeof(temp_l_pg);
2565}
2566
2567static int resp_ie_l_pg(unsigned char *arr)
2568{
2569	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2570		};
2571
2572	memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2573	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
2574		arr[4] = THRESHOLD_EXCEEDED;
2575		arr[5] = 0xff;
2576	}
2577	return sizeof(ie_l_pg);
2578}
2579
2580#define SDEBUG_MAX_LSENSE_SZ 512
2581
2582static int resp_log_sense(struct scsi_cmnd *scp,
2583			  struct sdebug_dev_info *devip)
2584{
2585	int ppc, sp, pcode, subpcode, alloc_len, len, n;
2586	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
2587	unsigned char *cmd = scp->cmnd;
2588
2589	memset(arr, 0, sizeof(arr));
2590	ppc = cmd[1] & 0x2;
2591	sp = cmd[1] & 0x1;
2592	if (ppc || sp) {
2593		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
2594		return check_condition_result;
2595	}
2596	pcode = cmd[2] & 0x3f;
2597	subpcode = cmd[3] & 0xff;
2598	alloc_len = get_unaligned_be16(cmd + 7);
2599	arr[0] = pcode;
2600	if (0 == subpcode) {
2601		switch (pcode) {
2602		case 0x0:	/* Supported log pages log page */
2603			n = 4;
2604			arr[n++] = 0x0;		/* this page */
2605			arr[n++] = 0xd;		/* Temperature */
2606			arr[n++] = 0x2f;	/* Informational exceptions */
2607			arr[3] = n - 4;
2608			break;
2609		case 0xd:	/* Temperature log page */
2610			arr[3] = resp_temp_l_pg(arr + 4);
2611			break;
2612		case 0x2f:	/* Informational exceptions log page */
2613			arr[3] = resp_ie_l_pg(arr + 4);
2614			break;
2615		default:
2616			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2617			return check_condition_result;
2618		}
2619	} else if (0xff == subpcode) {
2620		arr[0] |= 0x40;
2621		arr[1] = subpcode;
2622		switch (pcode) {
2623		case 0x0:	/* Supported log pages and subpages log page */
2624			n = 4;
2625			arr[n++] = 0x0;
2626			arr[n++] = 0x0;		/* 0,0 page */
2627			arr[n++] = 0x0;
2628			arr[n++] = 0xff;	/* this page */
2629			arr[n++] = 0xd;
2630			arr[n++] = 0x0;		/* Temperature */
2631			arr[n++] = 0x2f;
2632			arr[n++] = 0x0;	/* Informational exceptions */
2633			arr[3] = n - 4;
2634			break;
2635		case 0xd:	/* Temperature subpages */
2636			n = 4;
2637			arr[n++] = 0xd;
2638			arr[n++] = 0x0;		/* Temperature */
2639			arr[3] = n - 4;
2640			break;
2641		case 0x2f:	/* Informational exceptions subpages */
2642			n = 4;
2643			arr[n++] = 0x2f;
2644			arr[n++] = 0x0;		/* Informational exceptions */
2645			arr[3] = n - 4;
2646			break;
2647		default:
2648			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2649			return check_condition_result;
2650		}
2651	} else {
2652		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2653		return check_condition_result;
2654	}
2655	len = min_t(int, get_unaligned_be16(arr + 2) + 4, alloc_len);
2656	return fill_from_dev_buffer(scp, arr,
2657		    min_t(int, len, SDEBUG_MAX_INQ_ARR_SZ));
2658}
2659
2660static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip)
2661{
2662	return devip->nr_zones != 0;
2663}
2664
2665static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip,
2666					unsigned long long lba)
2667{
2668	return &devip->zstate[lba >> devip->zsize_shift];
2669}
2670
2671static inline bool zbc_zone_is_conv(struct sdeb_zone_state *zsp)
2672{
2673	return zsp->z_type == ZBC_ZONE_TYPE_CNV;
2674}
2675
2676static void zbc_close_zone(struct sdebug_dev_info *devip,
2677			   struct sdeb_zone_state *zsp)
2678{
2679	enum sdebug_z_cond zc;
2680
2681	if (zbc_zone_is_conv(zsp))
2682		return;
2683
2684	zc = zsp->z_cond;
2685	if (!(zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN))
2686		return;
2687
2688	if (zc == ZC2_IMPLICIT_OPEN)
2689		devip->nr_imp_open--;
2690	else
2691		devip->nr_exp_open--;
2692
2693	if (zsp->z_wp == zsp->z_start) {
2694		zsp->z_cond = ZC1_EMPTY;
2695	} else {
2696		zsp->z_cond = ZC4_CLOSED;
2697		devip->nr_closed++;
2698	}
2699}
2700
2701static void zbc_close_imp_open_zone(struct sdebug_dev_info *devip)
2702{
2703	struct sdeb_zone_state *zsp = &devip->zstate[0];
2704	unsigned int i;
2705
2706	for (i = 0; i < devip->nr_zones; i++, zsp++) {
2707		if (zsp->z_cond == ZC2_IMPLICIT_OPEN) {
2708			zbc_close_zone(devip, zsp);
2709			return;
2710		}
2711	}
2712}
2713
2714static void zbc_open_zone(struct sdebug_dev_info *devip,
2715			  struct sdeb_zone_state *zsp, bool explicit)
2716{
2717	enum sdebug_z_cond zc;
2718
2719	if (zbc_zone_is_conv(zsp))
2720		return;
2721
2722	zc = zsp->z_cond;
2723	if ((explicit && zc == ZC3_EXPLICIT_OPEN) ||
2724	    (!explicit && zc == ZC2_IMPLICIT_OPEN))
2725		return;
2726
2727	/* Close an implicit open zone if necessary */
2728	if (explicit && zsp->z_cond == ZC2_IMPLICIT_OPEN)
2729		zbc_close_zone(devip, zsp);
2730	else if (devip->max_open &&
2731		 devip->nr_imp_open + devip->nr_exp_open >= devip->max_open)
2732		zbc_close_imp_open_zone(devip);
2733
2734	if (zsp->z_cond == ZC4_CLOSED)
2735		devip->nr_closed--;
2736	if (explicit) {
2737		zsp->z_cond = ZC3_EXPLICIT_OPEN;
2738		devip->nr_exp_open++;
2739	} else {
2740		zsp->z_cond = ZC2_IMPLICIT_OPEN;
2741		devip->nr_imp_open++;
2742	}
2743}
2744
2745static void zbc_inc_wp(struct sdebug_dev_info *devip,
2746		       unsigned long long lba, unsigned int num)
2747{
2748	struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2749	unsigned long long n, end, zend = zsp->z_start + zsp->z_size;
2750
2751	if (zbc_zone_is_conv(zsp))
2752		return;
2753
2754	if (zsp->z_type == ZBC_ZONE_TYPE_SWR) {
2755		zsp->z_wp += num;
2756		if (zsp->z_wp >= zend)
2757			zsp->z_cond = ZC5_FULL;
2758		return;
2759	}
2760
2761	while (num) {
2762		if (lba != zsp->z_wp)
2763			zsp->z_non_seq_resource = true;
2764
2765		end = lba + num;
2766		if (end >= zend) {
2767			n = zend - lba;
2768			zsp->z_wp = zend;
2769		} else if (end > zsp->z_wp) {
2770			n = num;
2771			zsp->z_wp = end;
2772		} else {
2773			n = num;
2774		}
2775		if (zsp->z_wp >= zend)
2776			zsp->z_cond = ZC5_FULL;
2777
2778		num -= n;
2779		lba += n;
2780		if (num) {
2781			zsp++;
2782			zend = zsp->z_start + zsp->z_size;
2783		}
2784	}
2785}
2786
2787static int check_zbc_access_params(struct scsi_cmnd *scp,
2788			unsigned long long lba, unsigned int num, bool write)
2789{
2790	struct scsi_device *sdp = scp->device;
2791	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2792	struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2793	struct sdeb_zone_state *zsp_end = zbc_zone(devip, lba + num - 1);
2794
2795	if (!write) {
2796		if (devip->zmodel == BLK_ZONED_HA)
2797			return 0;
2798		/* For host-managed, reads cannot cross zone types boundaries */
2799		if (zsp_end != zsp &&
2800		    zbc_zone_is_conv(zsp) &&
2801		    !zbc_zone_is_conv(zsp_end)) {
2802			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2803					LBA_OUT_OF_RANGE,
2804					READ_INVDATA_ASCQ);
2805			return check_condition_result;
2806		}
2807		return 0;
2808	}
2809
2810	/* No restrictions for writes within conventional zones */
2811	if (zbc_zone_is_conv(zsp)) {
2812		if (!zbc_zone_is_conv(zsp_end)) {
2813			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2814					LBA_OUT_OF_RANGE,
2815					WRITE_BOUNDARY_ASCQ);
2816			return check_condition_result;
2817		}
2818		return 0;
2819	}
2820
2821	if (zsp->z_type == ZBC_ZONE_TYPE_SWR) {
2822		/* Writes cannot cross sequential zone boundaries */
2823		if (zsp_end != zsp) {
2824			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2825					LBA_OUT_OF_RANGE,
2826					WRITE_BOUNDARY_ASCQ);
2827			return check_condition_result;
2828		}
2829		/* Cannot write full zones */
2830		if (zsp->z_cond == ZC5_FULL) {
2831			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2832					INVALID_FIELD_IN_CDB, 0);
2833			return check_condition_result;
2834		}
2835		/* Writes must be aligned to the zone WP */
2836		if (lba != zsp->z_wp) {
2837			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2838					LBA_OUT_OF_RANGE,
2839					UNALIGNED_WRITE_ASCQ);
2840			return check_condition_result;
2841		}
2842	}
2843
2844	/* Handle implicit open of closed and empty zones */
2845	if (zsp->z_cond == ZC1_EMPTY || zsp->z_cond == ZC4_CLOSED) {
2846		if (devip->max_open &&
2847		    devip->nr_exp_open >= devip->max_open) {
2848			mk_sense_buffer(scp, DATA_PROTECT,
2849					INSUFF_RES_ASC,
2850					INSUFF_ZONE_ASCQ);
2851			return check_condition_result;
2852		}
2853		zbc_open_zone(devip, zsp, false);
2854	}
2855
2856	return 0;
2857}
2858
2859static inline int check_device_access_params
2860			(struct scsi_cmnd *scp, unsigned long long lba,
2861			 unsigned int num, bool write)
2862{
2863	struct scsi_device *sdp = scp->device;
2864	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2865
2866	if (lba + num > sdebug_capacity) {
2867		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2868		return check_condition_result;
2869	}
2870	/* transfer length excessive (tie in to block limits VPD page) */
2871	if (num > sdebug_store_sectors) {
2872		/* needs work to find which cdb byte 'num' comes from */
2873		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2874		return check_condition_result;
2875	}
2876	if (write && unlikely(sdebug_wp)) {
2877		mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
2878		return check_condition_result;
2879	}
2880	if (sdebug_dev_is_zoned(devip))
2881		return check_zbc_access_params(scp, lba, num, write);
2882
2883	return 0;
2884}
2885
2886/*
2887 * Note: if BUG_ON() fires it usually indicates a problem with the parser
2888 * tables. Perhaps a missing F_FAKE_RW or FF_MEDIA_IO flag. Response functions
2889 * that access any of the "stores" in struct sdeb_store_info should call this
2890 * function with bug_if_fake_rw set to true.
2891 */
2892static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip,
2893						bool bug_if_fake_rw)
2894{
2895	if (sdebug_fake_rw) {
2896		BUG_ON(bug_if_fake_rw);	/* See note above */
2897		return NULL;
2898	}
2899	return xa_load(per_store_ap, devip->sdbg_host->si_idx);
2900}
2901
2902/* Returns number of bytes copied or -1 if error. */
2903static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
2904			    u32 sg_skip, u64 lba, u32 num, bool do_write)
2905{
2906	int ret;
2907	u64 block, rest = 0;
 
2908	enum dma_data_direction dir;
2909	struct scsi_data_buffer *sdb = &scp->sdb;
2910	u8 *fsp;
2911
2912	if (do_write) {
2913		dir = DMA_TO_DEVICE;
2914		write_since_sync = true;
2915	} else {
2916		dir = DMA_FROM_DEVICE;
2917	}
2918
2919	if (!sdb->length || !sip)
2920		return 0;
2921	if (scp->sc_data_direction != dir)
2922		return -1;
2923	fsp = sip->storep;
2924
2925	block = do_div(lba, sdebug_store_sectors);
2926	if (block + num > sdebug_store_sectors)
2927		rest = block + num - sdebug_store_sectors;
2928
2929	ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2930		   fsp + (block * sdebug_sector_size),
2931		   (num - rest) * sdebug_sector_size, sg_skip, do_write);
2932	if (ret != (num - rest) * sdebug_sector_size)
2933		return ret;
2934
2935	if (rest) {
2936		ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2937			    fsp, rest * sdebug_sector_size,
2938			    sg_skip + ((num - rest) * sdebug_sector_size),
2939			    do_write);
2940	}
2941
2942	return ret;
2943}
2944
2945/* Returns number of bytes copied or -1 if error. */
2946static int do_dout_fetch(struct scsi_cmnd *scp, u32 num, u8 *doutp)
2947{
2948	struct scsi_data_buffer *sdb = &scp->sdb;
2949
2950	if (!sdb->length)
2951		return 0;
2952	if (scp->sc_data_direction != DMA_TO_DEVICE)
2953		return -1;
2954	return sg_copy_buffer(sdb->table.sgl, sdb->table.nents, doutp,
2955			      num * sdebug_sector_size, 0, true);
2956}
2957
2958/* If sip->storep+lba compares equal to arr(num), then copy top half of
2959 * arr into sip->storep+lba and return true. If comparison fails then
2960 * return false. */
2961static bool comp_write_worker(struct sdeb_store_info *sip, u64 lba, u32 num,
2962			      const u8 *arr, bool compare_only)
2963{
2964	bool res;
2965	u64 block, rest = 0;
2966	u32 store_blks = sdebug_store_sectors;
2967	u32 lb_size = sdebug_sector_size;
2968	u8 *fsp = sip->storep;
2969
2970	block = do_div(lba, store_blks);
2971	if (block + num > store_blks)
2972		rest = block + num - store_blks;
2973
2974	res = !memcmp(fsp + (block * lb_size), arr, (num - rest) * lb_size);
 
2975	if (!res)
2976		return res;
2977	if (rest)
2978		res = memcmp(fsp, arr + ((num - rest) * lb_size),
2979			     rest * lb_size);
2980	if (!res)
2981		return res;
2982	if (compare_only)
2983		return true;
2984	arr += num * lb_size;
2985	memcpy(fsp + (block * lb_size), arr, (num - rest) * lb_size);
2986	if (rest)
2987		memcpy(fsp, arr + ((num - rest) * lb_size), rest * lb_size);
 
2988	return res;
2989}
2990
2991static __be16 dif_compute_csum(const void *buf, int len)
2992{
2993	__be16 csum;
2994
2995	if (sdebug_guard)
2996		csum = (__force __be16)ip_compute_csum(buf, len);
2997	else
2998		csum = cpu_to_be16(crc_t10dif(buf, len));
2999
3000	return csum;
3001}
3002
3003static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
3004		      sector_t sector, u32 ei_lba)
3005{
3006	__be16 csum = dif_compute_csum(data, sdebug_sector_size);
3007
3008	if (sdt->guard_tag != csum) {
3009		pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
3010			(unsigned long)sector,
3011			be16_to_cpu(sdt->guard_tag),
3012			be16_to_cpu(csum));
3013		return 0x01;
3014	}
3015	if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
3016	    be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
3017		pr_err("REF check failed on sector %lu\n",
3018			(unsigned long)sector);
3019		return 0x03;
3020	}
3021	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3022	    be32_to_cpu(sdt->ref_tag) != ei_lba) {
3023		pr_err("REF check failed on sector %lu\n",
3024			(unsigned long)sector);
3025		return 0x03;
3026	}
3027	return 0;
3028}
3029
3030static void dif_copy_prot(struct scsi_cmnd *scp, sector_t sector,
3031			  unsigned int sectors, bool read)
3032{
3033	size_t resid;
3034	void *paddr;
3035	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3036						scp->device->hostdata, true);
3037	struct t10_pi_tuple *dif_storep = sip->dif_storep;
3038	const void *dif_store_end = dif_storep + sdebug_store_sectors;
3039	struct sg_mapping_iter miter;
3040
3041	/* Bytes of protection data to copy into sgl */
3042	resid = sectors * sizeof(*dif_storep);
3043
3044	sg_miter_start(&miter, scsi_prot_sglist(scp),
3045		       scsi_prot_sg_count(scp), SG_MITER_ATOMIC |
3046		       (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
3047
3048	while (sg_miter_next(&miter) && resid > 0) {
3049		size_t len = min_t(size_t, miter.length, resid);
3050		void *start = dif_store(sip, sector);
3051		size_t rest = 0;
3052
3053		if (dif_store_end < start + len)
3054			rest = start + len - dif_store_end;
3055
3056		paddr = miter.addr;
3057
3058		if (read)
3059			memcpy(paddr, start, len - rest);
3060		else
3061			memcpy(start, paddr, len - rest);
3062
3063		if (rest) {
3064			if (read)
3065				memcpy(paddr + len - rest, dif_storep, rest);
3066			else
3067				memcpy(dif_storep, paddr + len - rest, rest);
3068		}
3069
3070		sector += len / sizeof(*dif_storep);
3071		resid -= len;
3072	}
3073	sg_miter_stop(&miter);
3074}
3075
3076static int prot_verify_read(struct scsi_cmnd *scp, sector_t start_sec,
3077			    unsigned int sectors, u32 ei_lba)
3078{
3079	unsigned int i;
3080	sector_t sector;
3081	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3082						scp->device->hostdata, true);
3083	struct t10_pi_tuple *sdt;
 
3084
3085	for (i = 0; i < sectors; i++, ei_lba++) {
3086		int ret;
3087
3088		sector = start_sec + i;
3089		sdt = dif_store(sip, sector);
3090
3091		if (sdt->app_tag == cpu_to_be16(0xffff))
3092			continue;
3093
3094		ret = dif_verify(sdt, lba2fake_store(sip, sector), sector,
3095				 ei_lba);
3096		if (ret) {
3097			dif_errors++;
3098			return ret;
3099		}
3100	}
3101
3102	dif_copy_prot(scp, start_sec, sectors, true);
3103	dix_reads++;
3104
3105	return 0;
3106}
3107
3108static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3109{
3110	bool check_prot;
 
 
3111	u32 num;
3112	u32 ei_lba;
 
3113	int ret;
3114	u64 lba;
3115	struct sdeb_store_info *sip = devip2sip(devip, true);
3116	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
3117	u8 *cmd = scp->cmnd;
3118
3119	switch (cmd[0]) {
3120	case READ_16:
3121		ei_lba = 0;
3122		lba = get_unaligned_be64(cmd + 2);
3123		num = get_unaligned_be32(cmd + 10);
3124		check_prot = true;
3125		break;
3126	case READ_10:
3127		ei_lba = 0;
3128		lba = get_unaligned_be32(cmd + 2);
3129		num = get_unaligned_be16(cmd + 7);
3130		check_prot = true;
3131		break;
3132	case READ_6:
3133		ei_lba = 0;
3134		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3135		      (u32)(cmd[1] & 0x1f) << 16;
3136		num = (0 == cmd[4]) ? 256 : cmd[4];
3137		check_prot = true;
3138		break;
3139	case READ_12:
3140		ei_lba = 0;
3141		lba = get_unaligned_be32(cmd + 2);
3142		num = get_unaligned_be32(cmd + 6);
3143		check_prot = true;
3144		break;
3145	case XDWRITEREAD_10:
3146		ei_lba = 0;
3147		lba = get_unaligned_be32(cmd + 2);
3148		num = get_unaligned_be16(cmd + 7);
3149		check_prot = false;
3150		break;
3151	default:	/* assume READ(32) */
3152		lba = get_unaligned_be64(cmd + 12);
3153		ei_lba = get_unaligned_be32(cmd + 20);
3154		num = get_unaligned_be32(cmd + 28);
3155		check_prot = false;
3156		break;
3157	}
3158	if (unlikely(have_dif_prot && check_prot)) {
3159		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3160		    (cmd[1] & 0xe0)) {
3161			mk_sense_invalid_opcode(scp);
3162			return check_condition_result;
3163		}
3164		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3165		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3166		    (cmd[1] & 0xe0) == 0)
3167			sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
3168				    "to DIF device\n");
3169	}
3170	if (unlikely((sdebug_opts & SDEBUG_OPT_SHORT_TRANSFER) &&
3171		     atomic_read(&sdeb_inject_pending))) {
3172		num /= 2;
3173		atomic_set(&sdeb_inject_pending, 0);
3174	}
 
 
 
 
3175
3176	ret = check_device_access_params(scp, lba, num, false);
3177	if (ret)
3178		return ret;
3179	if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
3180		     (lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
3181		     ((lba + num) > sdebug_medium_error_start))) {
3182		/* claim unrecoverable read error */
3183		mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
3184		/* set info field and valid bit for fixed descriptor */
3185		if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
3186			scp->sense_buffer[0] |= 0x80;	/* Valid bit */
3187			ret = (lba < OPT_MEDIUM_ERR_ADDR)
3188			      ? OPT_MEDIUM_ERR_ADDR : (int)lba;
3189			put_unaligned_be32(ret, scp->sense_buffer + 3);
3190		}
3191		scsi_set_resid(scp, scsi_bufflen(scp));
3192		return check_condition_result;
3193	}
3194
3195	read_lock(macc_lckp);
3196
3197	/* DIX + T10 DIF */
3198	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3199		int prot_ret = prot_verify_read(scp, lba, num, ei_lba);
3200
3201		if (prot_ret) {
3202			read_unlock(macc_lckp);
3203			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, prot_ret);
3204			return illegal_condition_result;
3205		}
3206	}
3207
3208	ret = do_device_access(sip, scp, 0, lba, num, false);
3209	read_unlock(macc_lckp);
3210	if (unlikely(ret == -1))
3211		return DID_ERROR << 16;
3212
3213	scsi_set_resid(scp, scsi_bufflen(scp) - ret);
3214
3215	if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3216		     atomic_read(&sdeb_inject_pending))) {
3217		if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3218			mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3219			atomic_set(&sdeb_inject_pending, 0);
3220			return check_condition_result;
3221		} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
 
 
 
 
3222			/* Logical block guard check failed */
3223			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3224			atomic_set(&sdeb_inject_pending, 0);
3225			return illegal_condition_result;
3226		} else if (SDEBUG_OPT_DIX_ERR & sdebug_opts) {
3227			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3228			atomic_set(&sdeb_inject_pending, 0);
3229			return illegal_condition_result;
3230		}
3231	}
3232	return 0;
3233}
3234
3235static void dump_sector(unsigned char *buf, int len)
3236{
3237	int i, j, n;
3238
3239	pr_err(">>> Sector Dump <<<\n");
3240	for (i = 0 ; i < len ; i += 16) {
3241		char b[128];
3242
3243		for (j = 0, n = 0; j < 16; j++) {
3244			unsigned char c = buf[i+j];
3245
3246			if (c >= 0x20 && c < 0x7e)
3247				n += scnprintf(b + n, sizeof(b) - n,
3248					       " %c ", buf[i+j]);
3249			else
3250				n += scnprintf(b + n, sizeof(b) - n,
3251					       "%02x ", buf[i+j]);
3252		}
3253		pr_err("%04d: %s\n", i, b);
3254	}
3255}
3256
3257static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
3258			     unsigned int sectors, u32 ei_lba)
3259{
3260	int ret;
3261	struct t10_pi_tuple *sdt;
3262	void *daddr;
3263	sector_t sector = start_sec;
3264	int ppage_offset;
3265	int dpage_offset;
3266	struct sg_mapping_iter diter;
3267	struct sg_mapping_iter piter;
3268
3269	BUG_ON(scsi_sg_count(SCpnt) == 0);
3270	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
3271
3272	sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
3273			scsi_prot_sg_count(SCpnt),
3274			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3275	sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
3276			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3277
3278	/* For each protection page */
3279	while (sg_miter_next(&piter)) {
3280		dpage_offset = 0;
3281		if (WARN_ON(!sg_miter_next(&diter))) {
3282			ret = 0x01;
3283			goto out;
3284		}
3285
3286		for (ppage_offset = 0; ppage_offset < piter.length;
3287		     ppage_offset += sizeof(struct t10_pi_tuple)) {
3288			/* If we're at the end of the current
3289			 * data page advance to the next one
3290			 */
3291			if (dpage_offset >= diter.length) {
3292				if (WARN_ON(!sg_miter_next(&diter))) {
3293					ret = 0x01;
3294					goto out;
3295				}
3296				dpage_offset = 0;
3297			}
3298
3299			sdt = piter.addr + ppage_offset;
3300			daddr = diter.addr + dpage_offset;
3301
3302			ret = dif_verify(sdt, daddr, sector, ei_lba);
3303			if (ret) {
3304				dump_sector(daddr, sdebug_sector_size);
3305				goto out;
3306			}
3307
3308			sector++;
3309			ei_lba++;
3310			dpage_offset += sdebug_sector_size;
3311		}
3312		diter.consumed = dpage_offset;
3313		sg_miter_stop(&diter);
3314	}
3315	sg_miter_stop(&piter);
3316
3317	dif_copy_prot(SCpnt, start_sec, sectors, false);
3318	dix_writes++;
3319
3320	return 0;
3321
3322out:
3323	dif_errors++;
3324	sg_miter_stop(&diter);
3325	sg_miter_stop(&piter);
3326	return ret;
3327}
3328
3329static unsigned long lba_to_map_index(sector_t lba)
3330{
3331	if (sdebug_unmap_alignment)
3332		lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
3333	sector_div(lba, sdebug_unmap_granularity);
3334	return lba;
3335}
3336
3337static sector_t map_index_to_lba(unsigned long index)
3338{
3339	sector_t lba = index * sdebug_unmap_granularity;
3340
3341	if (sdebug_unmap_alignment)
3342		lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
3343	return lba;
3344}
3345
3346static unsigned int map_state(struct sdeb_store_info *sip, sector_t lba,
3347			      unsigned int *num)
3348{
3349	sector_t end;
3350	unsigned int mapped;
3351	unsigned long index;
3352	unsigned long next;
3353
3354	index = lba_to_map_index(lba);
3355	mapped = test_bit(index, sip->map_storep);
3356
3357	if (mapped)
3358		next = find_next_zero_bit(sip->map_storep, map_size, index);
3359	else
3360		next = find_next_bit(sip->map_storep, map_size, index);
3361
3362	end = min_t(sector_t, sdebug_store_sectors,  map_index_to_lba(next));
3363	*num = end - lba;
3364	return mapped;
3365}
3366
3367static void map_region(struct sdeb_store_info *sip, sector_t lba,
3368		       unsigned int len)
3369{
3370	sector_t end = lba + len;
3371
3372	while (lba < end) {
3373		unsigned long index = lba_to_map_index(lba);
3374
3375		if (index < map_size)
3376			set_bit(index, sip->map_storep);
3377
3378		lba = map_index_to_lba(index + 1);
3379	}
3380}
3381
3382static void unmap_region(struct sdeb_store_info *sip, sector_t lba,
3383			 unsigned int len)
3384{
3385	sector_t end = lba + len;
3386	u8 *fsp = sip->storep;
3387
3388	while (lba < end) {
3389		unsigned long index = lba_to_map_index(lba);
3390
3391		if (lba == map_index_to_lba(index) &&
3392		    lba + sdebug_unmap_granularity <= end &&
3393		    index < map_size) {
3394			clear_bit(index, sip->map_storep);
3395			if (sdebug_lbprz) {  /* for LBPRZ=2 return 0xff_s */
3396				memset(fsp + lba * sdebug_sector_size,
 
3397				       (sdebug_lbprz & 1) ? 0 : 0xff,
3398				       sdebug_sector_size *
3399				       sdebug_unmap_granularity);
3400			}
3401			if (sip->dif_storep) {
3402				memset(sip->dif_storep + lba, 0xff,
3403				       sizeof(*sip->dif_storep) *
3404				       sdebug_unmap_granularity);
3405			}
3406		}
3407		lba = map_index_to_lba(index + 1);
3408	}
3409}
3410
3411static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3412{
3413	bool check_prot;
 
3414	u32 num;
3415	u32 ei_lba;
 
3416	int ret;
3417	u64 lba;
3418	struct sdeb_store_info *sip = devip2sip(devip, true);
3419	rwlock_t *macc_lckp = &sip->macc_lck;
3420	u8 *cmd = scp->cmnd;
3421
3422	switch (cmd[0]) {
3423	case WRITE_16:
3424		ei_lba = 0;
3425		lba = get_unaligned_be64(cmd + 2);
3426		num = get_unaligned_be32(cmd + 10);
3427		check_prot = true;
3428		break;
3429	case WRITE_10:
3430		ei_lba = 0;
3431		lba = get_unaligned_be32(cmd + 2);
3432		num = get_unaligned_be16(cmd + 7);
3433		check_prot = true;
3434		break;
3435	case WRITE_6:
3436		ei_lba = 0;
3437		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3438		      (u32)(cmd[1] & 0x1f) << 16;
3439		num = (0 == cmd[4]) ? 256 : cmd[4];
3440		check_prot = true;
3441		break;
3442	case WRITE_12:
3443		ei_lba = 0;
3444		lba = get_unaligned_be32(cmd + 2);
3445		num = get_unaligned_be32(cmd + 6);
3446		check_prot = true;
3447		break;
3448	case 0x53:	/* XDWRITEREAD(10) */
3449		ei_lba = 0;
3450		lba = get_unaligned_be32(cmd + 2);
3451		num = get_unaligned_be16(cmd + 7);
3452		check_prot = false;
3453		break;
3454	default:	/* assume WRITE(32) */
3455		lba = get_unaligned_be64(cmd + 12);
3456		ei_lba = get_unaligned_be32(cmd + 20);
3457		num = get_unaligned_be32(cmd + 28);
3458		check_prot = false;
3459		break;
3460	}
3461	if (unlikely(have_dif_prot && check_prot)) {
3462		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3463		    (cmd[1] & 0xe0)) {
3464			mk_sense_invalid_opcode(scp);
3465			return check_condition_result;
3466		}
3467		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3468		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3469		    (cmd[1] & 0xe0) == 0)
3470			sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3471				    "to DIF device\n");
3472	}
3473
3474	write_lock(macc_lckp);
3475	ret = check_device_access_params(scp, lba, num, true);
3476	if (ret) {
3477		write_unlock(macc_lckp);
3478		return ret;
3479	}
3480
3481	/* DIX + T10 DIF */
3482	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3483		int prot_ret = prot_verify_write(scp, lba, num, ei_lba);
3484
3485		if (prot_ret) {
3486			write_unlock(macc_lckp);
3487			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, prot_ret);
3488			return illegal_condition_result;
3489		}
3490	}
3491
3492	ret = do_device_access(sip, scp, 0, lba, num, true);
3493	if (unlikely(scsi_debug_lbp()))
3494		map_region(sip, lba, num);
3495	/* If ZBC zone then bump its write pointer */
3496	if (sdebug_dev_is_zoned(devip))
3497		zbc_inc_wp(devip, lba, num);
3498	write_unlock(macc_lckp);
3499	if (unlikely(-1 == ret))
3500		return DID_ERROR << 16;
3501	else if (unlikely(sdebug_verbose &&
3502			  (ret < (num * sdebug_sector_size))))
3503		sdev_printk(KERN_INFO, scp->device,
3504			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3505			    my_name, num * sdebug_sector_size, ret);
3506
3507	if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3508		     atomic_read(&sdeb_inject_pending))) {
3509		if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3510			mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3511			atomic_set(&sdeb_inject_pending, 0);
3512			return check_condition_result;
3513		} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3514			/* Logical block guard check failed */
3515			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3516			atomic_set(&sdeb_inject_pending, 0);
3517			return illegal_condition_result;
3518		} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3519			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3520			atomic_set(&sdeb_inject_pending, 0);
3521			return illegal_condition_result;
 
 
3522		}
3523	}
3524	return 0;
3525}
3526
3527/*
3528 * T10 has only specified WRITE SCATTERED(16) and WRITE SCATTERED(32).
3529 * No READ GATHERED yet (requires bidi or long cdb holding gather list).
3530 */
3531static int resp_write_scat(struct scsi_cmnd *scp,
3532			   struct sdebug_dev_info *devip)
3533{
3534	u8 *cmd = scp->cmnd;
3535	u8 *lrdp = NULL;
3536	u8 *up;
3537	struct sdeb_store_info *sip = devip2sip(devip, true);
3538	rwlock_t *macc_lckp = &sip->macc_lck;
3539	u8 wrprotect;
3540	u16 lbdof, num_lrd, k;
3541	u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
3542	u32 lb_size = sdebug_sector_size;
3543	u32 ei_lba;
3544	u64 lba;
 
3545	int ret, res;
3546	bool is_16;
3547	static const u32 lrd_size = 32; /* + parameter list header size */
3548
3549	if (cmd[0] == VARIABLE_LENGTH_CMD) {
3550		is_16 = false;
3551		wrprotect = (cmd[10] >> 5) & 0x7;
3552		lbdof = get_unaligned_be16(cmd + 12);
3553		num_lrd = get_unaligned_be16(cmd + 16);
3554		bt_len = get_unaligned_be32(cmd + 28);
3555	} else {        /* that leaves WRITE SCATTERED(16) */
3556		is_16 = true;
3557		wrprotect = (cmd[2] >> 5) & 0x7;
3558		lbdof = get_unaligned_be16(cmd + 4);
3559		num_lrd = get_unaligned_be16(cmd + 8);
3560		bt_len = get_unaligned_be32(cmd + 10);
3561		if (unlikely(have_dif_prot)) {
3562			if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3563			    wrprotect) {
3564				mk_sense_invalid_opcode(scp);
3565				return illegal_condition_result;
3566			}
3567			if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3568			     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3569			     wrprotect == 0)
3570				sdev_printk(KERN_ERR, scp->device,
3571					    "Unprotected WR to DIF device\n");
3572		}
3573	}
3574	if ((num_lrd == 0) || (bt_len == 0))
3575		return 0;       /* T10 says these do-nothings are not errors */
3576	if (lbdof == 0) {
3577		if (sdebug_verbose)
3578			sdev_printk(KERN_INFO, scp->device,
3579				"%s: %s: LB Data Offset field bad\n",
3580				my_name, __func__);
3581		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3582		return illegal_condition_result;
3583	}
3584	lbdof_blen = lbdof * lb_size;
3585	if ((lrd_size + (num_lrd * lrd_size)) > lbdof_blen) {
3586		if (sdebug_verbose)
3587			sdev_printk(KERN_INFO, scp->device,
3588				"%s: %s: LBA range descriptors don't fit\n",
3589				my_name, __func__);
3590		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3591		return illegal_condition_result;
3592	}
3593	lrdp = kzalloc(lbdof_blen, GFP_ATOMIC);
3594	if (lrdp == NULL)
3595		return SCSI_MLQUEUE_HOST_BUSY;
3596	if (sdebug_verbose)
3597		sdev_printk(KERN_INFO, scp->device,
3598			"%s: %s: Fetch header+scatter_list, lbdof_blen=%u\n",
3599			my_name, __func__, lbdof_blen);
3600	res = fetch_to_dev_buffer(scp, lrdp, lbdof_blen);
3601	if (res == -1) {
3602		ret = DID_ERROR << 16;
3603		goto err_out;
3604	}
3605
3606	write_lock(macc_lckp);
3607	sg_off = lbdof_blen;
3608	/* Spec says Buffer xfer Length field in number of LBs in dout */
3609	cum_lb = 0;
3610	for (k = 0, up = lrdp + lrd_size; k < num_lrd; ++k, up += lrd_size) {
3611		lba = get_unaligned_be64(up + 0);
3612		num = get_unaligned_be32(up + 8);
3613		if (sdebug_verbose)
3614			sdev_printk(KERN_INFO, scp->device,
3615				"%s: %s: k=%d  LBA=0x%llx num=%u  sg_off=%u\n",
3616				my_name, __func__, k, lba, num, sg_off);
3617		if (num == 0)
3618			continue;
3619		ret = check_device_access_params(scp, lba, num, true);
3620		if (ret)
3621			goto err_out_unlock;
3622		num_by = num * lb_size;
3623		ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
3624
3625		if ((cum_lb + num) > bt_len) {
3626			if (sdebug_verbose)
3627				sdev_printk(KERN_INFO, scp->device,
3628				    "%s: %s: sum of blocks > data provided\n",
3629				    my_name, __func__);
3630			mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
3631					0);
3632			ret = illegal_condition_result;
3633			goto err_out_unlock;
3634		}
3635
3636		/* DIX + T10 DIF */
3637		if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3638			int prot_ret = prot_verify_write(scp, lba, num,
3639							 ei_lba);
3640
3641			if (prot_ret) {
3642				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
3643						prot_ret);
3644				ret = illegal_condition_result;
3645				goto err_out_unlock;
3646			}
3647		}
3648
3649		ret = do_device_access(sip, scp, sg_off, lba, num, true);
3650		/* If ZBC zone then bump its write pointer */
3651		if (sdebug_dev_is_zoned(devip))
3652			zbc_inc_wp(devip, lba, num);
3653		if (unlikely(scsi_debug_lbp()))
3654			map_region(sip, lba, num);
3655		if (unlikely(-1 == ret)) {
3656			ret = DID_ERROR << 16;
3657			goto err_out_unlock;
3658		} else if (unlikely(sdebug_verbose && (ret < num_by)))
3659			sdev_printk(KERN_INFO, scp->device,
3660			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3661			    my_name, num_by, ret);
3662
3663		if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3664			     atomic_read(&sdeb_inject_pending))) {
3665			if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3666				mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3667				atomic_set(&sdeb_inject_pending, 0);
3668				ret = check_condition_result;
3669				goto err_out_unlock;
3670			} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3671				/* Logical block guard check failed */
3672				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3673				atomic_set(&sdeb_inject_pending, 0);
3674				ret = illegal_condition_result;
3675				goto err_out_unlock;
3676			} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3677				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3678				atomic_set(&sdeb_inject_pending, 0);
3679				ret = illegal_condition_result;
3680				goto err_out_unlock;
 
 
 
 
3681			}
3682		}
3683		sg_off += num_by;
3684		cum_lb += num;
3685	}
3686	ret = 0;
3687err_out_unlock:
3688	write_unlock(macc_lckp);
3689err_out:
3690	kfree(lrdp);
3691	return ret;
3692}
3693
3694static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
3695			   u32 ei_lba, bool unmap, bool ndob)
3696{
3697	struct scsi_device *sdp = scp->device;
3698	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
3699	unsigned long long i;
3700	u64 block, lbaa;
3701	u32 lb_size = sdebug_sector_size;
3702	int ret;
3703	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3704						scp->device->hostdata, true);
3705	rwlock_t *macc_lckp = &sip->macc_lck;
3706	u8 *fs1p;
3707	u8 *fsp;
3708
3709	write_lock(macc_lckp);
3710
3711	ret = check_device_access_params(scp, lba, num, true);
3712	if (ret) {
3713		write_unlock(macc_lckp);
3714		return ret;
3715	}
 
3716
3717	if (unmap && scsi_debug_lbp()) {
3718		unmap_region(sip, lba, num);
3719		goto out;
3720	}
3721	lbaa = lba;
3722	block = do_div(lbaa, sdebug_store_sectors);
3723	/* if ndob then zero 1 logical block, else fetch 1 logical block */
3724	fsp = sip->storep;
3725	fs1p = fsp + (block * lb_size);
3726	if (ndob) {
3727		memset(fs1p, 0, lb_size);
3728		ret = 0;
3729	} else
3730		ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
3731
3732	if (-1 == ret) {
3733		write_unlock(&sip->macc_lck);
3734		return DID_ERROR << 16;
3735	} else if (sdebug_verbose && !ndob && (ret < lb_size))
3736		sdev_printk(KERN_INFO, scp->device,
3737			    "%s: %s: lb size=%u, IO sent=%d bytes\n",
3738			    my_name, "write same", lb_size, ret);
3739
3740	/* Copy first sector to remaining blocks */
3741	for (i = 1 ; i < num ; i++) {
3742		lbaa = lba + i;
3743		block = do_div(lbaa, sdebug_store_sectors);
3744		memmove(fsp + (block * lb_size), fs1p, lb_size);
3745	}
3746	if (scsi_debug_lbp())
3747		map_region(sip, lba, num);
3748	/* If ZBC zone then bump its write pointer */
3749	if (sdebug_dev_is_zoned(devip))
3750		zbc_inc_wp(devip, lba, num);
3751out:
3752	write_unlock(macc_lckp);
3753
3754	return 0;
3755}
3756
3757static int resp_write_same_10(struct scsi_cmnd *scp,
3758			      struct sdebug_dev_info *devip)
3759{
3760	u8 *cmd = scp->cmnd;
3761	u32 lba;
3762	u16 num;
3763	u32 ei_lba = 0;
3764	bool unmap = false;
3765
3766	if (cmd[1] & 0x8) {
3767		if (sdebug_lbpws10 == 0) {
3768			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3769			return check_condition_result;
3770		} else
3771			unmap = true;
3772	}
3773	lba = get_unaligned_be32(cmd + 2);
3774	num = get_unaligned_be16(cmd + 7);
3775	if (num > sdebug_write_same_length) {
3776		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3777		return check_condition_result;
3778	}
3779	return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3780}
3781
3782static int resp_write_same_16(struct scsi_cmnd *scp,
3783			      struct sdebug_dev_info *devip)
3784{
3785	u8 *cmd = scp->cmnd;
3786	u64 lba;
3787	u32 num;
3788	u32 ei_lba = 0;
3789	bool unmap = false;
3790	bool ndob = false;
3791
3792	if (cmd[1] & 0x8) {	/* UNMAP */
3793		if (sdebug_lbpws == 0) {
3794			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3795			return check_condition_result;
3796		} else
3797			unmap = true;
3798	}
3799	if (cmd[1] & 0x1)  /* NDOB (no data-out buffer, assumes zeroes) */
3800		ndob = true;
3801	lba = get_unaligned_be64(cmd + 2);
3802	num = get_unaligned_be32(cmd + 10);
3803	if (num > sdebug_write_same_length) {
3804		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3805		return check_condition_result;
3806	}
3807	return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3808}
3809
3810/* Note the mode field is in the same position as the (lower) service action
3811 * field. For the Report supported operation codes command, SPC-4 suggests
3812 * each mode of this command should be reported separately; for future. */
3813static int resp_write_buffer(struct scsi_cmnd *scp,
3814			     struct sdebug_dev_info *devip)
3815{
3816	u8 *cmd = scp->cmnd;
3817	struct scsi_device *sdp = scp->device;
3818	struct sdebug_dev_info *dp;
3819	u8 mode;
3820
3821	mode = cmd[1] & 0x1f;
3822	switch (mode) {
3823	case 0x4:	/* download microcode (MC) and activate (ACT) */
3824		/* set UAs on this device only */
3825		set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3826		set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
3827		break;
3828	case 0x5:	/* download MC, save and ACT */
3829		set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
3830		break;
3831	case 0x6:	/* download MC with offsets and ACT */
3832		/* set UAs on most devices (LUs) in this target */
3833		list_for_each_entry(dp,
3834				    &devip->sdbg_host->dev_info_list,
3835				    dev_list)
3836			if (dp->target == sdp->id) {
3837				set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
3838				if (devip != dp)
3839					set_bit(SDEBUG_UA_MICROCODE_CHANGED,
3840						dp->uas_bm);
3841			}
3842		break;
3843	case 0x7:	/* download MC with offsets, save, and ACT */
3844		/* set UA on all devices (LUs) in this target */
3845		list_for_each_entry(dp,
3846				    &devip->sdbg_host->dev_info_list,
3847				    dev_list)
3848			if (dp->target == sdp->id)
3849				set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
3850					dp->uas_bm);
3851		break;
3852	default:
3853		/* do nothing for this command for other mode values */
3854		break;
3855	}
3856	return 0;
3857}
3858
3859static int resp_comp_write(struct scsi_cmnd *scp,
3860			   struct sdebug_dev_info *devip)
3861{
3862	u8 *cmd = scp->cmnd;
3863	u8 *arr;
3864	struct sdeb_store_info *sip = devip2sip(devip, true);
3865	rwlock_t *macc_lckp = &sip->macc_lck;
3866	u64 lba;
3867	u32 dnum;
3868	u32 lb_size = sdebug_sector_size;
3869	u8 num;
 
3870	int ret;
3871	int retval = 0;
3872
3873	lba = get_unaligned_be64(cmd + 2);
3874	num = cmd[13];		/* 1 to a maximum of 255 logical blocks */
3875	if (0 == num)
3876		return 0;	/* degenerate case, not an error */
3877	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3878	    (cmd[1] & 0xe0)) {
3879		mk_sense_invalid_opcode(scp);
3880		return check_condition_result;
3881	}
3882	if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3883	     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3884	    (cmd[1] & 0xe0) == 0)
3885		sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3886			    "to DIF device\n");
3887	ret = check_device_access_params(scp, lba, num, false);
3888	if (ret)
3889		return ret;
3890	dnum = 2 * num;
3891	arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
3892	if (NULL == arr) {
3893		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3894				INSUFF_RES_ASCQ);
3895		return check_condition_result;
3896	}
3897
3898	write_lock(macc_lckp);
3899
3900	ret = do_dout_fetch(scp, dnum, arr);
 
 
 
 
 
3901	if (ret == -1) {
3902		retval = DID_ERROR << 16;
3903		goto cleanup;
3904	} else if (sdebug_verbose && (ret < (dnum * lb_size)))
3905		sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
3906			    "indicated=%u, IO sent=%d bytes\n", my_name,
3907			    dnum * lb_size, ret);
3908	if (!comp_write_worker(sip, lba, num, arr, false)) {
3909		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
3910		retval = check_condition_result;
3911		goto cleanup;
3912	}
3913	if (scsi_debug_lbp())
3914		map_region(sip, lba, num);
3915cleanup:
3916	write_unlock(macc_lckp);
3917	kfree(arr);
3918	return retval;
3919}
3920
3921struct unmap_block_desc {
3922	__be64	lba;
3923	__be32	blocks;
3924	__be32	__reserved;
3925};
3926
3927static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3928{
3929	unsigned char *buf;
3930	struct unmap_block_desc *desc;
3931	struct sdeb_store_info *sip = devip2sip(devip, true);
3932	rwlock_t *macc_lckp = &sip->macc_lck;
3933	unsigned int i, payload_len, descriptors;
3934	int ret;
 
 
3935
3936	if (!scsi_debug_lbp())
3937		return 0;	/* fib and say its done */
3938	payload_len = get_unaligned_be16(scp->cmnd + 7);
3939	BUG_ON(scsi_bufflen(scp) != payload_len);
3940
3941	descriptors = (payload_len - 8) / 16;
3942	if (descriptors > sdebug_unmap_max_desc) {
3943		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3944		return check_condition_result;
3945	}
3946
3947	buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
3948	if (!buf) {
3949		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3950				INSUFF_RES_ASCQ);
3951		return check_condition_result;
3952	}
3953
3954	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
3955
3956	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
3957	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
3958
3959	desc = (void *)&buf[8];
3960
3961	write_lock(macc_lckp);
3962
3963	for (i = 0 ; i < descriptors ; i++) {
3964		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
3965		unsigned int num = get_unaligned_be32(&desc[i].blocks);
3966
3967		ret = check_device_access_params(scp, lba, num, true);
3968		if (ret)
3969			goto out;
3970
3971		unmap_region(sip, lba, num);
3972	}
3973
3974	ret = 0;
3975
3976out:
3977	write_unlock(macc_lckp);
3978	kfree(buf);
3979
3980	return ret;
3981}
3982
3983#define SDEBUG_GET_LBA_STATUS_LEN 32
3984
3985static int resp_get_lba_status(struct scsi_cmnd *scp,
3986			       struct sdebug_dev_info *devip)
3987{
3988	u8 *cmd = scp->cmnd;
3989	u64 lba;
3990	u32 alloc_len, mapped, num;
3991	int ret;
3992	u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
 
3993
3994	lba = get_unaligned_be64(cmd + 2);
3995	alloc_len = get_unaligned_be32(cmd + 10);
3996
3997	if (alloc_len < 24)
3998		return 0;
3999
4000	ret = check_device_access_params(scp, lba, 1, false);
4001	if (ret)
4002		return ret;
4003
4004	if (scsi_debug_lbp()) {
4005		struct sdeb_store_info *sip = devip2sip(devip, true);
4006
4007		mapped = map_state(sip, lba, &num);
4008	} else {
4009		mapped = 1;
4010		/* following just in case virtual_gb changed */
4011		sdebug_capacity = get_sdebug_capacity();
4012		if (sdebug_capacity - lba <= 0xffffffff)
4013			num = sdebug_capacity - lba;
4014		else
4015			num = 0xffffffff;
4016	}
4017
4018	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
4019	put_unaligned_be32(20, arr);		/* Parameter Data Length */
4020	put_unaligned_be64(lba, arr + 8);	/* LBA */
4021	put_unaligned_be32(num, arr + 16);	/* Number of blocks */
4022	arr[20] = !mapped;		/* prov_stat=0: mapped; 1: dealloc */
4023
4024	return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
4025}
4026
4027static int resp_sync_cache(struct scsi_cmnd *scp,
4028			   struct sdebug_dev_info *devip)
4029{
4030	int res = 0;
4031	u64 lba;
4032	u32 num_blocks;
4033	u8 *cmd = scp->cmnd;
4034
4035	if (cmd[0] == SYNCHRONIZE_CACHE) {	/* 10 byte cdb */
4036		lba = get_unaligned_be32(cmd + 2);
4037		num_blocks = get_unaligned_be16(cmd + 7);
4038	} else {				/* SYNCHRONIZE_CACHE(16) */
4039		lba = get_unaligned_be64(cmd + 2);
4040		num_blocks = get_unaligned_be32(cmd + 10);
4041	}
4042	if (lba + num_blocks > sdebug_capacity) {
4043		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4044		return check_condition_result;
4045	}
4046	if (!write_since_sync || (cmd[1] & 0x2))
4047		res = SDEG_RES_IMMED_MASK;
4048	else		/* delay if write_since_sync and IMMED clear */
4049		write_since_sync = false;
4050	return res;
4051}
4052
4053/*
4054 * Assuming the LBA+num_blocks is not out-of-range, this function will return
4055 * CONDITION MET if the specified blocks will/have fitted in the cache, and
4056 * a GOOD status otherwise. Model a disk with a big cache and yield
4057 * CONDITION MET. Actually tries to bring range in main memory into the
4058 * cache associated with the CPU(s).
4059 */
4060static int resp_pre_fetch(struct scsi_cmnd *scp,
4061			  struct sdebug_dev_info *devip)
4062{
4063	int res = 0;
4064	u64 lba;
4065	u64 block, rest = 0;
4066	u32 nblks;
4067	u8 *cmd = scp->cmnd;
4068	struct sdeb_store_info *sip = devip2sip(devip, true);
4069	rwlock_t *macc_lckp = &sip->macc_lck;
4070	u8 *fsp = sip->storep;
4071
4072	if (cmd[0] == PRE_FETCH) {	/* 10 byte cdb */
4073		lba = get_unaligned_be32(cmd + 2);
4074		nblks = get_unaligned_be16(cmd + 7);
4075	} else {			/* PRE-FETCH(16) */
4076		lba = get_unaligned_be64(cmd + 2);
4077		nblks = get_unaligned_be32(cmd + 10);
4078	}
4079	if (lba + nblks > sdebug_capacity) {
4080		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4081		return check_condition_result;
4082	}
4083	if (!fsp)
4084		goto fini;
4085	/* PRE-FETCH spec says nothing about LBP or PI so skip them */
4086	block = do_div(lba, sdebug_store_sectors);
4087	if (block + nblks > sdebug_store_sectors)
4088		rest = block + nblks - sdebug_store_sectors;
4089
4090	/* Try to bring the PRE-FETCH range into CPU's cache */
4091	read_lock(macc_lckp);
4092	prefetch_range(fsp + (sdebug_sector_size * block),
4093		       (nblks - rest) * sdebug_sector_size);
4094	if (rest)
4095		prefetch_range(fsp, rest * sdebug_sector_size);
4096	read_unlock(macc_lckp);
4097fini:
4098	if (cmd[1] & 0x2)
4099		res = SDEG_RES_IMMED_MASK;
4100	return res | condition_met_result;
4101}
4102
4103#define RL_BUCKET_ELEMS 8
4104
4105/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
4106 * (W-LUN), the normal Linux scanning logic does not associate it with a
4107 * device (e.g. /dev/sg7). The following magic will make that association:
4108 *   "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
4109 * where <n> is a host number. If there are multiple targets in a host then
4110 * the above will associate a W-LUN to each target. To only get a W-LUN
4111 * for target 2, then use "echo '- 2 49409' > scan" .
4112 */
4113static int resp_report_luns(struct scsi_cmnd *scp,
4114			    struct sdebug_dev_info *devip)
4115{
4116	unsigned char *cmd = scp->cmnd;
4117	unsigned int alloc_len;
4118	unsigned char select_report;
4119	u64 lun;
4120	struct scsi_lun *lun_p;
4121	u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
4122	unsigned int lun_cnt;	/* normal LUN count (max: 256) */
4123	unsigned int wlun_cnt;	/* report luns W-LUN count */
4124	unsigned int tlun_cnt;	/* total LUN count */
4125	unsigned int rlen;	/* response length (in bytes) */
4126	int k, j, n, res;
4127	unsigned int off_rsp = 0;
4128	const int sz_lun = sizeof(struct scsi_lun);
4129
4130	clear_luns_changed_on_target(devip);
4131
4132	select_report = cmd[2];
4133	alloc_len = get_unaligned_be32(cmd + 6);
4134
4135	if (alloc_len < 4) {
4136		pr_err("alloc len too small %d\n", alloc_len);
4137		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
4138		return check_condition_result;
4139	}
4140
4141	switch (select_report) {
4142	case 0:		/* all LUNs apart from W-LUNs */
4143		lun_cnt = sdebug_max_luns;
4144		wlun_cnt = 0;
4145		break;
4146	case 1:		/* only W-LUNs */
4147		lun_cnt = 0;
4148		wlun_cnt = 1;
4149		break;
4150	case 2:		/* all LUNs */
4151		lun_cnt = sdebug_max_luns;
4152		wlun_cnt = 1;
4153		break;
4154	case 0x10:	/* only administrative LUs */
4155	case 0x11:	/* see SPC-5 */
4156	case 0x12:	/* only subsiduary LUs owned by referenced LU */
4157	default:
4158		pr_debug("select report invalid %d\n", select_report);
4159		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
4160		return check_condition_result;
4161	}
4162
4163	if (sdebug_no_lun_0 && (lun_cnt > 0))
4164		--lun_cnt;
4165
4166	tlun_cnt = lun_cnt + wlun_cnt;
4167	rlen = tlun_cnt * sz_lun;	/* excluding 8 byte header */
4168	scsi_set_resid(scp, scsi_bufflen(scp));
4169	pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
4170		 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
4171
4172	/* loops rely on sizeof response header same as sizeof lun (both 8) */
4173	lun = sdebug_no_lun_0 ? 1 : 0;
4174	for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
4175		memset(arr, 0, sizeof(arr));
4176		lun_p = (struct scsi_lun *)&arr[0];
4177		if (k == 0) {
4178			put_unaligned_be32(rlen, &arr[0]);
4179			++lun_p;
4180			j = 1;
4181		}
4182		for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
4183			if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
4184				break;
4185			int_to_scsilun(lun++, lun_p);
4186			if (lun > 1 && sdebug_lun_am == SAM_LUN_AM_FLAT)
4187				lun_p->scsi_lun[0] |= 0x40;
4188		}
4189		if (j < RL_BUCKET_ELEMS)
4190			break;
4191		n = j * sz_lun;
4192		res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
4193		if (res)
4194			return res;
4195		off_rsp += n;
4196	}
4197	if (wlun_cnt) {
4198		int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
4199		++j;
4200	}
4201	if (j > 0)
4202		res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
4203	return res;
4204}
4205
4206static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4207{
4208	bool is_bytchk3 = false;
4209	u8 bytchk;
4210	int ret, j;
4211	u32 vnum, a_num, off;
4212	const u32 lb_size = sdebug_sector_size;
4213	u64 lba;
4214	u8 *arr;
4215	u8 *cmd = scp->cmnd;
4216	struct sdeb_store_info *sip = devip2sip(devip, true);
4217	rwlock_t *macc_lckp = &sip->macc_lck;
4218
4219	bytchk = (cmd[1] >> 1) & 0x3;
4220	if (bytchk == 0) {
4221		return 0;	/* always claim internal verify okay */
4222	} else if (bytchk == 2) {
4223		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
4224		return check_condition_result;
4225	} else if (bytchk == 3) {
4226		is_bytchk3 = true;	/* 1 block sent, compared repeatedly */
4227	}
4228	switch (cmd[0]) {
4229	case VERIFY_16:
4230		lba = get_unaligned_be64(cmd + 2);
4231		vnum = get_unaligned_be32(cmd + 10);
4232		break;
4233	case VERIFY:		/* is VERIFY(10) */
4234		lba = get_unaligned_be32(cmd + 2);
4235		vnum = get_unaligned_be16(cmd + 7);
4236		break;
4237	default:
4238		mk_sense_invalid_opcode(scp);
4239		return check_condition_result;
4240	}
4241	a_num = is_bytchk3 ? 1 : vnum;
4242	/* Treat following check like one for read (i.e. no write) access */
4243	ret = check_device_access_params(scp, lba, a_num, false);
4244	if (ret)
4245		return ret;
4246
4247	arr = kcalloc(lb_size, vnum, GFP_ATOMIC);
4248	if (!arr) {
4249		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4250				INSUFF_RES_ASCQ);
4251		return check_condition_result;
4252	}
4253	/* Not changing store, so only need read access */
4254	read_lock(macc_lckp);
4255
4256	ret = do_dout_fetch(scp, a_num, arr);
4257	if (ret == -1) {
4258		ret = DID_ERROR << 16;
4259		goto cleanup;
4260	} else if (sdebug_verbose && (ret < (a_num * lb_size))) {
4261		sdev_printk(KERN_INFO, scp->device,
4262			    "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
4263			    my_name, __func__, a_num * lb_size, ret);
4264	}
4265	if (is_bytchk3) {
4266		for (j = 1, off = lb_size; j < vnum; ++j, off += lb_size)
4267			memcpy(arr + off, arr, lb_size);
4268	}
4269	ret = 0;
4270	if (!comp_write_worker(sip, lba, vnum, arr, true)) {
4271		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
4272		ret = check_condition_result;
4273		goto cleanup;
4274	}
4275cleanup:
4276	read_unlock(macc_lckp);
4277	kfree(arr);
4278	return ret;
4279}
4280
4281#define RZONES_DESC_HD 64
4282
4283/* Report zones depending on start LBA nad reporting options */
4284static int resp_report_zones(struct scsi_cmnd *scp,
4285			     struct sdebug_dev_info *devip)
4286{
4287	unsigned int i, max_zones, rep_max_zones, nrz = 0;
4288	int ret = 0;
4289	u32 alloc_len, rep_opts, rep_len;
4290	bool partial;
4291	u64 lba, zs_lba;
4292	u8 *arr = NULL, *desc;
4293	u8 *cmd = scp->cmnd;
4294	struct sdeb_zone_state *zsp;
4295	struct sdeb_store_info *sip = devip2sip(devip, false);
4296	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4297
4298	if (!sdebug_dev_is_zoned(devip)) {
4299		mk_sense_invalid_opcode(scp);
4300		return check_condition_result;
4301	}
4302	zs_lba = get_unaligned_be64(cmd + 2);
4303	alloc_len = get_unaligned_be32(cmd + 10);
4304	rep_opts = cmd[14] & 0x3f;
4305	partial = cmd[14] & 0x80;
4306
4307	if (zs_lba >= sdebug_capacity) {
4308		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4309		return check_condition_result;
4310	}
4311
4312	max_zones = devip->nr_zones - (zs_lba >> devip->zsize_shift);
4313	rep_max_zones = min((alloc_len - 64) >> ilog2(RZONES_DESC_HD),
4314			    max_zones);
4315
4316	arr = kcalloc(RZONES_DESC_HD, alloc_len, GFP_ATOMIC);
4317	if (!arr) {
4318		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4319				INSUFF_RES_ASCQ);
4320		return check_condition_result;
4321	}
4322
4323	read_lock(macc_lckp);
4324
4325	desc = arr + 64;
4326	for (i = 0; i < max_zones; i++) {
4327		lba = zs_lba + devip->zsize * i;
4328		if (lba > sdebug_capacity)
4329			break;
4330		zsp = zbc_zone(devip, lba);
4331		switch (rep_opts) {
4332		case 0x00:
4333			/* All zones */
4334			break;
4335		case 0x01:
4336			/* Empty zones */
4337			if (zsp->z_cond != ZC1_EMPTY)
4338				continue;
4339			break;
4340		case 0x02:
4341			/* Implicit open zones */
4342			if (zsp->z_cond != ZC2_IMPLICIT_OPEN)
4343				continue;
4344			break;
4345		case 0x03:
4346			/* Explicit open zones */
4347			if (zsp->z_cond != ZC3_EXPLICIT_OPEN)
4348				continue;
4349			break;
4350		case 0x04:
4351			/* Closed zones */
4352			if (zsp->z_cond != ZC4_CLOSED)
4353				continue;
4354			break;
4355		case 0x05:
4356			/* Full zones */
4357			if (zsp->z_cond != ZC5_FULL)
4358				continue;
4359			break;
4360		case 0x06:
4361		case 0x07:
4362		case 0x10:
4363			/*
4364			 * Read-only, offline, reset WP recommended are
4365			 * not emulated: no zones to report;
4366			 */
4367			continue;
4368		case 0x11:
4369			/* non-seq-resource set */
4370			if (!zsp->z_non_seq_resource)
4371				continue;
4372			break;
4373		case 0x3f:
4374			/* Not write pointer (conventional) zones */
4375			if (!zbc_zone_is_conv(zsp))
4376				continue;
4377			break;
4378		default:
4379			mk_sense_buffer(scp, ILLEGAL_REQUEST,
4380					INVALID_FIELD_IN_CDB, 0);
4381			ret = check_condition_result;
4382			goto fini;
4383		}
4384
4385		if (nrz < rep_max_zones) {
4386			/* Fill zone descriptor */
4387			desc[0] = zsp->z_type;
4388			desc[1] = zsp->z_cond << 4;
4389			if (zsp->z_non_seq_resource)
4390				desc[1] |= 1 << 1;
4391			put_unaligned_be64((u64)zsp->z_size, desc + 8);
4392			put_unaligned_be64((u64)zsp->z_start, desc + 16);
4393			put_unaligned_be64((u64)zsp->z_wp, desc + 24);
4394			desc += 64;
4395		}
4396
4397		if (partial && nrz >= rep_max_zones)
4398			break;
4399
4400		nrz++;
4401	}
4402
4403	/* Report header */
4404	put_unaligned_be32(nrz * RZONES_DESC_HD, arr + 0);
4405	put_unaligned_be64(sdebug_capacity - 1, arr + 8);
4406
4407	rep_len = (unsigned long)desc - (unsigned long)arr;
4408	ret = fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, rep_len));
4409
4410fini:
4411	read_unlock(macc_lckp);
4412	kfree(arr);
4413	return ret;
4414}
4415
4416/* Logic transplanted from tcmu-runner, file_zbc.c */
4417static void zbc_open_all(struct sdebug_dev_info *devip)
4418{
4419	struct sdeb_zone_state *zsp = &devip->zstate[0];
4420	unsigned int i;
4421
4422	for (i = 0; i < devip->nr_zones; i++, zsp++) {
4423		if (zsp->z_cond == ZC4_CLOSED)
4424			zbc_open_zone(devip, &devip->zstate[i], true);
4425	}
4426}
4427
4428static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4429{
4430	int res = 0;
4431	u64 z_id;
4432	enum sdebug_z_cond zc;
4433	u8 *cmd = scp->cmnd;
4434	struct sdeb_zone_state *zsp;
4435	bool all = cmd[14] & 0x01;
4436	struct sdeb_store_info *sip = devip2sip(devip, false);
4437	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4438
4439	if (!sdebug_dev_is_zoned(devip)) {
4440		mk_sense_invalid_opcode(scp);
4441		return check_condition_result;
4442	}
4443
4444	write_lock(macc_lckp);
4445
4446	if (all) {
4447		/* Check if all closed zones can be open */
4448		if (devip->max_open &&
4449		    devip->nr_exp_open + devip->nr_closed > devip->max_open) {
4450			mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4451					INSUFF_ZONE_ASCQ);
4452			res = check_condition_result;
4453			goto fini;
4454		}
4455		/* Open all closed zones */
4456		zbc_open_all(devip);
4457		goto fini;
4458	}
4459
4460	/* Open the specified zone */
4461	z_id = get_unaligned_be64(cmd + 2);
4462	if (z_id >= sdebug_capacity) {
4463		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4464		res = check_condition_result;
4465		goto fini;
4466	}
4467
4468	zsp = zbc_zone(devip, z_id);
4469	if (z_id != zsp->z_start) {
4470		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4471		res = check_condition_result;
4472		goto fini;
4473	}
4474	if (zbc_zone_is_conv(zsp)) {
4475		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4476		res = check_condition_result;
4477		goto fini;
4478	}
4479
4480	zc = zsp->z_cond;
4481	if (zc == ZC3_EXPLICIT_OPEN || zc == ZC5_FULL)
4482		goto fini;
4483
4484	if (devip->max_open && devip->nr_exp_open >= devip->max_open) {
4485		mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4486				INSUFF_ZONE_ASCQ);
4487		res = check_condition_result;
4488		goto fini;
4489	}
4490
4491	zbc_open_zone(devip, zsp, true);
4492fini:
4493	write_unlock(macc_lckp);
4494	return res;
4495}
4496
4497static void zbc_close_all(struct sdebug_dev_info *devip)
4498{
4499	unsigned int i;
4500
4501	for (i = 0; i < devip->nr_zones; i++)
4502		zbc_close_zone(devip, &devip->zstate[i]);
4503}
4504
4505static int resp_close_zone(struct scsi_cmnd *scp,
4506			   struct sdebug_dev_info *devip)
4507{
4508	int res = 0;
4509	u64 z_id;
4510	u8 *cmd = scp->cmnd;
4511	struct sdeb_zone_state *zsp;
4512	bool all = cmd[14] & 0x01;
4513	struct sdeb_store_info *sip = devip2sip(devip, false);
4514	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4515
4516	if (!sdebug_dev_is_zoned(devip)) {
4517		mk_sense_invalid_opcode(scp);
4518		return check_condition_result;
4519	}
4520
4521	write_lock(macc_lckp);
4522
4523	if (all) {
4524		zbc_close_all(devip);
4525		goto fini;
4526	}
4527
4528	/* Close specified zone */
4529	z_id = get_unaligned_be64(cmd + 2);
4530	if (z_id >= sdebug_capacity) {
4531		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4532		res = check_condition_result;
4533		goto fini;
4534	}
4535
4536	zsp = zbc_zone(devip, z_id);
4537	if (z_id != zsp->z_start) {
4538		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4539		res = check_condition_result;
4540		goto fini;
4541	}
4542	if (zbc_zone_is_conv(zsp)) {
4543		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4544		res = check_condition_result;
4545		goto fini;
4546	}
4547
4548	zbc_close_zone(devip, zsp);
4549fini:
4550	write_unlock(macc_lckp);
4551	return res;
4552}
4553
4554static void zbc_finish_zone(struct sdebug_dev_info *devip,
4555			    struct sdeb_zone_state *zsp, bool empty)
4556{
4557	enum sdebug_z_cond zc = zsp->z_cond;
4558
4559	if (zc == ZC4_CLOSED || zc == ZC2_IMPLICIT_OPEN ||
4560	    zc == ZC3_EXPLICIT_OPEN || (empty && zc == ZC1_EMPTY)) {
4561		if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4562			zbc_close_zone(devip, zsp);
4563		if (zsp->z_cond == ZC4_CLOSED)
4564			devip->nr_closed--;
4565		zsp->z_wp = zsp->z_start + zsp->z_size;
4566		zsp->z_cond = ZC5_FULL;
4567	}
4568}
4569
4570static void zbc_finish_all(struct sdebug_dev_info *devip)
4571{
4572	unsigned int i;
4573
4574	for (i = 0; i < devip->nr_zones; i++)
4575		zbc_finish_zone(devip, &devip->zstate[i], false);
4576}
4577
4578static int resp_finish_zone(struct scsi_cmnd *scp,
4579			    struct sdebug_dev_info *devip)
4580{
4581	struct sdeb_zone_state *zsp;
4582	int res = 0;
4583	u64 z_id;
4584	u8 *cmd = scp->cmnd;
4585	bool all = cmd[14] & 0x01;
4586	struct sdeb_store_info *sip = devip2sip(devip, false);
4587	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4588
4589	if (!sdebug_dev_is_zoned(devip)) {
4590		mk_sense_invalid_opcode(scp);
4591		return check_condition_result;
4592	}
4593
4594	write_lock(macc_lckp);
4595
4596	if (all) {
4597		zbc_finish_all(devip);
4598		goto fini;
4599	}
4600
4601	/* Finish the specified zone */
4602	z_id = get_unaligned_be64(cmd + 2);
4603	if (z_id >= sdebug_capacity) {
4604		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4605		res = check_condition_result;
4606		goto fini;
4607	}
4608
4609	zsp = zbc_zone(devip, z_id);
4610	if (z_id != zsp->z_start) {
4611		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4612		res = check_condition_result;
4613		goto fini;
4614	}
4615	if (zbc_zone_is_conv(zsp)) {
4616		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4617		res = check_condition_result;
4618		goto fini;
4619	}
4620
4621	zbc_finish_zone(devip, zsp, true);
4622fini:
4623	write_unlock(macc_lckp);
4624	return res;
4625}
4626
4627static void zbc_rwp_zone(struct sdebug_dev_info *devip,
4628			 struct sdeb_zone_state *zsp)
4629{
4630	enum sdebug_z_cond zc;
4631
4632	if (zbc_zone_is_conv(zsp))
4633		return;
4634
4635	zc = zsp->z_cond;
4636	if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4637		zbc_close_zone(devip, zsp);
4638
4639	if (zsp->z_cond == ZC4_CLOSED)
4640		devip->nr_closed--;
4641
4642	zsp->z_non_seq_resource = false;
4643	zsp->z_wp = zsp->z_start;
4644	zsp->z_cond = ZC1_EMPTY;
4645}
4646
4647static void zbc_rwp_all(struct sdebug_dev_info *devip)
4648{
4649	unsigned int i;
4650
4651	for (i = 0; i < devip->nr_zones; i++)
4652		zbc_rwp_zone(devip, &devip->zstate[i]);
4653}
4654
4655static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4656{
4657	struct sdeb_zone_state *zsp;
4658	int res = 0;
4659	u64 z_id;
4660	u8 *cmd = scp->cmnd;
4661	bool all = cmd[14] & 0x01;
4662	struct sdeb_store_info *sip = devip2sip(devip, false);
4663	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4664
4665	if (!sdebug_dev_is_zoned(devip)) {
4666		mk_sense_invalid_opcode(scp);
4667		return check_condition_result;
4668	}
4669
4670	write_lock(macc_lckp);
4671
4672	if (all) {
4673		zbc_rwp_all(devip);
4674		goto fini;
4675	}
4676
4677	z_id = get_unaligned_be64(cmd + 2);
4678	if (z_id >= sdebug_capacity) {
4679		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4680		res = check_condition_result;
4681		goto fini;
4682	}
4683
4684	zsp = zbc_zone(devip, z_id);
4685	if (z_id != zsp->z_start) {
4686		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4687		res = check_condition_result;
4688		goto fini;
4689	}
4690	if (zbc_zone_is_conv(zsp)) {
4691		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4692		res = check_condition_result;
4693		goto fini;
4694	}
4695
4696	zbc_rwp_zone(devip, zsp);
4697fini:
4698	write_unlock(macc_lckp);
4699	return res;
4700}
4701
4702static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
4703{
4704	u16 hwq;
4705	u32 tag = blk_mq_unique_tag(cmnd->request);
4706
4707	hwq = blk_mq_unique_tag_to_hwq(tag);
4708
4709	pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
4710	if (WARN_ON_ONCE(hwq >= submit_queues))
4711		hwq = 0;
4712
4713	return sdebug_q_arr + hwq;
4714}
4715
4716static u32 get_tag(struct scsi_cmnd *cmnd)
4717{
4718	return blk_mq_unique_tag(cmnd->request);
4719}
4720
4721/* Queued (deferred) command completions converge here. */
4722static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
4723{
4724	bool aborted = sd_dp->aborted;
4725	int qc_idx;
4726	int retiring = 0;
4727	unsigned long iflags;
4728	struct sdebug_queue *sqp;
4729	struct sdebug_queued_cmd *sqcp;
4730	struct scsi_cmnd *scp;
4731	struct sdebug_dev_info *devip;
4732
 
4733	if (unlikely(aborted))
4734		sd_dp->aborted = false;
4735	qc_idx = sd_dp->qc_idx;
4736	sqp = sdebug_q_arr + sd_dp->sqa_idx;
4737	if (sdebug_statistics) {
4738		atomic_inc(&sdebug_completions);
4739		if (raw_smp_processor_id() != sd_dp->issuing_cpu)
4740			atomic_inc(&sdebug_miss_cpus);
4741	}
4742	if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
4743		pr_err("wild qc_idx=%d\n", qc_idx);
4744		return;
4745	}
4746	spin_lock_irqsave(&sqp->qc_lock, iflags);
4747	sd_dp->defer_t = SDEB_DEFER_NONE;
4748	sqcp = &sqp->qc_arr[qc_idx];
4749	scp = sqcp->a_cmnd;
4750	if (unlikely(scp == NULL)) {
4751		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4752		pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d, hc_idx=%d\n",
4753		       sd_dp->sqa_idx, qc_idx, sd_dp->hc_idx);
4754		return;
4755	}
4756	devip = (struct sdebug_dev_info *)scp->device->hostdata;
4757	if (likely(devip))
4758		atomic_dec(&devip->num_in_q);
4759	else
4760		pr_err("devip=NULL\n");
4761	if (unlikely(atomic_read(&retired_max_queue) > 0))
4762		retiring = 1;
4763
4764	sqcp->a_cmnd = NULL;
4765	if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
4766		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4767		pr_err("Unexpected completion\n");
4768		return;
4769	}
4770
4771	if (unlikely(retiring)) {	/* user has reduced max_queue */
4772		int k, retval;
4773
4774		retval = atomic_read(&retired_max_queue);
4775		if (qc_idx >= retval) {
4776			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4777			pr_err("index %d too large\n", retval);
4778			return;
4779		}
4780		k = find_last_bit(sqp->in_use_bm, retval);
4781		if ((k < sdebug_max_queue) || (k == retval))
4782			atomic_set(&retired_max_queue, 0);
4783		else
4784			atomic_set(&retired_max_queue, k + 1);
4785	}
4786	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4787	if (unlikely(aborted)) {
4788		if (sdebug_verbose)
4789			pr_info("bypassing scsi_done() due to aborted cmd\n");
4790		return;
4791	}
4792	scp->scsi_done(scp); /* callback to mid level */
4793}
4794
4795/* When high resolution timer goes off this function is called. */
4796static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
4797{
4798	struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
4799						  hrt);
4800	sdebug_q_cmd_complete(sd_dp);
4801	return HRTIMER_NORESTART;
4802}
4803
4804/* When work queue schedules work, it calls this function. */
4805static void sdebug_q_cmd_wq_complete(struct work_struct *work)
4806{
4807	struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
4808						  ew.work);
4809	sdebug_q_cmd_complete(sd_dp);
4810}
4811
4812static bool got_shared_uuid;
4813static uuid_t shared_uuid;
4814
4815static int sdebug_device_create_zones(struct sdebug_dev_info *devip)
4816{
4817	struct sdeb_zone_state *zsp;
4818	sector_t capacity = get_sdebug_capacity();
4819	sector_t zstart = 0;
4820	unsigned int i;
4821
4822	/*
4823	 * Set the zone size: if sdeb_zbc_zone_size_mb is not set, figure out
4824	 * a zone size allowing for at least 4 zones on the device. Otherwise,
4825	 * use the specified zone size checking that at least 2 zones can be
4826	 * created for the device.
4827	 */
4828	if (!sdeb_zbc_zone_size_mb) {
4829		devip->zsize = (DEF_ZBC_ZONE_SIZE_MB * SZ_1M)
4830			>> ilog2(sdebug_sector_size);
4831		while (capacity < devip->zsize << 2 && devip->zsize >= 2)
4832			devip->zsize >>= 1;
4833		if (devip->zsize < 2) {
4834			pr_err("Device capacity too small\n");
4835			return -EINVAL;
4836		}
4837	} else {
4838		if (!is_power_of_2(sdeb_zbc_zone_size_mb)) {
4839			pr_err("Zone size is not a power of 2\n");
4840			return -EINVAL;
4841		}
4842		devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M)
4843			>> ilog2(sdebug_sector_size);
4844		if (devip->zsize >= capacity) {
4845			pr_err("Zone size too large for device capacity\n");
4846			return -EINVAL;
4847		}
4848	}
4849
4850	devip->zsize_shift = ilog2(devip->zsize);
4851	devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift;
4852
4853	if (sdeb_zbc_nr_conv >= devip->nr_zones) {
4854		pr_err("Number of conventional zones too large\n");
4855		return -EINVAL;
4856	}
4857	devip->nr_conv_zones = sdeb_zbc_nr_conv;
4858
4859	if (devip->zmodel == BLK_ZONED_HM) {
4860		/* zbc_max_open_zones can be 0, meaning "not reported" */
4861		if (sdeb_zbc_max_open >= devip->nr_zones - 1)
4862			devip->max_open = (devip->nr_zones - 1) / 2;
4863		else
4864			devip->max_open = sdeb_zbc_max_open;
4865	}
4866
4867	devip->zstate = kcalloc(devip->nr_zones,
4868				sizeof(struct sdeb_zone_state), GFP_KERNEL);
4869	if (!devip->zstate)
4870		return -ENOMEM;
4871
4872	for (i = 0; i < devip->nr_zones; i++) {
4873		zsp = &devip->zstate[i];
4874
4875		zsp->z_start = zstart;
4876
4877		if (i < devip->nr_conv_zones) {
4878			zsp->z_type = ZBC_ZONE_TYPE_CNV;
4879			zsp->z_cond = ZBC_NOT_WRITE_POINTER;
4880			zsp->z_wp = (sector_t)-1;
4881		} else {
4882			if (devip->zmodel == BLK_ZONED_HM)
4883				zsp->z_type = ZBC_ZONE_TYPE_SWR;
4884			else
4885				zsp->z_type = ZBC_ZONE_TYPE_SWP;
4886			zsp->z_cond = ZC1_EMPTY;
4887			zsp->z_wp = zsp->z_start;
4888		}
4889
4890		if (zsp->z_start + devip->zsize < capacity)
4891			zsp->z_size = devip->zsize;
4892		else
4893			zsp->z_size = capacity - zsp->z_start;
4894
4895		zstart += zsp->z_size;
4896	}
4897
4898	return 0;
4899}
4900
4901static struct sdebug_dev_info *sdebug_device_create(
4902			struct sdebug_host_info *sdbg_host, gfp_t flags)
4903{
4904	struct sdebug_dev_info *devip;
4905
4906	devip = kzalloc(sizeof(*devip), flags);
4907	if (devip) {
4908		if (sdebug_uuid_ctl == 1)
4909			uuid_gen(&devip->lu_name);
4910		else if (sdebug_uuid_ctl == 2) {
4911			if (got_shared_uuid)
4912				devip->lu_name = shared_uuid;
4913			else {
4914				uuid_gen(&shared_uuid);
4915				got_shared_uuid = true;
4916				devip->lu_name = shared_uuid;
4917			}
4918		}
4919		devip->sdbg_host = sdbg_host;
4920		if (sdeb_zbc_in_use) {
4921			devip->zmodel = sdeb_zbc_model;
4922			if (sdebug_device_create_zones(devip)) {
4923				kfree(devip);
4924				return NULL;
4925			}
4926		} else {
4927			devip->zmodel = BLK_ZONED_NONE;
4928		}
4929		devip->sdbg_host = sdbg_host;
4930		devip->create_ts = ktime_get_boottime();
4931		atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0));
4932		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
4933	}
4934	return devip;
4935}
4936
4937static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
4938{
4939	struct sdebug_host_info *sdbg_host;
4940	struct sdebug_dev_info *open_devip = NULL;
4941	struct sdebug_dev_info *devip;
4942
4943	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
4944	if (!sdbg_host) {
4945		pr_err("Host info NULL\n");
4946		return NULL;
4947	}
4948
4949	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
4950		if ((devip->used) && (devip->channel == sdev->channel) &&
4951		    (devip->target == sdev->id) &&
4952		    (devip->lun == sdev->lun))
4953			return devip;
4954		else {
4955			if ((!devip->used) && (!open_devip))
4956				open_devip = devip;
4957		}
4958	}
4959	if (!open_devip) { /* try and make a new one */
4960		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
4961		if (!open_devip) {
4962			pr_err("out of memory at line %d\n", __LINE__);
4963			return NULL;
4964		}
4965	}
4966
4967	open_devip->channel = sdev->channel;
4968	open_devip->target = sdev->id;
4969	open_devip->lun = sdev->lun;
4970	open_devip->sdbg_host = sdbg_host;
4971	atomic_set(&open_devip->num_in_q, 0);
4972	set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
4973	open_devip->used = true;
4974	return open_devip;
4975}
4976
4977static int scsi_debug_slave_alloc(struct scsi_device *sdp)
4978{
4979	if (sdebug_verbose)
4980		pr_info("slave_alloc <%u %u %u %llu>\n",
4981		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
4982	return 0;
4983}
4984
4985static int scsi_debug_slave_configure(struct scsi_device *sdp)
4986{
4987	struct sdebug_dev_info *devip =
4988			(struct sdebug_dev_info *)sdp->hostdata;
4989
4990	if (sdebug_verbose)
4991		pr_info("slave_configure <%u %u %u %llu>\n",
4992		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
4993	if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
4994		sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
4995	if (devip == NULL) {
4996		devip = find_build_dev_info(sdp);
4997		if (devip == NULL)
4998			return 1;  /* no resources, will be marked offline */
4999	}
5000	sdp->hostdata = devip;
5001	if (sdebug_no_uld)
5002		sdp->no_uld_attach = 1;
5003	config_cdb_len(sdp);
5004	return 0;
5005}
5006
5007static void scsi_debug_slave_destroy(struct scsi_device *sdp)
5008{
5009	struct sdebug_dev_info *devip =
5010		(struct sdebug_dev_info *)sdp->hostdata;
5011
5012	if (sdebug_verbose)
5013		pr_info("slave_destroy <%u %u %u %llu>\n",
5014		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
5015	if (devip) {
5016		/* make this slot available for re-use */
5017		devip->used = false;
5018		sdp->hostdata = NULL;
5019	}
5020}
5021
5022static void stop_qc_helper(struct sdebug_defer *sd_dp,
5023			   enum sdeb_defer_type defer_t)
5024{
5025	if (!sd_dp)
5026		return;
5027	if (defer_t == SDEB_DEFER_HRT)
5028		hrtimer_cancel(&sd_dp->hrt);
5029	else if (defer_t == SDEB_DEFER_WQ)
5030		cancel_work_sync(&sd_dp->ew.work);
5031}
5032
5033/* If @cmnd found deletes its timer or work queue and returns true; else
5034   returns false */
5035static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
5036{
5037	unsigned long iflags;
5038	int j, k, qmax, r_qmax;
5039	enum sdeb_defer_type l_defer_t;
5040	struct sdebug_queue *sqp;
5041	struct sdebug_queued_cmd *sqcp;
5042	struct sdebug_dev_info *devip;
5043	struct sdebug_defer *sd_dp;
5044
5045	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5046		spin_lock_irqsave(&sqp->qc_lock, iflags);
5047		qmax = sdebug_max_queue;
5048		r_qmax = atomic_read(&retired_max_queue);
5049		if (r_qmax > qmax)
5050			qmax = r_qmax;
5051		for (k = 0; k < qmax; ++k) {
5052			if (test_bit(k, sqp->in_use_bm)) {
5053				sqcp = &sqp->qc_arr[k];
5054				if (cmnd != sqcp->a_cmnd)
5055					continue;
5056				/* found */
5057				devip = (struct sdebug_dev_info *)
5058						cmnd->device->hostdata;
5059				if (devip)
5060					atomic_dec(&devip->num_in_q);
5061				sqcp->a_cmnd = NULL;
5062				sd_dp = sqcp->sd_dp;
5063				if (sd_dp) {
5064					l_defer_t = sd_dp->defer_t;
5065					sd_dp->defer_t = SDEB_DEFER_NONE;
5066				} else
5067					l_defer_t = SDEB_DEFER_NONE;
5068				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5069				stop_qc_helper(sd_dp, l_defer_t);
5070				clear_bit(k, sqp->in_use_bm);
5071				return true;
5072			}
5073		}
5074		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5075	}
5076	return false;
5077}
5078
5079/* Deletes (stops) timers or work queues of all queued commands */
5080static void stop_all_queued(void)
5081{
5082	unsigned long iflags;
5083	int j, k;
5084	enum sdeb_defer_type l_defer_t;
5085	struct sdebug_queue *sqp;
5086	struct sdebug_queued_cmd *sqcp;
5087	struct sdebug_dev_info *devip;
5088	struct sdebug_defer *sd_dp;
5089
5090	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5091		spin_lock_irqsave(&sqp->qc_lock, iflags);
5092		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5093			if (test_bit(k, sqp->in_use_bm)) {
5094				sqcp = &sqp->qc_arr[k];
5095				if (sqcp->a_cmnd == NULL)
5096					continue;
5097				devip = (struct sdebug_dev_info *)
5098					sqcp->a_cmnd->device->hostdata;
5099				if (devip)
5100					atomic_dec(&devip->num_in_q);
5101				sqcp->a_cmnd = NULL;
5102				sd_dp = sqcp->sd_dp;
5103				if (sd_dp) {
5104					l_defer_t = sd_dp->defer_t;
5105					sd_dp->defer_t = SDEB_DEFER_NONE;
5106				} else
5107					l_defer_t = SDEB_DEFER_NONE;
5108				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5109				stop_qc_helper(sd_dp, l_defer_t);
5110				clear_bit(k, sqp->in_use_bm);
5111				spin_lock_irqsave(&sqp->qc_lock, iflags);
5112			}
5113		}
5114		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5115	}
5116}
5117
5118/* Free queued command memory on heap */
5119static void free_all_queued(void)
5120{
5121	int j, k;
5122	struct sdebug_queue *sqp;
5123	struct sdebug_queued_cmd *sqcp;
5124
5125	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5126		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5127			sqcp = &sqp->qc_arr[k];
5128			kfree(sqcp->sd_dp);
5129			sqcp->sd_dp = NULL;
5130		}
5131	}
5132}
5133
5134static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
5135{
5136	bool ok;
5137
5138	++num_aborts;
5139	if (SCpnt) {
5140		ok = stop_queued_cmnd(SCpnt);
5141		if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5142			sdev_printk(KERN_INFO, SCpnt->device,
5143				    "%s: command%s found\n", __func__,
5144				    ok ? "" : " not");
5145	}
5146	return SUCCESS;
5147}
5148
5149static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
5150{
5151	++num_dev_resets;
5152	if (SCpnt && SCpnt->device) {
5153		struct scsi_device *sdp = SCpnt->device;
5154		struct sdebug_dev_info *devip =
5155				(struct sdebug_dev_info *)sdp->hostdata;
5156
5157		if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5158			sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5159		if (devip)
5160			set_bit(SDEBUG_UA_POR, devip->uas_bm);
5161	}
5162	return SUCCESS;
5163}
5164
5165static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
5166{
5167	struct sdebug_host_info *sdbg_host;
5168	struct sdebug_dev_info *devip;
5169	struct scsi_device *sdp;
5170	struct Scsi_Host *hp;
5171	int k = 0;
5172
5173	++num_target_resets;
5174	if (!SCpnt)
5175		goto lie;
5176	sdp = SCpnt->device;
5177	if (!sdp)
5178		goto lie;
5179	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5180		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5181	hp = sdp->host;
5182	if (!hp)
5183		goto lie;
5184	sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5185	if (sdbg_host) {
5186		list_for_each_entry(devip,
5187				    &sdbg_host->dev_info_list,
5188				    dev_list)
5189			if (devip->target == sdp->id) {
5190				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5191				++k;
5192			}
5193	}
5194	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5195		sdev_printk(KERN_INFO, sdp,
5196			    "%s: %d device(s) found in target\n", __func__, k);
5197lie:
5198	return SUCCESS;
5199}
5200
5201static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt)
5202{
5203	struct sdebug_host_info *sdbg_host;
5204	struct sdebug_dev_info *devip;
5205	struct scsi_device *sdp;
5206	struct Scsi_Host *hp;
5207	int k = 0;
5208
5209	++num_bus_resets;
5210	if (!(SCpnt && SCpnt->device))
5211		goto lie;
5212	sdp = SCpnt->device;
5213	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5214		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5215	hp = sdp->host;
5216	if (hp) {
5217		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5218		if (sdbg_host) {
5219			list_for_each_entry(devip,
5220					    &sdbg_host->dev_info_list,
5221					    dev_list) {
5222				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5223				++k;
5224			}
5225		}
5226	}
5227	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5228		sdev_printk(KERN_INFO, sdp,
5229			    "%s: %d device(s) found in host\n", __func__, k);
5230lie:
5231	return SUCCESS;
5232}
5233
5234static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
5235{
5236	struct sdebug_host_info *sdbg_host;
5237	struct sdebug_dev_info *devip;
5238	int k = 0;
5239
5240	++num_host_resets;
5241	if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5242		sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
5243	spin_lock(&sdebug_host_list_lock);
5244	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
5245		list_for_each_entry(devip, &sdbg_host->dev_info_list,
5246				    dev_list) {
5247			set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5248			++k;
5249		}
5250	}
5251	spin_unlock(&sdebug_host_list_lock);
5252	stop_all_queued();
5253	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5254		sdev_printk(KERN_INFO, SCpnt->device,
5255			    "%s: %d device(s) found\n", __func__, k);
5256	return SUCCESS;
5257}
5258
5259static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
 
5260{
5261	struct msdos_partition *pp;
5262	int starts[SDEBUG_MAX_PARTS + 2], max_part_secs;
5263	int sectors_per_part, num_sectors, k;
5264	int heads_by_sects, start_sec, end_sec;
5265
5266	/* assume partition table already zeroed */
5267	if ((sdebug_num_parts < 1) || (store_size < 1048576))
5268		return;
5269	if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
5270		sdebug_num_parts = SDEBUG_MAX_PARTS;
5271		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
5272	}
5273	num_sectors = (int)get_sdebug_capacity();
5274	sectors_per_part = (num_sectors - sdebug_sectors_per)
5275			   / sdebug_num_parts;
5276	heads_by_sects = sdebug_heads * sdebug_sectors_per;
5277	starts[0] = sdebug_sectors_per;
5278	max_part_secs = sectors_per_part;
5279	for (k = 1; k < sdebug_num_parts; ++k) {
5280		starts[k] = ((k * sectors_per_part) / heads_by_sects)
5281			    * heads_by_sects;
5282		if (starts[k] - starts[k - 1] < max_part_secs)
5283			max_part_secs = starts[k] - starts[k - 1];
5284	}
5285	starts[sdebug_num_parts] = num_sectors;
5286	starts[sdebug_num_parts + 1] = 0;
5287
5288	ramp[510] = 0x55;	/* magic partition markings */
5289	ramp[511] = 0xAA;
5290	pp = (struct msdos_partition *)(ramp + 0x1be);
5291	for (k = 0; starts[k + 1]; ++k, ++pp) {
5292		start_sec = starts[k];
5293		end_sec = starts[k] + max_part_secs - 1;
5294		pp->boot_ind = 0;
5295
5296		pp->cyl = start_sec / heads_by_sects;
5297		pp->head = (start_sec - (pp->cyl * heads_by_sects))
5298			   / sdebug_sectors_per;
5299		pp->sector = (start_sec % sdebug_sectors_per) + 1;
5300
5301		pp->end_cyl = end_sec / heads_by_sects;
5302		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
5303			       / sdebug_sectors_per;
5304		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
5305
5306		pp->start_sect = cpu_to_le32(start_sec);
5307		pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
5308		pp->sys_ind = 0x83;	/* plain Linux partition */
5309	}
5310}
5311
5312static void block_unblock_all_queues(bool block)
5313{
5314	int j;
5315	struct sdebug_queue *sqp;
5316
5317	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
5318		atomic_set(&sqp->blocked, (int)block);
5319}
5320
5321/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
5322 * commands will be processed normally before triggers occur.
5323 */
5324static void tweak_cmnd_count(void)
5325{
5326	int count, modulo;
5327
5328	modulo = abs(sdebug_every_nth);
5329	if (modulo < 2)
5330		return;
5331	block_unblock_all_queues(true);
5332	count = atomic_read(&sdebug_cmnd_count);
5333	atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
5334	block_unblock_all_queues(false);
5335}
5336
5337static void clear_queue_stats(void)
5338{
5339	atomic_set(&sdebug_cmnd_count, 0);
5340	atomic_set(&sdebug_completions, 0);
5341	atomic_set(&sdebug_miss_cpus, 0);
5342	atomic_set(&sdebug_a_tsf, 0);
5343}
5344
5345static bool inject_on_this_cmd(void)
 
5346{
5347	if (sdebug_every_nth == 0)
5348		return false;
5349	return (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) == 0;
 
 
 
 
 
 
 
 
 
 
 
 
5350}
5351
5352#define INCLUSIVE_TIMING_MAX_NS 1000000		/* 1 millisecond */
5353
5354/* Complete the processing of the thread that queued a SCSI command to this
5355 * driver. It either completes the command by calling cmnd_done() or
5356 * schedules a hr timer or work queue then returns 0. Returns
5357 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
5358 */
5359static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
5360			 int scsi_result,
5361			 int (*pfp)(struct scsi_cmnd *,
5362				    struct sdebug_dev_info *),
5363			 int delta_jiff, int ndelay)
5364{
5365	bool new_sd_dp;
5366	bool inject = false;
5367	bool hipri = (cmnd->request->cmd_flags & REQ_HIPRI);
5368	int k, num_in_q, qdepth;
5369	unsigned long iflags;
5370	u64 ns_from_boot = 0;
5371	struct sdebug_queue *sqp;
5372	struct sdebug_queued_cmd *sqcp;
5373	struct scsi_device *sdp;
5374	struct sdebug_defer *sd_dp;
5375
5376	if (unlikely(devip == NULL)) {
5377		if (scsi_result == 0)
5378			scsi_result = DID_NO_CONNECT << 16;
5379		goto respond_in_thread;
5380	}
5381	sdp = cmnd->device;
5382
5383	if (delta_jiff == 0)
5384		goto respond_in_thread;
5385
 
5386	sqp = get_queue(cmnd);
5387	spin_lock_irqsave(&sqp->qc_lock, iflags);
5388	if (unlikely(atomic_read(&sqp->blocked))) {
5389		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5390		return SCSI_MLQUEUE_HOST_BUSY;
5391	}
5392	num_in_q = atomic_read(&devip->num_in_q);
5393	qdepth = cmnd->device->queue_depth;
 
5394	if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
5395		if (scsi_result) {
5396			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5397			goto respond_in_thread;
5398		} else
5399			scsi_result = device_qfull_result;
5400	} else if (unlikely(sdebug_every_nth &&
5401			    (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
5402			    (scsi_result == 0))) {
5403		if ((num_in_q == (qdepth - 1)) &&
5404		    (atomic_inc_return(&sdebug_a_tsf) >=
5405		     abs(sdebug_every_nth))) {
5406			atomic_set(&sdebug_a_tsf, 0);
5407			inject = true;
5408			scsi_result = device_qfull_result;
5409		}
5410	}
5411
5412	k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
5413	if (unlikely(k >= sdebug_max_queue)) {
5414		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5415		if (scsi_result)
5416			goto respond_in_thread;
5417		else if (SDEBUG_OPT_ALL_TSF & sdebug_opts)
5418			scsi_result = device_qfull_result;
5419		if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
5420			sdev_printk(KERN_INFO, sdp,
5421				    "%s: max_queue=%d exceeded, %s\n",
5422				    __func__, sdebug_max_queue,
5423				    (scsi_result ?  "status: TASK SET FULL" :
5424						    "report: host busy"));
5425		if (scsi_result)
5426			goto respond_in_thread;
5427		else
5428			return SCSI_MLQUEUE_HOST_BUSY;
5429	}
5430	set_bit(k, sqp->in_use_bm);
5431	atomic_inc(&devip->num_in_q);
5432	sqcp = &sqp->qc_arr[k];
5433	sqcp->a_cmnd = cmnd;
5434	cmnd->host_scribble = (unsigned char *)sqcp;
5435	sd_dp = sqcp->sd_dp;
5436	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5437
5438	if (!sd_dp) {
 
5439		sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
5440		if (!sd_dp) {
5441			atomic_dec(&devip->num_in_q);
5442			clear_bit(k, sqp->in_use_bm);
5443			return SCSI_MLQUEUE_HOST_BUSY;
5444		}
5445		new_sd_dp = true;
5446	} else {
5447		new_sd_dp = false;
5448	}
5449
5450	/* Set the hostwide tag */
5451	if (sdebug_host_max_queue)
5452		sd_dp->hc_idx = get_tag(cmnd);
5453
5454	if (hipri)
5455		ns_from_boot = ktime_get_boottime_ns();
5456
5457	/* one of the resp_*() response functions is called here */
5458	cmnd->result = pfp ? pfp(cmnd, devip) : 0;
5459	if (cmnd->result & SDEG_RES_IMMED_MASK) {
 
 
 
5460		cmnd->result &= ~SDEG_RES_IMMED_MASK;
5461		delta_jiff = ndelay = 0;
5462	}
5463	if (cmnd->result == 0 && scsi_result != 0)
5464		cmnd->result = scsi_result;
5465	if (cmnd->result == 0 && unlikely(sdebug_opts & SDEBUG_OPT_TRANSPORT_ERR)) {
5466		if (atomic_read(&sdeb_inject_pending)) {
5467			mk_sense_buffer(cmnd, ABORTED_COMMAND, TRANSPORT_PROBLEM, ACK_NAK_TO);
5468			atomic_set(&sdeb_inject_pending, 0);
5469			cmnd->result = check_condition_result;
5470		}
5471	}
5472
5473	if (unlikely(sdebug_verbose && cmnd->result))
5474		sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
5475			    __func__, cmnd->result);
5476
5477	if (delta_jiff > 0 || ndelay > 0) {
5478		ktime_t kt;
5479
5480		if (delta_jiff > 0) {
5481			u64 ns = jiffies_to_nsecs(delta_jiff);
5482
5483			if (sdebug_random && ns < U32_MAX) {
5484				ns = prandom_u32_max((u32)ns);
5485			} else if (sdebug_random) {
5486				ns >>= 12;	/* scale to 4 usec precision */
5487				if (ns < U32_MAX)	/* over 4 hours max */
5488					ns = prandom_u32_max((u32)ns);
5489				ns <<= 12;
5490			}
5491			kt = ns_to_ktime(ns);
5492		} else {	/* ndelay has a 4.2 second max */
5493			kt = sdebug_random ? prandom_u32_max((u32)ndelay) :
5494					     (u32)ndelay;
5495			if (ndelay < INCLUSIVE_TIMING_MAX_NS) {
5496				u64 d = ktime_get_boottime_ns() - ns_from_boot;
5497
5498				if (kt <= d) {	/* elapsed duration >= kt */
5499					spin_lock_irqsave(&sqp->qc_lock, iflags);
5500					sqcp->a_cmnd = NULL;
5501					atomic_dec(&devip->num_in_q);
5502					clear_bit(k, sqp->in_use_bm);
5503					spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5504					if (new_sd_dp)
5505						kfree(sd_dp);
5506					/* call scsi_done() from this thread */
5507					cmnd->scsi_done(cmnd);
5508					return 0;
5509				}
5510				/* otherwise reduce kt by elapsed time */
5511				kt -= d;
5512			}
5513		}
5514		if (hipri) {
5515			sd_dp->cmpl_ts = ktime_add(ns_to_ktime(ns_from_boot), kt);
5516			spin_lock_irqsave(&sqp->qc_lock, iflags);
5517			if (!sd_dp->init_poll) {
5518				sd_dp->init_poll = true;
5519				sqcp->sd_dp = sd_dp;
5520				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5521				sd_dp->qc_idx = k;
5522			}
5523			sd_dp->defer_t = SDEB_DEFER_POLL;
5524			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5525		} else {
5526			if (!sd_dp->init_hrt) {
5527				sd_dp->init_hrt = true;
5528				sqcp->sd_dp = sd_dp;
5529				hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
5530					     HRTIMER_MODE_REL_PINNED);
5531				sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
5532				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5533				sd_dp->qc_idx = k;
5534			}
5535			sd_dp->defer_t = SDEB_DEFER_HRT;
5536			/* schedule the invocation of scsi_done() for a later time */
5537			hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
5538		}
5539		if (sdebug_statistics)
5540			sd_dp->issuing_cpu = raw_smp_processor_id();
 
 
5541	} else {	/* jdelay < 0, use work queue */
5542		if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) &&
5543			     atomic_read(&sdeb_inject_pending)))
5544			sd_dp->aborted = true;
5545		if (hipri) {
5546			sd_dp->cmpl_ts = ns_to_ktime(ns_from_boot);
5547			spin_lock_irqsave(&sqp->qc_lock, iflags);
5548			if (!sd_dp->init_poll) {
5549				sd_dp->init_poll = true;
5550				sqcp->sd_dp = sd_dp;
5551				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5552				sd_dp->qc_idx = k;
5553			}
5554			sd_dp->defer_t = SDEB_DEFER_POLL;
5555			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5556		} else {
5557			if (!sd_dp->init_wq) {
5558				sd_dp->init_wq = true;
5559				sqcp->sd_dp = sd_dp;
5560				sd_dp->sqa_idx = sqp - sdebug_q_arr;
5561				sd_dp->qc_idx = k;
5562				INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
5563			}
5564			sd_dp->defer_t = SDEB_DEFER_WQ;
5565			schedule_work(&sd_dp->ew.work);
5566		}
5567		if (sdebug_statistics)
5568			sd_dp->issuing_cpu = raw_smp_processor_id();
5569		if (unlikely(sd_dp->aborted)) {
5570			sdev_printk(KERN_INFO, sdp, "abort request tag %d\n", cmnd->request->tag);
 
 
 
 
 
5571			blk_abort_request(cmnd->request);
5572			atomic_set(&sdeb_inject_pending, 0);
5573			sd_dp->aborted = false;
5574		}
5575	}
5576	if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) && scsi_result == device_qfull_result))
5577		sdev_printk(KERN_INFO, sdp, "%s: num_in_q=%d +1, %s%s\n", __func__,
5578			    num_in_q, (inject ? "<inject> " : ""), "status: TASK SET FULL");
 
 
 
5579	return 0;
5580
5581respond_in_thread:	/* call back to mid-layer using invocation thread */
5582	cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
5583	cmnd->result &= ~SDEG_RES_IMMED_MASK;
5584	if (cmnd->result == 0 && scsi_result != 0)
5585		cmnd->result = scsi_result;
5586	cmnd->scsi_done(cmnd);
5587	return 0;
5588}
5589
5590/* Note: The following macros create attribute files in the
5591   /sys/module/scsi_debug/parameters directory. Unfortunately this
5592   driver is unaware of a change and cannot trigger auxiliary actions
5593   as it can when the corresponding attribute in the
5594   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
5595 */
5596module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
5597module_param_named(ato, sdebug_ato, int, S_IRUGO);
5598module_param_named(cdb_len, sdebug_cdb_len, int, 0644);
5599module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
5600module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
5601module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
5602module_param_named(dif, sdebug_dif, int, S_IRUGO);
5603module_param_named(dix, sdebug_dix, int, S_IRUGO);
5604module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
5605module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
5606module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
5607module_param_named(guard, sdebug_guard, uint, S_IRUGO);
5608module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
5609module_param_named(host_max_queue, sdebug_host_max_queue, int, S_IRUGO);
 
5610module_param_string(inq_product, sdebug_inq_product_id,
5611		    sizeof(sdebug_inq_product_id), S_IRUGO | S_IWUSR);
5612module_param_string(inq_rev, sdebug_inq_product_rev,
5613		    sizeof(sdebug_inq_product_rev), S_IRUGO | S_IWUSR);
5614module_param_string(inq_vendor, sdebug_inq_vendor_id,
5615		    sizeof(sdebug_inq_vendor_id), S_IRUGO | S_IWUSR);
5616module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
5617module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
5618module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
5619module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
 
5620module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
5621module_param_named(lun_format, sdebug_lun_am_i, int, S_IRUGO | S_IWUSR);
5622module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
5623module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
5624module_param_named(medium_error_count, sdebug_medium_error_count, int,
5625		   S_IRUGO | S_IWUSR);
5626module_param_named(medium_error_start, sdebug_medium_error_start, int,
5627		   S_IRUGO | S_IWUSR);
5628module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
5629module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
5630module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
5631module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
5632module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
5633module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
5634module_param_named(opt_xferlen_exp, sdebug_opt_xferlen_exp, int, S_IRUGO);
5635module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
5636module_param_named(per_host_store, sdebug_per_host_store, bool,
5637		   S_IRUGO | S_IWUSR);
5638module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
 
5639module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
5640module_param_named(random, sdebug_random, bool, S_IRUGO | S_IWUSR);
5641module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
5642module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
5643module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
5644module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
5645module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
5646module_param_named(submit_queues, submit_queues, int, S_IRUGO);
5647module_param_named(poll_queues, poll_queues, int, S_IRUGO);
5648module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO);
5649module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
5650module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
5651module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
5652module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
5653module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
5654module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
 
5655module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
5656		   S_IRUGO | S_IWUSR);
5657module_param_named(wp, sdebug_wp, bool, S_IRUGO | S_IWUSR);
5658module_param_named(write_same_length, sdebug_write_same_length, int,
5659		   S_IRUGO | S_IWUSR);
5660module_param_named(zbc, sdeb_zbc_model_s, charp, S_IRUGO);
5661module_param_named(zone_max_open, sdeb_zbc_max_open, int, S_IRUGO);
5662module_param_named(zone_nr_conv, sdeb_zbc_nr_conv, int, S_IRUGO);
5663module_param_named(zone_size_mb, sdeb_zbc_zone_size_mb, int, S_IRUGO);
5664
5665MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
5666MODULE_DESCRIPTION("SCSI debug adapter driver");
5667MODULE_LICENSE("GPL");
5668MODULE_VERSION(SDEBUG_VERSION);
5669
5670MODULE_PARM_DESC(add_host, "add n hosts, in sysfs if negative remove host(s) (def=1)");
5671MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
5672MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
5673MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
5674MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
5675MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
5676MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
5677MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
5678MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
5679MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
5680MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
5681MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
5682MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
5683MODULE_PARM_DESC(host_max_queue,
5684		 "host max # of queued cmds (0 to max(def) [max_queue fixed equal for !0])");
5685MODULE_PARM_DESC(inq_product, "SCSI INQUIRY product string (def=\"scsi_debug\")");
5686MODULE_PARM_DESC(inq_rev, "SCSI INQUIRY revision string (def=\""
5687		 SDEBUG_VERSION "\")");
5688MODULE_PARM_DESC(inq_vendor, "SCSI INQUIRY vendor string (def=\"Linux\")");
5689MODULE_PARM_DESC(lbprz,
5690		 "on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
5691MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
5692MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
5693MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
 
 
5694MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
5695MODULE_PARM_DESC(lun_format, "LUN format: 0->peripheral (def); 1 --> flat address method");
5696MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
5697MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
5698MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
5699MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
 
5700MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
5701MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
5702MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
5703MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
5704MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
5705MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
5706MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent (def=physblk_exp)");
5707MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
5708MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
5709MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
5710MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1))");
5711MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
5712MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
5713MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
5714MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
5715MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
5716MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
5717MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
5718MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
5719MODULE_PARM_DESC(tur_ms_to_ready, "TEST UNIT READY millisecs before initial good status (def=0)");
5720MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
5721MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
5722MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
5723MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
5724MODULE_PARM_DESC(uuid_ctl,
5725		 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
5726MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
5727MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
5728MODULE_PARM_DESC(wp, "Write Protect (def=0)");
5729MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
5730MODULE_PARM_DESC(zbc, "'none' [0]; 'aware' [1]; 'managed' [2] (def=0). Can have 'host-' prefix");
5731MODULE_PARM_DESC(zone_max_open, "Maximum number of open zones; [0] for no limit (def=auto)");
5732MODULE_PARM_DESC(zone_nr_conv, "Number of conventional zones (def=1)");
5733MODULE_PARM_DESC(zone_size_mb, "Zone size in MiB (def=auto)");
5734
5735#define SDEBUG_INFO_LEN 256
5736static char sdebug_info[SDEBUG_INFO_LEN];
5737
5738static const char *scsi_debug_info(struct Scsi_Host *shp)
5739{
5740	int k;
5741
5742	k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
5743		      my_name, SDEBUG_VERSION, sdebug_version_date);
5744	if (k >= (SDEBUG_INFO_LEN - 1))
5745		return sdebug_info;
5746	scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
5747		  "  dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
5748		  sdebug_dev_size_mb, sdebug_opts, submit_queues,
5749		  "statistics", (int)sdebug_statistics);
5750	return sdebug_info;
5751}
5752
5753/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
5754static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
5755				 int length)
5756{
5757	char arr[16];
5758	int opts;
5759	int minLen = length > 15 ? 15 : length;
5760
5761	if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
5762		return -EACCES;
5763	memcpy(arr, buffer, minLen);
5764	arr[minLen] = '\0';
5765	if (1 != sscanf(arr, "%d", &opts))
5766		return -EINVAL;
5767	sdebug_opts = opts;
5768	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
5769	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
5770	if (sdebug_every_nth != 0)
5771		tweak_cmnd_count();
5772	return length;
5773}
5774
5775/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
5776 * same for each scsi_debug host (if more than one). Some of the counters
5777 * output are not atomics so might be inaccurate in a busy system. */
5778static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
5779{
5780	int f, j, l;
5781	struct sdebug_queue *sqp;
5782	struct sdebug_host_info *sdhp;
5783
5784	seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
5785		   SDEBUG_VERSION, sdebug_version_date);
5786	seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
5787		   sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
5788		   sdebug_opts, sdebug_every_nth);
5789	seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
5790		   sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
5791		   sdebug_sector_size, "bytes");
5792	seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
5793		   sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
5794		   num_aborts);
5795	seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
5796		   num_dev_resets, num_target_resets, num_bus_resets,
5797		   num_host_resets);
5798	seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
5799		   dix_reads, dix_writes, dif_errors);
5800	seq_printf(m, "usec_in_jiffy=%lu, statistics=%d\n", TICK_NSEC / 1000,
5801		   sdebug_statistics);
5802	seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d, mq_polls=%d\n",
5803		   atomic_read(&sdebug_cmnd_count),
5804		   atomic_read(&sdebug_completions),
5805		   "miss_cpus", atomic_read(&sdebug_miss_cpus),
5806		   atomic_read(&sdebug_a_tsf),
5807		   atomic_read(&sdeb_mq_poll_count));
5808
5809	seq_printf(m, "submit_queues=%d\n", submit_queues);
5810	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5811		seq_printf(m, "  queue %d:\n", j);
5812		f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
5813		if (f != sdebug_max_queue) {
5814			l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
5815			seq_printf(m, "    in_use_bm BUSY: %s: %d,%d\n",
5816				   "first,last bits", f, l);
5817		}
5818	}
5819
5820	seq_printf(m, "this host_no=%d\n", host->host_no);
5821	if (!xa_empty(per_store_ap)) {
5822		bool niu;
5823		int idx;
5824		unsigned long l_idx;
5825		struct sdeb_store_info *sip;
5826
5827		seq_puts(m, "\nhost list:\n");
5828		j = 0;
5829		list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
5830			idx = sdhp->si_idx;
5831			seq_printf(m, "  %d: host_no=%d, si_idx=%d\n", j,
5832				   sdhp->shost->host_no, idx);
5833			++j;
5834		}
5835		seq_printf(m, "\nper_store array [most_recent_idx=%d]:\n",
5836			   sdeb_most_recent_idx);
5837		j = 0;
5838		xa_for_each(per_store_ap, l_idx, sip) {
5839			niu = xa_get_mark(per_store_ap, l_idx,
5840					  SDEB_XA_NOT_IN_USE);
5841			idx = (int)l_idx;
5842			seq_printf(m, "  %d: idx=%d%s\n", j, idx,
5843				   (niu ? "  not_in_use" : ""));
5844			++j;
5845		}
5846	}
5847	return 0;
5848}
5849
5850static ssize_t delay_show(struct device_driver *ddp, char *buf)
5851{
5852	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
5853}
5854/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
5855 * of delay is jiffies.
5856 */
5857static ssize_t delay_store(struct device_driver *ddp, const char *buf,
5858			   size_t count)
5859{
5860	int jdelay, res;
5861
5862	if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
5863		res = count;
5864		if (sdebug_jdelay != jdelay) {
5865			int j, k;
5866			struct sdebug_queue *sqp;
5867
5868			block_unblock_all_queues(true);
5869			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
5870			     ++j, ++sqp) {
5871				k = find_first_bit(sqp->in_use_bm,
5872						   sdebug_max_queue);
5873				if (k != sdebug_max_queue) {
5874					res = -EBUSY;   /* queued commands */
5875					break;
5876				}
5877			}
5878			if (res > 0) {
5879				sdebug_jdelay = jdelay;
5880				sdebug_ndelay = 0;
5881			}
5882			block_unblock_all_queues(false);
5883		}
5884		return res;
5885	}
5886	return -EINVAL;
5887}
5888static DRIVER_ATTR_RW(delay);
5889
5890static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
5891{
5892	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
5893}
5894/* Returns -EBUSY if ndelay is being changed and commands are queued */
5895/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
5896static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
5897			    size_t count)
5898{
5899	int ndelay, res;
5900
5901	if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
5902	    (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
5903		res = count;
5904		if (sdebug_ndelay != ndelay) {
5905			int j, k;
5906			struct sdebug_queue *sqp;
5907
5908			block_unblock_all_queues(true);
5909			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
5910			     ++j, ++sqp) {
5911				k = find_first_bit(sqp->in_use_bm,
5912						   sdebug_max_queue);
5913				if (k != sdebug_max_queue) {
5914					res = -EBUSY;   /* queued commands */
5915					break;
5916				}
5917			}
5918			if (res > 0) {
5919				sdebug_ndelay = ndelay;
5920				sdebug_jdelay = ndelay  ? JDELAY_OVERRIDDEN
5921							: DEF_JDELAY;
5922			}
5923			block_unblock_all_queues(false);
5924		}
5925		return res;
5926	}
5927	return -EINVAL;
5928}
5929static DRIVER_ATTR_RW(ndelay);
5930
5931static ssize_t opts_show(struct device_driver *ddp, char *buf)
5932{
5933	return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
5934}
5935
5936static ssize_t opts_store(struct device_driver *ddp, const char *buf,
5937			  size_t count)
5938{
5939	int opts;
5940	char work[20];
5941
5942	if (sscanf(buf, "%10s", work) == 1) {
5943		if (strncasecmp(work, "0x", 2) == 0) {
5944			if (kstrtoint(work + 2, 16, &opts) == 0)
5945				goto opts_done;
5946		} else {
5947			if (kstrtoint(work, 10, &opts) == 0)
5948				goto opts_done;
5949		}
5950	}
5951	return -EINVAL;
5952opts_done:
5953	sdebug_opts = opts;
5954	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
5955	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
5956	tweak_cmnd_count();
5957	return count;
5958}
5959static DRIVER_ATTR_RW(opts);
5960
5961static ssize_t ptype_show(struct device_driver *ddp, char *buf)
5962{
5963	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
5964}
5965static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
5966			   size_t count)
5967{
5968	int n;
5969
5970	/* Cannot change from or to TYPE_ZBC with sysfs */
5971	if (sdebug_ptype == TYPE_ZBC)
5972		return -EINVAL;
5973
5974	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5975		if (n == TYPE_ZBC)
5976			return -EINVAL;
5977		sdebug_ptype = n;
5978		return count;
5979	}
5980	return -EINVAL;
5981}
5982static DRIVER_ATTR_RW(ptype);
5983
5984static ssize_t dsense_show(struct device_driver *ddp, char *buf)
5985{
5986	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
5987}
5988static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
5989			    size_t count)
5990{
5991	int n;
5992
5993	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5994		sdebug_dsense = n;
5995		return count;
5996	}
5997	return -EINVAL;
5998}
5999static DRIVER_ATTR_RW(dsense);
6000
6001static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
6002{
6003	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
6004}
6005static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
6006			     size_t count)
6007{
6008	int n, idx;
6009
6010	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6011		bool want_store = (n == 0);
6012		struct sdebug_host_info *sdhp;
6013
6014		n = (n > 0);
6015		sdebug_fake_rw = (sdebug_fake_rw > 0);
6016		if (sdebug_fake_rw == n)
6017			return count;	/* not transitioning so do nothing */
6018
6019		if (want_store) {	/* 1 --> 0 transition, set up store */
6020			if (sdeb_first_idx < 0) {
6021				idx = sdebug_add_store();
6022				if (idx < 0)
6023					return idx;
6024			} else {
6025				idx = sdeb_first_idx;
6026				xa_clear_mark(per_store_ap, idx,
6027					      SDEB_XA_NOT_IN_USE);
6028			}
6029			/* make all hosts use same store */
6030			list_for_each_entry(sdhp, &sdebug_host_list,
6031					    host_list) {
6032				if (sdhp->si_idx != idx) {
6033					xa_set_mark(per_store_ap, sdhp->si_idx,
6034						    SDEB_XA_NOT_IN_USE);
6035					sdhp->si_idx = idx;
6036				}
6037			}
6038			sdeb_most_recent_idx = idx;
6039		} else {	/* 0 --> 1 transition is trigger for shrink */
6040			sdebug_erase_all_stores(true /* apart from first */);
6041		}
6042		sdebug_fake_rw = n;
6043		return count;
6044	}
6045	return -EINVAL;
6046}
6047static DRIVER_ATTR_RW(fake_rw);
6048
6049static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
6050{
6051	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
6052}
6053static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
6054			      size_t count)
6055{
6056	int n;
6057
6058	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6059		sdebug_no_lun_0 = n;
6060		return count;
6061	}
6062	return -EINVAL;
6063}
6064static DRIVER_ATTR_RW(no_lun_0);
6065
6066static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
6067{
6068	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
6069}
6070static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
6071			      size_t count)
6072{
6073	int n;
6074
6075	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6076		sdebug_num_tgts = n;
6077		sdebug_max_tgts_luns();
6078		return count;
6079	}
6080	return -EINVAL;
6081}
6082static DRIVER_ATTR_RW(num_tgts);
6083
6084static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
6085{
6086	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
6087}
6088static DRIVER_ATTR_RO(dev_size_mb);
6089
6090static ssize_t per_host_store_show(struct device_driver *ddp, char *buf)
6091{
6092	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_per_host_store);
6093}
6094
6095static ssize_t per_host_store_store(struct device_driver *ddp, const char *buf,
6096				    size_t count)
6097{
6098	bool v;
6099
6100	if (kstrtobool(buf, &v))
6101		return -EINVAL;
6102
6103	sdebug_per_host_store = v;
6104	return count;
6105}
6106static DRIVER_ATTR_RW(per_host_store);
6107
6108static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
6109{
6110	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
6111}
6112static DRIVER_ATTR_RO(num_parts);
6113
6114static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
6115{
6116	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
6117}
6118static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
6119			       size_t count)
6120{
6121	int nth;
6122	char work[20];
6123
6124	if (sscanf(buf, "%10s", work) == 1) {
6125		if (strncasecmp(work, "0x", 2) == 0) {
6126			if (kstrtoint(work + 2, 16, &nth) == 0)
6127				goto every_nth_done;
6128		} else {
6129			if (kstrtoint(work, 10, &nth) == 0)
6130				goto every_nth_done;
6131		}
6132	}
6133	return -EINVAL;
6134
6135every_nth_done:
6136	sdebug_every_nth = nth;
6137	if (nth && !sdebug_statistics) {
6138		pr_info("every_nth needs statistics=1, set it\n");
6139		sdebug_statistics = true;
6140	}
6141	tweak_cmnd_count();
6142	return count;
6143}
6144static DRIVER_ATTR_RW(every_nth);
6145
6146static ssize_t lun_format_show(struct device_driver *ddp, char *buf)
6147{
6148	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_lun_am);
6149}
6150static ssize_t lun_format_store(struct device_driver *ddp, const char *buf,
6151				size_t count)
6152{
6153	int n;
6154	bool changed;
6155
6156	if (kstrtoint(buf, 0, &n))
6157		return -EINVAL;
6158	if (n >= 0) {
6159		if (n > (int)SAM_LUN_AM_FLAT) {
6160			pr_warn("only LUN address methods 0 and 1 are supported\n");
6161			return -EINVAL;
6162		}
6163		changed = ((int)sdebug_lun_am != n);
6164		sdebug_lun_am = n;
6165		if (changed && sdebug_scsi_level >= 5) {	/* >= SPC-3 */
6166			struct sdebug_host_info *sdhp;
6167			struct sdebug_dev_info *dp;
6168
6169			spin_lock(&sdebug_host_list_lock);
6170			list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
6171				list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
6172					set_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
6173				}
6174			}
6175			spin_unlock(&sdebug_host_list_lock);
6176		}
 
6177		return count;
6178	}
6179	return -EINVAL;
6180}
6181static DRIVER_ATTR_RW(lun_format);
6182
6183static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
6184{
6185	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
6186}
6187static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
6188			      size_t count)
6189{
6190	int n;
6191	bool changed;
6192
6193	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6194		if (n > 256) {
6195			pr_warn("max_luns can be no more than 256\n");
6196			return -EINVAL;
6197		}
6198		changed = (sdebug_max_luns != n);
6199		sdebug_max_luns = n;
6200		sdebug_max_tgts_luns();
6201		if (changed && (sdebug_scsi_level >= 5)) {	/* >= SPC-3 */
6202			struct sdebug_host_info *sdhp;
6203			struct sdebug_dev_info *dp;
6204
6205			spin_lock(&sdebug_host_list_lock);
6206			list_for_each_entry(sdhp, &sdebug_host_list,
6207					    host_list) {
6208				list_for_each_entry(dp, &sdhp->dev_info_list,
6209						    dev_list) {
6210					set_bit(SDEBUG_UA_LUNS_CHANGED,
6211						dp->uas_bm);
6212				}
6213			}
6214			spin_unlock(&sdebug_host_list_lock);
6215		}
6216		return count;
6217	}
6218	return -EINVAL;
6219}
6220static DRIVER_ATTR_RW(max_luns);
6221
6222static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
6223{
6224	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
6225}
6226/* N.B. max_queue can be changed while there are queued commands. In flight
6227 * commands beyond the new max_queue will be completed. */
6228static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
6229			       size_t count)
6230{
6231	int j, n, k, a;
6232	struct sdebug_queue *sqp;
6233
6234	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
6235	    (n <= SDEBUG_CANQUEUE) &&
6236	    (sdebug_host_max_queue == 0)) {
6237		block_unblock_all_queues(true);
6238		k = 0;
6239		for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6240		     ++j, ++sqp) {
6241			a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
6242			if (a > k)
6243				k = a;
6244		}
6245		sdebug_max_queue = n;
6246		if (k == SDEBUG_CANQUEUE)
6247			atomic_set(&retired_max_queue, 0);
6248		else if (k >= n)
6249			atomic_set(&retired_max_queue, k + 1);
6250		else
6251			atomic_set(&retired_max_queue, 0);
6252		block_unblock_all_queues(false);
6253		return count;
6254	}
6255	return -EINVAL;
6256}
6257static DRIVER_ATTR_RW(max_queue);
6258
6259static ssize_t host_max_queue_show(struct device_driver *ddp, char *buf)
6260{
6261	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_host_max_queue);
6262}
6263
6264/*
6265 * Since this is used for .can_queue, and we get the hc_idx tag from the bitmap
6266 * in range [0, sdebug_host_max_queue), we can't change it.
6267 */
6268static DRIVER_ATTR_RO(host_max_queue);
6269
6270static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
6271{
6272	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
6273}
6274static DRIVER_ATTR_RO(no_uld);
6275
6276static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
6277{
6278	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
6279}
6280static DRIVER_ATTR_RO(scsi_level);
6281
6282static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
6283{
6284	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
6285}
6286static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
6287				size_t count)
6288{
6289	int n;
6290	bool changed;
6291
6292	/* Ignore capacity change for ZBC drives for now */
6293	if (sdeb_zbc_in_use)
6294		return -ENOTSUPP;
6295
6296	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6297		changed = (sdebug_virtual_gb != n);
6298		sdebug_virtual_gb = n;
6299		sdebug_capacity = get_sdebug_capacity();
6300		if (changed) {
6301			struct sdebug_host_info *sdhp;
6302			struct sdebug_dev_info *dp;
6303
6304			spin_lock(&sdebug_host_list_lock);
6305			list_for_each_entry(sdhp, &sdebug_host_list,
6306					    host_list) {
6307				list_for_each_entry(dp, &sdhp->dev_info_list,
6308						    dev_list) {
6309					set_bit(SDEBUG_UA_CAPACITY_CHANGED,
6310						dp->uas_bm);
6311				}
6312			}
6313			spin_unlock(&sdebug_host_list_lock);
6314		}
6315		return count;
6316	}
6317	return -EINVAL;
6318}
6319static DRIVER_ATTR_RW(virtual_gb);
6320
6321static ssize_t add_host_show(struct device_driver *ddp, char *buf)
6322{
6323	/* absolute number of hosts currently active is what is shown */
6324	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_hosts);
6325}
6326
 
 
 
6327static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
6328			      size_t count)
6329{
6330	bool found;
6331	unsigned long idx;
6332	struct sdeb_store_info *sip;
6333	bool want_phs = (sdebug_fake_rw == 0) && sdebug_per_host_store;
6334	int delta_hosts;
6335
6336	if (sscanf(buf, "%d", &delta_hosts) != 1)
6337		return -EINVAL;
6338	if (delta_hosts > 0) {
6339		do {
6340			found = false;
6341			if (want_phs) {
6342				xa_for_each_marked(per_store_ap, idx, sip,
6343						   SDEB_XA_NOT_IN_USE) {
6344					sdeb_most_recent_idx = (int)idx;
6345					found = true;
6346					break;
6347				}
6348				if (found)	/* re-use case */
6349					sdebug_add_host_helper((int)idx);
6350				else
6351					sdebug_do_add_host(true);
6352			} else {
6353				sdebug_do_add_host(false);
6354			}
6355		} while (--delta_hosts);
6356	} else if (delta_hosts < 0) {
6357		do {
6358			sdebug_do_remove_host(false);
6359		} while (++delta_hosts);
6360	}
6361	return count;
6362}
6363static DRIVER_ATTR_RW(add_host);
6364
6365static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
6366{
6367	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
6368}
6369static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
6370				    size_t count)
6371{
6372	int n;
6373
6374	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6375		sdebug_vpd_use_hostno = n;
6376		return count;
6377	}
6378	return -EINVAL;
6379}
6380static DRIVER_ATTR_RW(vpd_use_hostno);
6381
6382static ssize_t statistics_show(struct device_driver *ddp, char *buf)
6383{
6384	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
6385}
6386static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
6387				size_t count)
6388{
6389	int n;
6390
6391	if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
6392		if (n > 0)
6393			sdebug_statistics = true;
6394		else {
6395			clear_queue_stats();
6396			sdebug_statistics = false;
6397		}
6398		return count;
6399	}
6400	return -EINVAL;
6401}
6402static DRIVER_ATTR_RW(statistics);
6403
6404static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
6405{
6406	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
6407}
6408static DRIVER_ATTR_RO(sector_size);
6409
6410static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
6411{
6412	return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
6413}
6414static DRIVER_ATTR_RO(submit_queues);
6415
6416static ssize_t dix_show(struct device_driver *ddp, char *buf)
6417{
6418	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
6419}
6420static DRIVER_ATTR_RO(dix);
6421
6422static ssize_t dif_show(struct device_driver *ddp, char *buf)
6423{
6424	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
6425}
6426static DRIVER_ATTR_RO(dif);
6427
6428static ssize_t guard_show(struct device_driver *ddp, char *buf)
6429{
6430	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
6431}
6432static DRIVER_ATTR_RO(guard);
6433
6434static ssize_t ato_show(struct device_driver *ddp, char *buf)
6435{
6436	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
6437}
6438static DRIVER_ATTR_RO(ato);
6439
6440static ssize_t map_show(struct device_driver *ddp, char *buf)
6441{
6442	ssize_t count = 0;
6443
6444	if (!scsi_debug_lbp())
6445		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
6446				 sdebug_store_sectors);
6447
6448	if (sdebug_fake_rw == 0 && !xa_empty(per_store_ap)) {
6449		struct sdeb_store_info *sip = xa_load(per_store_ap, 0);
6450
6451		if (sip)
6452			count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
6453					  (int)map_size, sip->map_storep);
6454	}
6455	buf[count++] = '\n';
6456	buf[count] = '\0';
6457
6458	return count;
6459}
6460static DRIVER_ATTR_RO(map);
6461
6462static ssize_t random_show(struct device_driver *ddp, char *buf)
6463{
6464	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_random);
6465}
6466
6467static ssize_t random_store(struct device_driver *ddp, const char *buf,
6468			    size_t count)
6469{
6470	bool v;
6471
6472	if (kstrtobool(buf, &v))
6473		return -EINVAL;
6474
6475	sdebug_random = v;
6476	return count;
6477}
6478static DRIVER_ATTR_RW(random);
6479
6480static ssize_t removable_show(struct device_driver *ddp, char *buf)
6481{
6482	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
6483}
6484static ssize_t removable_store(struct device_driver *ddp, const char *buf,
6485			       size_t count)
6486{
6487	int n;
6488
6489	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6490		sdebug_removable = (n > 0);
6491		return count;
6492	}
6493	return -EINVAL;
6494}
6495static DRIVER_ATTR_RW(removable);
6496
6497static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
6498{
6499	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
6500}
6501/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
6502static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
6503			       size_t count)
6504{
6505	int n;
6506
6507	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6508		sdebug_host_lock = (n > 0);
6509		return count;
6510	}
6511	return -EINVAL;
6512}
6513static DRIVER_ATTR_RW(host_lock);
6514
6515static ssize_t strict_show(struct device_driver *ddp, char *buf)
6516{
6517	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
6518}
6519static ssize_t strict_store(struct device_driver *ddp, const char *buf,
6520			    size_t count)
6521{
6522	int n;
6523
6524	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6525		sdebug_strict = (n > 0);
6526		return count;
6527	}
6528	return -EINVAL;
6529}
6530static DRIVER_ATTR_RW(strict);
6531
6532static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
6533{
6534	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
6535}
6536static DRIVER_ATTR_RO(uuid_ctl);
6537
6538static ssize_t cdb_len_show(struct device_driver *ddp, char *buf)
6539{
6540	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_cdb_len);
6541}
6542static ssize_t cdb_len_store(struct device_driver *ddp, const char *buf,
6543			     size_t count)
6544{
6545	int ret, n;
6546
6547	ret = kstrtoint(buf, 0, &n);
6548	if (ret)
6549		return ret;
6550	sdebug_cdb_len = n;
6551	all_config_cdb_len();
6552	return count;
6553}
6554static DRIVER_ATTR_RW(cdb_len);
6555
6556static const char * const zbc_model_strs_a[] = {
6557	[BLK_ZONED_NONE] = "none",
6558	[BLK_ZONED_HA]   = "host-aware",
6559	[BLK_ZONED_HM]   = "host-managed",
6560};
6561
6562static const char * const zbc_model_strs_b[] = {
6563	[BLK_ZONED_NONE] = "no",
6564	[BLK_ZONED_HA]   = "aware",
6565	[BLK_ZONED_HM]   = "managed",
6566};
6567
6568static const char * const zbc_model_strs_c[] = {
6569	[BLK_ZONED_NONE] = "0",
6570	[BLK_ZONED_HA]   = "1",
6571	[BLK_ZONED_HM]   = "2",
6572};
6573
6574static int sdeb_zbc_model_str(const char *cp)
6575{
6576	int res = sysfs_match_string(zbc_model_strs_a, cp);
6577
6578	if (res < 0) {
6579		res = sysfs_match_string(zbc_model_strs_b, cp);
6580		if (res < 0) {
6581			res = sysfs_match_string(zbc_model_strs_c, cp);
6582			if (res < 0)
6583				return -EINVAL;
6584		}
6585	}
6586	return res;
6587}
6588
6589static ssize_t zbc_show(struct device_driver *ddp, char *buf)
6590{
6591	return scnprintf(buf, PAGE_SIZE, "%s\n",
6592			 zbc_model_strs_a[sdeb_zbc_model]);
6593}
6594static DRIVER_ATTR_RO(zbc);
6595
6596static ssize_t tur_ms_to_ready_show(struct device_driver *ddp, char *buf)
6597{
6598	return scnprintf(buf, PAGE_SIZE, "%d\n", sdeb_tur_ms_to_ready);
6599}
6600static DRIVER_ATTR_RO(tur_ms_to_ready);
6601
6602/* Note: The following array creates attribute files in the
6603   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
6604   files (over those found in the /sys/module/scsi_debug/parameters
6605   directory) is that auxiliary actions can be triggered when an attribute
6606   is changed. For example see: add_host_store() above.
6607 */
6608
6609static struct attribute *sdebug_drv_attrs[] = {
6610	&driver_attr_delay.attr,
6611	&driver_attr_opts.attr,
6612	&driver_attr_ptype.attr,
6613	&driver_attr_dsense.attr,
6614	&driver_attr_fake_rw.attr,
6615	&driver_attr_host_max_queue.attr,
6616	&driver_attr_no_lun_0.attr,
6617	&driver_attr_num_tgts.attr,
6618	&driver_attr_dev_size_mb.attr,
6619	&driver_attr_num_parts.attr,
6620	&driver_attr_every_nth.attr,
6621	&driver_attr_lun_format.attr,
6622	&driver_attr_max_luns.attr,
6623	&driver_attr_max_queue.attr,
6624	&driver_attr_no_uld.attr,
6625	&driver_attr_scsi_level.attr,
6626	&driver_attr_virtual_gb.attr,
6627	&driver_attr_add_host.attr,
6628	&driver_attr_per_host_store.attr,
6629	&driver_attr_vpd_use_hostno.attr,
6630	&driver_attr_sector_size.attr,
6631	&driver_attr_statistics.attr,
6632	&driver_attr_submit_queues.attr,
6633	&driver_attr_dix.attr,
6634	&driver_attr_dif.attr,
6635	&driver_attr_guard.attr,
6636	&driver_attr_ato.attr,
6637	&driver_attr_map.attr,
6638	&driver_attr_random.attr,
6639	&driver_attr_removable.attr,
6640	&driver_attr_host_lock.attr,
6641	&driver_attr_ndelay.attr,
6642	&driver_attr_strict.attr,
6643	&driver_attr_uuid_ctl.attr,
6644	&driver_attr_cdb_len.attr,
6645	&driver_attr_tur_ms_to_ready.attr,
6646	&driver_attr_zbc.attr,
6647	NULL,
6648};
6649ATTRIBUTE_GROUPS(sdebug_drv);
6650
6651static struct device *pseudo_primary;
6652
6653static int __init scsi_debug_init(void)
6654{
6655	bool want_store = (sdebug_fake_rw == 0);
6656	unsigned long sz;
6657	int k, ret, hosts_to_add;
6658	int idx = -1;
 
6659
6660	ramdisk_lck_a[0] = &atomic_rw;
6661	ramdisk_lck_a[1] = &atomic_rw2;
6662	atomic_set(&retired_max_queue, 0);
6663
6664	if (sdebug_ndelay >= 1000 * 1000 * 1000) {
6665		pr_warn("ndelay must be less than 1 second, ignored\n");
6666		sdebug_ndelay = 0;
6667	} else if (sdebug_ndelay > 0)
6668		sdebug_jdelay = JDELAY_OVERRIDDEN;
6669
6670	switch (sdebug_sector_size) {
6671	case  512:
6672	case 1024:
6673	case 2048:
6674	case 4096:
6675		break;
6676	default:
6677		pr_err("invalid sector_size %d\n", sdebug_sector_size);
6678		return -EINVAL;
6679	}
6680
6681	switch (sdebug_dif) {
6682	case T10_PI_TYPE0_PROTECTION:
6683		break;
6684	case T10_PI_TYPE1_PROTECTION:
6685	case T10_PI_TYPE2_PROTECTION:
6686	case T10_PI_TYPE3_PROTECTION:
6687		have_dif_prot = true;
6688		break;
6689
6690	default:
6691		pr_err("dif must be 0, 1, 2 or 3\n");
6692		return -EINVAL;
6693	}
6694
6695	if (sdebug_num_tgts < 0) {
6696		pr_err("num_tgts must be >= 0\n");
6697		return -EINVAL;
6698	}
6699
6700	if (sdebug_guard > 1) {
6701		pr_err("guard must be 0 or 1\n");
6702		return -EINVAL;
6703	}
6704
6705	if (sdebug_ato > 1) {
6706		pr_err("ato must be 0 or 1\n");
6707		return -EINVAL;
6708	}
6709
6710	if (sdebug_physblk_exp > 15) {
6711		pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
6712		return -EINVAL;
6713	}
6714
6715	sdebug_lun_am = sdebug_lun_am_i;
6716	if (sdebug_lun_am > SAM_LUN_AM_FLAT) {
6717		pr_warn("Invalid LUN format %u, using default\n", (int)sdebug_lun_am);
6718		sdebug_lun_am = SAM_LUN_AM_PERIPHERAL;
6719	}
6720
6721	if (sdebug_max_luns > 256) {
6722		if (sdebug_max_luns > 16384) {
6723			pr_warn("max_luns can be no more than 16384, use default\n");
6724			sdebug_max_luns = DEF_MAX_LUNS;
6725		}
6726		sdebug_lun_am = SAM_LUN_AM_FLAT;
6727	}
6728
6729	if (sdebug_lowest_aligned > 0x3fff) {
6730		pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
6731		return -EINVAL;
6732	}
6733
6734	if (submit_queues < 1) {
6735		pr_err("submit_queues must be 1 or more\n");
6736		return -EINVAL;
6737	}
6738
6739	if ((sdebug_max_queue > SDEBUG_CANQUEUE) || (sdebug_max_queue < 1)) {
6740		pr_err("max_queue must be in range [1, %d]\n", SDEBUG_CANQUEUE);
6741		return -EINVAL;
6742	}
6743
6744	if ((sdebug_host_max_queue > SDEBUG_CANQUEUE) ||
6745	    (sdebug_host_max_queue < 0)) {
6746		pr_err("host_max_queue must be in range [0 %d]\n",
6747		       SDEBUG_CANQUEUE);
6748		return -EINVAL;
6749	}
6750
6751	if (sdebug_host_max_queue &&
6752	    (sdebug_max_queue != sdebug_host_max_queue)) {
6753		sdebug_max_queue = sdebug_host_max_queue;
6754		pr_warn("fixing max submit queue depth to host max queue depth, %d\n",
6755			sdebug_max_queue);
6756	}
6757
6758	sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
6759			       GFP_KERNEL);
6760	if (sdebug_q_arr == NULL)
6761		return -ENOMEM;
6762	for (k = 0; k < submit_queues; ++k)
6763		spin_lock_init(&sdebug_q_arr[k].qc_lock);
6764
6765	/*
6766	 * check for host managed zoned block device specified with
6767	 * ptype=0x14 or zbc=XXX.
6768	 */
6769	if (sdebug_ptype == TYPE_ZBC) {
6770		sdeb_zbc_model = BLK_ZONED_HM;
6771	} else if (sdeb_zbc_model_s && *sdeb_zbc_model_s) {
6772		k = sdeb_zbc_model_str(sdeb_zbc_model_s);
6773		if (k < 0) {
6774			ret = k;
6775			goto free_q_arr;
6776		}
6777		sdeb_zbc_model = k;
6778		switch (sdeb_zbc_model) {
6779		case BLK_ZONED_NONE:
6780		case BLK_ZONED_HA:
6781			sdebug_ptype = TYPE_DISK;
6782			break;
6783		case BLK_ZONED_HM:
6784			sdebug_ptype = TYPE_ZBC;
6785			break;
6786		default:
6787			pr_err("Invalid ZBC model\n");
6788			ret = -EINVAL;
6789			goto free_q_arr;
6790		}
6791	}
6792	if (sdeb_zbc_model != BLK_ZONED_NONE) {
6793		sdeb_zbc_in_use = true;
6794		if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
6795			sdebug_dev_size_mb = DEF_ZBC_DEV_SIZE_MB;
6796	}
6797
6798	if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
6799		sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
6800	if (sdebug_dev_size_mb < 1)
6801		sdebug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
6802	sz = (unsigned long)sdebug_dev_size_mb * 1048576;
6803	sdebug_store_sectors = sz / sdebug_sector_size;
6804	sdebug_capacity = get_sdebug_capacity();
6805
6806	/* play around with geometry, don't waste too much on track 0 */
6807	sdebug_heads = 8;
6808	sdebug_sectors_per = 32;
6809	if (sdebug_dev_size_mb >= 256)
6810		sdebug_heads = 64;
6811	else if (sdebug_dev_size_mb >= 16)
6812		sdebug_heads = 32;
6813	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
6814			       (sdebug_sectors_per * sdebug_heads);
6815	if (sdebug_cylinders_per >= 1024) {
6816		/* other LLDs do this; implies >= 1GB ram disk ... */
6817		sdebug_heads = 255;
6818		sdebug_sectors_per = 63;
6819		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
6820			       (sdebug_sectors_per * sdebug_heads);
6821	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6822	if (scsi_debug_lbp()) {
6823		sdebug_unmap_max_blocks =
6824			clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
6825
6826		sdebug_unmap_max_desc =
6827			clamp(sdebug_unmap_max_desc, 0U, 256U);
6828
6829		sdebug_unmap_granularity =
6830			clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
6831
6832		if (sdebug_unmap_alignment &&
6833		    sdebug_unmap_granularity <=
6834		    sdebug_unmap_alignment) {
6835			pr_err("ERR: unmap_granularity <= unmap_alignment\n");
6836			ret = -EINVAL;
6837			goto free_q_arr;
6838		}
6839	}
6840	xa_init_flags(per_store_ap, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
6841	if (want_store) {
6842		idx = sdebug_add_store();
6843		if (idx < 0) {
6844			ret = idx;
6845			goto free_q_arr;
 
 
 
 
6846		}
 
 
 
 
 
 
6847	}
6848
6849	pseudo_primary = root_device_register("pseudo_0");
6850	if (IS_ERR(pseudo_primary)) {
6851		pr_warn("root_device_register() error\n");
6852		ret = PTR_ERR(pseudo_primary);
6853		goto free_vm;
6854	}
6855	ret = bus_register(&pseudo_lld_bus);
6856	if (ret < 0) {
6857		pr_warn("bus_register error: %d\n", ret);
6858		goto dev_unreg;
6859	}
6860	ret = driver_register(&sdebug_driverfs_driver);
6861	if (ret < 0) {
6862		pr_warn("driver_register error: %d\n", ret);
6863		goto bus_unreg;
6864	}
6865
6866	hosts_to_add = sdebug_add_host;
6867	sdebug_add_host = 0;
6868
6869	for (k = 0; k < hosts_to_add; k++) {
6870		if (want_store && k == 0) {
6871			ret = sdebug_add_host_helper(idx);
6872			if (ret < 0) {
6873				pr_err("add_host_helper k=%d, error=%d\n",
6874				       k, -ret);
6875				break;
6876			}
6877		} else {
6878			ret = sdebug_do_add_host(want_store &&
6879						 sdebug_per_host_store);
6880			if (ret < 0) {
6881				pr_err("add_host k=%d error=%d\n", k, -ret);
6882				break;
6883			}
6884		}
6885	}
 
6886	if (sdebug_verbose)
6887		pr_info("built %d host(s)\n", sdebug_num_hosts);
6888
6889	return 0;
6890
6891bus_unreg:
6892	bus_unregister(&pseudo_lld_bus);
6893dev_unreg:
6894	root_device_unregister(pseudo_primary);
6895free_vm:
6896	sdebug_erase_store(idx, NULL);
 
 
6897free_q_arr:
6898	kfree(sdebug_q_arr);
6899	return ret;
6900}
6901
6902static void __exit scsi_debug_exit(void)
6903{
6904	int k = sdebug_num_hosts;
6905
6906	stop_all_queued();
6907	for (; k; k--)
6908		sdebug_do_remove_host(true);
6909	free_all_queued();
6910	driver_unregister(&sdebug_driverfs_driver);
6911	bus_unregister(&pseudo_lld_bus);
6912	root_device_unregister(pseudo_primary);
6913
6914	sdebug_erase_all_stores(false);
6915	xa_destroy(per_store_ap);
 
6916	kfree(sdebug_q_arr);
6917}
6918
6919device_initcall(scsi_debug_init);
6920module_exit(scsi_debug_exit);
6921
6922static void sdebug_release_adapter(struct device *dev)
6923{
6924	struct sdebug_host_info *sdbg_host;
6925
6926	sdbg_host = to_sdebug_host(dev);
6927	kfree(sdbg_host);
6928}
6929
6930/* idx must be valid, if sip is NULL then it will be obtained using idx */
6931static void sdebug_erase_store(int idx, struct sdeb_store_info *sip)
6932{
6933	if (idx < 0)
6934		return;
6935	if (!sip) {
6936		if (xa_empty(per_store_ap))
6937			return;
6938		sip = xa_load(per_store_ap, idx);
6939		if (!sip)
6940			return;
6941	}
6942	vfree(sip->map_storep);
6943	vfree(sip->dif_storep);
6944	vfree(sip->storep);
6945	xa_erase(per_store_ap, idx);
6946	kfree(sip);
6947}
6948
6949/* Assume apart_from_first==false only in shutdown case. */
6950static void sdebug_erase_all_stores(bool apart_from_first)
6951{
6952	unsigned long idx;
6953	struct sdeb_store_info *sip = NULL;
6954
6955	xa_for_each(per_store_ap, idx, sip) {
6956		if (apart_from_first)
6957			apart_from_first = false;
6958		else
6959			sdebug_erase_store(idx, sip);
6960	}
6961	if (apart_from_first)
6962		sdeb_most_recent_idx = sdeb_first_idx;
6963}
6964
6965/*
6966 * Returns store xarray new element index (idx) if >=0 else negated errno.
6967 * Limit the number of stores to 65536.
6968 */
6969static int sdebug_add_store(void)
6970{
6971	int res;
6972	u32 n_idx;
6973	unsigned long iflags;
6974	unsigned long sz = (unsigned long)sdebug_dev_size_mb * 1048576;
6975	struct sdeb_store_info *sip = NULL;
6976	struct xa_limit xal = { .max = 1 << 16, .min = 0 };
6977
6978	sip = kzalloc(sizeof(*sip), GFP_KERNEL);
6979	if (!sip)
6980		return -ENOMEM;
6981
6982	xa_lock_irqsave(per_store_ap, iflags);
6983	res = __xa_alloc(per_store_ap, &n_idx, sip, xal, GFP_ATOMIC);
6984	if (unlikely(res < 0)) {
6985		xa_unlock_irqrestore(per_store_ap, iflags);
6986		kfree(sip);
6987		pr_warn("%s: xa_alloc() errno=%d\n", __func__, -res);
6988		return res;
6989	}
6990	sdeb_most_recent_idx = n_idx;
6991	if (sdeb_first_idx < 0)
6992		sdeb_first_idx = n_idx;
6993	xa_unlock_irqrestore(per_store_ap, iflags);
6994
6995	res = -ENOMEM;
6996	sip->storep = vzalloc(sz);
6997	if (!sip->storep) {
6998		pr_err("user data oom\n");
6999		goto err;
7000	}
7001	if (sdebug_num_parts > 0)
7002		sdebug_build_parts(sip->storep, sz);
7003
7004	/* DIF/DIX: what T10 calls Protection Information (PI) */
7005	if (sdebug_dix) {
7006		int dif_size;
7007
7008		dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
7009		sip->dif_storep = vmalloc(dif_size);
7010
7011		pr_info("dif_storep %u bytes @ %pK\n", dif_size,
7012			sip->dif_storep);
7013
7014		if (!sip->dif_storep) {
7015			pr_err("DIX oom\n");
7016			goto err;
7017		}
7018		memset(sip->dif_storep, 0xff, dif_size);
7019	}
7020	/* Logical Block Provisioning */
7021	if (scsi_debug_lbp()) {
7022		map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
7023		sip->map_storep = vmalloc(array_size(sizeof(long),
7024						     BITS_TO_LONGS(map_size)));
7025
7026		pr_info("%lu provisioning blocks\n", map_size);
7027
7028		if (!sip->map_storep) {
7029			pr_err("LBP map oom\n");
7030			goto err;
7031		}
7032
7033		bitmap_zero(sip->map_storep, map_size);
7034
7035		/* Map first 1KB for partition table */
7036		if (sdebug_num_parts)
7037			map_region(sip, 0, 2);
7038	}
7039
7040	rwlock_init(&sip->macc_lck);
7041	return (int)n_idx;
7042err:
7043	sdebug_erase_store((int)n_idx, sip);
7044	pr_warn("%s: failed, errno=%d\n", __func__, -res);
7045	return res;
7046}
7047
7048static int sdebug_add_host_helper(int per_host_idx)
7049{
7050	int k, devs_per_host, idx;
7051	int error = -ENOMEM;
7052	struct sdebug_host_info *sdbg_host;
7053	struct sdebug_dev_info *sdbg_devinfo, *tmp;
7054
7055	sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL);
7056	if (!sdbg_host)
 
7057		return -ENOMEM;
7058	idx = (per_host_idx < 0) ? sdeb_first_idx : per_host_idx;
7059	if (xa_get_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE))
7060		xa_clear_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7061	sdbg_host->si_idx = idx;
7062
7063	INIT_LIST_HEAD(&sdbg_host->dev_info_list);
7064
7065	devs_per_host = sdebug_num_tgts * sdebug_max_luns;
7066	for (k = 0; k < devs_per_host; k++) {
7067		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
7068		if (!sdbg_devinfo)
 
 
7069			goto clean;
 
7070	}
7071
7072	spin_lock(&sdebug_host_list_lock);
7073	list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
7074	spin_unlock(&sdebug_host_list_lock);
7075
7076	sdbg_host->dev.bus = &pseudo_lld_bus;
7077	sdbg_host->dev.parent = pseudo_primary;
7078	sdbg_host->dev.release = &sdebug_release_adapter;
7079	dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_num_hosts);
7080
7081	error = device_register(&sdbg_host->dev);
 
7082	if (error)
7083		goto clean;
7084
7085	++sdebug_num_hosts;
7086	return 0;
7087
7088clean:
7089	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7090				 dev_list) {
7091		list_del(&sdbg_devinfo->dev_list);
7092		kfree(sdbg_devinfo->zstate);
7093		kfree(sdbg_devinfo);
7094	}
 
7095	kfree(sdbg_host);
7096	pr_warn("%s: failed, errno=%d\n", __func__, -error);
7097	return error;
7098}
7099
7100static int sdebug_do_add_host(bool mk_new_store)
7101{
7102	int ph_idx = sdeb_most_recent_idx;
7103
7104	if (mk_new_store) {
7105		ph_idx = sdebug_add_store();
7106		if (ph_idx < 0)
7107			return ph_idx;
7108	}
7109	return sdebug_add_host_helper(ph_idx);
7110}
7111
7112static void sdebug_do_remove_host(bool the_end)
7113{
7114	int idx = -1;
7115	struct sdebug_host_info *sdbg_host = NULL;
7116	struct sdebug_host_info *sdbg_host2;
7117
7118	spin_lock(&sdebug_host_list_lock);
7119	if (!list_empty(&sdebug_host_list)) {
7120		sdbg_host = list_entry(sdebug_host_list.prev,
7121				       struct sdebug_host_info, host_list);
7122		idx = sdbg_host->si_idx;
7123	}
7124	if (!the_end && idx >= 0) {
7125		bool unique = true;
7126
7127		list_for_each_entry(sdbg_host2, &sdebug_host_list, host_list) {
7128			if (sdbg_host2 == sdbg_host)
7129				continue;
7130			if (idx == sdbg_host2->si_idx) {
7131				unique = false;
7132				break;
7133			}
7134		}
7135		if (unique) {
7136			xa_set_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7137			if (idx == sdeb_most_recent_idx)
7138				--sdeb_most_recent_idx;
7139		}
7140	}
7141	if (sdbg_host)
7142		list_del(&sdbg_host->host_list);
 
7143	spin_unlock(&sdebug_host_list_lock);
7144
7145	if (!sdbg_host)
7146		return;
7147
7148	device_unregister(&sdbg_host->dev);
7149	--sdebug_num_hosts;
7150}
7151
7152static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
7153{
7154	int num_in_q = 0;
7155	struct sdebug_dev_info *devip;
7156
7157	block_unblock_all_queues(true);
7158	devip = (struct sdebug_dev_info *)sdev->hostdata;
7159	if (NULL == devip) {
7160		block_unblock_all_queues(false);
7161		return	-ENODEV;
7162	}
7163	num_in_q = atomic_read(&devip->num_in_q);
7164
7165	if (qdepth > SDEBUG_CANQUEUE) {
7166		qdepth = SDEBUG_CANQUEUE;
7167		pr_warn("%s: requested qdepth [%d] exceeds canqueue [%d], trim\n", __func__,
7168			qdepth, SDEBUG_CANQUEUE);
7169	}
7170	if (qdepth < 1)
7171		qdepth = 1;
7172	if (qdepth != sdev->queue_depth)
7173		scsi_change_queue_depth(sdev, qdepth);
 
 
7174
7175	if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
7176		sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
7177			    __func__, qdepth, num_in_q);
7178	}
7179	block_unblock_all_queues(false);
7180	return sdev->queue_depth;
7181}
7182
7183static bool fake_timeout(struct scsi_cmnd *scp)
7184{
7185	if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
7186		if (sdebug_every_nth < -1)
7187			sdebug_every_nth = -1;
7188		if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
7189			return true; /* ignore command causing timeout */
7190		else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
7191			 scsi_medium_access_command(scp))
7192			return true; /* time out reads and writes */
7193	}
7194	return false;
7195}
7196
7197/* Response to TUR or media access command when device stopped */
7198static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
7199{
7200	int stopped_state;
7201	u64 diff_ns = 0;
7202	ktime_t now_ts = ktime_get_boottime();
7203	struct scsi_device *sdp = scp->device;
7204
7205	stopped_state = atomic_read(&devip->stopped);
7206	if (stopped_state == 2) {
7207		if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
7208			diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
7209			if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
7210				/* tur_ms_to_ready timer extinguished */
7211				atomic_set(&devip->stopped, 0);
7212				return 0;
7213			}
7214		}
7215		mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x1);
7216		if (sdebug_verbose)
7217			sdev_printk(KERN_INFO, sdp,
7218				    "%s: Not ready: in process of becoming ready\n", my_name);
7219		if (scp->cmnd[0] == TEST_UNIT_READY) {
7220			u64 tur_nanosecs_to_ready = (u64)sdeb_tur_ms_to_ready * 1000000;
7221
7222			if (diff_ns <= tur_nanosecs_to_ready)
7223				diff_ns = tur_nanosecs_to_ready - diff_ns;
7224			else
7225				diff_ns = tur_nanosecs_to_ready;
7226			/* As per 20-061r2 approved for spc6 by T10 on 20200716 */
7227			do_div(diff_ns, 1000000);	/* diff_ns becomes milliseconds */
7228			scsi_set_sense_information(scp->sense_buffer, SCSI_SENSE_BUFFERSIZE,
7229						   diff_ns);
7230			return check_condition_result;
7231		}
7232	}
7233	mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
7234	if (sdebug_verbose)
7235		sdev_printk(KERN_INFO, sdp, "%s: Not ready: initializing command required\n",
7236			    my_name);
7237	return check_condition_result;
7238}
7239
7240static int sdebug_map_queues(struct Scsi_Host *shost)
7241{
7242	int i, qoff;
7243
7244	if (shost->nr_hw_queues == 1)
7245		return 0;
7246
7247	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
7248		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
7249
7250		map->nr_queues  = 0;
7251
7252		if (i == HCTX_TYPE_DEFAULT)
7253			map->nr_queues = submit_queues - poll_queues;
7254		else if (i == HCTX_TYPE_POLL)
7255			map->nr_queues = poll_queues;
7256
7257		if (!map->nr_queues) {
7258			BUG_ON(i == HCTX_TYPE_DEFAULT);
7259			continue;
7260		}
7261
7262		map->queue_offset = qoff;
7263		blk_mq_map_queues(map);
7264
7265		qoff += map->nr_queues;
7266	}
7267
7268	return 0;
7269
7270}
7271
7272static int sdebug_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
7273{
7274	bool first;
7275	bool retiring = false;
7276	int num_entries = 0;
7277	unsigned int qc_idx = 0;
7278	unsigned long iflags;
7279	ktime_t kt_from_boot = ktime_get_boottime();
7280	struct sdebug_queue *sqp;
7281	struct sdebug_queued_cmd *sqcp;
7282	struct scsi_cmnd *scp;
7283	struct sdebug_dev_info *devip;
7284	struct sdebug_defer *sd_dp;
7285
7286	sqp = sdebug_q_arr + queue_num;
7287	spin_lock_irqsave(&sqp->qc_lock, iflags);
7288
7289	for (first = true; first || qc_idx + 1 < sdebug_max_queue; )   {
7290		if (first) {
7291			qc_idx = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
7292			first = false;
7293		} else {
7294			qc_idx = find_next_bit(sqp->in_use_bm, sdebug_max_queue, qc_idx + 1);
7295		}
7296		if (unlikely(qc_idx >= sdebug_max_queue))
7297			break;
7298
7299		sqcp = &sqp->qc_arr[qc_idx];
7300		sd_dp = sqcp->sd_dp;
7301		if (unlikely(!sd_dp))
7302			continue;
7303		scp = sqcp->a_cmnd;
7304		if (unlikely(scp == NULL)) {
7305			pr_err("scp is NULL, queue_num=%d, qc_idx=%u from %s\n",
7306			       queue_num, qc_idx, __func__);
7307			break;
7308		}
7309		if (sd_dp->defer_t == SDEB_DEFER_POLL) {
7310			if (kt_from_boot < sd_dp->cmpl_ts)
7311				continue;
7312
7313		} else		/* ignoring non REQ_HIPRI requests */
7314			continue;
7315		devip = (struct sdebug_dev_info *)scp->device->hostdata;
7316		if (likely(devip))
7317			atomic_dec(&devip->num_in_q);
7318		else
7319			pr_err("devip=NULL from %s\n", __func__);
7320		if (unlikely(atomic_read(&retired_max_queue) > 0))
7321			retiring = true;
7322
7323		sqcp->a_cmnd = NULL;
7324		if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
7325			pr_err("Unexpected completion sqp %p queue_num=%d qc_idx=%u from %s\n",
7326				sqp, queue_num, qc_idx, __func__);
7327			break;
7328		}
7329		if (unlikely(retiring)) {	/* user has reduced max_queue */
7330			int k, retval;
7331
7332			retval = atomic_read(&retired_max_queue);
7333			if (qc_idx >= retval) {
7334				pr_err("index %d too large\n", retval);
7335				break;
7336			}
7337			k = find_last_bit(sqp->in_use_bm, retval);
7338			if ((k < sdebug_max_queue) || (k == retval))
7339				atomic_set(&retired_max_queue, 0);
7340			else
7341				atomic_set(&retired_max_queue, k + 1);
7342		}
7343		sd_dp->defer_t = SDEB_DEFER_NONE;
7344		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
7345		scp->scsi_done(scp); /* callback to mid level */
7346		spin_lock_irqsave(&sqp->qc_lock, iflags);
7347		num_entries++;
7348	}
7349	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
7350	if (num_entries > 0)
7351		atomic_add(num_entries, &sdeb_mq_poll_count);
7352	return num_entries;
7353}
7354
7355static int scsi_debug_queuecommand(struct Scsi_Host *shost,
7356				   struct scsi_cmnd *scp)
7357{
7358	u8 sdeb_i;
7359	struct scsi_device *sdp = scp->device;
7360	const struct opcode_info_t *oip;
7361	const struct opcode_info_t *r_oip;
7362	struct sdebug_dev_info *devip;
7363	u8 *cmd = scp->cmnd;
7364	int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
7365	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *) = NULL;
7366	int k, na;
7367	int errsts = 0;
7368	u64 lun_index = sdp->lun & 0x3FFF;
7369	u32 flags;
7370	u16 sa;
7371	u8 opcode = cmd[0];
7372	bool has_wlun_rl;
7373	bool inject_now;
7374
7375	scsi_set_resid(scp, 0);
7376	if (sdebug_statistics) {
7377		atomic_inc(&sdebug_cmnd_count);
7378		inject_now = inject_on_this_cmd();
7379	} else {
7380		inject_now = false;
7381	}
7382	if (unlikely(sdebug_verbose &&
7383		     !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
7384		char b[120];
7385		int n, len, sb;
7386
7387		len = scp->cmd_len;
7388		sb = (int)sizeof(b);
7389		if (len > 32)
7390			strcpy(b, "too long, over 32 bytes");
7391		else {
7392			for (k = 0, n = 0; k < len && n < sb; ++k)
7393				n += scnprintf(b + n, sb - n, "%02x ",
7394					       (u32)cmd[k]);
7395		}
7396		sdev_printk(KERN_INFO, sdp, "%s: tag=%#x, cmd %s\n", my_name,
7397			    blk_mq_unique_tag(scp->request), b);
7398	}
7399	if (unlikely(inject_now && (sdebug_opts & SDEBUG_OPT_HOST_BUSY)))
7400		return SCSI_MLQUEUE_HOST_BUSY;
7401	has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
7402	if (unlikely(lun_index >= sdebug_max_luns && !has_wlun_rl))
7403		goto err_out;
7404
7405	sdeb_i = opcode_ind_arr[opcode];	/* fully mapped */
7406	oip = &opcode_info_arr[sdeb_i];		/* safe if table consistent */
7407	devip = (struct sdebug_dev_info *)sdp->hostdata;
7408	if (unlikely(!devip)) {
7409		devip = find_build_dev_info(sdp);
7410		if (NULL == devip)
7411			goto err_out;
7412	}
7413	if (unlikely(inject_now && !atomic_read(&sdeb_inject_pending)))
7414		atomic_set(&sdeb_inject_pending, 1);
7415
7416	na = oip->num_attached;
7417	r_pfp = oip->pfp;
7418	if (na) {	/* multiple commands with this opcode */
7419		r_oip = oip;
7420		if (FF_SA & r_oip->flags) {
7421			if (F_SA_LOW & oip->flags)
7422				sa = 0x1f & cmd[1];
7423			else
7424				sa = get_unaligned_be16(cmd + 8);
7425			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7426				if (opcode == oip->opcode && sa == oip->sa)
7427					break;
7428			}
7429		} else {   /* since no service action only check opcode */
7430			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7431				if (opcode == oip->opcode)
7432					break;
7433			}
7434		}
7435		if (k > na) {
7436			if (F_SA_LOW & r_oip->flags)
7437				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
7438			else if (F_SA_HIGH & r_oip->flags)
7439				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
7440			else
7441				mk_sense_invalid_opcode(scp);
7442			goto check_cond;
7443		}
7444	}	/* else (when na==0) we assume the oip is a match */
7445	flags = oip->flags;
7446	if (unlikely(F_INV_OP & flags)) {
7447		mk_sense_invalid_opcode(scp);
7448		goto check_cond;
7449	}
7450	if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
7451		if (sdebug_verbose)
7452			sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
7453				    my_name, opcode, " supported for wlun");
7454		mk_sense_invalid_opcode(scp);
7455		goto check_cond;
7456	}
7457	if (unlikely(sdebug_strict)) {	/* check cdb against mask */
7458		u8 rem;
7459		int j;
7460
7461		for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
7462			rem = ~oip->len_mask[k] & cmd[k];
7463			if (rem) {
7464				for (j = 7; j >= 0; --j, rem <<= 1) {
7465					if (0x80 & rem)
7466						break;
7467				}
7468				mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
7469				goto check_cond;
7470			}
7471		}
7472	}
7473	if (unlikely(!(F_SKIP_UA & flags) &&
7474		     find_first_bit(devip->uas_bm,
7475				    SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
7476		errsts = make_ua(scp, devip);
7477		if (errsts)
7478			goto check_cond;
7479	}
7480	if (unlikely(((F_M_ACCESS & flags) || scp->cmnd[0] == TEST_UNIT_READY) &&
7481		     atomic_read(&devip->stopped))) {
7482		errsts = resp_not_ready(scp, devip);
7483		if (errsts)
7484			goto fini;
 
 
 
7485	}
7486	if (sdebug_fake_rw && (F_FAKE_RW & flags))
7487		goto fini;
7488	if (unlikely(sdebug_every_nth)) {
7489		if (fake_timeout(scp))
7490			return 0;	/* ignore command: make trouble */
7491	}
7492	if (likely(oip->pfp))
7493		pfp = oip->pfp;	/* calls a resp_* function */
7494	else
7495		pfp = r_pfp;    /* if leaf function ptr NULL, try the root's */
7496
7497fini:
7498	if (F_DELAY_OVERR & flags)	/* cmds like INQUIRY respond asap */
7499		return schedule_resp(scp, devip, errsts, pfp, 0, 0);
7500	else if ((flags & F_LONG_DELAY) && (sdebug_jdelay > 0 ||
7501					    sdebug_ndelay > 10000)) {
7502		/*
7503		 * Skip long delays if ndelay <= 10 microseconds. Otherwise
7504		 * for Start Stop Unit (SSU) want at least 1 second delay and
7505		 * if sdebug_jdelay>1 want a long delay of that many seconds.
7506		 * For Synchronize Cache want 1/20 of SSU's delay.
7507		 */
7508		int jdelay = (sdebug_jdelay < 2) ? 1 : sdebug_jdelay;
7509		int denom = (flags & F_SYNC_DELAY) ? 20 : 1;
7510
7511		jdelay = mult_frac(USER_HZ * jdelay, HZ, denom * USER_HZ);
7512		return schedule_resp(scp, devip, errsts, pfp, jdelay, 0);
7513	} else
7514		return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay,
7515				     sdebug_ndelay);
7516check_cond:
7517	return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0);
7518err_out:
7519	return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, NULL, 0, 0);
7520}
7521
7522static struct scsi_host_template sdebug_driver_template = {
7523	.show_info =		scsi_debug_show_info,
7524	.write_info =		scsi_debug_write_info,
7525	.proc_name =		sdebug_proc_name,
7526	.name =			"SCSI DEBUG",
7527	.info =			scsi_debug_info,
7528	.slave_alloc =		scsi_debug_slave_alloc,
7529	.slave_configure =	scsi_debug_slave_configure,
7530	.slave_destroy =	scsi_debug_slave_destroy,
7531	.ioctl =		scsi_debug_ioctl,
7532	.queuecommand =		scsi_debug_queuecommand,
7533	.change_queue_depth =	sdebug_change_qdepth,
7534	.map_queues =		sdebug_map_queues,
7535	.mq_poll =		sdebug_blk_mq_poll,
7536	.eh_abort_handler =	scsi_debug_abort,
7537	.eh_device_reset_handler = scsi_debug_device_reset,
7538	.eh_target_reset_handler = scsi_debug_target_reset,
7539	.eh_bus_reset_handler = scsi_debug_bus_reset,
7540	.eh_host_reset_handler = scsi_debug_host_reset,
7541	.can_queue =		SDEBUG_CANQUEUE,
7542	.this_id =		7,
7543	.sg_tablesize =		SG_MAX_SEGMENTS,
7544	.cmd_per_lun =		DEF_CMD_PER_LUN,
7545	.max_sectors =		-1U,
7546	.max_segment_size =	-1U,
7547	.module =		THIS_MODULE,
7548	.track_queue_depth =	1,
7549};
7550
7551static int sdebug_driver_probe(struct device *dev)
7552{
7553	int error = 0;
7554	struct sdebug_host_info *sdbg_host;
7555	struct Scsi_Host *hpnt;
7556	int hprot;
7557
7558	sdbg_host = to_sdebug_host(dev);
7559
7560	sdebug_driver_template.can_queue = sdebug_max_queue;
7561	sdebug_driver_template.cmd_per_lun = sdebug_max_queue;
7562	if (!sdebug_clustering)
7563		sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
7564
7565	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
7566	if (NULL == hpnt) {
7567		pr_err("scsi_host_alloc failed\n");
7568		error = -ENODEV;
7569		return error;
7570	}
7571	if (submit_queues > nr_cpu_ids) {
7572		pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%u\n",
7573			my_name, submit_queues, nr_cpu_ids);
7574		submit_queues = nr_cpu_ids;
7575	}
7576	/*
7577	 * Decide whether to tell scsi subsystem that we want mq. The
7578	 * following should give the same answer for each host.
7579	 */
7580	hpnt->nr_hw_queues = submit_queues;
7581	if (sdebug_host_max_queue)
7582		hpnt->host_tagset = 1;
7583
7584	/* poll queues are possible for nr_hw_queues > 1 */
7585	if (hpnt->nr_hw_queues == 1 || (poll_queues < 1)) {
7586		pr_warn("%s: trim poll_queues to 0. poll_q/nr_hw = (%d/%d)\n",
7587			 my_name, poll_queues, hpnt->nr_hw_queues);
7588		poll_queues = 0;
7589	}
7590
7591	/*
7592	 * Poll queues don't need interrupts, but we need at least one I/O queue
7593	 * left over for non-polled I/O.
7594	 * If condition not met, trim poll_queues to 1 (just for simplicity).
7595	 */
7596	if (poll_queues >= submit_queues) {
7597		if (submit_queues < 3)
7598			pr_warn("%s: trim poll_queues to 1\n", my_name);
7599		else
7600			pr_warn("%s: trim poll_queues to 1. Perhaps try poll_queues=%d\n",
7601				my_name, submit_queues - 1);
7602		poll_queues = 1;
7603	}
7604	if (poll_queues)
7605		hpnt->nr_maps = 3;
7606
7607	sdbg_host->shost = hpnt;
7608	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
7609	if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
7610		hpnt->max_id = sdebug_num_tgts + 1;
7611	else
7612		hpnt->max_id = sdebug_num_tgts;
7613	/* = sdebug_max_luns; */
7614	hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
7615
7616	hprot = 0;
7617
7618	switch (sdebug_dif) {
7619
7620	case T10_PI_TYPE1_PROTECTION:
7621		hprot = SHOST_DIF_TYPE1_PROTECTION;
7622		if (sdebug_dix)
7623			hprot |= SHOST_DIX_TYPE1_PROTECTION;
7624		break;
7625
7626	case T10_PI_TYPE2_PROTECTION:
7627		hprot = SHOST_DIF_TYPE2_PROTECTION;
7628		if (sdebug_dix)
7629			hprot |= SHOST_DIX_TYPE2_PROTECTION;
7630		break;
7631
7632	case T10_PI_TYPE3_PROTECTION:
7633		hprot = SHOST_DIF_TYPE3_PROTECTION;
7634		if (sdebug_dix)
7635			hprot |= SHOST_DIX_TYPE3_PROTECTION;
7636		break;
7637
7638	default:
7639		if (sdebug_dix)
7640			hprot |= SHOST_DIX_TYPE0_PROTECTION;
7641		break;
7642	}
7643
7644	scsi_host_set_prot(hpnt, hprot);
7645
7646	if (have_dif_prot || sdebug_dix)
7647		pr_info("host protection%s%s%s%s%s%s%s\n",
7648			(hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
7649			(hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
7650			(hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
7651			(hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
7652			(hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
7653			(hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
7654			(hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
7655
7656	if (sdebug_guard == 1)
7657		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
7658	else
7659		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
7660
7661	sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
7662	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
7663	if (sdebug_every_nth)	/* need stats counters for every_nth */
7664		sdebug_statistics = true;
7665	error = scsi_add_host(hpnt, &sdbg_host->dev);
7666	if (error) {
7667		pr_err("scsi_add_host failed\n");
7668		error = -ENODEV;
7669		scsi_host_put(hpnt);
7670	} else {
7671		scsi_scan_host(hpnt);
7672	}
7673
7674	return error;
7675}
7676
7677static int sdebug_driver_remove(struct device *dev)
7678{
7679	struct sdebug_host_info *sdbg_host;
7680	struct sdebug_dev_info *sdbg_devinfo, *tmp;
7681
7682	sdbg_host = to_sdebug_host(dev);
7683
 
 
 
 
 
7684	scsi_remove_host(sdbg_host->shost);
7685
7686	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7687				 dev_list) {
7688		list_del(&sdbg_devinfo->dev_list);
7689		kfree(sdbg_devinfo->zstate);
7690		kfree(sdbg_devinfo);
7691	}
7692
7693	scsi_host_put(sdbg_host->shost);
7694	return 0;
7695}
7696
7697static int pseudo_lld_bus_match(struct device *dev,
7698				struct device_driver *dev_driver)
7699{
7700	return 1;
7701}
7702
7703static struct bus_type pseudo_lld_bus = {
7704	.name = "pseudo",
7705	.match = pseudo_lld_bus_match,
7706	.probe = sdebug_driver_probe,
7707	.remove = sdebug_driver_remove,
7708	.drv_groups = sdebug_drv_groups,
7709};
v5.4
   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 - 2018 Douglas Gilbert
  11 *
  12 *  For documentation see http://sg.danny.cz/sg/sdebug26.html
  13 */
  14
  15
  16#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
  17
  18#include <linux/module.h>
  19
  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/genhd.h>
  27#include <linux/fs.h>
  28#include <linux/init.h>
  29#include <linux/proc_fs.h>
  30#include <linux/vmalloc.h>
  31#include <linux/moduleparam.h>
  32#include <linux/scatterlist.h>
  33#include <linux/blkdev.h>
  34#include <linux/crc-t10dif.h>
  35#include <linux/spinlock.h>
  36#include <linux/interrupt.h>
  37#include <linux/atomic.h>
  38#include <linux/hrtimer.h>
  39#include <linux/uuid.h>
  40#include <linux/t10-pi.h>
 
 
 
 
  41
  42#include <net/checksum.h>
  43
  44#include <asm/unaligned.h>
  45
  46#include <scsi/scsi.h>
  47#include <scsi/scsi_cmnd.h>
  48#include <scsi/scsi_device.h>
  49#include <scsi/scsi_host.h>
  50#include <scsi/scsicam.h>
  51#include <scsi/scsi_eh.h>
  52#include <scsi/scsi_tcq.h>
  53#include <scsi/scsi_dbg.h>
  54
  55#include "sd.h"
  56#include "scsi_logging.h"
  57
  58/* make sure inq_product_rev string corresponds to this version */
  59#define SDEBUG_VERSION "0188"	/* format to fit INQUIRY revision field */
  60static const char *sdebug_version_date = "20190125";
  61
  62#define MY_NAME "scsi_debug"
  63
  64/* Additional Sense Code (ASC) */
  65#define NO_ADDITIONAL_SENSE 0x0
  66#define LOGICAL_UNIT_NOT_READY 0x4
  67#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
  68#define UNRECOVERED_READ_ERR 0x11
  69#define PARAMETER_LIST_LENGTH_ERR 0x1a
  70#define INVALID_OPCODE 0x20
  71#define LBA_OUT_OF_RANGE 0x21
  72#define INVALID_FIELD_IN_CDB 0x24
  73#define INVALID_FIELD_IN_PARAM_LIST 0x26
  74#define WRITE_PROTECTED 0x27
  75#define UA_RESET_ASC 0x29
  76#define UA_CHANGED_ASC 0x2a
  77#define TARGET_CHANGED_ASC 0x3f
  78#define LUNS_CHANGED_ASCQ 0x0e
  79#define INSUFF_RES_ASC 0x55
  80#define INSUFF_RES_ASCQ 0x3
  81#define POWER_ON_RESET_ASCQ 0x0
  82#define BUS_RESET_ASCQ 0x2	/* scsi bus reset occurred */
  83#define MODE_CHANGED_ASCQ 0x1	/* mode parameters changed */
  84#define CAPACITY_CHANGED_ASCQ 0x9
  85#define SAVING_PARAMS_UNSUP 0x39
  86#define TRANSPORT_PROBLEM 0x4b
  87#define THRESHOLD_EXCEEDED 0x5d
  88#define LOW_POWER_COND_ON 0x5e
  89#define MISCOMPARE_VERIFY_ASC 0x1d
  90#define MICROCODE_CHANGED_ASCQ 0x1	/* with TARGET_CHANGED_ASC */
  91#define MICROCODE_CHANGED_WO_RESET_ASCQ 0x16
  92#define WRITE_ERROR_ASC 0xc
 
 
 
 
 
  93
  94/* Additional Sense Code Qualifier (ASCQ) */
  95#define ACK_NAK_TO 0x3
  96
  97/* Default values for driver parameters */
  98#define DEF_NUM_HOST   1
  99#define DEF_NUM_TGTS   1
 100#define DEF_MAX_LUNS   1
 101/* With these defaults, this driver will make 1 host with 1 target
 102 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
 103 */
 104#define DEF_ATO 1
 105#define DEF_CDB_LEN 10
 106#define DEF_JDELAY   1		/* if > 0 unit is a jiffy */
 
 107#define DEF_DEV_SIZE_MB   8
 
 108#define DEF_DIF 0
 109#define DEF_DIX 0
 
 110#define DEF_D_SENSE   0
 111#define DEF_EVERY_NTH   0
 112#define DEF_FAKE_RW	0
 113#define DEF_GUARD 0
 114#define DEF_HOST_LOCK 0
 115#define DEF_LBPU 0
 116#define DEF_LBPWS 0
 117#define DEF_LBPWS10 0
 118#define DEF_LBPRZ 1
 119#define DEF_LOWEST_ALIGNED 0
 120#define DEF_NDELAY   0		/* if > 0 unit is a nanosecond */
 121#define DEF_NO_LUN_0   0
 122#define DEF_NUM_PARTS   0
 123#define DEF_OPTS   0
 124#define DEF_OPT_BLKS 1024
 125#define DEF_PHYSBLK_EXP 0
 126#define DEF_OPT_XFERLEN_EXP 0
 127#define DEF_PTYPE   TYPE_DISK
 
 128#define DEF_REMOVABLE false
 129#define DEF_SCSI_LEVEL   7    /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
 130#define DEF_SECTOR_SIZE 512
 131#define DEF_UNMAP_ALIGNMENT 0
 132#define DEF_UNMAP_GRANULARITY 1
 133#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
 134#define DEF_UNMAP_MAX_DESC 256
 135#define DEF_VIRTUAL_GB   0
 136#define DEF_VPD_USE_HOSTNO 1
 137#define DEF_WRITESAME_LENGTH 0xFFFF
 138#define DEF_STRICT 0
 139#define DEF_STATISTICS false
 140#define DEF_SUBMIT_QUEUES 1
 
 141#define DEF_UUID_CTL 0
 142#define JDELAY_OVERRIDDEN -9999
 143
 
 
 
 
 
 144#define SDEBUG_LUN_0_VAL 0
 145
 146/* bit mask values for sdebug_opts */
 147#define SDEBUG_OPT_NOISE		1
 148#define SDEBUG_OPT_MEDIUM_ERR		2
 149#define SDEBUG_OPT_TIMEOUT		4
 150#define SDEBUG_OPT_RECOVERED_ERR	8
 151#define SDEBUG_OPT_TRANSPORT_ERR	16
 152#define SDEBUG_OPT_DIF_ERR		32
 153#define SDEBUG_OPT_DIX_ERR		64
 154#define SDEBUG_OPT_MAC_TIMEOUT		128
 155#define SDEBUG_OPT_SHORT_TRANSFER	0x100
 156#define SDEBUG_OPT_Q_NOISE		0x200
 157#define SDEBUG_OPT_ALL_TSF		0x400
 158#define SDEBUG_OPT_RARE_TSF		0x800
 159#define SDEBUG_OPT_N_WCE		0x1000
 160#define SDEBUG_OPT_RESET_NOISE		0x2000
 161#define SDEBUG_OPT_NO_CDB_NOISE		0x4000
 162#define SDEBUG_OPT_HOST_BUSY		0x8000
 163#define SDEBUG_OPT_CMD_ABORT		0x10000
 164#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
 165			      SDEBUG_OPT_RESET_NOISE)
 166#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
 167				  SDEBUG_OPT_TRANSPORT_ERR | \
 168				  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
 169				  SDEBUG_OPT_SHORT_TRANSFER | \
 170				  SDEBUG_OPT_HOST_BUSY | \
 171				  SDEBUG_OPT_CMD_ABORT)
 172/* When "every_nth" > 0 then modulo "every_nth" commands:
 173 *   - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set
 174 *   - a RECOVERED_ERROR is simulated on successful read and write
 175 *     commands if SDEBUG_OPT_RECOVERED_ERR is set.
 176 *   - a TRANSPORT_ERROR is simulated on successful read and write
 177 *     commands if SDEBUG_OPT_TRANSPORT_ERR is set.
 178 *   - similarly for DIF_ERR, DIX_ERR, SHORT_TRANSFER, HOST_BUSY and
 179 *     CMD_ABORT
 180 *
 181 * When "every_nth" < 0 then after "- every_nth" commands the selected
 182 * error will be injected. The error will be injected on every subsequent
 183 * command until some other action occurs; for example, the user writing
 184 * a new value (other than -1 or 1) to every_nth:
 185 *      echo 0 > /sys/bus/pseudo/drivers/scsi_debug/every_nth
 186 */
 187
 188/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
 189 * priority order. In the subset implemented here lower numbers have higher
 190 * priority. The UA numbers should be a sequence starting from 0 with
 191 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
 192#define SDEBUG_UA_POR 0		/* Power on, reset, or bus device reset */
 193#define SDEBUG_UA_BUS_RESET 1
 194#define SDEBUG_UA_MODE_CHANGED 2
 195#define SDEBUG_UA_CAPACITY_CHANGED 3
 196#define SDEBUG_UA_LUNS_CHANGED 4
 197#define SDEBUG_UA_MICROCODE_CHANGED 5	/* simulate firmware change */
 198#define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 6
 199#define SDEBUG_NUM_UAS 7
 200
 201/* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 202 * sector on read commands: */
 203#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 204#define OPT_MEDIUM_ERR_NUM    10     /* number of consecutive medium errs */
 205
 206/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
 207 * or "peripheral device" addressing (value 0) */
 208#define SAM2_LUN_ADDRESS_METHOD 0
 209
 210/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
 211 * (for response) per submit queue at one time. Can be reduced by max_queue
 212 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
 213 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
 214 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
 215 * but cannot exceed SDEBUG_CANQUEUE .
 216 */
 217#define SDEBUG_CANQUEUE_WORDS  3	/* a WORD is bits in a long */
 218#define SDEBUG_CANQUEUE  (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
 219#define DEF_CMD_PER_LUN  255
 220
 221#define F_D_IN			1
 222#define F_D_OUT			2
 
 223#define F_D_OUT_MAYBE		4	/* WRITE SAME, NDOB bit */
 224#define F_D_UNKN		8
 225#define F_RL_WLUN_OK		0x10
 226#define F_SKIP_UA		0x20
 227#define F_DELAY_OVERR		0x40
 228#define F_SA_LOW		0x80	/* cdb byte 1, bits 4 to 0 */
 229#define F_SA_HIGH		0x100	/* as used by variable length cdbs */
 230#define F_INV_OP		0x200
 231#define F_FAKE_RW		0x400
 232#define F_M_ACCESS		0x800	/* media access */
 233#define F_SSU_DELAY		0x1000
 234#define F_SYNC_DELAY		0x2000
 235
 
 236#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
 237#define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
 238#define FF_SA (F_SA_HIGH | F_SA_LOW)
 239#define F_LONG_DELAY		(F_SSU_DELAY | F_SYNC_DELAY)
 240
 241#define SDEBUG_MAX_PARTS 4
 242
 243#define SDEBUG_MAX_CMD_LEN 32
 244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 245
 246struct sdebug_dev_info {
 247	struct list_head dev_list;
 248	unsigned int channel;
 249	unsigned int target;
 250	u64 lun;
 251	uuid_t lu_name;
 252	struct sdebug_host_info *sdbg_host;
 253	unsigned long uas_bm[1];
 254	atomic_t num_in_q;
 255	atomic_t stopped;
 256	bool used;
 
 
 
 
 
 
 
 
 
 
 
 
 
 257};
 258
 259struct sdebug_host_info {
 260	struct list_head host_list;
 
 261	struct Scsi_Host *shost;
 262	struct device dev;
 263	struct list_head dev_info_list;
 264};
 265
 
 
 
 
 
 
 
 
 266#define to_sdebug_host(d)	\
 267	container_of(d, struct sdebug_host_info, dev)
 268
 269enum sdeb_defer_type {SDEB_DEFER_NONE = 0, SDEB_DEFER_HRT = 1,
 270		      SDEB_DEFER_WQ = 2};
 271
 272struct sdebug_defer {
 273	struct hrtimer hrt;
 274	struct execute_work ew;
 
 275	int sqa_idx;	/* index of sdebug_queue array */
 276	int qc_idx;	/* index of sdebug_queued_cmd array within sqa_idx */
 
 277	int issuing_cpu;
 278	bool init_hrt;
 279	bool init_wq;
 
 280	bool aborted;	/* true when blk_abort_request() already called */
 281	enum sdeb_defer_type defer_t;
 282};
 283
 284struct sdebug_queued_cmd {
 285	/* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
 286	 * instance indicates this slot is in use.
 287	 */
 288	struct sdebug_defer *sd_dp;
 289	struct scsi_cmnd *a_cmnd;
 290	unsigned int inj_recovered:1;
 291	unsigned int inj_transport:1;
 292	unsigned int inj_dif:1;
 293	unsigned int inj_dix:1;
 294	unsigned int inj_short:1;
 295	unsigned int inj_host_busy:1;
 296	unsigned int inj_cmd_abort:1;
 297};
 298
 299struct sdebug_queue {
 300	struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
 301	unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
 302	spinlock_t qc_lock;
 303	atomic_t blocked;	/* to temporarily stop more being queued */
 304};
 305
 306static atomic_t sdebug_cmnd_count;   /* number of incoming commands */
 307static atomic_t sdebug_completions;  /* count of deferred completions */
 308static atomic_t sdebug_miss_cpus;    /* submission + completion cpus differ */
 309static atomic_t sdebug_a_tsf;	     /* 'almost task set full' counter */
 
 
 310
 311struct opcode_info_t {
 312	u8 num_attached;	/* 0 if this is it (i.e. a leaf); use 0xff */
 313				/* for terminating element */
 314	u8 opcode;		/* if num_attached > 0, preferred */
 315	u16 sa;			/* service action */
 316	u32 flags;		/* OR-ed set of SDEB_F_* */
 317	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
 318	const struct opcode_info_t *arrp;  /* num_attached elements or NULL */
 319	u8 len_mask[16];	/* len_mask[0]-->cdb_len, then mask for cdb */
 320				/* 1 to min(cdb_len, 15); ignore cdb[15...] */
 321};
 322
 323/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
 324enum sdeb_opcode_index {
 325	SDEB_I_INVALID_OPCODE =	0,
 326	SDEB_I_INQUIRY = 1,
 327	SDEB_I_REPORT_LUNS = 2,
 328	SDEB_I_REQUEST_SENSE = 3,
 329	SDEB_I_TEST_UNIT_READY = 4,
 330	SDEB_I_MODE_SENSE = 5,		/* 6, 10 */
 331	SDEB_I_MODE_SELECT = 6,		/* 6, 10 */
 332	SDEB_I_LOG_SENSE = 7,
 333	SDEB_I_READ_CAPACITY = 8,	/* 10; 16 is in SA_IN(16) */
 334	SDEB_I_READ = 9,		/* 6, 10, 12, 16 */
 335	SDEB_I_WRITE = 10,		/* 6, 10, 12, 16 */
 336	SDEB_I_START_STOP = 11,
 337	SDEB_I_SERV_ACT_IN_16 = 12,	/* add ...SERV_ACT_IN_12 if needed */
 338	SDEB_I_SERV_ACT_OUT_16 = 13,	/* add ...SERV_ACT_OUT_12 if needed */
 339	SDEB_I_MAINT_IN = 14,
 340	SDEB_I_MAINT_OUT = 15,
 341	SDEB_I_VERIFY = 16,		/* 10 only */
 342	SDEB_I_VARIABLE_LEN = 17,	/* READ(32), WRITE(32), WR_SCAT(32) */
 343	SDEB_I_RESERVE = 18,		/* 6, 10 */
 344	SDEB_I_RELEASE = 19,		/* 6, 10 */
 345	SDEB_I_ALLOW_REMOVAL = 20,	/* PREVENT ALLOW MEDIUM REMOVAL */
 346	SDEB_I_REZERO_UNIT = 21,	/* REWIND in SSC */
 347	SDEB_I_ATA_PT = 22,		/* 12, 16 */
 348	SDEB_I_SEND_DIAG = 23,
 349	SDEB_I_UNMAP = 24,
 350	SDEB_I_WRITE_BUFFER = 25,
 351	SDEB_I_WRITE_SAME = 26,		/* 10, 16 */
 352	SDEB_I_SYNC_CACHE = 27,		/* 10, 16 */
 353	SDEB_I_COMP_WRITE = 28,
 354	SDEB_I_LAST_ELEMENT = 29,	/* keep this last (previous + 1) */
 
 
 
 355};
 356
 357
 358static const unsigned char opcode_ind_arr[256] = {
 359/* 0x0; 0x0->0x1f: 6 byte cdbs */
 360	SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
 361	    0, 0, 0, 0,
 362	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 363	0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 364	    SDEB_I_RELEASE,
 365	0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
 366	    SDEB_I_ALLOW_REMOVAL, 0,
 367/* 0x20; 0x20->0x3f: 10 byte cdbs */
 368	0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
 369	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
 370	0, 0, 0, 0, 0, SDEB_I_SYNC_CACHE, 0, 0,
 371	0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
 372/* 0x40; 0x40->0x5f: 10 byte cdbs */
 373	0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
 374	0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
 375	0, 0, 0, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 376	    SDEB_I_RELEASE,
 377	0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
 378/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
 379	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 380	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 381	0, SDEB_I_VARIABLE_LEN,
 382/* 0x80; 0x80->0x9f: 16 byte cdbs */
 383	0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
 384	SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 385	0, SDEB_I_SYNC_CACHE, 0, SDEB_I_WRITE_SAME, 0, 0, 0, 0,
 
 
 386	0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
 387/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
 388	SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
 389	     SDEB_I_MAINT_OUT, 0, 0, 0,
 390	SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
 391	     0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
 392	0, 0, 0, 0, 0, 0, 0, 0,
 393	0, 0, 0, 0, 0, 0, 0, 0,
 394/* 0xc0; 0xc0->0xff: vendor specific */
 395	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 396	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 397	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 398	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 399};
 400
 401/*
 402 * The following "response" functions return the SCSI mid-level's 4 byte
 403 * tuple-in-an-int. To handle commands with an IMMED bit, for a faster
 404 * command completion, they can mask their return value with
 405 * SDEG_RES_IMMED_MASK .
 406 */
 407#define SDEG_RES_IMMED_MASK 0x40000000
 408
 409static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
 410static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
 411static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
 412static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 413static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
 414static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 415static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
 416static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 417static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 418static int resp_write_scat(struct scsi_cmnd *, struct sdebug_dev_info *);
 419static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
 420static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
 421static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
 422static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
 423static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
 424static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
 425static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
 
 426static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
 427static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
 428static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
 429static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
 430static int resp_sync_cache(struct scsi_cmnd *, struct sdebug_dev_info *);
 
 
 
 
 
 
 
 
 
 
 
 
 
 431
 432/*
 433 * The following are overflow arrays for cdbs that "hit" the same index in
 434 * the opcode_info_arr array. The most time sensitive (or commonly used) cdb
 435 * should be placed in opcode_info_arr[], the others should be placed here.
 436 */
 437static const struct opcode_info_t msense_iarr[] = {
 438	{0, 0x1a, 0, F_D_IN, NULL, NULL,
 439	    {6,  0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 440};
 441
 442static const struct opcode_info_t mselect_iarr[] = {
 443	{0, 0x15, 0, F_D_OUT, NULL, NULL,
 444	    {6,  0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 445};
 446
 447static const struct opcode_info_t read_iarr[] = {
 448	{0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
 449	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 450	     0, 0, 0, 0} },
 451	{0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
 452	    {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 453	{0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
 454	    {12,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
 455	     0xc7, 0, 0, 0, 0} },
 456};
 457
 458static const struct opcode_info_t write_iarr[] = {
 459	{0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(10) */
 460	    NULL, {10,  0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
 461		   0, 0, 0, 0, 0, 0} },
 462	{0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,   /* WRITE(6) */
 463	    NULL, {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
 464		   0, 0, 0} },
 465	{0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(12) */
 466	    NULL, {12,  0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 467		   0xbf, 0xc7, 0, 0, 0, 0} },
 468};
 469
 
 
 
 
 
 
 470static const struct opcode_info_t sa_in_16_iarr[] = {
 471	{0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
 472	    {16,  0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 473	     0xff, 0xff, 0xff, 0, 0xc7} },	/* GET LBA STATUS(16) */
 474};
 475
 476static const struct opcode_info_t vl_iarr[] = {	/* VARIABLE LENGTH */
 477	{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
 478	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
 479		   0, 0xff, 0xff, 0xff, 0xff} },	/* WRITE(32) */
 480	{0, 0x7f, 0x11, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 481	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x11, 0xf8,
 482		   0, 0xff, 0xff, 0x0, 0x0} },	/* WRITE SCATTERED(32) */
 483};
 484
 485static const struct opcode_info_t maint_in_iarr[] = {	/* MAINT IN */
 486	{0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
 487	    {12,  0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
 488	     0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
 489	{0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
 490	    {12,  0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 491	     0, 0} },	/* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
 492};
 493
 494static const struct opcode_info_t write_same_iarr[] = {
 495	{0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
 496	    {16,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 497	     0xff, 0xff, 0xff, 0x3f, 0xc7} },		/* WRITE SAME(16) */
 498};
 499
 500static const struct opcode_info_t reserve_iarr[] = {
 501	{0, 0x16, 0, F_D_OUT, NULL, NULL,		/* RESERVE(6) */
 502	    {6,  0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 503};
 504
 505static const struct opcode_info_t release_iarr[] = {
 506	{0, 0x17, 0, F_D_OUT, NULL, NULL,		/* RELEASE(6) */
 507	    {6,  0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 508};
 509
 510static const struct opcode_info_t sync_cache_iarr[] = {
 511	{0, 0x91, 0, F_SYNC_DELAY | F_M_ACCESS, resp_sync_cache, NULL,
 512	    {16,  0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 513	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* SYNC_CACHE (16) */
 514};
 515
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 516
 517/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
 518 * plus the terminating elements for logic that scans this table such as
 519 * REPORT SUPPORTED OPERATION CODES. */
 520static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
 521/* 0 */
 522	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,	/* unknown opcodes */
 523	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 524	{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
 525	    {6,  0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 526	{0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
 527	    {12,  0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 528	     0, 0} },					/* REPORT LUNS */
 529	{0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
 530	    {6,  0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 531	{0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
 532	    {6,  0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 533/* 5 */
 534	{ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN,	/* MODE SENSE(10) */
 535	    resp_mode_sense, msense_iarr, {10,  0xf8, 0xff, 0xff, 0, 0, 0,
 536		0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 537	{ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT,	/* MODE SELECT(10) */
 538	    resp_mode_select, mselect_iarr, {10,  0xf1, 0, 0, 0, 0, 0, 0xff,
 539		0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 540	{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,	/* LOG SENSE */
 541	    {10,  0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
 542	     0, 0, 0} },
 543	{0, 0x25, 0, F_D_IN, resp_readcap, NULL,    /* READ CAPACITY(10) */
 544	    {10,  0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
 545	     0, 0} },
 546	{ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
 547	    resp_read_dt0, read_iarr, {16,  0xfe, 0xff, 0xff, 0xff, 0xff,
 548	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 549/* 10 */
 550	{ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
 551	    resp_write_dt0, write_iarr,			/* WRITE(16) */
 552		{16,  0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 553		 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 554	{0, 0x1b, 0, F_SSU_DELAY, resp_start_stop, NULL,/* START STOP UNIT */
 555	    {6,  0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 556	{ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
 557	    resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
 558		{16,  0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 559		 0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
 560	{0, 0x9f, 0x12, F_SA_LOW | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 561	    NULL, {16,  0x12, 0xf9, 0x0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff,
 562	    0xff, 0xff, 0xff, 0xff, 0xc7} },  /* SA_OUT(16), WRITE SCAT(16) */
 563	{ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
 564	    resp_report_tgtpgs,	/* MAINT IN, REPORT TARGET PORT GROUPS */
 565		maint_in_iarr, {12,  0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
 566				0xff, 0, 0xc7, 0, 0, 0, 0} },
 567/* 15 */
 568	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
 569	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 570	{0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, NULL, NULL, /* VERIFY(10) */
 571	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7,
 572	     0, 0, 0, 0, 0, 0} },
 
 573	{ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
 574	    resp_read_dt0, vl_iarr,	/* VARIABLE LENGTH, READ(32) */
 575	    {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
 576	     0xff, 0xff} },
 577	{ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
 578	    NULL, reserve_iarr,	/* RESERVE(10) <no response function> */
 579	    {10,  0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 580	     0} },
 581	{ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
 582	    NULL, release_iarr, /* RELEASE(10) <no response function> */
 583	    {10,  0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 584	     0} },
 585/* 20 */
 586	{0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
 587	    {6,  0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 588	{0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
 589	    {6,  0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 590	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
 591	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 592	{0, 0x1d, F_D_OUT, 0, NULL, NULL,	/* SEND DIAGNOSTIC */
 593	    {6,  0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 594	{0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
 595	    {10,  0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 596/* 25 */
 597	{0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
 598	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
 599	     0, 0, 0, 0} },			/* WRITE_BUFFER */
 600	{ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
 601	    resp_write_same_10, write_same_iarr,	/* WRITE SAME(10) */
 602		{10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
 603		 0, 0, 0, 0, 0} },
 604	{ARRAY_SIZE(sync_cache_iarr), 0x35, 0, F_SYNC_DELAY | F_M_ACCESS,
 605	    resp_sync_cache, sync_cache_iarr,
 606	    {10,  0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 607	     0, 0, 0, 0} },			/* SYNC_CACHE (10) */
 608	{0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
 609	    {16,  0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
 610	     0, 0xff, 0x3f, 0xc7} },		/* COMPARE AND WRITE */
 611
 612/* 29 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 613	{0xff, 0, 0, 0, NULL, NULL,		/* terminating element */
 614	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 615};
 616
 617static int sdebug_add_host = DEF_NUM_HOST;
 
 618static int sdebug_ato = DEF_ATO;
 619static int sdebug_cdb_len = DEF_CDB_LEN;
 620static int sdebug_jdelay = DEF_JDELAY;	/* if > 0 then unit is jiffies */
 621static int sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
 622static int sdebug_dif = DEF_DIF;
 623static int sdebug_dix = DEF_DIX;
 624static int sdebug_dsense = DEF_D_SENSE;
 625static int sdebug_every_nth = DEF_EVERY_NTH;
 626static int sdebug_fake_rw = DEF_FAKE_RW;
 627static unsigned int sdebug_guard = DEF_GUARD;
 
 628static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
 629static int sdebug_max_luns = DEF_MAX_LUNS;
 630static int sdebug_max_queue = SDEBUG_CANQUEUE;	/* per submit queue */
 631static unsigned int sdebug_medium_error_start = OPT_MEDIUM_ERR_ADDR;
 632static int sdebug_medium_error_count = OPT_MEDIUM_ERR_NUM;
 633static atomic_t retired_max_queue;	/* if > 0 then was prior max_queue */
 634static int sdebug_ndelay = DEF_NDELAY;	/* if > 0 then unit is nanoseconds */
 635static int sdebug_no_lun_0 = DEF_NO_LUN_0;
 636static int sdebug_no_uld;
 637static int sdebug_num_parts = DEF_NUM_PARTS;
 638static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 639static int sdebug_opt_blks = DEF_OPT_BLKS;
 640static int sdebug_opts = DEF_OPTS;
 641static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
 642static int sdebug_opt_xferlen_exp = DEF_OPT_XFERLEN_EXP;
 643static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
 644static int sdebug_scsi_level = DEF_SCSI_LEVEL;
 645static int sdebug_sector_size = DEF_SECTOR_SIZE;
 
 646static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
 647static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 648static unsigned int sdebug_lbpu = DEF_LBPU;
 649static unsigned int sdebug_lbpws = DEF_LBPWS;
 650static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
 651static unsigned int sdebug_lbprz = DEF_LBPRZ;
 652static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 653static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 654static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 655static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 656static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
 657static int sdebug_uuid_ctl = DEF_UUID_CTL;
 
 
 658static bool sdebug_removable = DEF_REMOVABLE;
 659static bool sdebug_clustering;
 660static bool sdebug_host_lock = DEF_HOST_LOCK;
 661static bool sdebug_strict = DEF_STRICT;
 662static bool sdebug_any_injecting_opt;
 663static bool sdebug_verbose;
 664static bool have_dif_prot;
 665static bool write_since_sync;
 666static bool sdebug_statistics = DEF_STATISTICS;
 667static bool sdebug_wp;
 
 
 
 
 
 
 
 
 
 
 668
 669static unsigned int sdebug_store_sectors;
 670static sector_t sdebug_capacity;	/* in sectors */
 671
 672/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 673   may still need them */
 674static int sdebug_heads;		/* heads per disk */
 675static int sdebug_cylinders_per;	/* cylinders per surface */
 676static int sdebug_sectors_per;		/* sectors per cylinder */
 677
 678static LIST_HEAD(sdebug_host_list);
 679static DEFINE_SPINLOCK(sdebug_host_list_lock);
 680
 681static unsigned char *fake_storep;	/* ramdisk storage */
 682static struct t10_pi_tuple *dif_storep;	/* protection info */
 683static void *map_storep;		/* provisioning map */
 
 
 684
 685static unsigned long map_size;
 686static int num_aborts;
 687static int num_dev_resets;
 688static int num_target_resets;
 689static int num_bus_resets;
 690static int num_host_resets;
 691static int dix_writes;
 692static int dix_reads;
 693static int dif_errors;
 694
 
 
 
 
 
 
 695static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
 
 696static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
 697
 698static DEFINE_RWLOCK(atomic_rw);
 
 
 
 699
 700static char sdebug_proc_name[] = MY_NAME;
 701static const char *my_name = MY_NAME;
 702
 703static struct bus_type pseudo_lld_bus;
 704
 705static struct device_driver sdebug_driverfs_driver = {
 706	.name 		= sdebug_proc_name,
 707	.bus		= &pseudo_lld_bus,
 708};
 709
 710static const int check_condition_result =
 711		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 712
 713static const int illegal_condition_result =
 714	(DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 715
 716static const int device_qfull_result =
 717	(DID_OK << 16) | (COMMAND_COMPLETE << 8) | SAM_STAT_TASK_SET_FULL;
 
 
 718
 719
 720/* Only do the extra work involved in logical block provisioning if one or
 721 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
 722 * real reads and writes (i.e. not skipping them for speed).
 723 */
 724static inline bool scsi_debug_lbp(void)
 725{
 726	return 0 == sdebug_fake_rw &&
 727		(sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
 728}
 729
 730static void *lba2fake_store(unsigned long long lba)
 
 731{
 
 
 732	lba = do_div(lba, sdebug_store_sectors);
 733
 734	return fake_storep + lba * sdebug_sector_size;
 
 
 
 735}
 736
 737static struct t10_pi_tuple *dif_store(sector_t sector)
 
 738{
 739	sector = sector_div(sector, sdebug_store_sectors);
 740
 741	return dif_storep + sector;
 742}
 743
 744static void sdebug_max_tgts_luns(void)
 745{
 746	struct sdebug_host_info *sdbg_host;
 747	struct Scsi_Host *hpnt;
 748
 749	spin_lock(&sdebug_host_list_lock);
 750	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 751		hpnt = sdbg_host->shost;
 752		if ((hpnt->this_id >= 0) &&
 753		    (sdebug_num_tgts > hpnt->this_id))
 754			hpnt->max_id = sdebug_num_tgts + 1;
 755		else
 756			hpnt->max_id = sdebug_num_tgts;
 757		/* sdebug_max_luns; */
 758		hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
 759	}
 760	spin_unlock(&sdebug_host_list_lock);
 761}
 762
 763enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
 764
 765/* Set in_bit to -1 to indicate no bit position of invalid field */
 766static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
 767				 enum sdeb_cmd_data c_d,
 768				 int in_byte, int in_bit)
 769{
 770	unsigned char *sbuff;
 771	u8 sks[4];
 772	int sl, asc;
 773
 774	sbuff = scp->sense_buffer;
 775	if (!sbuff) {
 776		sdev_printk(KERN_ERR, scp->device,
 777			    "%s: sense_buffer is NULL\n", __func__);
 778		return;
 779	}
 780	asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
 781	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 782	scsi_build_sense_buffer(sdebug_dsense, sbuff, ILLEGAL_REQUEST, asc, 0);
 783	memset(sks, 0, sizeof(sks));
 784	sks[0] = 0x80;
 785	if (c_d)
 786		sks[0] |= 0x40;
 787	if (in_bit >= 0) {
 788		sks[0] |= 0x8;
 789		sks[0] |= 0x7 & in_bit;
 790	}
 791	put_unaligned_be16(in_byte, sks + 1);
 792	if (sdebug_dsense) {
 793		sl = sbuff[7] + 8;
 794		sbuff[7] = sl;
 795		sbuff[sl] = 0x2;
 796		sbuff[sl + 1] = 0x6;
 797		memcpy(sbuff + sl + 4, sks, 3);
 798	} else
 799		memcpy(sbuff + 15, sks, 3);
 800	if (sdebug_verbose)
 801		sdev_printk(KERN_INFO, scp->device, "%s:  [sense_key,asc,ascq"
 802			    "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
 803			    my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
 804}
 805
 806static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
 807{
 808	unsigned char *sbuff;
 809
 810	sbuff = scp->sense_buffer;
 811	if (!sbuff) {
 812		sdev_printk(KERN_ERR, scp->device,
 813			    "%s: sense_buffer is NULL\n", __func__);
 814		return;
 815	}
 816	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 817
 818	scsi_build_sense_buffer(sdebug_dsense, sbuff, key, asc, asq);
 819
 820	if (sdebug_verbose)
 821		sdev_printk(KERN_INFO, scp->device,
 822			    "%s:  [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
 823			    my_name, key, asc, asq);
 824}
 825
 826static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
 827{
 828	mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
 829}
 830
 831static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
 832			    void __user *arg)
 833{
 834	if (sdebug_verbose) {
 835		if (0x1261 == cmd)
 836			sdev_printk(KERN_INFO, dev,
 837				    "%s: BLKFLSBUF [0x1261]\n", __func__);
 838		else if (0x5331 == cmd)
 839			sdev_printk(KERN_INFO, dev,
 840				    "%s: CDROM_GET_CAPABILITY [0x5331]\n",
 841				    __func__);
 842		else
 843			sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
 844				    __func__, cmd);
 845	}
 846	return -EINVAL;
 847	/* return -ENOTTY; // correct return but upsets fdisk */
 848}
 849
 850static void config_cdb_len(struct scsi_device *sdev)
 851{
 852	switch (sdebug_cdb_len) {
 853	case 6:	/* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
 854		sdev->use_10_for_rw = false;
 855		sdev->use_16_for_rw = false;
 856		sdev->use_10_for_ms = false;
 857		break;
 858	case 10: /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
 859		sdev->use_10_for_rw = true;
 860		sdev->use_16_for_rw = false;
 861		sdev->use_10_for_ms = false;
 862		break;
 863	case 12: /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
 864		sdev->use_10_for_rw = true;
 865		sdev->use_16_for_rw = false;
 866		sdev->use_10_for_ms = true;
 867		break;
 868	case 16:
 869		sdev->use_10_for_rw = false;
 870		sdev->use_16_for_rw = true;
 871		sdev->use_10_for_ms = true;
 872		break;
 873	case 32: /* No knobs to suggest this so same as 16 for now */
 874		sdev->use_10_for_rw = false;
 875		sdev->use_16_for_rw = true;
 876		sdev->use_10_for_ms = true;
 877		break;
 878	default:
 879		pr_warn("unexpected cdb_len=%d, force to 10\n",
 880			sdebug_cdb_len);
 881		sdev->use_10_for_rw = true;
 882		sdev->use_16_for_rw = false;
 883		sdev->use_10_for_ms = false;
 884		sdebug_cdb_len = 10;
 885		break;
 886	}
 887}
 888
 889static void all_config_cdb_len(void)
 890{
 891	struct sdebug_host_info *sdbg_host;
 892	struct Scsi_Host *shost;
 893	struct scsi_device *sdev;
 894
 895	spin_lock(&sdebug_host_list_lock);
 896	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 897		shost = sdbg_host->shost;
 898		shost_for_each_device(sdev, shost) {
 899			config_cdb_len(sdev);
 900		}
 901	}
 902	spin_unlock(&sdebug_host_list_lock);
 903}
 904
 905static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
 906{
 907	struct sdebug_host_info *sdhp;
 908	struct sdebug_dev_info *dp;
 909
 910	spin_lock(&sdebug_host_list_lock);
 911	list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
 912		list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
 913			if ((devip->sdbg_host == dp->sdbg_host) &&
 914			    (devip->target == dp->target))
 915				clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
 916		}
 917	}
 918	spin_unlock(&sdebug_host_list_lock);
 919}
 920
 921static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 922{
 923	int k;
 924
 925	k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
 926	if (k != SDEBUG_NUM_UAS) {
 927		const char *cp = NULL;
 928
 929		switch (k) {
 930		case SDEBUG_UA_POR:
 931			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
 932					POWER_ON_RESET_ASCQ);
 933			if (sdebug_verbose)
 934				cp = "power on reset";
 935			break;
 936		case SDEBUG_UA_BUS_RESET:
 937			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
 938					BUS_RESET_ASCQ);
 939			if (sdebug_verbose)
 940				cp = "bus reset";
 941			break;
 942		case SDEBUG_UA_MODE_CHANGED:
 943			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
 944					MODE_CHANGED_ASCQ);
 945			if (sdebug_verbose)
 946				cp = "mode parameters changed";
 947			break;
 948		case SDEBUG_UA_CAPACITY_CHANGED:
 949			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
 950					CAPACITY_CHANGED_ASCQ);
 951			if (sdebug_verbose)
 952				cp = "capacity data changed";
 953			break;
 954		case SDEBUG_UA_MICROCODE_CHANGED:
 955			mk_sense_buffer(scp, UNIT_ATTENTION,
 956					TARGET_CHANGED_ASC,
 957					MICROCODE_CHANGED_ASCQ);
 958			if (sdebug_verbose)
 959				cp = "microcode has been changed";
 960			break;
 961		case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
 962			mk_sense_buffer(scp, UNIT_ATTENTION,
 963					TARGET_CHANGED_ASC,
 964					MICROCODE_CHANGED_WO_RESET_ASCQ);
 965			if (sdebug_verbose)
 966				cp = "microcode has been changed without reset";
 967			break;
 968		case SDEBUG_UA_LUNS_CHANGED:
 969			/*
 970			 * SPC-3 behavior is to report a UNIT ATTENTION with
 971			 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
 972			 * on the target, until a REPORT LUNS command is
 973			 * received.  SPC-4 behavior is to report it only once.
 974			 * NOTE:  sdebug_scsi_level does not use the same
 975			 * values as struct scsi_device->scsi_level.
 976			 */
 977			if (sdebug_scsi_level >= 6)	/* SPC-4 and above */
 978				clear_luns_changed_on_target(devip);
 979			mk_sense_buffer(scp, UNIT_ATTENTION,
 980					TARGET_CHANGED_ASC,
 981					LUNS_CHANGED_ASCQ);
 982			if (sdebug_verbose)
 983				cp = "reported luns data has changed";
 984			break;
 985		default:
 986			pr_warn("unexpected unit attention code=%d\n", k);
 987			if (sdebug_verbose)
 988				cp = "unknown";
 989			break;
 990		}
 991		clear_bit(k, devip->uas_bm);
 992		if (sdebug_verbose)
 993			sdev_printk(KERN_INFO, scp->device,
 994				   "%s reports: Unit attention: %s\n",
 995				   my_name, cp);
 996		return check_condition_result;
 997	}
 998	return 0;
 999}
1000
1001/* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
1002static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1003				int arr_len)
1004{
1005	int act_len;
1006	struct scsi_data_buffer *sdb = &scp->sdb;
1007
1008	if (!sdb->length)
1009		return 0;
1010	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1011		return DID_ERROR << 16;
1012
1013	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
1014				      arr, arr_len);
1015	scsi_set_resid(scp, scsi_bufflen(scp) - act_len);
1016
1017	return 0;
1018}
1019
1020/* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
1021 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
1022 * calls, not required to write in ascending offset order. Assumes resid
1023 * set to scsi_bufflen() prior to any calls.
1024 */
1025static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
1026				  int arr_len, unsigned int off_dst)
1027{
1028	int act_len, n;
1029	struct scsi_data_buffer *sdb = &scp->sdb;
1030	off_t skip = off_dst;
1031
1032	if (sdb->length <= off_dst)
1033		return 0;
1034	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1035		return DID_ERROR << 16;
1036
1037	act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
1038				       arr, arr_len, skip);
1039	pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
1040		 __func__, off_dst, scsi_bufflen(scp), act_len,
1041		 scsi_get_resid(scp));
1042	n = (int)scsi_bufflen(scp) - ((int)off_dst + act_len);
1043	scsi_set_resid(scp, min(scsi_get_resid(scp), n));
1044	return 0;
1045}
1046
1047/* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
1048 * 'arr' or -1 if error.
1049 */
1050static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1051			       int arr_len)
1052{
1053	if (!scsi_bufflen(scp))
1054		return 0;
1055	if (scp->sc_data_direction != DMA_TO_DEVICE)
1056		return -1;
1057
1058	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1059}
1060
1061
1062static char sdebug_inq_vendor_id[9] = "Linux   ";
1063static char sdebug_inq_product_id[17] = "scsi_debug      ";
1064static char sdebug_inq_product_rev[5] = SDEBUG_VERSION;
1065/* Use some locally assigned NAAs for SAS addresses. */
1066static const u64 naa3_comp_a = 0x3222222000000000ULL;
1067static const u64 naa3_comp_b = 0x3333333000000000ULL;
1068static const u64 naa3_comp_c = 0x3111111000000000ULL;
1069
1070/* Device identification VPD page. Returns number of bytes placed in arr */
1071static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
1072			  int target_dev_id, int dev_id_num,
1073			  const char *dev_id_str, int dev_id_str_len,
1074			  const uuid_t *lu_name)
1075{
1076	int num, port_a;
1077	char b[32];
1078
1079	port_a = target_dev_id + 1;
1080	/* T10 vendor identifier field format (faked) */
1081	arr[0] = 0x2;	/* ASCII */
1082	arr[1] = 0x1;
1083	arr[2] = 0x0;
1084	memcpy(&arr[4], sdebug_inq_vendor_id, 8);
1085	memcpy(&arr[12], sdebug_inq_product_id, 16);
1086	memcpy(&arr[28], dev_id_str, dev_id_str_len);
1087	num = 8 + 16 + dev_id_str_len;
1088	arr[3] = num;
1089	num += 4;
1090	if (dev_id_num >= 0) {
1091		if (sdebug_uuid_ctl) {
1092			/* Locally assigned UUID */
1093			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1094			arr[num++] = 0xa;  /* PIV=0, lu, naa */
1095			arr[num++] = 0x0;
1096			arr[num++] = 0x12;
1097			arr[num++] = 0x10; /* uuid type=1, locally assigned */
1098			arr[num++] = 0x0;
1099			memcpy(arr + num, lu_name, 16);
1100			num += 16;
1101		} else {
1102			/* NAA-3, Logical unit identifier (binary) */
1103			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1104			arr[num++] = 0x3;  /* PIV=0, lu, naa */
1105			arr[num++] = 0x0;
1106			arr[num++] = 0x8;
1107			put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
1108			num += 8;
1109		}
1110		/* Target relative port number */
1111		arr[num++] = 0x61;	/* proto=sas, binary */
1112		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
1113		arr[num++] = 0x0;	/* reserved */
1114		arr[num++] = 0x4;	/* length */
1115		arr[num++] = 0x0;	/* reserved */
1116		arr[num++] = 0x0;	/* reserved */
1117		arr[num++] = 0x0;
1118		arr[num++] = 0x1;	/* relative port A */
1119	}
1120	/* NAA-3, Target port identifier */
1121	arr[num++] = 0x61;	/* proto=sas, binary */
1122	arr[num++] = 0x93;	/* piv=1, target port, naa */
1123	arr[num++] = 0x0;
1124	arr[num++] = 0x8;
1125	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1126	num += 8;
1127	/* NAA-3, Target port group identifier */
1128	arr[num++] = 0x61;	/* proto=sas, binary */
1129	arr[num++] = 0x95;	/* piv=1, target port group id */
1130	arr[num++] = 0x0;
1131	arr[num++] = 0x4;
1132	arr[num++] = 0;
1133	arr[num++] = 0;
1134	put_unaligned_be16(port_group_id, arr + num);
1135	num += 2;
1136	/* NAA-3, Target device identifier */
1137	arr[num++] = 0x61;	/* proto=sas, binary */
1138	arr[num++] = 0xa3;	/* piv=1, target device, naa */
1139	arr[num++] = 0x0;
1140	arr[num++] = 0x8;
1141	put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
1142	num += 8;
1143	/* SCSI name string: Target device identifier */
1144	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
1145	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
1146	arr[num++] = 0x0;
1147	arr[num++] = 24;
1148	memcpy(arr + num, "naa.32222220", 12);
1149	num += 12;
1150	snprintf(b, sizeof(b), "%08X", target_dev_id);
1151	memcpy(arr + num, b, 8);
1152	num += 8;
1153	memset(arr + num, 0, 4);
1154	num += 4;
1155	return num;
1156}
1157
1158static unsigned char vpd84_data[] = {
1159/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1160    0x22,0x22,0x22,0x0,0xbb,0x1,
1161    0x22,0x22,0x22,0x0,0xbb,0x2,
1162};
1163
1164/*  Software interface identification VPD page */
1165static int inquiry_vpd_84(unsigned char *arr)
1166{
1167	memcpy(arr, vpd84_data, sizeof(vpd84_data));
1168	return sizeof(vpd84_data);
1169}
1170
1171/* Management network addresses VPD page */
1172static int inquiry_vpd_85(unsigned char *arr)
1173{
1174	int num = 0;
1175	const char *na1 = "https://www.kernel.org/config";
1176	const char *na2 = "http://www.kernel.org/log";
1177	int plen, olen;
1178
1179	arr[num++] = 0x1;	/* lu, storage config */
1180	arr[num++] = 0x0;	/* reserved */
1181	arr[num++] = 0x0;
1182	olen = strlen(na1);
1183	plen = olen + 1;
1184	if (plen % 4)
1185		plen = ((plen / 4) + 1) * 4;
1186	arr[num++] = plen;	/* length, null termianted, padded */
1187	memcpy(arr + num, na1, olen);
1188	memset(arr + num + olen, 0, plen - olen);
1189	num += plen;
1190
1191	arr[num++] = 0x4;	/* lu, logging */
1192	arr[num++] = 0x0;	/* reserved */
1193	arr[num++] = 0x0;
1194	olen = strlen(na2);
1195	plen = olen + 1;
1196	if (plen % 4)
1197		plen = ((plen / 4) + 1) * 4;
1198	arr[num++] = plen;	/* length, null terminated, padded */
1199	memcpy(arr + num, na2, olen);
1200	memset(arr + num + olen, 0, plen - olen);
1201	num += plen;
1202
1203	return num;
1204}
1205
1206/* SCSI ports VPD page */
1207static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
1208{
1209	int num = 0;
1210	int port_a, port_b;
1211
1212	port_a = target_dev_id + 1;
1213	port_b = port_a + 1;
1214	arr[num++] = 0x0;	/* reserved */
1215	arr[num++] = 0x0;	/* reserved */
1216	arr[num++] = 0x0;
1217	arr[num++] = 0x1;	/* relative port 1 (primary) */
1218	memset(arr + num, 0, 6);
1219	num += 6;
1220	arr[num++] = 0x0;
1221	arr[num++] = 12;	/* length tp descriptor */
1222	/* naa-5 target port identifier (A) */
1223	arr[num++] = 0x61;	/* proto=sas, binary */
1224	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1225	arr[num++] = 0x0;	/* reserved */
1226	arr[num++] = 0x8;	/* length */
1227	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1228	num += 8;
1229	arr[num++] = 0x0;	/* reserved */
1230	arr[num++] = 0x0;	/* reserved */
1231	arr[num++] = 0x0;
1232	arr[num++] = 0x2;	/* relative port 2 (secondary) */
1233	memset(arr + num, 0, 6);
1234	num += 6;
1235	arr[num++] = 0x0;
1236	arr[num++] = 12;	/* length tp descriptor */
1237	/* naa-5 target port identifier (B) */
1238	arr[num++] = 0x61;	/* proto=sas, binary */
1239	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1240	arr[num++] = 0x0;	/* reserved */
1241	arr[num++] = 0x8;	/* length */
1242	put_unaligned_be64(naa3_comp_a + port_b, arr + num);
1243	num += 8;
1244
1245	return num;
1246}
1247
1248
1249static unsigned char vpd89_data[] = {
1250/* from 4th byte */ 0,0,0,0,
1251'l','i','n','u','x',' ',' ',' ',
1252'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1253'1','2','3','4',
12540x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
12550xec,0,0,0,
12560x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
12570,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
12580x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
12590x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
12600x53,0x41,
12610x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12620x20,0x20,
12630x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12640x10,0x80,
12650,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
12660x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
12670x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
12680,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
12690x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
12700x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
12710,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
12720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12730,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12750x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
12760,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
12770xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
12780,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
12790,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12810,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12820,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12830,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12850,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12860,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12880,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12900,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1291};
1292
1293/* ATA Information VPD page */
1294static int inquiry_vpd_89(unsigned char *arr)
1295{
1296	memcpy(arr, vpd89_data, sizeof(vpd89_data));
1297	return sizeof(vpd89_data);
1298}
1299
1300
1301static unsigned char vpdb0_data[] = {
1302	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1303	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1304	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1305	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1306};
1307
1308/* Block limits VPD page (SBC-3) */
1309static int inquiry_vpd_b0(unsigned char *arr)
1310{
1311	unsigned int gran;
1312
1313	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
1314
1315	/* Optimal transfer length granularity */
1316	if (sdebug_opt_xferlen_exp != 0 &&
1317	    sdebug_physblk_exp < sdebug_opt_xferlen_exp)
1318		gran = 1 << sdebug_opt_xferlen_exp;
1319	else
1320		gran = 1 << sdebug_physblk_exp;
1321	put_unaligned_be16(gran, arr + 2);
1322
1323	/* Maximum Transfer Length */
1324	if (sdebug_store_sectors > 0x400)
1325		put_unaligned_be32(sdebug_store_sectors, arr + 4);
1326
1327	/* Optimal Transfer Length */
1328	put_unaligned_be32(sdebug_opt_blks, &arr[8]);
1329
1330	if (sdebug_lbpu) {
1331		/* Maximum Unmap LBA Count */
1332		put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
1333
1334		/* Maximum Unmap Block Descriptor Count */
1335		put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
1336	}
1337
1338	/* Unmap Granularity Alignment */
1339	if (sdebug_unmap_alignment) {
1340		put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
1341		arr[28] |= 0x80; /* UGAVALID */
1342	}
1343
1344	/* Optimal Unmap Granularity */
1345	put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
1346
1347	/* Maximum WRITE SAME Length */
1348	put_unaligned_be64(sdebug_write_same_length, &arr[32]);
1349
1350	return 0x3c; /* Mandatory page length for Logical Block Provisioning */
1351
1352	return sizeof(vpdb0_data);
1353}
1354
1355/* Block device characteristics VPD page (SBC-3) */
1356static int inquiry_vpd_b1(unsigned char *arr)
1357{
1358	memset(arr, 0, 0x3c);
1359	arr[0] = 0;
1360	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
1361	arr[2] = 0;
1362	arr[3] = 5;	/* less than 1.8" */
 
 
1363
1364	return 0x3c;
1365}
1366
1367/* Logical block provisioning VPD page (SBC-4) */
1368static int inquiry_vpd_b2(unsigned char *arr)
1369{
1370	memset(arr, 0, 0x4);
1371	arr[0] = 0;			/* threshold exponent */
1372	if (sdebug_lbpu)
1373		arr[1] = 1 << 7;
1374	if (sdebug_lbpws)
1375		arr[1] |= 1 << 6;
1376	if (sdebug_lbpws10)
1377		arr[1] |= 1 << 5;
1378	if (sdebug_lbprz && scsi_debug_lbp())
1379		arr[1] |= (sdebug_lbprz & 0x7) << 2;  /* sbc4r07 and later */
1380	/* anc_sup=0; dp=0 (no provisioning group descriptor) */
1381	/* minimum_percentage=0; provisioning_type=0 (unknown) */
1382	/* threshold_percentage=0 */
1383	return 0x4;
1384}
1385
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1386#define SDEBUG_LONG_INQ_SZ 96
1387#define SDEBUG_MAX_INQ_ARR_SZ 584
1388
1389static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1390{
1391	unsigned char pq_pdt;
1392	unsigned char *arr;
1393	unsigned char *cmd = scp->cmnd;
1394	int alloc_len, n, ret;
1395	bool have_wlun, is_disk;
1396
1397	alloc_len = get_unaligned_be16(cmd + 3);
1398	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1399	if (! arr)
1400		return DID_REQUEUE << 16;
1401	is_disk = (sdebug_ptype == TYPE_DISK);
 
 
1402	have_wlun = scsi_is_wlun(scp->device->lun);
1403	if (have_wlun)
1404		pq_pdt = TYPE_WLUN;	/* present, wlun */
1405	else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1406		pq_pdt = 0x7f;	/* not present, PQ=3, PDT=0x1f */
1407	else
1408		pq_pdt = (sdebug_ptype & 0x1f);
1409	arr[0] = pq_pdt;
1410	if (0x2 & cmd[1]) {  /* CMDDT bit set */
1411		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
1412		kfree(arr);
1413		return check_condition_result;
1414	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
1415		int lu_id_num, port_group_id, target_dev_id, len;
1416		char lu_id_str[6];
1417		int host_no = devip->sdbg_host->shost->host_no;
1418		
1419		port_group_id = (((host_no + 1) & 0x7f) << 8) +
1420		    (devip->channel & 0x7f);
1421		if (sdebug_vpd_use_hostno == 0)
1422			host_no = 0;
1423		lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
1424			    (devip->target * 1000) + devip->lun);
1425		target_dev_id = ((host_no + 1) * 2000) +
1426				 (devip->target * 1000) - 3;
1427		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1428		if (0 == cmd[2]) { /* supported vital product data pages */
1429			arr[1] = cmd[2];	/*sanity */
1430			n = 4;
1431			arr[n++] = 0x0;   /* this page */
1432			arr[n++] = 0x80;  /* unit serial number */
1433			arr[n++] = 0x83;  /* device identification */
1434			arr[n++] = 0x84;  /* software interface ident. */
1435			arr[n++] = 0x85;  /* management network addresses */
1436			arr[n++] = 0x86;  /* extended inquiry */
1437			arr[n++] = 0x87;  /* mode page policy */
1438			arr[n++] = 0x88;  /* SCSI ports */
1439			if (is_disk) {	  /* SBC only */
1440				arr[n++] = 0x89;  /* ATA information */
1441				arr[n++] = 0xb0;  /* Block limits */
1442				arr[n++] = 0xb1;  /* Block characteristics */
1443				arr[n++] = 0xb2;  /* Logical Block Prov */
 
 
 
1444			}
1445			arr[3] = n - 4;	  /* number of supported VPD pages */
1446		} else if (0x80 == cmd[2]) { /* unit serial number */
1447			arr[1] = cmd[2];	/*sanity */
1448			arr[3] = len;
1449			memcpy(&arr[4], lu_id_str, len);
1450		} else if (0x83 == cmd[2]) { /* device identification */
1451			arr[1] = cmd[2];	/*sanity */
1452			arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1453						target_dev_id, lu_id_num,
1454						lu_id_str, len,
1455						&devip->lu_name);
1456		} else if (0x84 == cmd[2]) { /* Software interface ident. */
1457			arr[1] = cmd[2];	/*sanity */
1458			arr[3] = inquiry_vpd_84(&arr[4]);
1459		} else if (0x85 == cmd[2]) { /* Management network addresses */
1460			arr[1] = cmd[2];	/*sanity */
1461			arr[3] = inquiry_vpd_85(&arr[4]);
1462		} else if (0x86 == cmd[2]) { /* extended inquiry */
1463			arr[1] = cmd[2];	/*sanity */
1464			arr[3] = 0x3c;	/* number of following entries */
1465			if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
1466				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
1467			else if (have_dif_prot)
1468				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
1469			else
1470				arr[4] = 0x0;   /* no protection stuff */
1471			arr[5] = 0x7;   /* head of q, ordered + simple q's */
1472		} else if (0x87 == cmd[2]) { /* mode page policy */
1473			arr[1] = cmd[2];	/*sanity */
1474			arr[3] = 0x8;	/* number of following entries */
1475			arr[4] = 0x2;	/* disconnect-reconnect mp */
1476			arr[6] = 0x80;	/* mlus, shared */
1477			arr[8] = 0x18;	 /* protocol specific lu */
1478			arr[10] = 0x82;	 /* mlus, per initiator port */
1479		} else if (0x88 == cmd[2]) { /* SCSI Ports */
1480			arr[1] = cmd[2];	/*sanity */
1481			arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1482		} else if (is_disk && 0x89 == cmd[2]) { /* ATA information */
1483			arr[1] = cmd[2];        /*sanity */
1484			n = inquiry_vpd_89(&arr[4]);
1485			put_unaligned_be16(n, arr + 2);
1486		} else if (is_disk && 0xb0 == cmd[2]) { /* Block limits */
1487			arr[1] = cmd[2];        /*sanity */
1488			arr[3] = inquiry_vpd_b0(&arr[4]);
1489		} else if (is_disk && 0xb1 == cmd[2]) { /* Block char. */
1490			arr[1] = cmd[2];        /*sanity */
1491			arr[3] = inquiry_vpd_b1(&arr[4]);
1492		} else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
1493			arr[1] = cmd[2];        /*sanity */
1494			arr[3] = inquiry_vpd_b2(&arr[4]);
 
 
 
1495		} else {
1496			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
1497			kfree(arr);
1498			return check_condition_result;
1499		}
1500		len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
1501		ret = fill_from_dev_buffer(scp, arr,
1502			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1503		kfree(arr);
1504		return ret;
1505	}
1506	/* drops through here for a standard inquiry */
1507	arr[1] = sdebug_removable ? 0x80 : 0;	/* Removable disk */
1508	arr[2] = sdebug_scsi_level;
1509	arr[3] = 2;    /* response_data_format==2 */
1510	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1511	arr[5] = (int)have_dif_prot;	/* PROTECT bit */
1512	if (sdebug_vpd_use_hostno == 0)
1513		arr[5] |= 0x10; /* claim: implicit TPGS */
1514	arr[6] = 0x10; /* claim: MultiP */
1515	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1516	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1517	memcpy(&arr[8], sdebug_inq_vendor_id, 8);
1518	memcpy(&arr[16], sdebug_inq_product_id, 16);
1519	memcpy(&arr[32], sdebug_inq_product_rev, 4);
1520	/* Use Vendor Specific area to place driver date in ASCII hex */
1521	memcpy(&arr[36], sdebug_version_date, 8);
1522	/* version descriptors (2 bytes each) follow */
1523	put_unaligned_be16(0xc0, arr + 58);   /* SAM-6 no version claimed */
1524	put_unaligned_be16(0x5c0, arr + 60);  /* SPC-5 no version claimed */
1525	n = 62;
1526	if (is_disk) {		/* SBC-4 no version claimed */
1527		put_unaligned_be16(0x600, arr + n);
1528		n += 2;
1529	} else if (sdebug_ptype == TYPE_TAPE) {	/* SSC-4 rev 3 */
1530		put_unaligned_be16(0x525, arr + n);
1531		n += 2;
 
 
 
1532	}
1533	put_unaligned_be16(0x2100, arr + n);	/* SPL-4 no version claimed */
1534	ret = fill_from_dev_buffer(scp, arr,
1535			    min(alloc_len, SDEBUG_LONG_INQ_SZ));
1536	kfree(arr);
1537	return ret;
1538}
1539
 
1540static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1541				   0, 0, 0x0, 0x0};
1542
1543static int resp_requests(struct scsi_cmnd *scp,
1544			 struct sdebug_dev_info *devip)
1545{
1546	unsigned char *sbuff;
1547	unsigned char *cmd = scp->cmnd;
1548	unsigned char arr[SCSI_SENSE_BUFFERSIZE];
1549	bool dsense;
 
1550	int len = 18;
 
1551
1552	memset(arr, 0, sizeof(arr));
1553	dsense = !!(cmd[1] & 1);
1554	sbuff = scp->sense_buffer;
1555	if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
 
 
 
 
 
 
 
 
 
 
 
 
 
1556		if (dsense) {
1557			arr[0] = 0x72;
1558			arr[1] = 0x0;		/* NO_SENSE in sense_key */
1559			arr[2] = THRESHOLD_EXCEEDED;
1560			arr[3] = 0xff;		/* TEST set and MRIE==6 */
1561			len = 8;
1562		} else {
1563			arr[0] = 0x70;
1564			arr[2] = 0x0;		/* NO_SENSE in sense_key */
1565			arr[7] = 0xa;   	/* 18 byte sense buffer */
1566			arr[12] = THRESHOLD_EXCEEDED;
1567			arr[13] = 0xff;		/* TEST set and MRIE==6 */
1568		}
1569	} else {
1570		memcpy(arr, sbuff, SCSI_SENSE_BUFFERSIZE);
1571		if (arr[0] >= 0x70 && dsense == sdebug_dsense)
1572			;	/* have sense and formats match */
1573		else if (arr[0] <= 0x70) {
1574			if (dsense) {
1575				memset(arr, 0, 8);
1576				arr[0] = 0x72;
1577				len = 8;
1578			} else {
1579				memset(arr, 0, 18);
1580				arr[0] = 0x70;
1581				arr[7] = 0xa;
1582			}
1583		} else if (dsense) {
1584			memset(arr, 0, 8);
1585			arr[0] = 0x72;
1586			arr[1] = sbuff[2];     /* sense key */
1587			arr[2] = sbuff[12];    /* asc */
1588			arr[3] = sbuff[13];    /* ascq */
1589			len = 8;
1590		} else {
1591			memset(arr, 0, 18);
1592			arr[0] = 0x70;
1593			arr[2] = sbuff[1];
1594			arr[7] = 0xa;
1595			arr[12] = sbuff[1];
1596			arr[13] = sbuff[3];
1597		}
1598
1599	}
1600	mk_sense_buffer(scp, 0, NO_ADDITIONAL_SENSE, 0);
1601	return fill_from_dev_buffer(scp, arr, len);
1602}
1603
1604static int resp_start_stop(struct scsi_cmnd *scp,
1605			   struct sdebug_dev_info *devip)
1606{
1607	unsigned char *cmd = scp->cmnd;
1608	int power_cond, stop;
1609	bool changing;
1610
1611	power_cond = (cmd[4] & 0xf0) >> 4;
1612	if (power_cond) {
1613		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
1614		return check_condition_result;
1615	}
1616	stop = !(cmd[4] & 1);
1617	changing = atomic_read(&devip->stopped) == !stop;
1618	atomic_xchg(&devip->stopped, stop);
1619	if (!changing || cmd[1] & 0x1)  /* state unchanged or IMMED set */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1620		return SDEG_RES_IMMED_MASK;
1621	else
1622		return 0;
1623}
1624
1625static sector_t get_sdebug_capacity(void)
1626{
1627	static const unsigned int gibibyte = 1073741824;
1628
1629	if (sdebug_virtual_gb > 0)
1630		return (sector_t)sdebug_virtual_gb *
1631			(gibibyte / sdebug_sector_size);
1632	else
1633		return sdebug_store_sectors;
1634}
1635
1636#define SDEBUG_READCAP_ARR_SZ 8
1637static int resp_readcap(struct scsi_cmnd *scp,
1638			struct sdebug_dev_info *devip)
1639{
1640	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1641	unsigned int capac;
1642
1643	/* following just in case virtual_gb changed */
1644	sdebug_capacity = get_sdebug_capacity();
1645	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1646	if (sdebug_capacity < 0xffffffff) {
1647		capac = (unsigned int)sdebug_capacity - 1;
1648		put_unaligned_be32(capac, arr + 0);
1649	} else
1650		put_unaligned_be32(0xffffffff, arr + 0);
1651	put_unaligned_be16(sdebug_sector_size, arr + 6);
1652	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1653}
1654
1655#define SDEBUG_READCAP16_ARR_SZ 32
1656static int resp_readcap16(struct scsi_cmnd *scp,
1657			  struct sdebug_dev_info *devip)
1658{
1659	unsigned char *cmd = scp->cmnd;
1660	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1661	int alloc_len;
1662
1663	alloc_len = get_unaligned_be32(cmd + 10);
1664	/* following just in case virtual_gb changed */
1665	sdebug_capacity = get_sdebug_capacity();
1666	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1667	put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1668	put_unaligned_be32(sdebug_sector_size, arr + 8);
1669	arr[13] = sdebug_physblk_exp & 0xf;
1670	arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
1671
1672	if (scsi_debug_lbp()) {
1673		arr[14] |= 0x80; /* LBPME */
1674		/* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1675		 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1676		 * in the wider field maps to 0 in this field.
1677		 */
1678		if (sdebug_lbprz & 1)	/* precisely what the draft requires */
1679			arr[14] |= 0x40;
1680	}
1681
1682	arr[15] = sdebug_lowest_aligned & 0xff;
1683
1684	if (have_dif_prot) {
1685		arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
1686		arr[12] |= 1; /* PROT_EN */
1687	}
1688
1689	return fill_from_dev_buffer(scp, arr,
1690				    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1691}
1692
1693#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1694
1695static int resp_report_tgtpgs(struct scsi_cmnd *scp,
1696			      struct sdebug_dev_info *devip)
1697{
1698	unsigned char *cmd = scp->cmnd;
1699	unsigned char *arr;
1700	int host_no = devip->sdbg_host->shost->host_no;
1701	int n, ret, alen, rlen;
1702	int port_group_a, port_group_b, port_a, port_b;
1703
1704	alen = get_unaligned_be32(cmd + 6);
1705	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1706	if (! arr)
1707		return DID_REQUEUE << 16;
1708	/*
1709	 * EVPD page 0x88 states we have two ports, one
1710	 * real and a fake port with no device connected.
1711	 * So we create two port groups with one port each
1712	 * and set the group with port B to unavailable.
1713	 */
1714	port_a = 0x1; /* relative port A */
1715	port_b = 0x2; /* relative port B */
1716	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1717			(devip->channel & 0x7f);
1718	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1719			(devip->channel & 0x7f) + 0x80;
1720
1721	/*
1722	 * The asymmetric access state is cycled according to the host_id.
1723	 */
1724	n = 4;
1725	if (sdebug_vpd_use_hostno == 0) {
1726		arr[n++] = host_no % 3; /* Asymm access state */
1727		arr[n++] = 0x0F; /* claim: all states are supported */
1728	} else {
1729		arr[n++] = 0x0; /* Active/Optimized path */
1730		arr[n++] = 0x01; /* only support active/optimized paths */
1731	}
1732	put_unaligned_be16(port_group_a, arr + n);
1733	n += 2;
1734	arr[n++] = 0;    /* Reserved */
1735	arr[n++] = 0;    /* Status code */
1736	arr[n++] = 0;    /* Vendor unique */
1737	arr[n++] = 0x1;  /* One port per group */
1738	arr[n++] = 0;    /* Reserved */
1739	arr[n++] = 0;    /* Reserved */
1740	put_unaligned_be16(port_a, arr + n);
1741	n += 2;
1742	arr[n++] = 3;    /* Port unavailable */
1743	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1744	put_unaligned_be16(port_group_b, arr + n);
1745	n += 2;
1746	arr[n++] = 0;    /* Reserved */
1747	arr[n++] = 0;    /* Status code */
1748	arr[n++] = 0;    /* Vendor unique */
1749	arr[n++] = 0x1;  /* One port per group */
1750	arr[n++] = 0;    /* Reserved */
1751	arr[n++] = 0;    /* Reserved */
1752	put_unaligned_be16(port_b, arr + n);
1753	n += 2;
1754
1755	rlen = n - 4;
1756	put_unaligned_be32(rlen, arr + 0);
1757
1758	/*
1759	 * Return the smallest value of either
1760	 * - The allocated length
1761	 * - The constructed command length
1762	 * - The maximum array size
1763	 */
1764	rlen = min(alen,n);
1765	ret = fill_from_dev_buffer(scp, arr,
1766				   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1767	kfree(arr);
1768	return ret;
1769}
1770
1771static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1772			     struct sdebug_dev_info *devip)
1773{
1774	bool rctd;
1775	u8 reporting_opts, req_opcode, sdeb_i, supp;
1776	u16 req_sa, u;
1777	u32 alloc_len, a_len;
1778	int k, offset, len, errsts, count, bump, na;
1779	const struct opcode_info_t *oip;
1780	const struct opcode_info_t *r_oip;
1781	u8 *arr;
1782	u8 *cmd = scp->cmnd;
1783
1784	rctd = !!(cmd[2] & 0x80);
1785	reporting_opts = cmd[2] & 0x7;
1786	req_opcode = cmd[3];
1787	req_sa = get_unaligned_be16(cmd + 4);
1788	alloc_len = get_unaligned_be32(cmd + 6);
1789	if (alloc_len < 4 || alloc_len > 0xffff) {
1790		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1791		return check_condition_result;
1792	}
1793	if (alloc_len > 8192)
1794		a_len = 8192;
1795	else
1796		a_len = alloc_len;
1797	arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
1798	if (NULL == arr) {
1799		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
1800				INSUFF_RES_ASCQ);
1801		return check_condition_result;
1802	}
1803	switch (reporting_opts) {
1804	case 0:	/* all commands */
1805		/* count number of commands */
1806		for (count = 0, oip = opcode_info_arr;
1807		     oip->num_attached != 0xff; ++oip) {
1808			if (F_INV_OP & oip->flags)
1809				continue;
1810			count += (oip->num_attached + 1);
1811		}
1812		bump = rctd ? 20 : 8;
1813		put_unaligned_be32(count * bump, arr);
1814		for (offset = 4, oip = opcode_info_arr;
1815		     oip->num_attached != 0xff && offset < a_len; ++oip) {
1816			if (F_INV_OP & oip->flags)
1817				continue;
1818			na = oip->num_attached;
1819			arr[offset] = oip->opcode;
1820			put_unaligned_be16(oip->sa, arr + offset + 2);
1821			if (rctd)
1822				arr[offset + 5] |= 0x2;
1823			if (FF_SA & oip->flags)
1824				arr[offset + 5] |= 0x1;
1825			put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
1826			if (rctd)
1827				put_unaligned_be16(0xa, arr + offset + 8);
1828			r_oip = oip;
1829			for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
1830				if (F_INV_OP & oip->flags)
1831					continue;
1832				offset += bump;
1833				arr[offset] = oip->opcode;
1834				put_unaligned_be16(oip->sa, arr + offset + 2);
1835				if (rctd)
1836					arr[offset + 5] |= 0x2;
1837				if (FF_SA & oip->flags)
1838					arr[offset + 5] |= 0x1;
1839				put_unaligned_be16(oip->len_mask[0],
1840						   arr + offset + 6);
1841				if (rctd)
1842					put_unaligned_be16(0xa,
1843							   arr + offset + 8);
1844			}
1845			oip = r_oip;
1846			offset += bump;
1847		}
1848		break;
1849	case 1:	/* one command: opcode only */
1850	case 2:	/* one command: opcode plus service action */
1851	case 3:	/* one command: if sa==0 then opcode only else opcode+sa */
1852		sdeb_i = opcode_ind_arr[req_opcode];
1853		oip = &opcode_info_arr[sdeb_i];
1854		if (F_INV_OP & oip->flags) {
1855			supp = 1;
1856			offset = 4;
1857		} else {
1858			if (1 == reporting_opts) {
1859				if (FF_SA & oip->flags) {
1860					mk_sense_invalid_fld(scp, SDEB_IN_CDB,
1861							     2, 2);
1862					kfree(arr);
1863					return check_condition_result;
1864				}
1865				req_sa = 0;
1866			} else if (2 == reporting_opts &&
1867				   0 == (FF_SA & oip->flags)) {
1868				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
1869				kfree(arr);	/* point at requested sa */
1870				return check_condition_result;
1871			}
1872			if (0 == (FF_SA & oip->flags) &&
1873			    req_opcode == oip->opcode)
1874				supp = 3;
1875			else if (0 == (FF_SA & oip->flags)) {
1876				na = oip->num_attached;
1877				for (k = 0, oip = oip->arrp; k < na;
1878				     ++k, ++oip) {
1879					if (req_opcode == oip->opcode)
1880						break;
1881				}
1882				supp = (k >= na) ? 1 : 3;
1883			} else if (req_sa != oip->sa) {
1884				na = oip->num_attached;
1885				for (k = 0, oip = oip->arrp; k < na;
1886				     ++k, ++oip) {
1887					if (req_sa == oip->sa)
1888						break;
1889				}
1890				supp = (k >= na) ? 1 : 3;
1891			} else
1892				supp = 3;
1893			if (3 == supp) {
1894				u = oip->len_mask[0];
1895				put_unaligned_be16(u, arr + 2);
1896				arr[4] = oip->opcode;
1897				for (k = 1; k < u; ++k)
1898					arr[4 + k] = (k < 16) ?
1899						 oip->len_mask[k] : 0xff;
1900				offset = 4 + u;
1901			} else
1902				offset = 4;
1903		}
1904		arr[1] = (rctd ? 0x80 : 0) | supp;
1905		if (rctd) {
1906			put_unaligned_be16(0xa, arr + offset);
1907			offset += 12;
1908		}
1909		break;
1910	default:
1911		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
1912		kfree(arr);
1913		return check_condition_result;
1914	}
1915	offset = (offset < a_len) ? offset : a_len;
1916	len = (offset < alloc_len) ? offset : alloc_len;
1917	errsts = fill_from_dev_buffer(scp, arr, len);
1918	kfree(arr);
1919	return errsts;
1920}
1921
1922static int resp_rsup_tmfs(struct scsi_cmnd *scp,
1923			  struct sdebug_dev_info *devip)
1924{
1925	bool repd;
1926	u32 alloc_len, len;
1927	u8 arr[16];
1928	u8 *cmd = scp->cmnd;
1929
1930	memset(arr, 0, sizeof(arr));
1931	repd = !!(cmd[2] & 0x80);
1932	alloc_len = get_unaligned_be32(cmd + 6);
1933	if (alloc_len < 4) {
1934		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1935		return check_condition_result;
1936	}
1937	arr[0] = 0xc8;		/* ATS | ATSS | LURS */
1938	arr[1] = 0x1;		/* ITNRS */
1939	if (repd) {
1940		arr[3] = 0xc;
1941		len = 16;
1942	} else
1943		len = 4;
1944
1945	len = (len < alloc_len) ? len : alloc_len;
1946	return fill_from_dev_buffer(scp, arr, len);
1947}
1948
1949/* <<Following mode page info copied from ST318451LW>> */
1950
1951static int resp_err_recov_pg(unsigned char *p, int pcontrol, int target)
1952{	/* Read-Write Error Recovery page for mode_sense */
1953	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1954					5, 0, 0xff, 0xff};
1955
1956	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1957	if (1 == pcontrol)
1958		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1959	return sizeof(err_recov_pg);
1960}
1961
1962static int resp_disconnect_pg(unsigned char *p, int pcontrol, int target)
1963{ 	/* Disconnect-Reconnect page for mode_sense */
1964	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1965					 0, 0, 0, 0, 0, 0, 0, 0};
1966
1967	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1968	if (1 == pcontrol)
1969		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1970	return sizeof(disconnect_pg);
1971}
1972
1973static int resp_format_pg(unsigned char *p, int pcontrol, int target)
1974{       /* Format device page for mode_sense */
1975	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1976				     0, 0, 0, 0, 0, 0, 0, 0,
1977				     0, 0, 0, 0, 0x40, 0, 0, 0};
1978
1979	memcpy(p, format_pg, sizeof(format_pg));
1980	put_unaligned_be16(sdebug_sectors_per, p + 10);
1981	put_unaligned_be16(sdebug_sector_size, p + 12);
1982	if (sdebug_removable)
1983		p[20] |= 0x20; /* should agree with INQUIRY */
1984	if (1 == pcontrol)
1985		memset(p + 2, 0, sizeof(format_pg) - 2);
1986	return sizeof(format_pg);
1987}
1988
1989static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1990				     0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
1991				     0, 0, 0, 0};
1992
1993static int resp_caching_pg(unsigned char *p, int pcontrol, int target)
1994{ 	/* Caching page for mode_sense */
1995	unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
1996		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1997	unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1998		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1999
2000	if (SDEBUG_OPT_N_WCE & sdebug_opts)
2001		caching_pg[2] &= ~0x4;	/* set WCE=0 (default WCE=1) */
2002	memcpy(p, caching_pg, sizeof(caching_pg));
2003	if (1 == pcontrol)
2004		memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
2005	else if (2 == pcontrol)
2006		memcpy(p, d_caching_pg, sizeof(d_caching_pg));
2007	return sizeof(caching_pg);
2008}
2009
2010static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2011				    0, 0, 0x2, 0x4b};
2012
2013static int resp_ctrl_m_pg(unsigned char *p, int pcontrol, int target)
2014{ 	/* Control mode page for mode_sense */
2015	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
2016					0, 0, 0, 0};
2017	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2018				     0, 0, 0x2, 0x4b};
2019
2020	if (sdebug_dsense)
2021		ctrl_m_pg[2] |= 0x4;
2022	else
2023		ctrl_m_pg[2] &= ~0x4;
2024
2025	if (sdebug_ato)
2026		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
2027
2028	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
2029	if (1 == pcontrol)
2030		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
2031	else if (2 == pcontrol)
2032		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
2033	return sizeof(ctrl_m_pg);
2034}
2035
2036
2037static int resp_iec_m_pg(unsigned char *p, int pcontrol, int target)
2038{	/* Informational Exceptions control mode page for mode_sense */
2039	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
2040				       0, 0, 0x0, 0x0};
2041	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
2042				      0, 0, 0x0, 0x0};
2043
2044	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
2045	if (1 == pcontrol)
2046		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
2047	else if (2 == pcontrol)
2048		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
2049	return sizeof(iec_m_pg);
2050}
2051
2052static int resp_sas_sf_m_pg(unsigned char *p, int pcontrol, int target)
2053{	/* SAS SSP mode page - short format for mode_sense */
2054	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
2055		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
2056
2057	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
2058	if (1 == pcontrol)
2059		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
2060	return sizeof(sas_sf_m_pg);
2061}
2062
2063
2064static int resp_sas_pcd_m_spg(unsigned char *p, int pcontrol, int target,
2065			      int target_dev_id)
2066{	/* SAS phy control and discover mode page for mode_sense */
2067	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
2068		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
2069		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2070		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2071		    0x2, 0, 0, 0, 0, 0, 0, 0,
2072		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2073		    0, 0, 0, 0, 0, 0, 0, 0,
2074		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
2075		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2076		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2077		    0x3, 0, 0, 0, 0, 0, 0, 0,
2078		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2079		    0, 0, 0, 0, 0, 0, 0, 0,
2080		};
2081	int port_a, port_b;
2082
2083	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
2084	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
2085	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
2086	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
2087	port_a = target_dev_id + 1;
2088	port_b = port_a + 1;
2089	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
2090	put_unaligned_be32(port_a, p + 20);
2091	put_unaligned_be32(port_b, p + 48 + 20);
2092	if (1 == pcontrol)
2093		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
2094	return sizeof(sas_pcd_m_pg);
2095}
2096
2097static int resp_sas_sha_m_spg(unsigned char *p, int pcontrol)
2098{	/* SAS SSP shared protocol specific port mode subpage */
2099	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
2100		    0, 0, 0, 0, 0, 0, 0, 0,
2101		};
2102
2103	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
2104	if (1 == pcontrol)
2105		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
2106	return sizeof(sas_sha_m_pg);
2107}
2108
2109#define SDEBUG_MAX_MSENSE_SZ 256
2110
2111static int resp_mode_sense(struct scsi_cmnd *scp,
2112			   struct sdebug_dev_info *devip)
2113{
2114	int pcontrol, pcode, subpcode, bd_len;
2115	unsigned char dev_spec;
2116	int alloc_len, offset, len, target_dev_id;
2117	int target = scp->device->id;
2118	unsigned char *ap;
2119	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
2120	unsigned char *cmd = scp->cmnd;
2121	bool dbd, llbaa, msense_6, is_disk, bad_pcode;
2122
2123	dbd = !!(cmd[1] & 0x8);		/* disable block descriptors */
2124	pcontrol = (cmd[2] & 0xc0) >> 6;
2125	pcode = cmd[2] & 0x3f;
2126	subpcode = cmd[3];
2127	msense_6 = (MODE_SENSE == cmd[0]);
2128	llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2129	is_disk = (sdebug_ptype == TYPE_DISK);
2130	if (is_disk && !dbd)
 
2131		bd_len = llbaa ? 16 : 8;
2132	else
2133		bd_len = 0;
2134	alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2135	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2136	if (0x3 == pcontrol) {  /* Saving values not supported */
2137		mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
2138		return check_condition_result;
2139	}
2140	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2141			(devip->target * 1000) - 3;
2142	/* for disks set DPOFUA bit and clear write protect (WP) bit */
2143	if (is_disk) {
2144		dev_spec = 0x10;	/* =0x90 if WP=1 implies read-only */
2145		if (sdebug_wp)
2146			dev_spec |= 0x80;
2147	} else
2148		dev_spec = 0x0;
2149	if (msense_6) {
2150		arr[2] = dev_spec;
2151		arr[3] = bd_len;
2152		offset = 4;
2153	} else {
2154		arr[3] = dev_spec;
2155		if (16 == bd_len)
2156			arr[4] = 0x1;	/* set LONGLBA bit */
2157		arr[7] = bd_len;	/* assume 255 or less */
2158		offset = 8;
2159	}
2160	ap = arr + offset;
2161	if ((bd_len > 0) && (!sdebug_capacity))
2162		sdebug_capacity = get_sdebug_capacity();
2163
2164	if (8 == bd_len) {
2165		if (sdebug_capacity > 0xfffffffe)
2166			put_unaligned_be32(0xffffffff, ap + 0);
2167		else
2168			put_unaligned_be32(sdebug_capacity, ap + 0);
2169		put_unaligned_be16(sdebug_sector_size, ap + 6);
2170		offset += bd_len;
2171		ap = arr + offset;
2172	} else if (16 == bd_len) {
2173		put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2174		put_unaligned_be32(sdebug_sector_size, ap + 12);
2175		offset += bd_len;
2176		ap = arr + offset;
2177	}
2178
2179	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2180		/* TODO: Control Extension page */
2181		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2182		return check_condition_result;
2183	}
2184	bad_pcode = false;
2185
2186	switch (pcode) {
2187	case 0x1:	/* Read-Write error recovery page, direct access */
2188		len = resp_err_recov_pg(ap, pcontrol, target);
2189		offset += len;
2190		break;
2191	case 0x2:	/* Disconnect-Reconnect page, all devices */
2192		len = resp_disconnect_pg(ap, pcontrol, target);
2193		offset += len;
2194		break;
2195	case 0x3:       /* Format device page, direct access */
2196		if (is_disk) {
2197			len = resp_format_pg(ap, pcontrol, target);
2198			offset += len;
2199		} else
2200			bad_pcode = true;
2201		break;
2202	case 0x8:	/* Caching page, direct access */
2203		if (is_disk) {
2204			len = resp_caching_pg(ap, pcontrol, target);
2205			offset += len;
2206		} else
2207			bad_pcode = true;
2208		break;
2209	case 0xa:	/* Control Mode page, all devices */
2210		len = resp_ctrl_m_pg(ap, pcontrol, target);
2211		offset += len;
2212		break;
2213	case 0x19:	/* if spc==1 then sas phy, control+discover */
2214		if ((subpcode > 0x2) && (subpcode < 0xff)) {
2215			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2216			return check_condition_result;
2217		}
2218		len = 0;
2219		if ((0x0 == subpcode) || (0xff == subpcode))
2220			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2221		if ((0x1 == subpcode) || (0xff == subpcode))
2222			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2223						  target_dev_id);
2224		if ((0x2 == subpcode) || (0xff == subpcode))
2225			len += resp_sas_sha_m_spg(ap + len, pcontrol);
2226		offset += len;
2227		break;
2228	case 0x1c:	/* Informational Exceptions Mode page, all devices */
2229		len = resp_iec_m_pg(ap, pcontrol, target);
2230		offset += len;
2231		break;
2232	case 0x3f:	/* Read all Mode pages */
2233		if ((0 == subpcode) || (0xff == subpcode)) {
2234			len = resp_err_recov_pg(ap, pcontrol, target);
2235			len += resp_disconnect_pg(ap + len, pcontrol, target);
2236			if (is_disk) {
2237				len += resp_format_pg(ap + len, pcontrol,
2238						      target);
2239				len += resp_caching_pg(ap + len, pcontrol,
2240						       target);
 
 
 
2241			}
2242			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2243			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2244			if (0xff == subpcode) {
2245				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2246						  target, target_dev_id);
2247				len += resp_sas_sha_m_spg(ap + len, pcontrol);
2248			}
2249			len += resp_iec_m_pg(ap + len, pcontrol, target);
2250			offset += len;
2251		} else {
2252			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2253			return check_condition_result;
2254		}
2255		break;
2256	default:
2257		bad_pcode = true;
2258		break;
2259	}
2260	if (bad_pcode) {
2261		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2262		return check_condition_result;
2263	}
2264	if (msense_6)
2265		arr[0] = offset - 1;
2266	else
2267		put_unaligned_be16((offset - 2), arr + 0);
2268	return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
2269}
2270
2271#define SDEBUG_MAX_MSELECT_SZ 512
2272
2273static int resp_mode_select(struct scsi_cmnd *scp,
2274			    struct sdebug_dev_info *devip)
2275{
2276	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
2277	int param_len, res, mpage;
2278	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
2279	unsigned char *cmd = scp->cmnd;
2280	int mselect6 = (MODE_SELECT == cmd[0]);
2281
2282	memset(arr, 0, sizeof(arr));
2283	pf = cmd[1] & 0x10;
2284	sp = cmd[1] & 0x1;
2285	param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2286	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
2287		mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
2288		return check_condition_result;
2289	}
2290	res = fetch_to_dev_buffer(scp, arr, param_len);
2291	if (-1 == res)
2292		return DID_ERROR << 16;
2293	else if (sdebug_verbose && (res < param_len))
2294		sdev_printk(KERN_INFO, scp->device,
2295			    "%s: cdb indicated=%d, IO sent=%d bytes\n",
2296			    __func__, param_len, res);
2297	md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2298	bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
2299	if (md_len > 2) {
2300		mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
2301		return check_condition_result;
2302	}
2303	off = bd_len + (mselect6 ? 4 : 8);
2304	mpage = arr[off] & 0x3f;
2305	ps = !!(arr[off] & 0x80);
2306	if (ps) {
2307		mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
2308		return check_condition_result;
2309	}
2310	spf = !!(arr[off] & 0x40);
2311	pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
2312		       (arr[off + 1] + 2);
2313	if ((pg_len + off) > param_len) {
2314		mk_sense_buffer(scp, ILLEGAL_REQUEST,
2315				PARAMETER_LIST_LENGTH_ERR, 0);
2316		return check_condition_result;
2317	}
2318	switch (mpage) {
2319	case 0x8:      /* Caching Mode page */
2320		if (caching_pg[1] == arr[off + 1]) {
2321			memcpy(caching_pg + 2, arr + off + 2,
2322			       sizeof(caching_pg) - 2);
2323			goto set_mode_changed_ua;
2324		}
2325		break;
2326	case 0xa:      /* Control Mode page */
2327		if (ctrl_m_pg[1] == arr[off + 1]) {
2328			memcpy(ctrl_m_pg + 2, arr + off + 2,
2329			       sizeof(ctrl_m_pg) - 2);
2330			if (ctrl_m_pg[4] & 0x8)
2331				sdebug_wp = true;
2332			else
2333				sdebug_wp = false;
2334			sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
2335			goto set_mode_changed_ua;
2336		}
2337		break;
2338	case 0x1c:      /* Informational Exceptions Mode page */
2339		if (iec_m_pg[1] == arr[off + 1]) {
2340			memcpy(iec_m_pg + 2, arr + off + 2,
2341			       sizeof(iec_m_pg) - 2);
2342			goto set_mode_changed_ua;
2343		}
2344		break;
2345	default:
2346		break;
2347	}
2348	mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
2349	return check_condition_result;
2350set_mode_changed_ua:
2351	set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2352	return 0;
2353}
2354
2355static int resp_temp_l_pg(unsigned char *arr)
2356{
2357	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2358				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
2359		};
2360
2361	memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2362	return sizeof(temp_l_pg);
2363}
2364
2365static int resp_ie_l_pg(unsigned char *arr)
2366{
2367	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2368		};
2369
2370	memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2371	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
2372		arr[4] = THRESHOLD_EXCEEDED;
2373		arr[5] = 0xff;
2374	}
2375	return sizeof(ie_l_pg);
2376}
2377
2378#define SDEBUG_MAX_LSENSE_SZ 512
2379
2380static int resp_log_sense(struct scsi_cmnd *scp,
2381			  struct sdebug_dev_info *devip)
2382{
2383	int ppc, sp, pcode, subpcode, alloc_len, len, n;
2384	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
2385	unsigned char *cmd = scp->cmnd;
2386
2387	memset(arr, 0, sizeof(arr));
2388	ppc = cmd[1] & 0x2;
2389	sp = cmd[1] & 0x1;
2390	if (ppc || sp) {
2391		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
2392		return check_condition_result;
2393	}
2394	pcode = cmd[2] & 0x3f;
2395	subpcode = cmd[3] & 0xff;
2396	alloc_len = get_unaligned_be16(cmd + 7);
2397	arr[0] = pcode;
2398	if (0 == subpcode) {
2399		switch (pcode) {
2400		case 0x0:	/* Supported log pages log page */
2401			n = 4;
2402			arr[n++] = 0x0;		/* this page */
2403			arr[n++] = 0xd;		/* Temperature */
2404			arr[n++] = 0x2f;	/* Informational exceptions */
2405			arr[3] = n - 4;
2406			break;
2407		case 0xd:	/* Temperature log page */
2408			arr[3] = resp_temp_l_pg(arr + 4);
2409			break;
2410		case 0x2f:	/* Informational exceptions log page */
2411			arr[3] = resp_ie_l_pg(arr + 4);
2412			break;
2413		default:
2414			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2415			return check_condition_result;
2416		}
2417	} else if (0xff == subpcode) {
2418		arr[0] |= 0x40;
2419		arr[1] = subpcode;
2420		switch (pcode) {
2421		case 0x0:	/* Supported log pages and subpages log page */
2422			n = 4;
2423			arr[n++] = 0x0;
2424			arr[n++] = 0x0;		/* 0,0 page */
2425			arr[n++] = 0x0;
2426			arr[n++] = 0xff;	/* this page */
2427			arr[n++] = 0xd;
2428			arr[n++] = 0x0;		/* Temperature */
2429			arr[n++] = 0x2f;
2430			arr[n++] = 0x0;	/* Informational exceptions */
2431			arr[3] = n - 4;
2432			break;
2433		case 0xd:	/* Temperature subpages */
2434			n = 4;
2435			arr[n++] = 0xd;
2436			arr[n++] = 0x0;		/* Temperature */
2437			arr[3] = n - 4;
2438			break;
2439		case 0x2f:	/* Informational exceptions subpages */
2440			n = 4;
2441			arr[n++] = 0x2f;
2442			arr[n++] = 0x0;		/* Informational exceptions */
2443			arr[3] = n - 4;
2444			break;
2445		default:
2446			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2447			return check_condition_result;
2448		}
2449	} else {
2450		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2451		return check_condition_result;
2452	}
2453	len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
2454	return fill_from_dev_buffer(scp, arr,
2455		    min(len, SDEBUG_MAX_INQ_ARR_SZ));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2456}
2457
2458static inline int check_device_access_params(struct scsi_cmnd *scp,
2459	unsigned long long lba, unsigned int num, bool write)
 
2460{
 
 
 
2461	if (lba + num > sdebug_capacity) {
2462		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2463		return check_condition_result;
2464	}
2465	/* transfer length excessive (tie in to block limits VPD page) */
2466	if (num > sdebug_store_sectors) {
2467		/* needs work to find which cdb byte 'num' comes from */
2468		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2469		return check_condition_result;
2470	}
2471	if (write && unlikely(sdebug_wp)) {
2472		mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
2473		return check_condition_result;
2474	}
 
 
 
2475	return 0;
2476}
2477
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2478/* Returns number of bytes copied or -1 if error. */
2479static int do_device_access(struct scsi_cmnd *scmd, u32 sg_skip, u64 lba,
2480			    u32 num, bool do_write)
2481{
2482	int ret;
2483	u64 block, rest = 0;
2484	struct scsi_data_buffer *sdb = &scmd->sdb;
2485	enum dma_data_direction dir;
 
 
2486
2487	if (do_write) {
2488		dir = DMA_TO_DEVICE;
2489		write_since_sync = true;
2490	} else {
2491		dir = DMA_FROM_DEVICE;
2492	}
2493
2494	if (!sdb->length)
2495		return 0;
2496	if (scmd->sc_data_direction != dir)
2497		return -1;
 
2498
2499	block = do_div(lba, sdebug_store_sectors);
2500	if (block + num > sdebug_store_sectors)
2501		rest = block + num - sdebug_store_sectors;
2502
2503	ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2504		   fake_storep + (block * sdebug_sector_size),
2505		   (num - rest) * sdebug_sector_size, sg_skip, do_write);
2506	if (ret != (num - rest) * sdebug_sector_size)
2507		return ret;
2508
2509	if (rest) {
2510		ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2511			    fake_storep, rest * sdebug_sector_size,
2512			    sg_skip + ((num - rest) * sdebug_sector_size),
2513			    do_write);
2514	}
2515
2516	return ret;
2517}
2518
2519/* If lba2fake_store(lba,num) compares equal to arr(num), then copy top half of
2520 * arr into lba2fake_store(lba,num) and return true. If comparison fails then
 
 
 
 
 
 
 
 
 
 
 
 
 
2521 * return false. */
2522static bool comp_write_worker(u64 lba, u32 num, const u8 *arr)
 
2523{
2524	bool res;
2525	u64 block, rest = 0;
2526	u32 store_blks = sdebug_store_sectors;
2527	u32 lb_size = sdebug_sector_size;
 
2528
2529	block = do_div(lba, store_blks);
2530	if (block + num > store_blks)
2531		rest = block + num - store_blks;
2532
2533	res = !memcmp(fake_storep + (block * lb_size), arr,
2534		      (num - rest) * lb_size);
2535	if (!res)
2536		return res;
2537	if (rest)
2538		res = memcmp(fake_storep, arr + ((num - rest) * lb_size),
2539			     rest * lb_size);
2540	if (!res)
2541		return res;
 
 
2542	arr += num * lb_size;
2543	memcpy(fake_storep + (block * lb_size), arr, (num - rest) * lb_size);
2544	if (rest)
2545		memcpy(fake_storep, arr + ((num - rest) * lb_size),
2546		       rest * lb_size);
2547	return res;
2548}
2549
2550static __be16 dif_compute_csum(const void *buf, int len)
2551{
2552	__be16 csum;
2553
2554	if (sdebug_guard)
2555		csum = (__force __be16)ip_compute_csum(buf, len);
2556	else
2557		csum = cpu_to_be16(crc_t10dif(buf, len));
2558
2559	return csum;
2560}
2561
2562static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
2563		      sector_t sector, u32 ei_lba)
2564{
2565	__be16 csum = dif_compute_csum(data, sdebug_sector_size);
2566
2567	if (sdt->guard_tag != csum) {
2568		pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
2569			(unsigned long)sector,
2570			be16_to_cpu(sdt->guard_tag),
2571			be16_to_cpu(csum));
2572		return 0x01;
2573	}
2574	if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
2575	    be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
2576		pr_err("REF check failed on sector %lu\n",
2577			(unsigned long)sector);
2578		return 0x03;
2579	}
2580	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2581	    be32_to_cpu(sdt->ref_tag) != ei_lba) {
2582		pr_err("REF check failed on sector %lu\n",
2583			(unsigned long)sector);
2584		return 0x03;
2585	}
2586	return 0;
2587}
2588
2589static void dif_copy_prot(struct scsi_cmnd *SCpnt, sector_t sector,
2590			  unsigned int sectors, bool read)
2591{
2592	size_t resid;
2593	void *paddr;
 
 
 
2594	const void *dif_store_end = dif_storep + sdebug_store_sectors;
2595	struct sg_mapping_iter miter;
2596
2597	/* Bytes of protection data to copy into sgl */
2598	resid = sectors * sizeof(*dif_storep);
2599
2600	sg_miter_start(&miter, scsi_prot_sglist(SCpnt),
2601			scsi_prot_sg_count(SCpnt), SG_MITER_ATOMIC |
2602			(read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
2603
2604	while (sg_miter_next(&miter) && resid > 0) {
2605		size_t len = min(miter.length, resid);
2606		void *start = dif_store(sector);
2607		size_t rest = 0;
2608
2609		if (dif_store_end < start + len)
2610			rest = start + len - dif_store_end;
2611
2612		paddr = miter.addr;
2613
2614		if (read)
2615			memcpy(paddr, start, len - rest);
2616		else
2617			memcpy(start, paddr, len - rest);
2618
2619		if (rest) {
2620			if (read)
2621				memcpy(paddr + len - rest, dif_storep, rest);
2622			else
2623				memcpy(dif_storep, paddr + len - rest, rest);
2624		}
2625
2626		sector += len / sizeof(*dif_storep);
2627		resid -= len;
2628	}
2629	sg_miter_stop(&miter);
2630}
2631
2632static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
2633			    unsigned int sectors, u32 ei_lba)
2634{
2635	unsigned int i;
 
 
 
2636	struct t10_pi_tuple *sdt;
2637	sector_t sector;
2638
2639	for (i = 0; i < sectors; i++, ei_lba++) {
2640		int ret;
2641
2642		sector = start_sec + i;
2643		sdt = dif_store(sector);
2644
2645		if (sdt->app_tag == cpu_to_be16(0xffff))
2646			continue;
2647
2648		ret = dif_verify(sdt, lba2fake_store(sector), sector, ei_lba);
 
2649		if (ret) {
2650			dif_errors++;
2651			return ret;
2652		}
2653	}
2654
2655	dif_copy_prot(SCpnt, start_sec, sectors, true);
2656	dix_reads++;
2657
2658	return 0;
2659}
2660
2661static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
2662{
2663	u8 *cmd = scp->cmnd;
2664	struct sdebug_queued_cmd *sqcp;
2665	u64 lba;
2666	u32 num;
2667	u32 ei_lba;
2668	unsigned long iflags;
2669	int ret;
2670	bool check_prot;
 
 
 
2671
2672	switch (cmd[0]) {
2673	case READ_16:
2674		ei_lba = 0;
2675		lba = get_unaligned_be64(cmd + 2);
2676		num = get_unaligned_be32(cmd + 10);
2677		check_prot = true;
2678		break;
2679	case READ_10:
2680		ei_lba = 0;
2681		lba = get_unaligned_be32(cmd + 2);
2682		num = get_unaligned_be16(cmd + 7);
2683		check_prot = true;
2684		break;
2685	case READ_6:
2686		ei_lba = 0;
2687		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2688		      (u32)(cmd[1] & 0x1f) << 16;
2689		num = (0 == cmd[4]) ? 256 : cmd[4];
2690		check_prot = true;
2691		break;
2692	case READ_12:
2693		ei_lba = 0;
2694		lba = get_unaligned_be32(cmd + 2);
2695		num = get_unaligned_be32(cmd + 6);
2696		check_prot = true;
2697		break;
2698	case XDWRITEREAD_10:
2699		ei_lba = 0;
2700		lba = get_unaligned_be32(cmd + 2);
2701		num = get_unaligned_be16(cmd + 7);
2702		check_prot = false;
2703		break;
2704	default:	/* assume READ(32) */
2705		lba = get_unaligned_be64(cmd + 12);
2706		ei_lba = get_unaligned_be32(cmd + 20);
2707		num = get_unaligned_be32(cmd + 28);
2708		check_prot = false;
2709		break;
2710	}
2711	if (unlikely(have_dif_prot && check_prot)) {
2712		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2713		    (cmd[1] & 0xe0)) {
2714			mk_sense_invalid_opcode(scp);
2715			return check_condition_result;
2716		}
2717		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
2718		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
2719		    (cmd[1] & 0xe0) == 0)
2720			sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
2721				    "to DIF device\n");
2722	}
2723	if (unlikely(sdebug_any_injecting_opt)) {
2724		sqcp = (struct sdebug_queued_cmd *)scp->host_scribble;
2725
2726		if (sqcp) {
2727			if (sqcp->inj_short)
2728				num /= 2;
2729		}
2730	} else
2731		sqcp = NULL;
2732
2733	ret = check_device_access_params(scp, lba, num, false);
2734	if (ret)
2735		return ret;
2736	if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
2737		     (lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
2738		     ((lba + num) > sdebug_medium_error_start))) {
2739		/* claim unrecoverable read error */
2740		mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
2741		/* set info field and valid bit for fixed descriptor */
2742		if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
2743			scp->sense_buffer[0] |= 0x80;	/* Valid bit */
2744			ret = (lba < OPT_MEDIUM_ERR_ADDR)
2745			      ? OPT_MEDIUM_ERR_ADDR : (int)lba;
2746			put_unaligned_be32(ret, scp->sense_buffer + 3);
2747		}
2748		scsi_set_resid(scp, scsi_bufflen(scp));
2749		return check_condition_result;
2750	}
2751
2752	read_lock_irqsave(&atomic_rw, iflags);
2753
2754	/* DIX + T10 DIF */
2755	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
2756		int prot_ret = prot_verify_read(scp, lba, num, ei_lba);
2757
2758		if (prot_ret) {
2759			read_unlock_irqrestore(&atomic_rw, iflags);
2760			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, prot_ret);
2761			return illegal_condition_result;
2762		}
2763	}
2764
2765	ret = do_device_access(scp, 0, lba, num, false);
2766	read_unlock_irqrestore(&atomic_rw, iflags);
2767	if (unlikely(ret == -1))
2768		return DID_ERROR << 16;
2769
2770	scsi_set_resid(scp, scsi_bufflen(scp) - ret);
2771
2772	if (unlikely(sqcp)) {
2773		if (sqcp->inj_recovered) {
2774			mk_sense_buffer(scp, RECOVERED_ERROR,
2775					THRESHOLD_EXCEEDED, 0);
 
2776			return check_condition_result;
2777		} else if (sqcp->inj_transport) {
2778			mk_sense_buffer(scp, ABORTED_COMMAND,
2779					TRANSPORT_PROBLEM, ACK_NAK_TO);
2780			return check_condition_result;
2781		} else if (sqcp->inj_dif) {
2782			/* Logical block guard check failed */
2783			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
 
2784			return illegal_condition_result;
2785		} else if (sqcp->inj_dix) {
2786			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
 
2787			return illegal_condition_result;
2788		}
2789	}
2790	return 0;
2791}
2792
2793static void dump_sector(unsigned char *buf, int len)
2794{
2795	int i, j, n;
2796
2797	pr_err(">>> Sector Dump <<<\n");
2798	for (i = 0 ; i < len ; i += 16) {
2799		char b[128];
2800
2801		for (j = 0, n = 0; j < 16; j++) {
2802			unsigned char c = buf[i+j];
2803
2804			if (c >= 0x20 && c < 0x7e)
2805				n += scnprintf(b + n, sizeof(b) - n,
2806					       " %c ", buf[i+j]);
2807			else
2808				n += scnprintf(b + n, sizeof(b) - n,
2809					       "%02x ", buf[i+j]);
2810		}
2811		pr_err("%04d: %s\n", i, b);
2812	}
2813}
2814
2815static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
2816			     unsigned int sectors, u32 ei_lba)
2817{
2818	int ret;
2819	struct t10_pi_tuple *sdt;
2820	void *daddr;
2821	sector_t sector = start_sec;
2822	int ppage_offset;
2823	int dpage_offset;
2824	struct sg_mapping_iter diter;
2825	struct sg_mapping_iter piter;
2826
2827	BUG_ON(scsi_sg_count(SCpnt) == 0);
2828	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
2829
2830	sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
2831			scsi_prot_sg_count(SCpnt),
2832			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2833	sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
2834			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2835
2836	/* For each protection page */
2837	while (sg_miter_next(&piter)) {
2838		dpage_offset = 0;
2839		if (WARN_ON(!sg_miter_next(&diter))) {
2840			ret = 0x01;
2841			goto out;
2842		}
2843
2844		for (ppage_offset = 0; ppage_offset < piter.length;
2845		     ppage_offset += sizeof(struct t10_pi_tuple)) {
2846			/* If we're at the end of the current
2847			 * data page advance to the next one
2848			 */
2849			if (dpage_offset >= diter.length) {
2850				if (WARN_ON(!sg_miter_next(&diter))) {
2851					ret = 0x01;
2852					goto out;
2853				}
2854				dpage_offset = 0;
2855			}
2856
2857			sdt = piter.addr + ppage_offset;
2858			daddr = diter.addr + dpage_offset;
2859
2860			ret = dif_verify(sdt, daddr, sector, ei_lba);
2861			if (ret) {
2862				dump_sector(daddr, sdebug_sector_size);
2863				goto out;
2864			}
2865
2866			sector++;
2867			ei_lba++;
2868			dpage_offset += sdebug_sector_size;
2869		}
2870		diter.consumed = dpage_offset;
2871		sg_miter_stop(&diter);
2872	}
2873	sg_miter_stop(&piter);
2874
2875	dif_copy_prot(SCpnt, start_sec, sectors, false);
2876	dix_writes++;
2877
2878	return 0;
2879
2880out:
2881	dif_errors++;
2882	sg_miter_stop(&diter);
2883	sg_miter_stop(&piter);
2884	return ret;
2885}
2886
2887static unsigned long lba_to_map_index(sector_t lba)
2888{
2889	if (sdebug_unmap_alignment)
2890		lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
2891	sector_div(lba, sdebug_unmap_granularity);
2892	return lba;
2893}
2894
2895static sector_t map_index_to_lba(unsigned long index)
2896{
2897	sector_t lba = index * sdebug_unmap_granularity;
2898
2899	if (sdebug_unmap_alignment)
2900		lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
2901	return lba;
2902}
2903
2904static unsigned int map_state(sector_t lba, unsigned int *num)
 
2905{
2906	sector_t end;
2907	unsigned int mapped;
2908	unsigned long index;
2909	unsigned long next;
2910
2911	index = lba_to_map_index(lba);
2912	mapped = test_bit(index, map_storep);
2913
2914	if (mapped)
2915		next = find_next_zero_bit(map_storep, map_size, index);
2916	else
2917		next = find_next_bit(map_storep, map_size, index);
2918
2919	end = min_t(sector_t, sdebug_store_sectors,  map_index_to_lba(next));
2920	*num = end - lba;
2921	return mapped;
2922}
2923
2924static void map_region(sector_t lba, unsigned int len)
 
2925{
2926	sector_t end = lba + len;
2927
2928	while (lba < end) {
2929		unsigned long index = lba_to_map_index(lba);
2930
2931		if (index < map_size)
2932			set_bit(index, map_storep);
2933
2934		lba = map_index_to_lba(index + 1);
2935	}
2936}
2937
2938static void unmap_region(sector_t lba, unsigned int len)
 
2939{
2940	sector_t end = lba + len;
 
2941
2942	while (lba < end) {
2943		unsigned long index = lba_to_map_index(lba);
2944
2945		if (lba == map_index_to_lba(index) &&
2946		    lba + sdebug_unmap_granularity <= end &&
2947		    index < map_size) {
2948			clear_bit(index, map_storep);
2949			if (sdebug_lbprz) {  /* for LBPRZ=2 return 0xff_s */
2950				memset(fake_storep +
2951				       lba * sdebug_sector_size,
2952				       (sdebug_lbprz & 1) ? 0 : 0xff,
2953				       sdebug_sector_size *
2954				       sdebug_unmap_granularity);
2955			}
2956			if (dif_storep) {
2957				memset(dif_storep + lba, 0xff,
2958				       sizeof(*dif_storep) *
2959				       sdebug_unmap_granularity);
2960			}
2961		}
2962		lba = map_index_to_lba(index + 1);
2963	}
2964}
2965
2966static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
2967{
2968	u8 *cmd = scp->cmnd;
2969	u64 lba;
2970	u32 num;
2971	u32 ei_lba;
2972	unsigned long iflags;
2973	int ret;
2974	bool check_prot;
 
 
 
2975
2976	switch (cmd[0]) {
2977	case WRITE_16:
2978		ei_lba = 0;
2979		lba = get_unaligned_be64(cmd + 2);
2980		num = get_unaligned_be32(cmd + 10);
2981		check_prot = true;
2982		break;
2983	case WRITE_10:
2984		ei_lba = 0;
2985		lba = get_unaligned_be32(cmd + 2);
2986		num = get_unaligned_be16(cmd + 7);
2987		check_prot = true;
2988		break;
2989	case WRITE_6:
2990		ei_lba = 0;
2991		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2992		      (u32)(cmd[1] & 0x1f) << 16;
2993		num = (0 == cmd[4]) ? 256 : cmd[4];
2994		check_prot = true;
2995		break;
2996	case WRITE_12:
2997		ei_lba = 0;
2998		lba = get_unaligned_be32(cmd + 2);
2999		num = get_unaligned_be32(cmd + 6);
3000		check_prot = true;
3001		break;
3002	case 0x53:	/* XDWRITEREAD(10) */
3003		ei_lba = 0;
3004		lba = get_unaligned_be32(cmd + 2);
3005		num = get_unaligned_be16(cmd + 7);
3006		check_prot = false;
3007		break;
3008	default:	/* assume WRITE(32) */
3009		lba = get_unaligned_be64(cmd + 12);
3010		ei_lba = get_unaligned_be32(cmd + 20);
3011		num = get_unaligned_be32(cmd + 28);
3012		check_prot = false;
3013		break;
3014	}
3015	if (unlikely(have_dif_prot && check_prot)) {
3016		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3017		    (cmd[1] & 0xe0)) {
3018			mk_sense_invalid_opcode(scp);
3019			return check_condition_result;
3020		}
3021		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3022		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3023		    (cmd[1] & 0xe0) == 0)
3024			sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3025				    "to DIF device\n");
3026	}
 
 
3027	ret = check_device_access_params(scp, lba, num, true);
3028	if (ret)
 
3029		return ret;
3030	write_lock_irqsave(&atomic_rw, iflags);
3031
3032	/* DIX + T10 DIF */
3033	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3034		int prot_ret = prot_verify_write(scp, lba, num, ei_lba);
3035
3036		if (prot_ret) {
3037			write_unlock_irqrestore(&atomic_rw, iflags);
3038			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, prot_ret);
3039			return illegal_condition_result;
3040		}
3041	}
3042
3043	ret = do_device_access(scp, 0, lba, num, true);
3044	if (unlikely(scsi_debug_lbp()))
3045		map_region(lba, num);
3046	write_unlock_irqrestore(&atomic_rw, iflags);
 
 
 
3047	if (unlikely(-1 == ret))
3048		return DID_ERROR << 16;
3049	else if (unlikely(sdebug_verbose &&
3050			  (ret < (num * sdebug_sector_size))))
3051		sdev_printk(KERN_INFO, scp->device,
3052			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3053			    my_name, num * sdebug_sector_size, ret);
3054
3055	if (unlikely(sdebug_any_injecting_opt)) {
3056		struct sdebug_queued_cmd *sqcp =
3057				(struct sdebug_queued_cmd *)scp->host_scribble;
3058
3059		if (sqcp) {
3060			if (sqcp->inj_recovered) {
3061				mk_sense_buffer(scp, RECOVERED_ERROR,
3062						THRESHOLD_EXCEEDED, 0);
3063				return check_condition_result;
3064			} else if (sqcp->inj_dif) {
3065				/* Logical block guard check failed */
3066				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3067				return illegal_condition_result;
3068			} else if (sqcp->inj_dix) {
3069				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3070				return illegal_condition_result;
3071			}
3072		}
3073	}
3074	return 0;
3075}
3076
3077/*
3078 * T10 has only specified WRITE SCATTERED(16) and WRITE SCATTERED(32).
3079 * No READ GATHERED yet (requires bidi or long cdb holding gather list).
3080 */
3081static int resp_write_scat(struct scsi_cmnd *scp,
3082			   struct sdebug_dev_info *devip)
3083{
3084	u8 *cmd = scp->cmnd;
3085	u8 *lrdp = NULL;
3086	u8 *up;
 
 
3087	u8 wrprotect;
3088	u16 lbdof, num_lrd, k;
3089	u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
3090	u32 lb_size = sdebug_sector_size;
3091	u32 ei_lba;
3092	u64 lba;
3093	unsigned long iflags;
3094	int ret, res;
3095	bool is_16;
3096	static const u32 lrd_size = 32; /* + parameter list header size */
3097
3098	if (cmd[0] == VARIABLE_LENGTH_CMD) {
3099		is_16 = false;
3100		wrprotect = (cmd[10] >> 5) & 0x7;
3101		lbdof = get_unaligned_be16(cmd + 12);
3102		num_lrd = get_unaligned_be16(cmd + 16);
3103		bt_len = get_unaligned_be32(cmd + 28);
3104	} else {        /* that leaves WRITE SCATTERED(16) */
3105		is_16 = true;
3106		wrprotect = (cmd[2] >> 5) & 0x7;
3107		lbdof = get_unaligned_be16(cmd + 4);
3108		num_lrd = get_unaligned_be16(cmd + 8);
3109		bt_len = get_unaligned_be32(cmd + 10);
3110		if (unlikely(have_dif_prot)) {
3111			if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3112			    wrprotect) {
3113				mk_sense_invalid_opcode(scp);
3114				return illegal_condition_result;
3115			}
3116			if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3117			     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3118			     wrprotect == 0)
3119				sdev_printk(KERN_ERR, scp->device,
3120					    "Unprotected WR to DIF device\n");
3121		}
3122	}
3123	if ((num_lrd == 0) || (bt_len == 0))
3124		return 0;       /* T10 says these do-nothings are not errors */
3125	if (lbdof == 0) {
3126		if (sdebug_verbose)
3127			sdev_printk(KERN_INFO, scp->device,
3128				"%s: %s: LB Data Offset field bad\n",
3129				my_name, __func__);
3130		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3131		return illegal_condition_result;
3132	}
3133	lbdof_blen = lbdof * lb_size;
3134	if ((lrd_size + (num_lrd * lrd_size)) > lbdof_blen) {
3135		if (sdebug_verbose)
3136			sdev_printk(KERN_INFO, scp->device,
3137				"%s: %s: LBA range descriptors don't fit\n",
3138				my_name, __func__);
3139		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3140		return illegal_condition_result;
3141	}
3142	lrdp = kzalloc(lbdof_blen, GFP_ATOMIC);
3143	if (lrdp == NULL)
3144		return SCSI_MLQUEUE_HOST_BUSY;
3145	if (sdebug_verbose)
3146		sdev_printk(KERN_INFO, scp->device,
3147			"%s: %s: Fetch header+scatter_list, lbdof_blen=%u\n",
3148			my_name, __func__, lbdof_blen);
3149	res = fetch_to_dev_buffer(scp, lrdp, lbdof_blen);
3150	if (res == -1) {
3151		ret = DID_ERROR << 16;
3152		goto err_out;
3153	}
3154
3155	write_lock_irqsave(&atomic_rw, iflags);
3156	sg_off = lbdof_blen;
3157	/* Spec says Buffer xfer Length field in number of LBs in dout */
3158	cum_lb = 0;
3159	for (k = 0, up = lrdp + lrd_size; k < num_lrd; ++k, up += lrd_size) {
3160		lba = get_unaligned_be64(up + 0);
3161		num = get_unaligned_be32(up + 8);
3162		if (sdebug_verbose)
3163			sdev_printk(KERN_INFO, scp->device,
3164				"%s: %s: k=%d  LBA=0x%llx num=%u  sg_off=%u\n",
3165				my_name, __func__, k, lba, num, sg_off);
3166		if (num == 0)
3167			continue;
3168		ret = check_device_access_params(scp, lba, num, true);
3169		if (ret)
3170			goto err_out_unlock;
3171		num_by = num * lb_size;
3172		ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
3173
3174		if ((cum_lb + num) > bt_len) {
3175			if (sdebug_verbose)
3176				sdev_printk(KERN_INFO, scp->device,
3177				    "%s: %s: sum of blocks > data provided\n",
3178				    my_name, __func__);
3179			mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
3180					0);
3181			ret = illegal_condition_result;
3182			goto err_out_unlock;
3183		}
3184
3185		/* DIX + T10 DIF */
3186		if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3187			int prot_ret = prot_verify_write(scp, lba, num,
3188							 ei_lba);
3189
3190			if (prot_ret) {
3191				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
3192						prot_ret);
3193				ret = illegal_condition_result;
3194				goto err_out_unlock;
3195			}
3196		}
3197
3198		ret = do_device_access(scp, sg_off, lba, num, true);
 
 
 
3199		if (unlikely(scsi_debug_lbp()))
3200			map_region(lba, num);
3201		if (unlikely(-1 == ret)) {
3202			ret = DID_ERROR << 16;
3203			goto err_out_unlock;
3204		} else if (unlikely(sdebug_verbose && (ret < num_by)))
3205			sdev_printk(KERN_INFO, scp->device,
3206			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3207			    my_name, num_by, ret);
3208
3209		if (unlikely(sdebug_any_injecting_opt)) {
3210			struct sdebug_queued_cmd *sqcp =
3211				(struct sdebug_queued_cmd *)scp->host_scribble;
3212
3213			if (sqcp) {
3214				if (sqcp->inj_recovered) {
3215					mk_sense_buffer(scp, RECOVERED_ERROR,
3216							THRESHOLD_EXCEEDED, 0);
3217					ret = illegal_condition_result;
3218					goto err_out_unlock;
3219				} else if (sqcp->inj_dif) {
3220					/* Logical block guard check failed */
3221					mk_sense_buffer(scp, ABORTED_COMMAND,
3222							0x10, 1);
3223					ret = illegal_condition_result;
3224					goto err_out_unlock;
3225				} else if (sqcp->inj_dix) {
3226					mk_sense_buffer(scp, ILLEGAL_REQUEST,
3227							0x10, 1);
3228					ret = illegal_condition_result;
3229					goto err_out_unlock;
3230				}
3231			}
3232		}
3233		sg_off += num_by;
3234		cum_lb += num;
3235	}
3236	ret = 0;
3237err_out_unlock:
3238	write_unlock_irqrestore(&atomic_rw, iflags);
3239err_out:
3240	kfree(lrdp);
3241	return ret;
3242}
3243
3244static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
3245			   u32 ei_lba, bool unmap, bool ndob)
3246{
3247	int ret;
3248	unsigned long iflags;
3249	unsigned long long i;
 
3250	u32 lb_size = sdebug_sector_size;
3251	u64 block, lbaa;
 
 
 
3252	u8 *fs1p;
 
 
 
3253
3254	ret = check_device_access_params(scp, lba, num, true);
3255	if (ret)
 
3256		return ret;
3257
3258	write_lock_irqsave(&atomic_rw, iflags);
3259
3260	if (unmap && scsi_debug_lbp()) {
3261		unmap_region(lba, num);
3262		goto out;
3263	}
3264	lbaa = lba;
3265	block = do_div(lbaa, sdebug_store_sectors);
3266	/* if ndob then zero 1 logical block, else fetch 1 logical block */
3267	fs1p = fake_storep + (block * lb_size);
 
3268	if (ndob) {
3269		memset(fs1p, 0, lb_size);
3270		ret = 0;
3271	} else
3272		ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
3273
3274	if (-1 == ret) {
3275		write_unlock_irqrestore(&atomic_rw, iflags);
3276		return DID_ERROR << 16;
3277	} else if (sdebug_verbose && !ndob && (ret < lb_size))
3278		sdev_printk(KERN_INFO, scp->device,
3279			    "%s: %s: lb size=%u, IO sent=%d bytes\n",
3280			    my_name, "write same", lb_size, ret);
3281
3282	/* Copy first sector to remaining blocks */
3283	for (i = 1 ; i < num ; i++) {
3284		lbaa = lba + i;
3285		block = do_div(lbaa, sdebug_store_sectors);
3286		memmove(fake_storep + (block * lb_size), fs1p, lb_size);
3287	}
3288	if (scsi_debug_lbp())
3289		map_region(lba, num);
 
 
 
3290out:
3291	write_unlock_irqrestore(&atomic_rw, iflags);
3292
3293	return 0;
3294}
3295
3296static int resp_write_same_10(struct scsi_cmnd *scp,
3297			      struct sdebug_dev_info *devip)
3298{
3299	u8 *cmd = scp->cmnd;
3300	u32 lba;
3301	u16 num;
3302	u32 ei_lba = 0;
3303	bool unmap = false;
3304
3305	if (cmd[1] & 0x8) {
3306		if (sdebug_lbpws10 == 0) {
3307			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3308			return check_condition_result;
3309		} else
3310			unmap = true;
3311	}
3312	lba = get_unaligned_be32(cmd + 2);
3313	num = get_unaligned_be16(cmd + 7);
3314	if (num > sdebug_write_same_length) {
3315		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3316		return check_condition_result;
3317	}
3318	return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3319}
3320
3321static int resp_write_same_16(struct scsi_cmnd *scp,
3322			      struct sdebug_dev_info *devip)
3323{
3324	u8 *cmd = scp->cmnd;
3325	u64 lba;
3326	u32 num;
3327	u32 ei_lba = 0;
3328	bool unmap = false;
3329	bool ndob = false;
3330
3331	if (cmd[1] & 0x8) {	/* UNMAP */
3332		if (sdebug_lbpws == 0) {
3333			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3334			return check_condition_result;
3335		} else
3336			unmap = true;
3337	}
3338	if (cmd[1] & 0x1)  /* NDOB (no data-out buffer, assumes zeroes) */
3339		ndob = true;
3340	lba = get_unaligned_be64(cmd + 2);
3341	num = get_unaligned_be32(cmd + 10);
3342	if (num > sdebug_write_same_length) {
3343		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3344		return check_condition_result;
3345	}
3346	return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3347}
3348
3349/* Note the mode field is in the same position as the (lower) service action
3350 * field. For the Report supported operation codes command, SPC-4 suggests
3351 * each mode of this command should be reported separately; for future. */
3352static int resp_write_buffer(struct scsi_cmnd *scp,
3353			     struct sdebug_dev_info *devip)
3354{
3355	u8 *cmd = scp->cmnd;
3356	struct scsi_device *sdp = scp->device;
3357	struct sdebug_dev_info *dp;
3358	u8 mode;
3359
3360	mode = cmd[1] & 0x1f;
3361	switch (mode) {
3362	case 0x4:	/* download microcode (MC) and activate (ACT) */
3363		/* set UAs on this device only */
3364		set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3365		set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
3366		break;
3367	case 0x5:	/* download MC, save and ACT */
3368		set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
3369		break;
3370	case 0x6:	/* download MC with offsets and ACT */
3371		/* set UAs on most devices (LUs) in this target */
3372		list_for_each_entry(dp,
3373				    &devip->sdbg_host->dev_info_list,
3374				    dev_list)
3375			if (dp->target == sdp->id) {
3376				set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
3377				if (devip != dp)
3378					set_bit(SDEBUG_UA_MICROCODE_CHANGED,
3379						dp->uas_bm);
3380			}
3381		break;
3382	case 0x7:	/* download MC with offsets, save, and ACT */
3383		/* set UA on all devices (LUs) in this target */
3384		list_for_each_entry(dp,
3385				    &devip->sdbg_host->dev_info_list,
3386				    dev_list)
3387			if (dp->target == sdp->id)
3388				set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
3389					dp->uas_bm);
3390		break;
3391	default:
3392		/* do nothing for this command for other mode values */
3393		break;
3394	}
3395	return 0;
3396}
3397
3398static int resp_comp_write(struct scsi_cmnd *scp,
3399			   struct sdebug_dev_info *devip)
3400{
3401	u8 *cmd = scp->cmnd;
3402	u8 *arr;
3403	u8 *fake_storep_hold;
 
3404	u64 lba;
3405	u32 dnum;
3406	u32 lb_size = sdebug_sector_size;
3407	u8 num;
3408	unsigned long iflags;
3409	int ret;
3410	int retval = 0;
3411
3412	lba = get_unaligned_be64(cmd + 2);
3413	num = cmd[13];		/* 1 to a maximum of 255 logical blocks */
3414	if (0 == num)
3415		return 0;	/* degenerate case, not an error */
3416	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3417	    (cmd[1] & 0xe0)) {
3418		mk_sense_invalid_opcode(scp);
3419		return check_condition_result;
3420	}
3421	if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3422	     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3423	    (cmd[1] & 0xe0) == 0)
3424		sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3425			    "to DIF device\n");
3426	ret = check_device_access_params(scp, lba, num, false);
3427	if (ret)
3428		return ret;
3429	dnum = 2 * num;
3430	arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
3431	if (NULL == arr) {
3432		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3433				INSUFF_RES_ASCQ);
3434		return check_condition_result;
3435	}
3436
3437	write_lock_irqsave(&atomic_rw, iflags);
3438
3439	/* trick do_device_access() to fetch both compare and write buffers
3440	 * from data-in into arr. Safe (atomic) since write_lock held. */
3441	fake_storep_hold = fake_storep;
3442	fake_storep = arr;
3443	ret = do_device_access(scp, 0, 0, dnum, true);
3444	fake_storep = fake_storep_hold;
3445	if (ret == -1) {
3446		retval = DID_ERROR << 16;
3447		goto cleanup;
3448	} else if (sdebug_verbose && (ret < (dnum * lb_size)))
3449		sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
3450			    "indicated=%u, IO sent=%d bytes\n", my_name,
3451			    dnum * lb_size, ret);
3452	if (!comp_write_worker(lba, num, arr)) {
3453		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
3454		retval = check_condition_result;
3455		goto cleanup;
3456	}
3457	if (scsi_debug_lbp())
3458		map_region(lba, num);
3459cleanup:
3460	write_unlock_irqrestore(&atomic_rw, iflags);
3461	kfree(arr);
3462	return retval;
3463}
3464
3465struct unmap_block_desc {
3466	__be64	lba;
3467	__be32	blocks;
3468	__be32	__reserved;
3469};
3470
3471static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3472{
3473	unsigned char *buf;
3474	struct unmap_block_desc *desc;
 
 
3475	unsigned int i, payload_len, descriptors;
3476	int ret;
3477	unsigned long iflags;
3478
3479
3480	if (!scsi_debug_lbp())
3481		return 0;	/* fib and say its done */
3482	payload_len = get_unaligned_be16(scp->cmnd + 7);
3483	BUG_ON(scsi_bufflen(scp) != payload_len);
3484
3485	descriptors = (payload_len - 8) / 16;
3486	if (descriptors > sdebug_unmap_max_desc) {
3487		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3488		return check_condition_result;
3489	}
3490
3491	buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
3492	if (!buf) {
3493		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3494				INSUFF_RES_ASCQ);
3495		return check_condition_result;
3496	}
3497
3498	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
3499
3500	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
3501	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
3502
3503	desc = (void *)&buf[8];
3504
3505	write_lock_irqsave(&atomic_rw, iflags);
3506
3507	for (i = 0 ; i < descriptors ; i++) {
3508		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
3509		unsigned int num = get_unaligned_be32(&desc[i].blocks);
3510
3511		ret = check_device_access_params(scp, lba, num, true);
3512		if (ret)
3513			goto out;
3514
3515		unmap_region(lba, num);
3516	}
3517
3518	ret = 0;
3519
3520out:
3521	write_unlock_irqrestore(&atomic_rw, iflags);
3522	kfree(buf);
3523
3524	return ret;
3525}
3526
3527#define SDEBUG_GET_LBA_STATUS_LEN 32
3528
3529static int resp_get_lba_status(struct scsi_cmnd *scp,
3530			       struct sdebug_dev_info *devip)
3531{
3532	u8 *cmd = scp->cmnd;
3533	u64 lba;
3534	u32 alloc_len, mapped, num;
 
3535	u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
3536	int ret;
3537
3538	lba = get_unaligned_be64(cmd + 2);
3539	alloc_len = get_unaligned_be32(cmd + 10);
3540
3541	if (alloc_len < 24)
3542		return 0;
3543
3544	ret = check_device_access_params(scp, lba, 1, false);
3545	if (ret)
3546		return ret;
3547
3548	if (scsi_debug_lbp())
3549		mapped = map_state(lba, &num);
3550	else {
 
 
3551		mapped = 1;
3552		/* following just in case virtual_gb changed */
3553		sdebug_capacity = get_sdebug_capacity();
3554		if (sdebug_capacity - lba <= 0xffffffff)
3555			num = sdebug_capacity - lba;
3556		else
3557			num = 0xffffffff;
3558	}
3559
3560	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
3561	put_unaligned_be32(20, arr);		/* Parameter Data Length */
3562	put_unaligned_be64(lba, arr + 8);	/* LBA */
3563	put_unaligned_be32(num, arr + 16);	/* Number of blocks */
3564	arr[20] = !mapped;		/* prov_stat=0: mapped; 1: dealloc */
3565
3566	return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
3567}
3568
3569static int resp_sync_cache(struct scsi_cmnd *scp,
3570			   struct sdebug_dev_info *devip)
3571{
3572	int res = 0;
3573	u64 lba;
3574	u32 num_blocks;
3575	u8 *cmd = scp->cmnd;
3576
3577	if (cmd[0] == SYNCHRONIZE_CACHE) {	/* 10 byte cdb */
3578		lba = get_unaligned_be32(cmd + 2);
3579		num_blocks = get_unaligned_be16(cmd + 7);
3580	} else {				/* SYNCHRONIZE_CACHE(16) */
3581		lba = get_unaligned_be64(cmd + 2);
3582		num_blocks = get_unaligned_be32(cmd + 10);
3583	}
3584	if (lba + num_blocks > sdebug_capacity) {
3585		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
3586		return check_condition_result;
3587	}
3588	if (!write_since_sync || cmd[1] & 0x2)
3589		res = SDEG_RES_IMMED_MASK;
3590	else		/* delay if write_since_sync and IMMED clear */
3591		write_since_sync = false;
3592	return res;
3593}
3594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3595#define RL_BUCKET_ELEMS 8
3596
3597/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
3598 * (W-LUN), the normal Linux scanning logic does not associate it with a
3599 * device (e.g. /dev/sg7). The following magic will make that association:
3600 *   "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
3601 * where <n> is a host number. If there are multiple targets in a host then
3602 * the above will associate a W-LUN to each target. To only get a W-LUN
3603 * for target 2, then use "echo '- 2 49409' > scan" .
3604 */
3605static int resp_report_luns(struct scsi_cmnd *scp,
3606			    struct sdebug_dev_info *devip)
3607{
3608	unsigned char *cmd = scp->cmnd;
3609	unsigned int alloc_len;
3610	unsigned char select_report;
3611	u64 lun;
3612	struct scsi_lun *lun_p;
3613	u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
3614	unsigned int lun_cnt;	/* normal LUN count (max: 256) */
3615	unsigned int wlun_cnt;	/* report luns W-LUN count */
3616	unsigned int tlun_cnt;	/* total LUN count */
3617	unsigned int rlen;	/* response length (in bytes) */
3618	int k, j, n, res;
3619	unsigned int off_rsp = 0;
3620	const int sz_lun = sizeof(struct scsi_lun);
3621
3622	clear_luns_changed_on_target(devip);
3623
3624	select_report = cmd[2];
3625	alloc_len = get_unaligned_be32(cmd + 6);
3626
3627	if (alloc_len < 4) {
3628		pr_err("alloc len too small %d\n", alloc_len);
3629		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
3630		return check_condition_result;
3631	}
3632
3633	switch (select_report) {
3634	case 0:		/* all LUNs apart from W-LUNs */
3635		lun_cnt = sdebug_max_luns;
3636		wlun_cnt = 0;
3637		break;
3638	case 1:		/* only W-LUNs */
3639		lun_cnt = 0;
3640		wlun_cnt = 1;
3641		break;
3642	case 2:		/* all LUNs */
3643		lun_cnt = sdebug_max_luns;
3644		wlun_cnt = 1;
3645		break;
3646	case 0x10:	/* only administrative LUs */
3647	case 0x11:	/* see SPC-5 */
3648	case 0x12:	/* only subsiduary LUs owned by referenced LU */
3649	default:
3650		pr_debug("select report invalid %d\n", select_report);
3651		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
3652		return check_condition_result;
3653	}
3654
3655	if (sdebug_no_lun_0 && (lun_cnt > 0))
3656		--lun_cnt;
3657
3658	tlun_cnt = lun_cnt + wlun_cnt;
3659	rlen = tlun_cnt * sz_lun;	/* excluding 8 byte header */
3660	scsi_set_resid(scp, scsi_bufflen(scp));
3661	pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
3662		 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
3663
3664	/* loops rely on sizeof response header same as sizeof lun (both 8) */
3665	lun = sdebug_no_lun_0 ? 1 : 0;
3666	for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
3667		memset(arr, 0, sizeof(arr));
3668		lun_p = (struct scsi_lun *)&arr[0];
3669		if (k == 0) {
3670			put_unaligned_be32(rlen, &arr[0]);
3671			++lun_p;
3672			j = 1;
3673		}
3674		for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
3675			if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
3676				break;
3677			int_to_scsilun(lun++, lun_p);
 
 
3678		}
3679		if (j < RL_BUCKET_ELEMS)
3680			break;
3681		n = j * sz_lun;
3682		res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
3683		if (res)
3684			return res;
3685		off_rsp += n;
3686	}
3687	if (wlun_cnt) {
3688		int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
3689		++j;
3690	}
3691	if (j > 0)
3692		res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
3693	return res;
3694}
3695
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3696static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
3697{
 
3698	u32 tag = blk_mq_unique_tag(cmnd->request);
3699	u16 hwq = blk_mq_unique_tag_to_hwq(tag);
 
3700
3701	pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
3702	if (WARN_ON_ONCE(hwq >= submit_queues))
3703		hwq = 0;
 
3704	return sdebug_q_arr + hwq;
3705}
3706
 
 
 
 
 
3707/* Queued (deferred) command completions converge here. */
3708static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
3709{
3710	bool aborted = sd_dp->aborted;
3711	int qc_idx;
3712	int retiring = 0;
3713	unsigned long iflags;
3714	struct sdebug_queue *sqp;
3715	struct sdebug_queued_cmd *sqcp;
3716	struct scsi_cmnd *scp;
3717	struct sdebug_dev_info *devip;
3718
3719	sd_dp->defer_t = SDEB_DEFER_NONE;
3720	if (unlikely(aborted))
3721		sd_dp->aborted = false;
3722	qc_idx = sd_dp->qc_idx;
3723	sqp = sdebug_q_arr + sd_dp->sqa_idx;
3724	if (sdebug_statistics) {
3725		atomic_inc(&sdebug_completions);
3726		if (raw_smp_processor_id() != sd_dp->issuing_cpu)
3727			atomic_inc(&sdebug_miss_cpus);
3728	}
3729	if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
3730		pr_err("wild qc_idx=%d\n", qc_idx);
3731		return;
3732	}
3733	spin_lock_irqsave(&sqp->qc_lock, iflags);
 
3734	sqcp = &sqp->qc_arr[qc_idx];
3735	scp = sqcp->a_cmnd;
3736	if (unlikely(scp == NULL)) {
3737		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3738		pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d\n",
3739		       sd_dp->sqa_idx, qc_idx);
3740		return;
3741	}
3742	devip = (struct sdebug_dev_info *)scp->device->hostdata;
3743	if (likely(devip))
3744		atomic_dec(&devip->num_in_q);
3745	else
3746		pr_err("devip=NULL\n");
3747	if (unlikely(atomic_read(&retired_max_queue) > 0))
3748		retiring = 1;
3749
3750	sqcp->a_cmnd = NULL;
3751	if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
3752		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3753		pr_err("Unexpected completion\n");
3754		return;
3755	}
3756
3757	if (unlikely(retiring)) {	/* user has reduced max_queue */
3758		int k, retval;
3759
3760		retval = atomic_read(&retired_max_queue);
3761		if (qc_idx >= retval) {
3762			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3763			pr_err("index %d too large\n", retval);
3764			return;
3765		}
3766		k = find_last_bit(sqp->in_use_bm, retval);
3767		if ((k < sdebug_max_queue) || (k == retval))
3768			atomic_set(&retired_max_queue, 0);
3769		else
3770			atomic_set(&retired_max_queue, k + 1);
3771	}
3772	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3773	if (unlikely(aborted)) {
3774		if (sdebug_verbose)
3775			pr_info("bypassing scsi_done() due to aborted cmd\n");
3776		return;
3777	}
3778	scp->scsi_done(scp); /* callback to mid level */
3779}
3780
3781/* When high resolution timer goes off this function is called. */
3782static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
3783{
3784	struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
3785						  hrt);
3786	sdebug_q_cmd_complete(sd_dp);
3787	return HRTIMER_NORESTART;
3788}
3789
3790/* When work queue schedules work, it calls this function. */
3791static void sdebug_q_cmd_wq_complete(struct work_struct *work)
3792{
3793	struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
3794						  ew.work);
3795	sdebug_q_cmd_complete(sd_dp);
3796}
3797
3798static bool got_shared_uuid;
3799static uuid_t shared_uuid;
3800
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3801static struct sdebug_dev_info *sdebug_device_create(
3802			struct sdebug_host_info *sdbg_host, gfp_t flags)
3803{
3804	struct sdebug_dev_info *devip;
3805
3806	devip = kzalloc(sizeof(*devip), flags);
3807	if (devip) {
3808		if (sdebug_uuid_ctl == 1)
3809			uuid_gen(&devip->lu_name);
3810		else if (sdebug_uuid_ctl == 2) {
3811			if (got_shared_uuid)
3812				devip->lu_name = shared_uuid;
3813			else {
3814				uuid_gen(&shared_uuid);
3815				got_shared_uuid = true;
3816				devip->lu_name = shared_uuid;
3817			}
3818		}
3819		devip->sdbg_host = sdbg_host;
 
 
 
 
 
 
 
 
 
 
 
 
3820		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
3821	}
3822	return devip;
3823}
3824
3825static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
3826{
3827	struct sdebug_host_info *sdbg_host;
3828	struct sdebug_dev_info *open_devip = NULL;
3829	struct sdebug_dev_info *devip;
3830
3831	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
3832	if (!sdbg_host) {
3833		pr_err("Host info NULL\n");
3834		return NULL;
3835	}
 
3836	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
3837		if ((devip->used) && (devip->channel == sdev->channel) &&
3838		    (devip->target == sdev->id) &&
3839		    (devip->lun == sdev->lun))
3840			return devip;
3841		else {
3842			if ((!devip->used) && (!open_devip))
3843				open_devip = devip;
3844		}
3845	}
3846	if (!open_devip) { /* try and make a new one */
3847		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
3848		if (!open_devip) {
3849			pr_err("out of memory at line %d\n", __LINE__);
3850			return NULL;
3851		}
3852	}
3853
3854	open_devip->channel = sdev->channel;
3855	open_devip->target = sdev->id;
3856	open_devip->lun = sdev->lun;
3857	open_devip->sdbg_host = sdbg_host;
3858	atomic_set(&open_devip->num_in_q, 0);
3859	set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
3860	open_devip->used = true;
3861	return open_devip;
3862}
3863
3864static int scsi_debug_slave_alloc(struct scsi_device *sdp)
3865{
3866	if (sdebug_verbose)
3867		pr_info("slave_alloc <%u %u %u %llu>\n",
3868		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3869	return 0;
3870}
3871
3872static int scsi_debug_slave_configure(struct scsi_device *sdp)
3873{
3874	struct sdebug_dev_info *devip =
3875			(struct sdebug_dev_info *)sdp->hostdata;
3876
3877	if (sdebug_verbose)
3878		pr_info("slave_configure <%u %u %u %llu>\n",
3879		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3880	if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
3881		sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
3882	if (devip == NULL) {
3883		devip = find_build_dev_info(sdp);
3884		if (devip == NULL)
3885			return 1;  /* no resources, will be marked offline */
3886	}
3887	sdp->hostdata = devip;
3888	if (sdebug_no_uld)
3889		sdp->no_uld_attach = 1;
3890	config_cdb_len(sdp);
3891	return 0;
3892}
3893
3894static void scsi_debug_slave_destroy(struct scsi_device *sdp)
3895{
3896	struct sdebug_dev_info *devip =
3897		(struct sdebug_dev_info *)sdp->hostdata;
3898
3899	if (sdebug_verbose)
3900		pr_info("slave_destroy <%u %u %u %llu>\n",
3901		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3902	if (devip) {
3903		/* make this slot available for re-use */
3904		devip->used = false;
3905		sdp->hostdata = NULL;
3906	}
3907}
3908
3909static void stop_qc_helper(struct sdebug_defer *sd_dp,
3910			   enum sdeb_defer_type defer_t)
3911{
3912	if (!sd_dp)
3913		return;
3914	if (defer_t == SDEB_DEFER_HRT)
3915		hrtimer_cancel(&sd_dp->hrt);
3916	else if (defer_t == SDEB_DEFER_WQ)
3917		cancel_work_sync(&sd_dp->ew.work);
3918}
3919
3920/* If @cmnd found deletes its timer or work queue and returns true; else
3921   returns false */
3922static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
3923{
3924	unsigned long iflags;
3925	int j, k, qmax, r_qmax;
3926	enum sdeb_defer_type l_defer_t;
3927	struct sdebug_queue *sqp;
3928	struct sdebug_queued_cmd *sqcp;
3929	struct sdebug_dev_info *devip;
3930	struct sdebug_defer *sd_dp;
3931
3932	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3933		spin_lock_irqsave(&sqp->qc_lock, iflags);
3934		qmax = sdebug_max_queue;
3935		r_qmax = atomic_read(&retired_max_queue);
3936		if (r_qmax > qmax)
3937			qmax = r_qmax;
3938		for (k = 0; k < qmax; ++k) {
3939			if (test_bit(k, sqp->in_use_bm)) {
3940				sqcp = &sqp->qc_arr[k];
3941				if (cmnd != sqcp->a_cmnd)
3942					continue;
3943				/* found */
3944				devip = (struct sdebug_dev_info *)
3945						cmnd->device->hostdata;
3946				if (devip)
3947					atomic_dec(&devip->num_in_q);
3948				sqcp->a_cmnd = NULL;
3949				sd_dp = sqcp->sd_dp;
3950				if (sd_dp) {
3951					l_defer_t = sd_dp->defer_t;
3952					sd_dp->defer_t = SDEB_DEFER_NONE;
3953				} else
3954					l_defer_t = SDEB_DEFER_NONE;
3955				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3956				stop_qc_helper(sd_dp, l_defer_t);
3957				clear_bit(k, sqp->in_use_bm);
3958				return true;
3959			}
3960		}
3961		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3962	}
3963	return false;
3964}
3965
3966/* Deletes (stops) timers or work queues of all queued commands */
3967static void stop_all_queued(void)
3968{
3969	unsigned long iflags;
3970	int j, k;
3971	enum sdeb_defer_type l_defer_t;
3972	struct sdebug_queue *sqp;
3973	struct sdebug_queued_cmd *sqcp;
3974	struct sdebug_dev_info *devip;
3975	struct sdebug_defer *sd_dp;
3976
3977	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3978		spin_lock_irqsave(&sqp->qc_lock, iflags);
3979		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
3980			if (test_bit(k, sqp->in_use_bm)) {
3981				sqcp = &sqp->qc_arr[k];
3982				if (sqcp->a_cmnd == NULL)
3983					continue;
3984				devip = (struct sdebug_dev_info *)
3985					sqcp->a_cmnd->device->hostdata;
3986				if (devip)
3987					atomic_dec(&devip->num_in_q);
3988				sqcp->a_cmnd = NULL;
3989				sd_dp = sqcp->sd_dp;
3990				if (sd_dp) {
3991					l_defer_t = sd_dp->defer_t;
3992					sd_dp->defer_t = SDEB_DEFER_NONE;
3993				} else
3994					l_defer_t = SDEB_DEFER_NONE;
3995				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3996				stop_qc_helper(sd_dp, l_defer_t);
3997				clear_bit(k, sqp->in_use_bm);
3998				spin_lock_irqsave(&sqp->qc_lock, iflags);
3999			}
4000		}
4001		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4002	}
4003}
4004
4005/* Free queued command memory on heap */
4006static void free_all_queued(void)
4007{
4008	int j, k;
4009	struct sdebug_queue *sqp;
4010	struct sdebug_queued_cmd *sqcp;
4011
4012	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
4013		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
4014			sqcp = &sqp->qc_arr[k];
4015			kfree(sqcp->sd_dp);
4016			sqcp->sd_dp = NULL;
4017		}
4018	}
4019}
4020
4021static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
4022{
4023	bool ok;
4024
4025	++num_aborts;
4026	if (SCpnt) {
4027		ok = stop_queued_cmnd(SCpnt);
4028		if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
4029			sdev_printk(KERN_INFO, SCpnt->device,
4030				    "%s: command%s found\n", __func__,
4031				    ok ? "" : " not");
4032	}
4033	return SUCCESS;
4034}
4035
4036static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
4037{
4038	++num_dev_resets;
4039	if (SCpnt && SCpnt->device) {
4040		struct scsi_device *sdp = SCpnt->device;
4041		struct sdebug_dev_info *devip =
4042				(struct sdebug_dev_info *)sdp->hostdata;
4043
4044		if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
4045			sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
4046		if (devip)
4047			set_bit(SDEBUG_UA_POR, devip->uas_bm);
4048	}
4049	return SUCCESS;
4050}
4051
4052static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
4053{
4054	struct sdebug_host_info *sdbg_host;
4055	struct sdebug_dev_info *devip;
4056	struct scsi_device *sdp;
4057	struct Scsi_Host *hp;
4058	int k = 0;
4059
4060	++num_target_resets;
4061	if (!SCpnt)
4062		goto lie;
4063	sdp = SCpnt->device;
4064	if (!sdp)
4065		goto lie;
4066	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
4067		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
4068	hp = sdp->host;
4069	if (!hp)
4070		goto lie;
4071	sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
4072	if (sdbg_host) {
4073		list_for_each_entry(devip,
4074				    &sdbg_host->dev_info_list,
4075				    dev_list)
4076			if (devip->target == sdp->id) {
4077				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4078				++k;
4079			}
4080	}
4081	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
4082		sdev_printk(KERN_INFO, sdp,
4083			    "%s: %d device(s) found in target\n", __func__, k);
4084lie:
4085	return SUCCESS;
4086}
4087
4088static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt)
4089{
4090	struct sdebug_host_info *sdbg_host;
4091	struct sdebug_dev_info *devip;
4092	struct scsi_device *sdp;
4093	struct Scsi_Host *hp;
4094	int k = 0;
4095
4096	++num_bus_resets;
4097	if (!(SCpnt && SCpnt->device))
4098		goto lie;
4099	sdp = SCpnt->device;
4100	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
4101		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
4102	hp = sdp->host;
4103	if (hp) {
4104		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
4105		if (sdbg_host) {
4106			list_for_each_entry(devip,
4107					    &sdbg_host->dev_info_list,
4108					    dev_list) {
4109				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4110				++k;
4111			}
4112		}
4113	}
4114	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
4115		sdev_printk(KERN_INFO, sdp,
4116			    "%s: %d device(s) found in host\n", __func__, k);
4117lie:
4118	return SUCCESS;
4119}
4120
4121static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
4122{
4123	struct sdebug_host_info *sdbg_host;
4124	struct sdebug_dev_info *devip;
4125	int k = 0;
4126
4127	++num_host_resets;
4128	if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
4129		sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
4130	spin_lock(&sdebug_host_list_lock);
4131	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
4132		list_for_each_entry(devip, &sdbg_host->dev_info_list,
4133				    dev_list) {
4134			set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4135			++k;
4136		}
4137	}
4138	spin_unlock(&sdebug_host_list_lock);
4139	stop_all_queued();
4140	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
4141		sdev_printk(KERN_INFO, SCpnt->device,
4142			    "%s: %d device(s) found\n", __func__, k);
4143	return SUCCESS;
4144}
4145
4146static void __init sdebug_build_parts(unsigned char *ramp,
4147				      unsigned long store_size)
4148{
4149	struct partition *pp;
4150	int starts[SDEBUG_MAX_PARTS + 2];
4151	int sectors_per_part, num_sectors, k;
4152	int heads_by_sects, start_sec, end_sec;
4153
4154	/* assume partition table already zeroed */
4155	if ((sdebug_num_parts < 1) || (store_size < 1048576))
4156		return;
4157	if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
4158		sdebug_num_parts = SDEBUG_MAX_PARTS;
4159		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
4160	}
4161	num_sectors = (int)sdebug_store_sectors;
4162	sectors_per_part = (num_sectors - sdebug_sectors_per)
4163			   / sdebug_num_parts;
4164	heads_by_sects = sdebug_heads * sdebug_sectors_per;
4165	starts[0] = sdebug_sectors_per;
4166	for (k = 1; k < sdebug_num_parts; ++k)
 
4167		starts[k] = ((k * sectors_per_part) / heads_by_sects)
4168			    * heads_by_sects;
 
 
 
4169	starts[sdebug_num_parts] = num_sectors;
4170	starts[sdebug_num_parts + 1] = 0;
4171
4172	ramp[510] = 0x55;	/* magic partition markings */
4173	ramp[511] = 0xAA;
4174	pp = (struct partition *)(ramp + 0x1be);
4175	for (k = 0; starts[k + 1]; ++k, ++pp) {
4176		start_sec = starts[k];
4177		end_sec = starts[k + 1] - 1;
4178		pp->boot_ind = 0;
4179
4180		pp->cyl = start_sec / heads_by_sects;
4181		pp->head = (start_sec - (pp->cyl * heads_by_sects))
4182			   / sdebug_sectors_per;
4183		pp->sector = (start_sec % sdebug_sectors_per) + 1;
4184
4185		pp->end_cyl = end_sec / heads_by_sects;
4186		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
4187			       / sdebug_sectors_per;
4188		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
4189
4190		pp->start_sect = cpu_to_le32(start_sec);
4191		pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
4192		pp->sys_ind = 0x83;	/* plain Linux partition */
4193	}
4194}
4195
4196static void block_unblock_all_queues(bool block)
4197{
4198	int j;
4199	struct sdebug_queue *sqp;
4200
4201	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
4202		atomic_set(&sqp->blocked, (int)block);
4203}
4204
4205/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
4206 * commands will be processed normally before triggers occur.
4207 */
4208static void tweak_cmnd_count(void)
4209{
4210	int count, modulo;
4211
4212	modulo = abs(sdebug_every_nth);
4213	if (modulo < 2)
4214		return;
4215	block_unblock_all_queues(true);
4216	count = atomic_read(&sdebug_cmnd_count);
4217	atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
4218	block_unblock_all_queues(false);
4219}
4220
4221static void clear_queue_stats(void)
4222{
4223	atomic_set(&sdebug_cmnd_count, 0);
4224	atomic_set(&sdebug_completions, 0);
4225	atomic_set(&sdebug_miss_cpus, 0);
4226	atomic_set(&sdebug_a_tsf, 0);
4227}
4228
4229static void setup_inject(struct sdebug_queue *sqp,
4230			 struct sdebug_queued_cmd *sqcp)
4231{
4232	if ((atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) > 0) {
4233		if (sdebug_every_nth > 0)
4234			sqcp->inj_recovered = sqcp->inj_transport
4235				= sqcp->inj_dif
4236				= sqcp->inj_dix = sqcp->inj_short
4237				= sqcp->inj_host_busy = sqcp->inj_cmd_abort = 0;
4238		return;
4239	}
4240	sqcp->inj_recovered = !!(SDEBUG_OPT_RECOVERED_ERR & sdebug_opts);
4241	sqcp->inj_transport = !!(SDEBUG_OPT_TRANSPORT_ERR & sdebug_opts);
4242	sqcp->inj_dif = !!(SDEBUG_OPT_DIF_ERR & sdebug_opts);
4243	sqcp->inj_dix = !!(SDEBUG_OPT_DIX_ERR & sdebug_opts);
4244	sqcp->inj_short = !!(SDEBUG_OPT_SHORT_TRANSFER & sdebug_opts);
4245	sqcp->inj_host_busy = !!(SDEBUG_OPT_HOST_BUSY & sdebug_opts);
4246	sqcp->inj_cmd_abort = !!(SDEBUG_OPT_CMD_ABORT & sdebug_opts);
4247}
4248
 
 
4249/* Complete the processing of the thread that queued a SCSI command to this
4250 * driver. It either completes the command by calling cmnd_done() or
4251 * schedules a hr timer or work queue then returns 0. Returns
4252 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
4253 */
4254static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
4255			 int scsi_result,
4256			 int (*pfp)(struct scsi_cmnd *,
4257				    struct sdebug_dev_info *),
4258			 int delta_jiff, int ndelay)
4259{
 
 
 
 
4260	unsigned long iflags;
4261	int k, num_in_q, qdepth, inject;
4262	struct sdebug_queue *sqp;
4263	struct sdebug_queued_cmd *sqcp;
4264	struct scsi_device *sdp;
4265	struct sdebug_defer *sd_dp;
4266
4267	if (unlikely(devip == NULL)) {
4268		if (scsi_result == 0)
4269			scsi_result = DID_NO_CONNECT << 16;
4270		goto respond_in_thread;
4271	}
4272	sdp = cmnd->device;
4273
4274	if (delta_jiff == 0)
4275		goto respond_in_thread;
4276
4277	/* schedule the response at a later time if resources permit */
4278	sqp = get_queue(cmnd);
4279	spin_lock_irqsave(&sqp->qc_lock, iflags);
4280	if (unlikely(atomic_read(&sqp->blocked))) {
4281		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4282		return SCSI_MLQUEUE_HOST_BUSY;
4283	}
4284	num_in_q = atomic_read(&devip->num_in_q);
4285	qdepth = cmnd->device->queue_depth;
4286	inject = 0;
4287	if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
4288		if (scsi_result) {
4289			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4290			goto respond_in_thread;
4291		} else
4292			scsi_result = device_qfull_result;
4293	} else if (unlikely(sdebug_every_nth &&
4294			    (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
4295			    (scsi_result == 0))) {
4296		if ((num_in_q == (qdepth - 1)) &&
4297		    (atomic_inc_return(&sdebug_a_tsf) >=
4298		     abs(sdebug_every_nth))) {
4299			atomic_set(&sdebug_a_tsf, 0);
4300			inject = 1;
4301			scsi_result = device_qfull_result;
4302		}
4303	}
4304
4305	k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
4306	if (unlikely(k >= sdebug_max_queue)) {
4307		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4308		if (scsi_result)
4309			goto respond_in_thread;
4310		else if (SDEBUG_OPT_ALL_TSF & sdebug_opts)
4311			scsi_result = device_qfull_result;
4312		if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
4313			sdev_printk(KERN_INFO, sdp,
4314				    "%s: max_queue=%d exceeded, %s\n",
4315				    __func__, sdebug_max_queue,
4316				    (scsi_result ?  "status: TASK SET FULL" :
4317						    "report: host busy"));
4318		if (scsi_result)
4319			goto respond_in_thread;
4320		else
4321			return SCSI_MLQUEUE_HOST_BUSY;
4322	}
4323	__set_bit(k, sqp->in_use_bm);
4324	atomic_inc(&devip->num_in_q);
4325	sqcp = &sqp->qc_arr[k];
4326	sqcp->a_cmnd = cmnd;
4327	cmnd->host_scribble = (unsigned char *)sqcp;
4328	sd_dp = sqcp->sd_dp;
4329	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4330	if (unlikely(sdebug_every_nth && sdebug_any_injecting_opt))
4331		setup_inject(sqp, sqcp);
4332	if (sd_dp == NULL) {
4333		sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
4334		if (sd_dp == NULL)
 
 
4335			return SCSI_MLQUEUE_HOST_BUSY;
 
 
 
 
4336	}
4337
4338	cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
 
 
 
 
 
 
 
 
4339	if (cmnd->result & SDEG_RES_IMMED_MASK) {
4340		/*
4341		 * This is the F_DELAY_OVERR case. No delay.
4342		 */
4343		cmnd->result &= ~SDEG_RES_IMMED_MASK;
4344		delta_jiff = ndelay = 0;
4345	}
4346	if (cmnd->result == 0 && scsi_result != 0)
4347		cmnd->result = scsi_result;
 
 
 
 
 
 
 
4348
4349	if (unlikely(sdebug_verbose && cmnd->result))
4350		sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
4351			    __func__, cmnd->result);
4352
4353	if (delta_jiff > 0 || ndelay > 0) {
4354		ktime_t kt;
4355
4356		if (delta_jiff > 0) {
4357			kt = ns_to_ktime((u64)delta_jiff * (NSEC_PER_SEC / HZ));
4358		} else
4359			kt = ndelay;
4360		if (!sd_dp->init_hrt) {
4361			sd_dp->init_hrt = true;
4362			sqcp->sd_dp = sd_dp;
4363			hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
4364				     HRTIMER_MODE_REL_PINNED);
4365			sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
4366			sd_dp->sqa_idx = sqp - sdebug_q_arr;
4367			sd_dp->qc_idx = k;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4368		}
4369		if (sdebug_statistics)
4370			sd_dp->issuing_cpu = raw_smp_processor_id();
4371		sd_dp->defer_t = SDEB_DEFER_HRT;
4372		hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
4373	} else {	/* jdelay < 0, use work queue */
4374		if (!sd_dp->init_wq) {
4375			sd_dp->init_wq = true;
4376			sqcp->sd_dp = sd_dp;
4377			sd_dp->sqa_idx = sqp - sdebug_q_arr;
4378			sd_dp->qc_idx = k;
4379			INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4380		}
4381		if (sdebug_statistics)
4382			sd_dp->issuing_cpu = raw_smp_processor_id();
4383		sd_dp->defer_t = SDEB_DEFER_WQ;
4384		if (unlikely(sqcp->inj_cmd_abort))
4385			sd_dp->aborted = true;
4386		schedule_work(&sd_dp->ew.work);
4387		if (unlikely(sqcp->inj_cmd_abort)) {
4388			sdev_printk(KERN_INFO, sdp, "abort request tag %d\n",
4389				    cmnd->request->tag);
4390			blk_abort_request(cmnd->request);
 
 
4391		}
4392	}
4393	if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) &&
4394		     (scsi_result == device_qfull_result)))
4395		sdev_printk(KERN_INFO, sdp,
4396			    "%s: num_in_q=%d +1, %s%s\n", __func__,
4397			    num_in_q, (inject ? "<inject> " : ""),
4398			    "status: TASK SET FULL");
4399	return 0;
4400
4401respond_in_thread:	/* call back to mid-layer using invocation thread */
4402	cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
4403	cmnd->result &= ~SDEG_RES_IMMED_MASK;
4404	if (cmnd->result == 0 && scsi_result != 0)
4405		cmnd->result = scsi_result;
4406	cmnd->scsi_done(cmnd);
4407	return 0;
4408}
4409
4410/* Note: The following macros create attribute files in the
4411   /sys/module/scsi_debug/parameters directory. Unfortunately this
4412   driver is unaware of a change and cannot trigger auxiliary actions
4413   as it can when the corresponding attribute in the
4414   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
4415 */
4416module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
4417module_param_named(ato, sdebug_ato, int, S_IRUGO);
4418module_param_named(cdb_len, sdebug_cdb_len, int, 0644);
4419module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
4420module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
4421module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
4422module_param_named(dif, sdebug_dif, int, S_IRUGO);
4423module_param_named(dix, sdebug_dix, int, S_IRUGO);
4424module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
4425module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
4426module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
4427module_param_named(guard, sdebug_guard, uint, S_IRUGO);
4428module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
4429module_param_string(inq_vendor, sdebug_inq_vendor_id,
4430		    sizeof(sdebug_inq_vendor_id), S_IRUGO|S_IWUSR);
4431module_param_string(inq_product, sdebug_inq_product_id,
4432		    sizeof(sdebug_inq_product_id), S_IRUGO|S_IWUSR);
4433module_param_string(inq_rev, sdebug_inq_product_rev,
4434		    sizeof(sdebug_inq_product_rev), S_IRUGO|S_IWUSR);
 
 
 
4435module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
4436module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
4437module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
4438module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
4439module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
 
4440module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
4441module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
4442module_param_named(medium_error_start, sdebug_medium_error_start, int, S_IRUGO | S_IWUSR);
4443module_param_named(medium_error_count, sdebug_medium_error_count, int, S_IRUGO | S_IWUSR);
 
 
4444module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
4445module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
4446module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
4447module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
4448module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
4449module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
 
4450module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
 
 
4451module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
4452module_param_named(opt_xferlen_exp, sdebug_opt_xferlen_exp, int, S_IRUGO);
4453module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
 
4454module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
4455module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
4456module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
4457module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
4458module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
4459module_param_named(submit_queues, submit_queues, int, S_IRUGO);
 
 
4460module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
4461module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
4462module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
4463module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
 
4464module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
4465module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
4466module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
4467		   S_IRUGO | S_IWUSR);
4468module_param_named(wp, sdebug_wp, bool, S_IRUGO | S_IWUSR);
4469module_param_named(write_same_length, sdebug_write_same_length, int,
4470		   S_IRUGO | S_IWUSR);
 
 
 
 
4471
4472MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
4473MODULE_DESCRIPTION("SCSI debug adapter driver");
4474MODULE_LICENSE("GPL");
4475MODULE_VERSION(SDEBUG_VERSION);
4476
4477MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
4478MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
4479MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
4480MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
4481MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
4482MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
4483MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
4484MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
4485MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
4486MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
4487MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
4488MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
4489MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
4490MODULE_PARM_DESC(inq_vendor, "SCSI INQUIRY vendor string (def=\"Linux\")");
 
4491MODULE_PARM_DESC(inq_product, "SCSI INQUIRY product string (def=\"scsi_debug\")");
4492MODULE_PARM_DESC(inq_rev, "SCSI INQUIRY revision string (def=\""
4493		 SDEBUG_VERSION "\")");
 
 
 
4494MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
4495MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
4496MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
4497MODULE_PARM_DESC(lbprz,
4498	"on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
4499MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
 
4500MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
4501MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
 
4502MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
4503MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
4504MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
4505MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
4506MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
4507MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
4508MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
4509MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
 
4510MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
 
4511MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
4512MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent (def=physblk_exp)");
4513MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
 
4514MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
4515MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
4516MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
4517MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
4518MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
4519MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
 
4520MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
4521MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
4522MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
4523MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
4524MODULE_PARM_DESC(uuid_ctl,
4525		 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
4526MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
4527MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
4528MODULE_PARM_DESC(wp, "Write Protect (def=0)");
4529MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
 
 
 
 
4530
4531#define SDEBUG_INFO_LEN 256
4532static char sdebug_info[SDEBUG_INFO_LEN];
4533
4534static const char *scsi_debug_info(struct Scsi_Host *shp)
4535{
4536	int k;
4537
4538	k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
4539		      my_name, SDEBUG_VERSION, sdebug_version_date);
4540	if (k >= (SDEBUG_INFO_LEN - 1))
4541		return sdebug_info;
4542	scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
4543		  "  dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
4544		  sdebug_dev_size_mb, sdebug_opts, submit_queues,
4545		  "statistics", (int)sdebug_statistics);
4546	return sdebug_info;
4547}
4548
4549/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
4550static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
4551				 int length)
4552{
4553	char arr[16];
4554	int opts;
4555	int minLen = length > 15 ? 15 : length;
4556
4557	if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
4558		return -EACCES;
4559	memcpy(arr, buffer, minLen);
4560	arr[minLen] = '\0';
4561	if (1 != sscanf(arr, "%d", &opts))
4562		return -EINVAL;
4563	sdebug_opts = opts;
4564	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4565	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4566	if (sdebug_every_nth != 0)
4567		tweak_cmnd_count();
4568	return length;
4569}
4570
4571/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
4572 * same for each scsi_debug host (if more than one). Some of the counters
4573 * output are not atomics so might be inaccurate in a busy system. */
4574static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
4575{
4576	int f, j, l;
4577	struct sdebug_queue *sqp;
 
4578
4579	seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
4580		   SDEBUG_VERSION, sdebug_version_date);
4581	seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
4582		   sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
4583		   sdebug_opts, sdebug_every_nth);
4584	seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
4585		   sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
4586		   sdebug_sector_size, "bytes");
4587	seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
4588		   sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
4589		   num_aborts);
4590	seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
4591		   num_dev_resets, num_target_resets, num_bus_resets,
4592		   num_host_resets);
4593	seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
4594		   dix_reads, dix_writes, dif_errors);
4595	seq_printf(m, "usec_in_jiffy=%lu, statistics=%d\n", TICK_NSEC / 1000,
4596		   sdebug_statistics);
4597	seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d\n",
4598		   atomic_read(&sdebug_cmnd_count),
4599		   atomic_read(&sdebug_completions),
4600		   "miss_cpus", atomic_read(&sdebug_miss_cpus),
4601		   atomic_read(&sdebug_a_tsf));
 
4602
4603	seq_printf(m, "submit_queues=%d\n", submit_queues);
4604	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
4605		seq_printf(m, "  queue %d:\n", j);
4606		f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
4607		if (f != sdebug_max_queue) {
4608			l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
4609			seq_printf(m, "    in_use_bm BUSY: %s: %d,%d\n",
4610				   "first,last bits", f, l);
4611		}
4612	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4613	return 0;
4614}
4615
4616static ssize_t delay_show(struct device_driver *ddp, char *buf)
4617{
4618	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
4619}
4620/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
4621 * of delay is jiffies.
4622 */
4623static ssize_t delay_store(struct device_driver *ddp, const char *buf,
4624			   size_t count)
4625{
4626	int jdelay, res;
4627
4628	if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
4629		res = count;
4630		if (sdebug_jdelay != jdelay) {
4631			int j, k;
4632			struct sdebug_queue *sqp;
4633
4634			block_unblock_all_queues(true);
4635			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4636			     ++j, ++sqp) {
4637				k = find_first_bit(sqp->in_use_bm,
4638						   sdebug_max_queue);
4639				if (k != sdebug_max_queue) {
4640					res = -EBUSY;   /* queued commands */
4641					break;
4642				}
4643			}
4644			if (res > 0) {
4645				sdebug_jdelay = jdelay;
4646				sdebug_ndelay = 0;
4647			}
4648			block_unblock_all_queues(false);
4649		}
4650		return res;
4651	}
4652	return -EINVAL;
4653}
4654static DRIVER_ATTR_RW(delay);
4655
4656static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
4657{
4658	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
4659}
4660/* Returns -EBUSY if ndelay is being changed and commands are queued */
4661/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
4662static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
4663			    size_t count)
4664{
4665	int ndelay, res;
4666
4667	if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
4668	    (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
4669		res = count;
4670		if (sdebug_ndelay != ndelay) {
4671			int j, k;
4672			struct sdebug_queue *sqp;
4673
4674			block_unblock_all_queues(true);
4675			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4676			     ++j, ++sqp) {
4677				k = find_first_bit(sqp->in_use_bm,
4678						   sdebug_max_queue);
4679				if (k != sdebug_max_queue) {
4680					res = -EBUSY;   /* queued commands */
4681					break;
4682				}
4683			}
4684			if (res > 0) {
4685				sdebug_ndelay = ndelay;
4686				sdebug_jdelay = ndelay  ? JDELAY_OVERRIDDEN
4687							: DEF_JDELAY;
4688			}
4689			block_unblock_all_queues(false);
4690		}
4691		return res;
4692	}
4693	return -EINVAL;
4694}
4695static DRIVER_ATTR_RW(ndelay);
4696
4697static ssize_t opts_show(struct device_driver *ddp, char *buf)
4698{
4699	return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
4700}
4701
4702static ssize_t opts_store(struct device_driver *ddp, const char *buf,
4703			  size_t count)
4704{
4705	int opts;
4706	char work[20];
4707
4708	if (sscanf(buf, "%10s", work) == 1) {
4709		if (strncasecmp(work, "0x", 2) == 0) {
4710			if (kstrtoint(work + 2, 16, &opts) == 0)
4711				goto opts_done;
4712		} else {
4713			if (kstrtoint(work, 10, &opts) == 0)
4714				goto opts_done;
4715		}
4716	}
4717	return -EINVAL;
4718opts_done:
4719	sdebug_opts = opts;
4720	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4721	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4722	tweak_cmnd_count();
4723	return count;
4724}
4725static DRIVER_ATTR_RW(opts);
4726
4727static ssize_t ptype_show(struct device_driver *ddp, char *buf)
4728{
4729	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
4730}
4731static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
4732			   size_t count)
4733{
4734	int n;
4735
 
 
 
 
4736	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
 
 
4737		sdebug_ptype = n;
4738		return count;
4739	}
4740	return -EINVAL;
4741}
4742static DRIVER_ATTR_RW(ptype);
4743
4744static ssize_t dsense_show(struct device_driver *ddp, char *buf)
4745{
4746	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
4747}
4748static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
4749			    size_t count)
4750{
4751	int n;
4752
4753	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4754		sdebug_dsense = n;
4755		return count;
4756	}
4757	return -EINVAL;
4758}
4759static DRIVER_ATTR_RW(dsense);
4760
4761static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
4762{
4763	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
4764}
4765static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
4766			     size_t count)
4767{
4768	int n;
4769
4770	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
 
 
 
4771		n = (n > 0);
4772		sdebug_fake_rw = (sdebug_fake_rw > 0);
4773		if (sdebug_fake_rw != n) {
4774			if ((0 == n) && (NULL == fake_storep)) {
4775				unsigned long sz =
4776					(unsigned long)sdebug_dev_size_mb *
4777					1048576;
4778
4779				fake_storep = vzalloc(sz);
4780				if (NULL == fake_storep) {
4781					pr_err("out of memory, 9\n");
4782					return -ENOMEM;
 
 
 
 
 
 
 
 
 
 
4783				}
4784			}
4785			sdebug_fake_rw = n;
 
 
4786		}
 
4787		return count;
4788	}
4789	return -EINVAL;
4790}
4791static DRIVER_ATTR_RW(fake_rw);
4792
4793static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
4794{
4795	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
4796}
4797static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
4798			      size_t count)
4799{
4800	int n;
4801
4802	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4803		sdebug_no_lun_0 = n;
4804		return count;
4805	}
4806	return -EINVAL;
4807}
4808static DRIVER_ATTR_RW(no_lun_0);
4809
4810static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
4811{
4812	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
4813}
4814static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
4815			      size_t count)
4816{
4817	int n;
4818
4819	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4820		sdebug_num_tgts = n;
4821		sdebug_max_tgts_luns();
4822		return count;
4823	}
4824	return -EINVAL;
4825}
4826static DRIVER_ATTR_RW(num_tgts);
4827
4828static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
4829{
4830	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
4831}
4832static DRIVER_ATTR_RO(dev_size_mb);
4833
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4834static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
4835{
4836	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
4837}
4838static DRIVER_ATTR_RO(num_parts);
4839
4840static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
4841{
4842	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
4843}
4844static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
4845			       size_t count)
4846{
4847	int nth;
 
 
 
 
 
 
 
 
 
 
 
 
4848
4849	if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
4850		sdebug_every_nth = nth;
4851		if (nth && !sdebug_statistics) {
4852			pr_info("every_nth needs statistics=1, set it\n");
4853			sdebug_statistics = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4854		}
4855		tweak_cmnd_count();
4856		return count;
4857	}
4858	return -EINVAL;
4859}
4860static DRIVER_ATTR_RW(every_nth);
4861
4862static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
4863{
4864	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
4865}
4866static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
4867			      size_t count)
4868{
4869	int n;
4870	bool changed;
4871
4872	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4873		if (n > 256) {
4874			pr_warn("max_luns can be no more than 256\n");
4875			return -EINVAL;
4876		}
4877		changed = (sdebug_max_luns != n);
4878		sdebug_max_luns = n;
4879		sdebug_max_tgts_luns();
4880		if (changed && (sdebug_scsi_level >= 5)) {	/* >= SPC-3 */
4881			struct sdebug_host_info *sdhp;
4882			struct sdebug_dev_info *dp;
4883
4884			spin_lock(&sdebug_host_list_lock);
4885			list_for_each_entry(sdhp, &sdebug_host_list,
4886					    host_list) {
4887				list_for_each_entry(dp, &sdhp->dev_info_list,
4888						    dev_list) {
4889					set_bit(SDEBUG_UA_LUNS_CHANGED,
4890						dp->uas_bm);
4891				}
4892			}
4893			spin_unlock(&sdebug_host_list_lock);
4894		}
4895		return count;
4896	}
4897	return -EINVAL;
4898}
4899static DRIVER_ATTR_RW(max_luns);
4900
4901static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
4902{
4903	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
4904}
4905/* N.B. max_queue can be changed while there are queued commands. In flight
4906 * commands beyond the new max_queue will be completed. */
4907static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
4908			       size_t count)
4909{
4910	int j, n, k, a;
4911	struct sdebug_queue *sqp;
4912
4913	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
4914	    (n <= SDEBUG_CANQUEUE)) {
 
4915		block_unblock_all_queues(true);
4916		k = 0;
4917		for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4918		     ++j, ++sqp) {
4919			a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
4920			if (a > k)
4921				k = a;
4922		}
4923		sdebug_max_queue = n;
4924		if (k == SDEBUG_CANQUEUE)
4925			atomic_set(&retired_max_queue, 0);
4926		else if (k >= n)
4927			atomic_set(&retired_max_queue, k + 1);
4928		else
4929			atomic_set(&retired_max_queue, 0);
4930		block_unblock_all_queues(false);
4931		return count;
4932	}
4933	return -EINVAL;
4934}
4935static DRIVER_ATTR_RW(max_queue);
4936
 
 
 
 
 
 
 
 
 
 
 
4937static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
4938{
4939	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
4940}
4941static DRIVER_ATTR_RO(no_uld);
4942
4943static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
4944{
4945	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
4946}
4947static DRIVER_ATTR_RO(scsi_level);
4948
4949static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
4950{
4951	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
4952}
4953static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
4954				size_t count)
4955{
4956	int n;
4957	bool changed;
4958
 
 
 
 
4959	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4960		changed = (sdebug_virtual_gb != n);
4961		sdebug_virtual_gb = n;
4962		sdebug_capacity = get_sdebug_capacity();
4963		if (changed) {
4964			struct sdebug_host_info *sdhp;
4965			struct sdebug_dev_info *dp;
4966
4967			spin_lock(&sdebug_host_list_lock);
4968			list_for_each_entry(sdhp, &sdebug_host_list,
4969					    host_list) {
4970				list_for_each_entry(dp, &sdhp->dev_info_list,
4971						    dev_list) {
4972					set_bit(SDEBUG_UA_CAPACITY_CHANGED,
4973						dp->uas_bm);
4974				}
4975			}
4976			spin_unlock(&sdebug_host_list_lock);
4977		}
4978		return count;
4979	}
4980	return -EINVAL;
4981}
4982static DRIVER_ATTR_RW(virtual_gb);
4983
4984static ssize_t add_host_show(struct device_driver *ddp, char *buf)
4985{
4986	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_add_host);
 
4987}
4988
4989static int sdebug_add_adapter(void);
4990static void sdebug_remove_adapter(void);
4991
4992static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
4993			      size_t count)
4994{
 
 
 
 
4995	int delta_hosts;
4996
4997	if (sscanf(buf, "%d", &delta_hosts) != 1)
4998		return -EINVAL;
4999	if (delta_hosts > 0) {
5000		do {
5001			sdebug_add_adapter();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5002		} while (--delta_hosts);
5003	} else if (delta_hosts < 0) {
5004		do {
5005			sdebug_remove_adapter();
5006		} while (++delta_hosts);
5007	}
5008	return count;
5009}
5010static DRIVER_ATTR_RW(add_host);
5011
5012static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
5013{
5014	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
5015}
5016static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
5017				    size_t count)
5018{
5019	int n;
5020
5021	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5022		sdebug_vpd_use_hostno = n;
5023		return count;
5024	}
5025	return -EINVAL;
5026}
5027static DRIVER_ATTR_RW(vpd_use_hostno);
5028
5029static ssize_t statistics_show(struct device_driver *ddp, char *buf)
5030{
5031	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
5032}
5033static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
5034				size_t count)
5035{
5036	int n;
5037
5038	if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
5039		if (n > 0)
5040			sdebug_statistics = true;
5041		else {
5042			clear_queue_stats();
5043			sdebug_statistics = false;
5044		}
5045		return count;
5046	}
5047	return -EINVAL;
5048}
5049static DRIVER_ATTR_RW(statistics);
5050
5051static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
5052{
5053	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
5054}
5055static DRIVER_ATTR_RO(sector_size);
5056
5057static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
5058{
5059	return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
5060}
5061static DRIVER_ATTR_RO(submit_queues);
5062
5063static ssize_t dix_show(struct device_driver *ddp, char *buf)
5064{
5065	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
5066}
5067static DRIVER_ATTR_RO(dix);
5068
5069static ssize_t dif_show(struct device_driver *ddp, char *buf)
5070{
5071	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
5072}
5073static DRIVER_ATTR_RO(dif);
5074
5075static ssize_t guard_show(struct device_driver *ddp, char *buf)
5076{
5077	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
5078}
5079static DRIVER_ATTR_RO(guard);
5080
5081static ssize_t ato_show(struct device_driver *ddp, char *buf)
5082{
5083	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
5084}
5085static DRIVER_ATTR_RO(ato);
5086
5087static ssize_t map_show(struct device_driver *ddp, char *buf)
5088{
5089	ssize_t count;
5090
5091	if (!scsi_debug_lbp())
5092		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
5093				 sdebug_store_sectors);
5094
5095	count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
5096			  (int)map_size, map_storep);
 
 
 
 
 
5097	buf[count++] = '\n';
5098	buf[count] = '\0';
5099
5100	return count;
5101}
5102static DRIVER_ATTR_RO(map);
5103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5104static ssize_t removable_show(struct device_driver *ddp, char *buf)
5105{
5106	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
5107}
5108static ssize_t removable_store(struct device_driver *ddp, const char *buf,
5109			       size_t count)
5110{
5111	int n;
5112
5113	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5114		sdebug_removable = (n > 0);
5115		return count;
5116	}
5117	return -EINVAL;
5118}
5119static DRIVER_ATTR_RW(removable);
5120
5121static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
5122{
5123	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
5124}
5125/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
5126static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
5127			       size_t count)
5128{
5129	int n;
5130
5131	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5132		sdebug_host_lock = (n > 0);
5133		return count;
5134	}
5135	return -EINVAL;
5136}
5137static DRIVER_ATTR_RW(host_lock);
5138
5139static ssize_t strict_show(struct device_driver *ddp, char *buf)
5140{
5141	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
5142}
5143static ssize_t strict_store(struct device_driver *ddp, const char *buf,
5144			    size_t count)
5145{
5146	int n;
5147
5148	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5149		sdebug_strict = (n > 0);
5150		return count;
5151	}
5152	return -EINVAL;
5153}
5154static DRIVER_ATTR_RW(strict);
5155
5156static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
5157{
5158	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
5159}
5160static DRIVER_ATTR_RO(uuid_ctl);
5161
5162static ssize_t cdb_len_show(struct device_driver *ddp, char *buf)
5163{
5164	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_cdb_len);
5165}
5166static ssize_t cdb_len_store(struct device_driver *ddp, const char *buf,
5167			     size_t count)
5168{
5169	int ret, n;
5170
5171	ret = kstrtoint(buf, 0, &n);
5172	if (ret)
5173		return ret;
5174	sdebug_cdb_len = n;
5175	all_config_cdb_len();
5176	return count;
5177}
5178static DRIVER_ATTR_RW(cdb_len);
5179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5180
5181/* Note: The following array creates attribute files in the
5182   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
5183   files (over those found in the /sys/module/scsi_debug/parameters
5184   directory) is that auxiliary actions can be triggered when an attribute
5185   is changed. For example see: sdebug_add_host_store() above.
5186 */
5187
5188static struct attribute *sdebug_drv_attrs[] = {
5189	&driver_attr_delay.attr,
5190	&driver_attr_opts.attr,
5191	&driver_attr_ptype.attr,
5192	&driver_attr_dsense.attr,
5193	&driver_attr_fake_rw.attr,
 
5194	&driver_attr_no_lun_0.attr,
5195	&driver_attr_num_tgts.attr,
5196	&driver_attr_dev_size_mb.attr,
5197	&driver_attr_num_parts.attr,
5198	&driver_attr_every_nth.attr,
 
5199	&driver_attr_max_luns.attr,
5200	&driver_attr_max_queue.attr,
5201	&driver_attr_no_uld.attr,
5202	&driver_attr_scsi_level.attr,
5203	&driver_attr_virtual_gb.attr,
5204	&driver_attr_add_host.attr,
 
5205	&driver_attr_vpd_use_hostno.attr,
5206	&driver_attr_sector_size.attr,
5207	&driver_attr_statistics.attr,
5208	&driver_attr_submit_queues.attr,
5209	&driver_attr_dix.attr,
5210	&driver_attr_dif.attr,
5211	&driver_attr_guard.attr,
5212	&driver_attr_ato.attr,
5213	&driver_attr_map.attr,
 
5214	&driver_attr_removable.attr,
5215	&driver_attr_host_lock.attr,
5216	&driver_attr_ndelay.attr,
5217	&driver_attr_strict.attr,
5218	&driver_attr_uuid_ctl.attr,
5219	&driver_attr_cdb_len.attr,
 
 
5220	NULL,
5221};
5222ATTRIBUTE_GROUPS(sdebug_drv);
5223
5224static struct device *pseudo_primary;
5225
5226static int __init scsi_debug_init(void)
5227{
 
5228	unsigned long sz;
5229	int host_to_add;
5230	int k;
5231	int ret;
5232
 
 
5233	atomic_set(&retired_max_queue, 0);
5234
5235	if (sdebug_ndelay >= 1000 * 1000 * 1000) {
5236		pr_warn("ndelay must be less than 1 second, ignored\n");
5237		sdebug_ndelay = 0;
5238	} else if (sdebug_ndelay > 0)
5239		sdebug_jdelay = JDELAY_OVERRIDDEN;
5240
5241	switch (sdebug_sector_size) {
5242	case  512:
5243	case 1024:
5244	case 2048:
5245	case 4096:
5246		break;
5247	default:
5248		pr_err("invalid sector_size %d\n", sdebug_sector_size);
5249		return -EINVAL;
5250	}
5251
5252	switch (sdebug_dif) {
5253	case T10_PI_TYPE0_PROTECTION:
5254		break;
5255	case T10_PI_TYPE1_PROTECTION:
5256	case T10_PI_TYPE2_PROTECTION:
5257	case T10_PI_TYPE3_PROTECTION:
5258		have_dif_prot = true;
5259		break;
5260
5261	default:
5262		pr_err("dif must be 0, 1, 2 or 3\n");
5263		return -EINVAL;
5264	}
5265
 
 
 
 
 
5266	if (sdebug_guard > 1) {
5267		pr_err("guard must be 0 or 1\n");
5268		return -EINVAL;
5269	}
5270
5271	if (sdebug_ato > 1) {
5272		pr_err("ato must be 0 or 1\n");
5273		return -EINVAL;
5274	}
5275
5276	if (sdebug_physblk_exp > 15) {
5277		pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
5278		return -EINVAL;
5279	}
 
 
 
 
 
 
 
5280	if (sdebug_max_luns > 256) {
5281		pr_warn("max_luns can be no more than 256, use default\n");
5282		sdebug_max_luns = DEF_MAX_LUNS;
 
 
 
5283	}
5284
5285	if (sdebug_lowest_aligned > 0x3fff) {
5286		pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
5287		return -EINVAL;
5288	}
5289
5290	if (submit_queues < 1) {
5291		pr_err("submit_queues must be 1 or more\n");
5292		return -EINVAL;
5293	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5294	sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
5295			       GFP_KERNEL);
5296	if (sdebug_q_arr == NULL)
5297		return -ENOMEM;
5298	for (k = 0; k < submit_queues; ++k)
5299		spin_lock_init(&sdebug_q_arr[k].qc_lock);
5300
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5301	if (sdebug_dev_size_mb < 1)
5302		sdebug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
5303	sz = (unsigned long)sdebug_dev_size_mb * 1048576;
5304	sdebug_store_sectors = sz / sdebug_sector_size;
5305	sdebug_capacity = get_sdebug_capacity();
5306
5307	/* play around with geometry, don't waste too much on track 0 */
5308	sdebug_heads = 8;
5309	sdebug_sectors_per = 32;
5310	if (sdebug_dev_size_mb >= 256)
5311		sdebug_heads = 64;
5312	else if (sdebug_dev_size_mb >= 16)
5313		sdebug_heads = 32;
5314	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
5315			       (sdebug_sectors_per * sdebug_heads);
5316	if (sdebug_cylinders_per >= 1024) {
5317		/* other LLDs do this; implies >= 1GB ram disk ... */
5318		sdebug_heads = 255;
5319		sdebug_sectors_per = 63;
5320		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
5321			       (sdebug_sectors_per * sdebug_heads);
5322	}
5323
5324	if (sdebug_fake_rw == 0) {
5325		fake_storep = vzalloc(sz);
5326		if (NULL == fake_storep) {
5327			pr_err("out of memory, 1\n");
5328			ret = -ENOMEM;
5329			goto free_q_arr;
5330		}
5331		if (sdebug_num_parts > 0)
5332			sdebug_build_parts(fake_storep, sz);
5333	}
5334
5335	if (sdebug_dix) {
5336		int dif_size;
5337
5338		dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
5339		dif_storep = vmalloc(dif_size);
5340
5341		pr_err("dif_storep %u bytes @ %p\n", dif_size, dif_storep);
5342
5343		if (dif_storep == NULL) {
5344			pr_err("out of mem. (DIX)\n");
5345			ret = -ENOMEM;
5346			goto free_vm;
5347		}
5348
5349		memset(dif_storep, 0xff, dif_size);
5350	}
5351
5352	/* Logical Block Provisioning */
5353	if (scsi_debug_lbp()) {
5354		sdebug_unmap_max_blocks =
5355			clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
5356
5357		sdebug_unmap_max_desc =
5358			clamp(sdebug_unmap_max_desc, 0U, 256U);
5359
5360		sdebug_unmap_granularity =
5361			clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
5362
5363		if (sdebug_unmap_alignment &&
5364		    sdebug_unmap_granularity <=
5365		    sdebug_unmap_alignment) {
5366			pr_err("ERR: unmap_granularity <= unmap_alignment\n");
5367			ret = -EINVAL;
5368			goto free_vm;
5369		}
5370
5371		map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
5372		map_storep = vmalloc(array_size(sizeof(long),
5373						BITS_TO_LONGS(map_size)));
5374
5375		pr_info("%lu provisioning blocks\n", map_size);
5376
5377		if (map_storep == NULL) {
5378			pr_err("out of mem. (MAP)\n");
5379			ret = -ENOMEM;
5380			goto free_vm;
5381		}
5382
5383		bitmap_zero(map_storep, map_size);
5384
5385		/* Map first 1KB for partition table */
5386		if (sdebug_num_parts)
5387			map_region(0, 2);
5388	}
5389
5390	pseudo_primary = root_device_register("pseudo_0");
5391	if (IS_ERR(pseudo_primary)) {
5392		pr_warn("root_device_register() error\n");
5393		ret = PTR_ERR(pseudo_primary);
5394		goto free_vm;
5395	}
5396	ret = bus_register(&pseudo_lld_bus);
5397	if (ret < 0) {
5398		pr_warn("bus_register error: %d\n", ret);
5399		goto dev_unreg;
5400	}
5401	ret = driver_register(&sdebug_driverfs_driver);
5402	if (ret < 0) {
5403		pr_warn("driver_register error: %d\n", ret);
5404		goto bus_unreg;
5405	}
5406
5407	host_to_add = sdebug_add_host;
5408	sdebug_add_host = 0;
5409
5410	for (k = 0; k < host_to_add; k++) {
5411		if (sdebug_add_adapter()) {
5412			pr_err("sdebug_add_adapter failed k=%d\n", k);
5413			break;
 
 
 
 
 
 
 
 
 
 
 
5414		}
5415	}
5416
5417	if (sdebug_verbose)
5418		pr_info("built %d host(s)\n", sdebug_add_host);
5419
5420	return 0;
5421
5422bus_unreg:
5423	bus_unregister(&pseudo_lld_bus);
5424dev_unreg:
5425	root_device_unregister(pseudo_primary);
5426free_vm:
5427	vfree(map_storep);
5428	vfree(dif_storep);
5429	vfree(fake_storep);
5430free_q_arr:
5431	kfree(sdebug_q_arr);
5432	return ret;
5433}
5434
5435static void __exit scsi_debug_exit(void)
5436{
5437	int k = sdebug_add_host;
5438
5439	stop_all_queued();
5440	for (; k; k--)
5441		sdebug_remove_adapter();
5442	free_all_queued();
5443	driver_unregister(&sdebug_driverfs_driver);
5444	bus_unregister(&pseudo_lld_bus);
5445	root_device_unregister(pseudo_primary);
5446
5447	vfree(map_storep);
5448	vfree(dif_storep);
5449	vfree(fake_storep);
5450	kfree(sdebug_q_arr);
5451}
5452
5453device_initcall(scsi_debug_init);
5454module_exit(scsi_debug_exit);
5455
5456static void sdebug_release_adapter(struct device *dev)
5457{
5458	struct sdebug_host_info *sdbg_host;
5459
5460	sdbg_host = to_sdebug_host(dev);
5461	kfree(sdbg_host);
5462}
5463
5464static int sdebug_add_adapter(void)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5465{
5466	int k, devs_per_host;
5467	int error = 0;
5468	struct sdebug_host_info *sdbg_host;
5469	struct sdebug_dev_info *sdbg_devinfo, *tmp;
5470
5471	sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL);
5472	if (sdbg_host == NULL) {
5473		pr_err("out of memory at line %d\n", __LINE__);
5474		return -ENOMEM;
5475	}
 
 
 
5476
5477	INIT_LIST_HEAD(&sdbg_host->dev_info_list);
5478
5479	devs_per_host = sdebug_num_tgts * sdebug_max_luns;
5480	for (k = 0; k < devs_per_host; k++) {
5481		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
5482		if (!sdbg_devinfo) {
5483			pr_err("out of memory at line %d\n", __LINE__);
5484			error = -ENOMEM;
5485			goto clean;
5486		}
5487	}
5488
5489	spin_lock(&sdebug_host_list_lock);
5490	list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
5491	spin_unlock(&sdebug_host_list_lock);
5492
5493	sdbg_host->dev.bus = &pseudo_lld_bus;
5494	sdbg_host->dev.parent = pseudo_primary;
5495	sdbg_host->dev.release = &sdebug_release_adapter;
5496	dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_add_host);
5497
5498	error = device_register(&sdbg_host->dev);
5499
5500	if (error)
5501		goto clean;
5502
5503	++sdebug_add_host;
5504	return error;
5505
5506clean:
5507	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5508				 dev_list) {
5509		list_del(&sdbg_devinfo->dev_list);
 
5510		kfree(sdbg_devinfo);
5511	}
5512
5513	kfree(sdbg_host);
 
5514	return error;
5515}
5516
5517static void sdebug_remove_adapter(void)
5518{
 
 
 
 
 
 
 
 
 
 
 
 
 
5519	struct sdebug_host_info *sdbg_host = NULL;
 
5520
5521	spin_lock(&sdebug_host_list_lock);
5522	if (!list_empty(&sdebug_host_list)) {
5523		sdbg_host = list_entry(sdebug_host_list.prev,
5524				       struct sdebug_host_info, host_list);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5525		list_del(&sdbg_host->host_list);
5526	}
5527	spin_unlock(&sdebug_host_list_lock);
5528
5529	if (!sdbg_host)
5530		return;
5531
5532	device_unregister(&sdbg_host->dev);
5533	--sdebug_add_host;
5534}
5535
5536static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
5537{
5538	int num_in_q = 0;
5539	struct sdebug_dev_info *devip;
5540
5541	block_unblock_all_queues(true);
5542	devip = (struct sdebug_dev_info *)sdev->hostdata;
5543	if (NULL == devip) {
5544		block_unblock_all_queues(false);
5545		return	-ENODEV;
5546	}
5547	num_in_q = atomic_read(&devip->num_in_q);
5548
 
 
 
 
 
5549	if (qdepth < 1)
5550		qdepth = 1;
5551	/* allow to exceed max host qc_arr elements for testing */
5552	if (qdepth > SDEBUG_CANQUEUE + 10)
5553		qdepth = SDEBUG_CANQUEUE + 10;
5554	scsi_change_queue_depth(sdev, qdepth);
5555
5556	if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
5557		sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
5558			    __func__, qdepth, num_in_q);
5559	}
5560	block_unblock_all_queues(false);
5561	return sdev->queue_depth;
5562}
5563
5564static bool fake_timeout(struct scsi_cmnd *scp)
5565{
5566	if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
5567		if (sdebug_every_nth < -1)
5568			sdebug_every_nth = -1;
5569		if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
5570			return true; /* ignore command causing timeout */
5571		else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
5572			 scsi_medium_access_command(scp))
5573			return true; /* time out reads and writes */
5574	}
5575	return false;
5576}
5577
5578static bool fake_host_busy(struct scsi_cmnd *scp)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5579{
5580	return (sdebug_opts & SDEBUG_OPT_HOST_BUSY) &&
5581		(atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) == 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5582}
5583
5584static int scsi_debug_queuecommand(struct Scsi_Host *shost,
5585				   struct scsi_cmnd *scp)
5586{
5587	u8 sdeb_i;
5588	struct scsi_device *sdp = scp->device;
5589	const struct opcode_info_t *oip;
5590	const struct opcode_info_t *r_oip;
5591	struct sdebug_dev_info *devip;
5592	u8 *cmd = scp->cmnd;
5593	int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
5594	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *) = NULL;
5595	int k, na;
5596	int errsts = 0;
 
5597	u32 flags;
5598	u16 sa;
5599	u8 opcode = cmd[0];
5600	bool has_wlun_rl;
 
5601
5602	scsi_set_resid(scp, 0);
5603	if (sdebug_statistics)
5604		atomic_inc(&sdebug_cmnd_count);
 
 
 
 
5605	if (unlikely(sdebug_verbose &&
5606		     !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
5607		char b[120];
5608		int n, len, sb;
5609
5610		len = scp->cmd_len;
5611		sb = (int)sizeof(b);
5612		if (len > 32)
5613			strcpy(b, "too long, over 32 bytes");
5614		else {
5615			for (k = 0, n = 0; k < len && n < sb; ++k)
5616				n += scnprintf(b + n, sb - n, "%02x ",
5617					       (u32)cmd[k]);
5618		}
5619		sdev_printk(KERN_INFO, sdp, "%s: tag=%#x, cmd %s\n", my_name,
5620			    blk_mq_unique_tag(scp->request), b);
5621	}
5622	if (fake_host_busy(scp))
5623		return SCSI_MLQUEUE_HOST_BUSY;
5624	has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
5625	if (unlikely((sdp->lun >= sdebug_max_luns) && !has_wlun_rl))
5626		goto err_out;
5627
5628	sdeb_i = opcode_ind_arr[opcode];	/* fully mapped */
5629	oip = &opcode_info_arr[sdeb_i];		/* safe if table consistent */
5630	devip = (struct sdebug_dev_info *)sdp->hostdata;
5631	if (unlikely(!devip)) {
5632		devip = find_build_dev_info(sdp);
5633		if (NULL == devip)
5634			goto err_out;
5635	}
 
 
 
5636	na = oip->num_attached;
5637	r_pfp = oip->pfp;
5638	if (na) {	/* multiple commands with this opcode */
5639		r_oip = oip;
5640		if (FF_SA & r_oip->flags) {
5641			if (F_SA_LOW & oip->flags)
5642				sa = 0x1f & cmd[1];
5643			else
5644				sa = get_unaligned_be16(cmd + 8);
5645			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5646				if (opcode == oip->opcode && sa == oip->sa)
5647					break;
5648			}
5649		} else {   /* since no service action only check opcode */
5650			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5651				if (opcode == oip->opcode)
5652					break;
5653			}
5654		}
5655		if (k > na) {
5656			if (F_SA_LOW & r_oip->flags)
5657				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
5658			else if (F_SA_HIGH & r_oip->flags)
5659				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
5660			else
5661				mk_sense_invalid_opcode(scp);
5662			goto check_cond;
5663		}
5664	}	/* else (when na==0) we assume the oip is a match */
5665	flags = oip->flags;
5666	if (unlikely(F_INV_OP & flags)) {
5667		mk_sense_invalid_opcode(scp);
5668		goto check_cond;
5669	}
5670	if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
5671		if (sdebug_verbose)
5672			sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
5673				    my_name, opcode, " supported for wlun");
5674		mk_sense_invalid_opcode(scp);
5675		goto check_cond;
5676	}
5677	if (unlikely(sdebug_strict)) {	/* check cdb against mask */
5678		u8 rem;
5679		int j;
5680
5681		for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
5682			rem = ~oip->len_mask[k] & cmd[k];
5683			if (rem) {
5684				for (j = 7; j >= 0; --j, rem <<= 1) {
5685					if (0x80 & rem)
5686						break;
5687				}
5688				mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
5689				goto check_cond;
5690			}
5691		}
5692	}
5693	if (unlikely(!(F_SKIP_UA & flags) &&
5694		     find_first_bit(devip->uas_bm,
5695				    SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
5696		errsts = make_ua(scp, devip);
5697		if (errsts)
5698			goto check_cond;
5699	}
5700	if (unlikely((F_M_ACCESS & flags) && atomic_read(&devip->stopped))) {
5701		mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
5702		if (sdebug_verbose)
5703			sdev_printk(KERN_INFO, sdp, "%s reports: Not ready: "
5704				    "%s\n", my_name, "initializing command "
5705				    "required");
5706		errsts = check_condition_result;
5707		goto fini;
5708	}
5709	if (sdebug_fake_rw && (F_FAKE_RW & flags))
5710		goto fini;
5711	if (unlikely(sdebug_every_nth)) {
5712		if (fake_timeout(scp))
5713			return 0;	/* ignore command: make trouble */
5714	}
5715	if (likely(oip->pfp))
5716		pfp = oip->pfp;	/* calls a resp_* function */
5717	else
5718		pfp = r_pfp;    /* if leaf function ptr NULL, try the root's */
5719
5720fini:
5721	if (F_DELAY_OVERR & flags)
5722		return schedule_resp(scp, devip, errsts, pfp, 0, 0);
5723	else if ((flags & F_LONG_DELAY) && (sdebug_jdelay > 0 ||
5724					    sdebug_ndelay > 10000)) {
5725		/*
5726		 * Skip long delays if ndelay <= 10 microseconds. Otherwise
5727		 * for Start Stop Unit (SSU) want at least 1 second delay and
5728		 * if sdebug_jdelay>1 want a long delay of that many seconds.
5729		 * For Synchronize Cache want 1/20 of SSU's delay.
5730		 */
5731		int jdelay = (sdebug_jdelay < 2) ? 1 : sdebug_jdelay;
5732		int denom = (flags & F_SYNC_DELAY) ? 20 : 1;
5733
5734		jdelay = mult_frac(USER_HZ * jdelay, HZ, denom * USER_HZ);
5735		return schedule_resp(scp, devip, errsts, pfp, jdelay, 0);
5736	} else
5737		return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay,
5738				     sdebug_ndelay);
5739check_cond:
5740	return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0);
5741err_out:
5742	return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, NULL, 0, 0);
5743}
5744
5745static struct scsi_host_template sdebug_driver_template = {
5746	.show_info =		scsi_debug_show_info,
5747	.write_info =		scsi_debug_write_info,
5748	.proc_name =		sdebug_proc_name,
5749	.name =			"SCSI DEBUG",
5750	.info =			scsi_debug_info,
5751	.slave_alloc =		scsi_debug_slave_alloc,
5752	.slave_configure =	scsi_debug_slave_configure,
5753	.slave_destroy =	scsi_debug_slave_destroy,
5754	.ioctl =		scsi_debug_ioctl,
5755	.queuecommand =		scsi_debug_queuecommand,
5756	.change_queue_depth =	sdebug_change_qdepth,
 
 
5757	.eh_abort_handler =	scsi_debug_abort,
5758	.eh_device_reset_handler = scsi_debug_device_reset,
5759	.eh_target_reset_handler = scsi_debug_target_reset,
5760	.eh_bus_reset_handler = scsi_debug_bus_reset,
5761	.eh_host_reset_handler = scsi_debug_host_reset,
5762	.can_queue =		SDEBUG_CANQUEUE,
5763	.this_id =		7,
5764	.sg_tablesize =		SG_MAX_SEGMENTS,
5765	.cmd_per_lun =		DEF_CMD_PER_LUN,
5766	.max_sectors =		-1U,
5767	.max_segment_size =	-1U,
5768	.module =		THIS_MODULE,
5769	.track_queue_depth =	1,
5770};
5771
5772static int sdebug_driver_probe(struct device *dev)
5773{
5774	int error = 0;
5775	struct sdebug_host_info *sdbg_host;
5776	struct Scsi_Host *hpnt;
5777	int hprot;
5778
5779	sdbg_host = to_sdebug_host(dev);
5780
5781	sdebug_driver_template.can_queue = sdebug_max_queue;
 
5782	if (!sdebug_clustering)
5783		sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
5784
5785	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
5786	if (NULL == hpnt) {
5787		pr_err("scsi_host_alloc failed\n");
5788		error = -ENODEV;
5789		return error;
5790	}
5791	if (submit_queues > nr_cpu_ids) {
5792		pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%u\n",
5793			my_name, submit_queues, nr_cpu_ids);
5794		submit_queues = nr_cpu_ids;
5795	}
5796	/* Decide whether to tell scsi subsystem that we want mq */
5797	/* Following should give the same answer for each host */
 
 
5798	hpnt->nr_hw_queues = submit_queues;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5799
5800	sdbg_host->shost = hpnt;
5801	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
5802	if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
5803		hpnt->max_id = sdebug_num_tgts + 1;
5804	else
5805		hpnt->max_id = sdebug_num_tgts;
5806	/* = sdebug_max_luns; */
5807	hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
5808
5809	hprot = 0;
5810
5811	switch (sdebug_dif) {
5812
5813	case T10_PI_TYPE1_PROTECTION:
5814		hprot = SHOST_DIF_TYPE1_PROTECTION;
5815		if (sdebug_dix)
5816			hprot |= SHOST_DIX_TYPE1_PROTECTION;
5817		break;
5818
5819	case T10_PI_TYPE2_PROTECTION:
5820		hprot = SHOST_DIF_TYPE2_PROTECTION;
5821		if (sdebug_dix)
5822			hprot |= SHOST_DIX_TYPE2_PROTECTION;
5823		break;
5824
5825	case T10_PI_TYPE3_PROTECTION:
5826		hprot = SHOST_DIF_TYPE3_PROTECTION;
5827		if (sdebug_dix)
5828			hprot |= SHOST_DIX_TYPE3_PROTECTION;
5829		break;
5830
5831	default:
5832		if (sdebug_dix)
5833			hprot |= SHOST_DIX_TYPE0_PROTECTION;
5834		break;
5835	}
5836
5837	scsi_host_set_prot(hpnt, hprot);
5838
5839	if (have_dif_prot || sdebug_dix)
5840		pr_info("host protection%s%s%s%s%s%s%s\n",
5841			(hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
5842			(hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
5843			(hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
5844			(hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
5845			(hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
5846			(hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
5847			(hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
5848
5849	if (sdebug_guard == 1)
5850		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
5851	else
5852		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
5853
5854	sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
5855	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
5856	if (sdebug_every_nth)	/* need stats counters for every_nth */
5857		sdebug_statistics = true;
5858	error = scsi_add_host(hpnt, &sdbg_host->dev);
5859	if (error) {
5860		pr_err("scsi_add_host failed\n");
5861		error = -ENODEV;
5862		scsi_host_put(hpnt);
5863	} else
5864		scsi_scan_host(hpnt);
 
5865
5866	return error;
5867}
5868
5869static int sdebug_driver_remove(struct device *dev)
5870{
5871	struct sdebug_host_info *sdbg_host;
5872	struct sdebug_dev_info *sdbg_devinfo, *tmp;
5873
5874	sdbg_host = to_sdebug_host(dev);
5875
5876	if (!sdbg_host) {
5877		pr_err("Unable to locate host info\n");
5878		return -ENODEV;
5879	}
5880
5881	scsi_remove_host(sdbg_host->shost);
5882
5883	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5884				 dev_list) {
5885		list_del(&sdbg_devinfo->dev_list);
 
5886		kfree(sdbg_devinfo);
5887	}
5888
5889	scsi_host_put(sdbg_host->shost);
5890	return 0;
5891}
5892
5893static int pseudo_lld_bus_match(struct device *dev,
5894				struct device_driver *dev_driver)
5895{
5896	return 1;
5897}
5898
5899static struct bus_type pseudo_lld_bus = {
5900	.name = "pseudo",
5901	.match = pseudo_lld_bus_match,
5902	.probe = sdebug_driver_probe,
5903	.remove = sdebug_driver_remove,
5904	.drv_groups = sdebug_drv_groups,
5905};