Linux Audio

Check our new training course

Loading...
v4.10.11
 
   1/*
   2 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
   3 *  Copyright (C) 1992  Eric Youngdale
   4 *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
   5 *  to make sure that we are not getting blocks mixed up, and PANIC if
   6 *  anything out of the ordinary is seen.
   7 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   8 *
   9 * Copyright (C) 2001 - 2016 Douglas Gilbert
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2, or (at your option)
  14 * any later version.
  15 *
  16 *  For documentation see http://sg.danny.cz/sg/sdebug26.html
  17 *
 
  18 */
  19
  20
  21#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
  22
  23#include <linux/module.h>
  24
  25#include <linux/kernel.h>
  26#include <linux/errno.h>
  27#include <linux/jiffies.h>
  28#include <linux/slab.h>
  29#include <linux/types.h>
  30#include <linux/string.h>
  31#include <linux/genhd.h>
  32#include <linux/fs.h>
  33#include <linux/init.h>
  34#include <linux/proc_fs.h>
  35#include <linux/vmalloc.h>
  36#include <linux/moduleparam.h>
  37#include <linux/scatterlist.h>
  38#include <linux/blkdev.h>
  39#include <linux/crc-t10dif.h>
  40#include <linux/spinlock.h>
  41#include <linux/interrupt.h>
  42#include <linux/atomic.h>
  43#include <linux/hrtimer.h>
  44#include <linux/uuid.h>
  45#include <linux/t10-pi.h>
 
 
 
 
  46
  47#include <net/checksum.h>
  48
  49#include <asm/unaligned.h>
  50
  51#include <scsi/scsi.h>
  52#include <scsi/scsi_cmnd.h>
  53#include <scsi/scsi_device.h>
  54#include <scsi/scsi_host.h>
  55#include <scsi/scsicam.h>
  56#include <scsi/scsi_eh.h>
  57#include <scsi/scsi_tcq.h>
  58#include <scsi/scsi_dbg.h>
  59
  60#include "sd.h"
  61#include "scsi_logging.h"
  62
  63/* make sure inq_product_rev string corresponds to this version */
  64#define SDEBUG_VERSION "1.86"
  65static const char *sdebug_version_date = "20160430";
  66
  67#define MY_NAME "scsi_debug"
  68
  69/* Additional Sense Code (ASC) */
  70#define NO_ADDITIONAL_SENSE 0x0
  71#define LOGICAL_UNIT_NOT_READY 0x4
  72#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
  73#define UNRECOVERED_READ_ERR 0x11
  74#define PARAMETER_LIST_LENGTH_ERR 0x1a
  75#define INVALID_OPCODE 0x20
  76#define LBA_OUT_OF_RANGE 0x21
  77#define INVALID_FIELD_IN_CDB 0x24
  78#define INVALID_FIELD_IN_PARAM_LIST 0x26
 
  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
  97/* Additional Sense Code Qualifier (ASCQ) */
  98#define ACK_NAK_TO 0x3
  99
 100/* Default values for driver parameters */
 101#define DEF_NUM_HOST   1
 102#define DEF_NUM_TGTS   1
 103#define DEF_MAX_LUNS   1
 104/* With these defaults, this driver will make 1 host with 1 target
 105 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
 106 */
 107#define DEF_ATO 1
 
 108#define DEF_JDELAY   1		/* if > 0 unit is a jiffy */
 
 109#define DEF_DEV_SIZE_MB   8
 
 110#define DEF_DIF 0
 111#define DEF_DIX 0
 
 112#define DEF_D_SENSE   0
 113#define DEF_EVERY_NTH   0
 114#define DEF_FAKE_RW	0
 115#define DEF_GUARD 0
 116#define DEF_HOST_LOCK 0
 117#define DEF_LBPU 0
 118#define DEF_LBPWS 0
 119#define DEF_LBPWS10 0
 120#define DEF_LBPRZ 1
 121#define DEF_LOWEST_ALIGNED 0
 122#define DEF_NDELAY   0		/* if > 0 unit is a nanosecond */
 123#define DEF_NO_LUN_0   0
 124#define DEF_NUM_PARTS   0
 125#define DEF_OPTS   0
 126#define DEF_OPT_BLKS 1024
 127#define DEF_PHYSBLK_EXP 0
 
 128#define DEF_PTYPE   TYPE_DISK
 
 129#define DEF_REMOVABLE false
 130#define DEF_SCSI_LEVEL   7    /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
 131#define DEF_SECTOR_SIZE 512
 132#define DEF_UNMAP_ALIGNMENT 0
 133#define DEF_UNMAP_GRANULARITY 1
 134#define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
 135#define DEF_UNMAP_MAX_DESC 256
 136#define DEF_VIRTUAL_GB   0
 137#define DEF_VPD_USE_HOSTNO 1
 138#define DEF_WRITESAME_LENGTH 0xFFFF
 139#define DEF_STRICT 0
 140#define DEF_STATISTICS false
 141#define DEF_SUBMIT_QUEUES 1
 
 142#define DEF_UUID_CTL 0
 143#define JDELAY_OVERRIDDEN -9999
 144
 
 
 
 
 
 145#define SDEBUG_LUN_0_VAL 0
 146
 147/* bit mask values for sdebug_opts */
 148#define SDEBUG_OPT_NOISE		1
 149#define SDEBUG_OPT_MEDIUM_ERR		2
 150#define SDEBUG_OPT_TIMEOUT		4
 151#define SDEBUG_OPT_RECOVERED_ERR	8
 152#define SDEBUG_OPT_TRANSPORT_ERR	16
 153#define SDEBUG_OPT_DIF_ERR		32
 154#define SDEBUG_OPT_DIX_ERR		64
 155#define SDEBUG_OPT_MAC_TIMEOUT		128
 156#define SDEBUG_OPT_SHORT_TRANSFER	0x100
 157#define SDEBUG_OPT_Q_NOISE		0x200
 158#define SDEBUG_OPT_ALL_TSF		0x400
 159#define SDEBUG_OPT_RARE_TSF		0x800
 160#define SDEBUG_OPT_N_WCE		0x1000
 161#define SDEBUG_OPT_RESET_NOISE		0x2000
 162#define SDEBUG_OPT_NO_CDB_NOISE		0x4000
 
 
 163#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
 164			      SDEBUG_OPT_RESET_NOISE)
 165#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
 166				  SDEBUG_OPT_TRANSPORT_ERR | \
 167				  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
 168				  SDEBUG_OPT_SHORT_TRANSFER)
 169/* When "every_nth" > 0 then modulo "every_nth" commands:
 170 *   - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set
 171 *   - a RECOVERED_ERROR is simulated on successful read and write
 172 *     commands if SDEBUG_OPT_RECOVERED_ERR is set.
 173 *   - a TRANSPORT_ERROR is simulated on successful read and write
 174 *     commands if SDEBUG_OPT_TRANSPORT_ERR is set.
 175 *
 176 * When "every_nth" < 0 then after "- every_nth" commands:
 177 *   - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set
 178 *   - a RECOVERED_ERROR is simulated on successful read and write
 179 *     commands if SDEBUG_OPT_RECOVERED_ERR is set.
 180 *   - a TRANSPORT_ERROR is simulated on successful read and write
 181 *     commands if _DEBUG_OPT_TRANSPORT_ERR is set.
 182 * This will continue on every subsequent command until some other action
 183 * occurs (e.g. the user * writing a new value (other than -1 or 1) to
 184 * every_nth via sysfs).
 185 */
 186
 187/* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
 188 * priority order. In the subset implemented here lower numbers have higher
 189 * priority. The UA numbers should be a sequence starting from 0 with
 190 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
 191#define SDEBUG_UA_POR 0		/* Power on, reset, or bus device reset */
 192#define SDEBUG_UA_BUS_RESET 1
 193#define SDEBUG_UA_MODE_CHANGED 2
 194#define SDEBUG_UA_CAPACITY_CHANGED 3
 195#define SDEBUG_UA_LUNS_CHANGED 4
 196#define SDEBUG_UA_MICROCODE_CHANGED 5	/* simulate firmware change */
 197#define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 6
 198#define SDEBUG_NUM_UAS 7
 199
 200/* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
 201 * sector on read commands: */
 202#define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
 203#define OPT_MEDIUM_ERR_NUM    10     /* number of consecutive medium errs */
 204
 205/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
 206 * or "peripheral device" addressing (value 0) */
 207#define SAM2_LUN_ADDRESS_METHOD 0
 208
 209/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
 210 * (for response) per submit queue at one time. Can be reduced by max_queue
 211 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
 212 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
 213 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
 214 * but cannot exceed SDEBUG_CANQUEUE .
 215 */
 216#define SDEBUG_CANQUEUE_WORDS  3	/* a WORD is bits in a long */
 217#define SDEBUG_CANQUEUE  (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
 218#define DEF_CMD_PER_LUN  255
 219
 220#define F_D_IN			1
 221#define F_D_OUT			2
 
 222#define F_D_OUT_MAYBE		4	/* WRITE SAME, NDOB bit */
 223#define F_D_UNKN		8
 224#define F_RL_WLUN_OK		0x10
 225#define F_SKIP_UA		0x20
 226#define F_DELAY_OVERR		0x40
 227#define F_SA_LOW		0x80	/* cdb byte 1, bits 4 to 0 */
 228#define F_SA_HIGH		0x100	/* as used by variable length cdbs */
 229#define F_INV_OP		0x200
 230#define F_FAKE_RW		0x400
 231#define F_M_ACCESS		0x800	/* media access */
 
 
 232
 
 233#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
 234#define FF_DIRECT_IO (F_M_ACCESS | F_FAKE_RW)
 235#define FF_SA (F_SA_HIGH | F_SA_LOW)
 
 236
 237#define SDEBUG_MAX_PARTS 4
 238
 239#define SDEBUG_MAX_CMD_LEN 32
 240
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 241
 242struct sdebug_dev_info {
 243	struct list_head dev_list;
 244	unsigned int channel;
 245	unsigned int target;
 246	u64 lun;
 247	uuid_be lu_name;
 248	struct sdebug_host_info *sdbg_host;
 249	unsigned long uas_bm[1];
 250	atomic_t num_in_q;
 251	atomic_t stopped;
 252	bool used;
 
 
 
 
 
 
 
 
 
 
 
 
 
 253};
 254
 255struct sdebug_host_info {
 256	struct list_head host_list;
 
 257	struct Scsi_Host *shost;
 258	struct device dev;
 259	struct list_head dev_info_list;
 260};
 261
 
 
 
 
 
 
 
 
 262#define to_sdebug_host(d)	\
 263	container_of(d, struct sdebug_host_info, dev)
 264
 
 
 
 265struct sdebug_defer {
 266	struct hrtimer hrt;
 267	struct execute_work ew;
 268	int sqa_idx;	/* index of sdebug_queue array */
 269	int qc_idx;	/* index of sdebug_queued_cmd array within sqa_idx */
 
 270	int issuing_cpu;
 
 
 
 
 271};
 272
 273struct sdebug_queued_cmd {
 274	/* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
 275	 * instance indicates this slot is in use.
 276	 */
 277	struct sdebug_defer *sd_dp;
 278	struct scsi_cmnd *a_cmnd;
 279	unsigned int inj_recovered:1;
 280	unsigned int inj_transport:1;
 281	unsigned int inj_dif:1;
 282	unsigned int inj_dix:1;
 283	unsigned int inj_short:1;
 284};
 285
 286struct sdebug_queue {
 287	struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
 288	unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
 289	spinlock_t qc_lock;
 290	atomic_t blocked;	/* to temporarily stop more being queued */
 291};
 292
 293static atomic_t sdebug_cmnd_count;   /* number of incoming commands */
 294static atomic_t sdebug_completions;  /* count of deferred completions */
 295static atomic_t sdebug_miss_cpus;    /* submission + completion cpus differ */
 296static atomic_t sdebug_a_tsf;	     /* 'almost task set full' counter */
 
 297
 298struct opcode_info_t {
 299	u8 num_attached;	/* 0 if this is it (i.e. a leaf); use 0xff */
 300				/* for terminating element */
 301	u8 opcode;		/* if num_attached > 0, preferred */
 302	u16 sa;			/* service action */
 303	u32 flags;		/* OR-ed set of SDEB_F_* */
 304	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
 305	const struct opcode_info_t *arrp;  /* num_attached elements or NULL */
 306	u8 len_mask[16];	/* len=len_mask[0], then mask for cdb[1]... */
 307				/* ignore cdb bytes after position 15 */
 308};
 309
 310/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
 311enum sdeb_opcode_index {
 312	SDEB_I_INVALID_OPCODE =	0,
 313	SDEB_I_INQUIRY = 1,
 314	SDEB_I_REPORT_LUNS = 2,
 315	SDEB_I_REQUEST_SENSE = 3,
 316	SDEB_I_TEST_UNIT_READY = 4,
 317	SDEB_I_MODE_SENSE = 5,		/* 6, 10 */
 318	SDEB_I_MODE_SELECT = 6,		/* 6, 10 */
 319	SDEB_I_LOG_SENSE = 7,
 320	SDEB_I_READ_CAPACITY = 8,	/* 10; 16 is in SA_IN(16) */
 321	SDEB_I_READ = 9,		/* 6, 10, 12, 16 */
 322	SDEB_I_WRITE = 10,		/* 6, 10, 12, 16 */
 323	SDEB_I_START_STOP = 11,
 324	SDEB_I_SERV_ACT_IN = 12,	/* 12, 16 */
 325	SDEB_I_SERV_ACT_OUT = 13,	/* 12, 16 */
 326	SDEB_I_MAINT_IN = 14,
 327	SDEB_I_MAINT_OUT = 15,
 328	SDEB_I_VERIFY = 16,		/* 10 only */
 329	SDEB_I_VARIABLE_LEN = 17,
 330	SDEB_I_RESERVE = 18,		/* 6, 10 */
 331	SDEB_I_RELEASE = 19,		/* 6, 10 */
 332	SDEB_I_ALLOW_REMOVAL = 20,	/* PREVENT ALLOW MEDIUM REMOVAL */
 333	SDEB_I_REZERO_UNIT = 21,	/* REWIND in SSC */
 334	SDEB_I_ATA_PT = 22,		/* 12, 16 */
 335	SDEB_I_SEND_DIAG = 23,
 336	SDEB_I_UNMAP = 24,
 337	SDEB_I_XDWRITEREAD = 25,	/* 10 only */
 338	SDEB_I_WRITE_BUFFER = 26,
 339	SDEB_I_WRITE_SAME = 27,		/* 10, 16 */
 340	SDEB_I_SYNC_CACHE = 28,		/* 10 only */
 341	SDEB_I_COMP_WRITE = 29,
 342	SDEB_I_LAST_ELEMENT = 30,	/* keep this last */
 
 
 343};
 344
 345
 346static const unsigned char opcode_ind_arr[256] = {
 347/* 0x0; 0x0->0x1f: 6 byte cdbs */
 348	SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
 349	    0, 0, 0, 0,
 350	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 351	0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 352	    SDEB_I_RELEASE,
 353	0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
 354	    SDEB_I_ALLOW_REMOVAL, 0,
 355/* 0x20; 0x20->0x3f: 10 byte cdbs */
 356	0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
 357	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
 358	0, 0, 0, 0, 0, SDEB_I_SYNC_CACHE, 0, 0,
 359	0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
 360/* 0x40; 0x40->0x5f: 10 byte cdbs */
 361	0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
 362	0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
 363	0, 0, 0, SDEB_I_XDWRITEREAD, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 364	    SDEB_I_RELEASE,
 365	0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
 366/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
 367	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 368	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 369	0, SDEB_I_VARIABLE_LEN,
 370/* 0x80; 0x80->0x9f: 16 byte cdbs */
 371	0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
 372	SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 373	0, 0, 0, SDEB_I_WRITE_SAME, 0, 0, 0, 0,
 374	0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN, SDEB_I_SERV_ACT_OUT,
 
 
 375/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
 376	SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
 377	     SDEB_I_MAINT_OUT, 0, 0, 0,
 378	SDEB_I_READ, SDEB_I_SERV_ACT_OUT, SDEB_I_WRITE, SDEB_I_SERV_ACT_IN,
 379	     0, 0, 0, 0,
 380	0, 0, 0, 0, 0, 0, 0, 0,
 381	0, 0, 0, 0, 0, 0, 0, 0,
 382/* 0xc0; 0xc0->0xff: vendor specific */
 383	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 384	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 385	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 386	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 387};
 388
 
 
 
 
 
 
 
 
 389static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
 390static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
 391static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
 392static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 393static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
 394static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 395static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
 396static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 397static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 
 398static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
 399static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
 400static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
 401static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
 402static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
 403static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
 404static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
 
 405static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
 406static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
 407static int resp_xdwriteread_10(struct scsi_cmnd *, struct sdebug_dev_info *);
 408static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
 409static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 410
 411static const struct opcode_info_t msense_iarr[1] = {
 
 
 
 
 
 412	{0, 0x1a, 0, F_D_IN, NULL, NULL,
 413	    {6,  0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 414};
 415
 416static const struct opcode_info_t mselect_iarr[1] = {
 417	{0, 0x15, 0, F_D_OUT, NULL, NULL,
 418	    {6,  0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 419};
 420
 421static const struct opcode_info_t read_iarr[3] = {
 422	{0, 0x28, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL,/* READ(10) */
 423	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7, 0, 0,
 424	     0, 0, 0, 0} },
 425	{0, 0x8, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL, /* READ(6) */
 426	    {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 427	{0, 0xa8, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL,/* READ(12) */
 428	    {12,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f,
 429	     0xc7, 0, 0, 0, 0} },
 430};
 431
 432static const struct opcode_info_t write_iarr[3] = {
 433	{0, 0x2a, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL,   /* 10 */
 434	    {10,  0xfb, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7, 0, 0,
 435	     0, 0, 0, 0} },
 436	{0, 0xa, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL,    /* 6 */
 437	    {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 438	{0, 0xaa, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL,   /* 12 */
 439	    {12,  0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f,
 440	     0xc7, 0, 0, 0, 0} },
 
 441};
 442
 443static const struct opcode_info_t sa_in_iarr[1] = {
 
 
 
 
 
 
 444	{0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
 445	    {16,  0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 446	     0xff, 0xff, 0xff, 0, 0xc7} },
 447};
 448
 449static const struct opcode_info_t vl_iarr[1] = {	/* VARIABLE LENGTH */
 450	{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_DIRECT_IO, resp_write_dt0,
 451	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x1f, 0x18, 0x0, 0xb, 0xfa,
 452		   0, 0xff, 0xff, 0xff, 0xff} },	/* WRITE(32) */
 
 
 
 453};
 454
 455static const struct opcode_info_t maint_in_iarr[2] = {
 456	{0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
 457	    {12,  0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
 458	     0xc7, 0, 0, 0, 0} },
 459	{0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
 460	    {12,  0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 461	     0, 0} },
 462};
 463
 464static const struct opcode_info_t write_same_iarr[1] = {
 465	{0, 0x93, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, resp_write_same_16, NULL,
 466	    {16,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 467	     0xff, 0xff, 0xff, 0x1f, 0xc7} },
 468};
 469
 470static const struct opcode_info_t reserve_iarr[1] = {
 471	{0, 0x16, 0, F_D_OUT, NULL, NULL,	/* RESERVE(6) */
 472	    {6,  0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 473};
 474
 475static const struct opcode_info_t release_iarr[1] = {
 476	{0, 0x17, 0, F_D_OUT, NULL, NULL,	/* RELEASE(6) */
 477	    {6,  0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 478};
 479
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 480
 481/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
 482 * plus the terminating elements for logic that scans this table such as
 483 * REPORT SUPPORTED OPERATION CODES. */
 484static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
 485/* 0 */
 486	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,
 487	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 488	{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL,
 489	    {6,  0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 490	{0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
 491	    {12,  0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 492	     0, 0} },
 493	{0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
 494	    {6,  0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 495	{0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
 496	    {6,  0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 497	{1, 0x5a, 0, F_D_IN, resp_mode_sense, msense_iarr,
 498	    {10,  0xf8, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 499	     0} },
 500	{1, 0x55, 0, F_D_OUT, resp_mode_select, mselect_iarr,
 501	    {10,  0xf1, 0, 0, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 502	{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,
 
 
 503	    {10,  0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
 504	     0, 0, 0} },
 505	{0, 0x25, 0, F_D_IN, resp_readcap, NULL,
 506	    {10,  0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
 507	     0, 0} },
 508	{3, 0x88, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, read_iarr,
 509	    {16,  0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 510	     0xff, 0xff, 0xff, 0x9f, 0xc7} },		/* READ(16) */
 511/* 10 */
 512	{3, 0x8a, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, write_iarr,
 513	    {16,  0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 514	     0xff, 0xff, 0xff, 0x9f, 0xc7} },		/* WRITE(16) */
 515	{0, 0x1b, 0, 0, resp_start_stop, NULL,		/* START STOP UNIT */
 
 516	    {6,  0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 517	{1, 0x9e, 0x10, F_SA_LOW | F_D_IN, resp_readcap16, sa_in_iarr,
 518	    {16,  0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 519	     0xff, 0xff, 0xff, 0x1, 0xc7} },	/* READ CAPACITY(16) */
 520	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* SA OUT */
 521	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 522	{2, 0xa3, 0xa, F_SA_LOW | F_D_IN, resp_report_tgtpgs, maint_in_iarr,
 523	    {12,  0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0, 0,
 524	     0} },
 
 
 
 
 525	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
 526	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 527	{0, 0x2f, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, NULL, NULL, /* VERIFY(10) */
 528	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7,
 529	     0, 0, 0, 0, 0, 0} },
 530	{1, 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_DIRECT_IO, resp_read_dt0,
 531	    vl_iarr, {32,  0xc7, 0, 0, 0, 0, 0x1f, 0x18, 0x0, 0x9, 0xfe, 0,
 532		      0xff, 0xff, 0xff, 0xff} },/* VARIABLE LENGTH, READ(32) */
 533	{1, 0x56, 0, F_D_OUT, NULL, reserve_iarr, /* RESERVE(10) */
 
 
 
 534	    {10,  0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 535	     0} },
 536	{1, 0x57, 0, F_D_OUT, NULL, release_iarr, /* RELEASE(10) */
 
 537	    {10,  0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 538	     0} },
 539/* 20 */
 540	{0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
 541	    {6,  0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 542	{0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
 543	    {6,  0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 544	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
 545	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 546	{0, 0x1d, F_D_OUT, 0, NULL, NULL,	/* SEND DIAGNOSTIC */
 547	    {6,  0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 548	{0, 0x42, 0, F_D_OUT | FF_DIRECT_IO, resp_unmap, NULL, /* UNMAP */
 549	    {10,  0x1, 0, 0, 0, 0, 0x1f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 550	{0, 0x53, 0, F_D_IN | F_D_OUT | FF_DIRECT_IO, resp_xdwriteread_10,
 551	    NULL, {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7,
 552		   0, 0, 0, 0, 0, 0} },
 553	{0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
 554	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
 555	     0, 0, 0, 0} },			/* WRITE_BUFFER */
 556	{1, 0x41, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, resp_write_same_10,
 557	    write_same_iarr, {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff,
 558			      0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 559	{0, 0x35, 0, F_DELAY_OVERR | FF_DIRECT_IO, NULL, NULL, /* SYNC_CACHE */
 560	    {10,  0x7, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xc7, 0, 0,
 561	     0, 0, 0, 0} },
 562	{0, 0x89, 0, F_D_OUT | FF_DIRECT_IO, resp_comp_write, NULL,
 
 
 563	    {16,  0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
 564	     0, 0xff, 0x1f, 0xc7} },		/* COMPARE AND WRITE */
 
 
 
 
 565
 566/* 30 */
 
 
 
 
 
 
 
 
 
 567	{0xff, 0, 0, 0, NULL, NULL,		/* terminating element */
 568	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 569};
 570
 571static int sdebug_add_host = DEF_NUM_HOST;
 
 572static int sdebug_ato = DEF_ATO;
 
 573static int sdebug_jdelay = DEF_JDELAY;	/* if > 0 then unit is jiffies */
 574static int sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
 575static int sdebug_dif = DEF_DIF;
 576static int sdebug_dix = DEF_DIX;
 577static int sdebug_dsense = DEF_D_SENSE;
 578static int sdebug_every_nth = DEF_EVERY_NTH;
 579static int sdebug_fake_rw = DEF_FAKE_RW;
 580static unsigned int sdebug_guard = DEF_GUARD;
 
 581static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
 582static int sdebug_max_luns = DEF_MAX_LUNS;
 583static int sdebug_max_queue = SDEBUG_CANQUEUE;	/* per submit queue */
 
 
 584static atomic_t retired_max_queue;	/* if > 0 then was prior max_queue */
 585static int sdebug_ndelay = DEF_NDELAY;	/* if > 0 then unit is nanoseconds */
 586static int sdebug_no_lun_0 = DEF_NO_LUN_0;
 587static int sdebug_no_uld;
 588static int sdebug_num_parts = DEF_NUM_PARTS;
 589static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 590static int sdebug_opt_blks = DEF_OPT_BLKS;
 591static int sdebug_opts = DEF_OPTS;
 592static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
 
 593static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
 594static int sdebug_scsi_level = DEF_SCSI_LEVEL;
 595static int sdebug_sector_size = DEF_SECTOR_SIZE;
 
 596static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
 597static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 598static unsigned int sdebug_lbpu = DEF_LBPU;
 599static unsigned int sdebug_lbpws = DEF_LBPWS;
 600static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
 601static unsigned int sdebug_lbprz = DEF_LBPRZ;
 602static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 603static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 604static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 605static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 606static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
 607static int sdebug_uuid_ctl = DEF_UUID_CTL;
 
 
 608static bool sdebug_removable = DEF_REMOVABLE;
 609static bool sdebug_clustering;
 610static bool sdebug_host_lock = DEF_HOST_LOCK;
 611static bool sdebug_strict = DEF_STRICT;
 612static bool sdebug_any_injecting_opt;
 613static bool sdebug_verbose;
 614static bool have_dif_prot;
 
 615static bool sdebug_statistics = DEF_STATISTICS;
 616static bool sdebug_mq_active;
 
 
 
 617
 618static unsigned int sdebug_store_sectors;
 619static sector_t sdebug_capacity;	/* in sectors */
 620
 621/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 622   may still need them */
 623static int sdebug_heads;		/* heads per disk */
 624static int sdebug_cylinders_per;	/* cylinders per surface */
 625static int sdebug_sectors_per;		/* sectors per cylinder */
 626
 627static LIST_HEAD(sdebug_host_list);
 628static DEFINE_SPINLOCK(sdebug_host_list_lock);
 629
 630static unsigned char *fake_storep;	/* ramdisk storage */
 631static struct t10_pi_tuple *dif_storep;	/* protection info */
 632static void *map_storep;		/* provisioning map */
 
 
 633
 634static unsigned long map_size;
 635static int num_aborts;
 636static int num_dev_resets;
 637static int num_target_resets;
 638static int num_bus_resets;
 639static int num_host_resets;
 640static int dix_writes;
 641static int dix_reads;
 642static int dif_errors;
 643
 
 
 
 
 
 
 644static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
 645static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
 646
 647static DEFINE_RWLOCK(atomic_rw);
 
 
 
 648
 649static char sdebug_proc_name[] = MY_NAME;
 650static const char *my_name = MY_NAME;
 651
 652static struct bus_type pseudo_lld_bus;
 653
 654static struct device_driver sdebug_driverfs_driver = {
 655	.name 		= sdebug_proc_name,
 656	.bus		= &pseudo_lld_bus,
 657};
 658
 659static const int check_condition_result =
 660		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 661
 662static const int illegal_condition_result =
 663	(DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 664
 665static const int device_qfull_result =
 666	(DID_OK << 16) | (COMMAND_COMPLETE << 8) | SAM_STAT_TASK_SET_FULL;
 667
 
 
 668
 669/* Only do the extra work involved in logical block provisioning if one or
 670 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
 671 * real reads and writes (i.e. not skipping them for speed).
 672 */
 673static inline bool scsi_debug_lbp(void)
 674{
 675	return 0 == sdebug_fake_rw &&
 676		(sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
 677}
 678
 679static void *fake_store(unsigned long long lba)
 
 680{
 681	lba = do_div(lba, sdebug_store_sectors);
 682
 683	return fake_storep + lba * sdebug_sector_size;
 
 
 
 
 
 684}
 685
 686static struct t10_pi_tuple *dif_store(sector_t sector)
 
 687{
 688	sector = sector_div(sector, sdebug_store_sectors);
 689
 690	return dif_storep + sector;
 691}
 692
 693static void sdebug_max_tgts_luns(void)
 694{
 695	struct sdebug_host_info *sdbg_host;
 696	struct Scsi_Host *hpnt;
 697
 698	spin_lock(&sdebug_host_list_lock);
 699	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 700		hpnt = sdbg_host->shost;
 701		if ((hpnt->this_id >= 0) &&
 702		    (sdebug_num_tgts > hpnt->this_id))
 703			hpnt->max_id = sdebug_num_tgts + 1;
 704		else
 705			hpnt->max_id = sdebug_num_tgts;
 706		/* sdebug_max_luns; */
 707		hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
 708	}
 709	spin_unlock(&sdebug_host_list_lock);
 710}
 711
 712enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
 713
 714/* Set in_bit to -1 to indicate no bit position of invalid field */
 715static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
 716				 enum sdeb_cmd_data c_d,
 717				 int in_byte, int in_bit)
 718{
 719	unsigned char *sbuff;
 720	u8 sks[4];
 721	int sl, asc;
 722
 723	sbuff = scp->sense_buffer;
 724	if (!sbuff) {
 725		sdev_printk(KERN_ERR, scp->device,
 726			    "%s: sense_buffer is NULL\n", __func__);
 727		return;
 728	}
 729	asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
 730	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 731	scsi_build_sense_buffer(sdebug_dsense, sbuff, ILLEGAL_REQUEST, asc, 0);
 732	memset(sks, 0, sizeof(sks));
 733	sks[0] = 0x80;
 734	if (c_d)
 735		sks[0] |= 0x40;
 736	if (in_bit >= 0) {
 737		sks[0] |= 0x8;
 738		sks[0] |= 0x7 & in_bit;
 739	}
 740	put_unaligned_be16(in_byte, sks + 1);
 741	if (sdebug_dsense) {
 742		sl = sbuff[7] + 8;
 743		sbuff[7] = sl;
 744		sbuff[sl] = 0x2;
 745		sbuff[sl + 1] = 0x6;
 746		memcpy(sbuff + sl + 4, sks, 3);
 747	} else
 748		memcpy(sbuff + 15, sks, 3);
 749	if (sdebug_verbose)
 750		sdev_printk(KERN_INFO, scp->device, "%s:  [sense_key,asc,ascq"
 751			    "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
 752			    my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
 753}
 754
 755static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
 756{
 757	unsigned char *sbuff;
 758
 759	sbuff = scp->sense_buffer;
 760	if (!sbuff) {
 761		sdev_printk(KERN_ERR, scp->device,
 762			    "%s: sense_buffer is NULL\n", __func__);
 763		return;
 764	}
 765	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 766
 767	scsi_build_sense_buffer(sdebug_dsense, sbuff, key, asc, asq);
 768
 769	if (sdebug_verbose)
 770		sdev_printk(KERN_INFO, scp->device,
 771			    "%s:  [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
 772			    my_name, key, asc, asq);
 773}
 774
 775static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
 776{
 777	mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
 778}
 779
 780static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
 
 781{
 782	if (sdebug_verbose) {
 783		if (0x1261 == cmd)
 784			sdev_printk(KERN_INFO, dev,
 785				    "%s: BLKFLSBUF [0x1261]\n", __func__);
 786		else if (0x5331 == cmd)
 787			sdev_printk(KERN_INFO, dev,
 788				    "%s: CDROM_GET_CAPABILITY [0x5331]\n",
 789				    __func__);
 790		else
 791			sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
 792				    __func__, cmd);
 793	}
 794	return -EINVAL;
 795	/* return -ENOTTY; // correct return but upsets fdisk */
 796}
 797
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 798static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
 799{
 800	struct sdebug_host_info *sdhp;
 801	struct sdebug_dev_info *dp;
 802
 803	spin_lock(&sdebug_host_list_lock);
 804	list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
 805		list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
 806			if ((devip->sdbg_host == dp->sdbg_host) &&
 807			    (devip->target == dp->target))
 808				clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
 809		}
 810	}
 811	spin_unlock(&sdebug_host_list_lock);
 812}
 813
 814static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 815{
 816	int k;
 817
 818	k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
 819	if (k != SDEBUG_NUM_UAS) {
 820		const char *cp = NULL;
 821
 822		switch (k) {
 823		case SDEBUG_UA_POR:
 824			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
 825					POWER_ON_RESET_ASCQ);
 826			if (sdebug_verbose)
 827				cp = "power on reset";
 828			break;
 829		case SDEBUG_UA_BUS_RESET:
 830			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
 831					BUS_RESET_ASCQ);
 832			if (sdebug_verbose)
 833				cp = "bus reset";
 834			break;
 835		case SDEBUG_UA_MODE_CHANGED:
 836			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
 837					MODE_CHANGED_ASCQ);
 838			if (sdebug_verbose)
 839				cp = "mode parameters changed";
 840			break;
 841		case SDEBUG_UA_CAPACITY_CHANGED:
 842			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
 843					CAPACITY_CHANGED_ASCQ);
 844			if (sdebug_verbose)
 845				cp = "capacity data changed";
 846			break;
 847		case SDEBUG_UA_MICROCODE_CHANGED:
 848			mk_sense_buffer(scp, UNIT_ATTENTION,
 849					TARGET_CHANGED_ASC,
 850					MICROCODE_CHANGED_ASCQ);
 851			if (sdebug_verbose)
 852				cp = "microcode has been changed";
 853			break;
 854		case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
 855			mk_sense_buffer(scp, UNIT_ATTENTION,
 856					TARGET_CHANGED_ASC,
 857					MICROCODE_CHANGED_WO_RESET_ASCQ);
 858			if (sdebug_verbose)
 859				cp = "microcode has been changed without reset";
 860			break;
 861		case SDEBUG_UA_LUNS_CHANGED:
 862			/*
 863			 * SPC-3 behavior is to report a UNIT ATTENTION with
 864			 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
 865			 * on the target, until a REPORT LUNS command is
 866			 * received.  SPC-4 behavior is to report it only once.
 867			 * NOTE:  sdebug_scsi_level does not use the same
 868			 * values as struct scsi_device->scsi_level.
 869			 */
 870			if (sdebug_scsi_level >= 6)	/* SPC-4 and above */
 871				clear_luns_changed_on_target(devip);
 872			mk_sense_buffer(scp, UNIT_ATTENTION,
 873					TARGET_CHANGED_ASC,
 874					LUNS_CHANGED_ASCQ);
 875			if (sdebug_verbose)
 876				cp = "reported luns data has changed";
 877			break;
 878		default:
 879			pr_warn("unexpected unit attention code=%d\n", k);
 880			if (sdebug_verbose)
 881				cp = "unknown";
 882			break;
 883		}
 884		clear_bit(k, devip->uas_bm);
 885		if (sdebug_verbose)
 886			sdev_printk(KERN_INFO, scp->device,
 887				   "%s reports: Unit attention: %s\n",
 888				   my_name, cp);
 889		return check_condition_result;
 890	}
 891	return 0;
 892}
 893
 894/* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
 895static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
 896				int arr_len)
 897{
 898	int act_len;
 899	struct scsi_data_buffer *sdb = scsi_in(scp);
 900
 901	if (!sdb->length)
 902		return 0;
 903	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
 904		return DID_ERROR << 16;
 905
 906	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
 907				      arr, arr_len);
 908	sdb->resid = scsi_bufflen(scp) - act_len;
 909
 910	return 0;
 911}
 912
 913/* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
 914 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
 915 * calls, not required to write in ascending offset order. Assumes resid
 916 * set to scsi_bufflen() prior to any calls.
 917 */
 918static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
 919				  int arr_len, unsigned int off_dst)
 920{
 921	int act_len, n;
 922	struct scsi_data_buffer *sdb = scsi_in(scp);
 923	off_t skip = off_dst;
 924
 925	if (sdb->length <= off_dst)
 926		return 0;
 927	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
 928		return DID_ERROR << 16;
 929
 930	act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
 931				       arr, arr_len, skip);
 932	pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
 933		 __func__, off_dst, scsi_bufflen(scp), act_len, sdb->resid);
 934	n = (int)scsi_bufflen(scp) - ((int)off_dst + act_len);
 935	sdb->resid = min(sdb->resid, n);
 
 936	return 0;
 937}
 938
 939/* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
 940 * 'arr' or -1 if error.
 941 */
 942static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
 943			       int arr_len)
 944{
 945	if (!scsi_bufflen(scp))
 946		return 0;
 947	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
 948		return -1;
 949
 950	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
 951}
 952
 953
 954static const char * inq_vendor_id = "Linux   ";
 955static const char * inq_product_id = "scsi_debug      ";
 956static const char *inq_product_rev = "0186";	/* version less '.' */
 957/* Use some locally assigned NAAs for SAS addresses. */
 958static const u64 naa3_comp_a = 0x3222222000000000ULL;
 959static const u64 naa3_comp_b = 0x3333333000000000ULL;
 960static const u64 naa3_comp_c = 0x3111111000000000ULL;
 961
 962/* Device identification VPD page. Returns number of bytes placed in arr */
 963static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
 964			  int target_dev_id, int dev_id_num,
 965			  const char *dev_id_str, int dev_id_str_len,
 966			  const uuid_be *lu_name)
 967{
 968	int num, port_a;
 969	char b[32];
 970
 971	port_a = target_dev_id + 1;
 972	/* T10 vendor identifier field format (faked) */
 973	arr[0] = 0x2;	/* ASCII */
 974	arr[1] = 0x1;
 975	arr[2] = 0x0;
 976	memcpy(&arr[4], inq_vendor_id, 8);
 977	memcpy(&arr[12], inq_product_id, 16);
 978	memcpy(&arr[28], dev_id_str, dev_id_str_len);
 979	num = 8 + 16 + dev_id_str_len;
 980	arr[3] = num;
 981	num += 4;
 982	if (dev_id_num >= 0) {
 983		if (sdebug_uuid_ctl) {
 984			/* Locally assigned UUID */
 985			arr[num++] = 0x1;  /* binary (not necessarily sas) */
 986			arr[num++] = 0xa;  /* PIV=0, lu, naa */
 987			arr[num++] = 0x0;
 988			arr[num++] = 0x12;
 989			arr[num++] = 0x10; /* uuid type=1, locally assigned */
 990			arr[num++] = 0x0;
 991			memcpy(arr + num, lu_name, 16);
 992			num += 16;
 993		} else {
 994			/* NAA-3, Logical unit identifier (binary) */
 995			arr[num++] = 0x1;  /* binary (not necessarily sas) */
 996			arr[num++] = 0x3;  /* PIV=0, lu, naa */
 997			arr[num++] = 0x0;
 998			arr[num++] = 0x8;
 999			put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
1000			num += 8;
1001		}
1002		/* Target relative port number */
1003		arr[num++] = 0x61;	/* proto=sas, binary */
1004		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
1005		arr[num++] = 0x0;	/* reserved */
1006		arr[num++] = 0x4;	/* length */
1007		arr[num++] = 0x0;	/* reserved */
1008		arr[num++] = 0x0;	/* reserved */
1009		arr[num++] = 0x0;
1010		arr[num++] = 0x1;	/* relative port A */
1011	}
1012	/* NAA-3, Target port identifier */
1013	arr[num++] = 0x61;	/* proto=sas, binary */
1014	arr[num++] = 0x93;	/* piv=1, target port, naa */
1015	arr[num++] = 0x0;
1016	arr[num++] = 0x8;
1017	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1018	num += 8;
1019	/* NAA-3, Target port group identifier */
1020	arr[num++] = 0x61;	/* proto=sas, binary */
1021	arr[num++] = 0x95;	/* piv=1, target port group id */
1022	arr[num++] = 0x0;
1023	arr[num++] = 0x4;
1024	arr[num++] = 0;
1025	arr[num++] = 0;
1026	put_unaligned_be16(port_group_id, arr + num);
1027	num += 2;
1028	/* NAA-3, Target device identifier */
1029	arr[num++] = 0x61;	/* proto=sas, binary */
1030	arr[num++] = 0xa3;	/* piv=1, target device, naa */
1031	arr[num++] = 0x0;
1032	arr[num++] = 0x8;
1033	put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
1034	num += 8;
1035	/* SCSI name string: Target device identifier */
1036	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
1037	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
1038	arr[num++] = 0x0;
1039	arr[num++] = 24;
1040	memcpy(arr + num, "naa.32222220", 12);
1041	num += 12;
1042	snprintf(b, sizeof(b), "%08X", target_dev_id);
1043	memcpy(arr + num, b, 8);
1044	num += 8;
1045	memset(arr + num, 0, 4);
1046	num += 4;
1047	return num;
1048}
1049
1050static unsigned char vpd84_data[] = {
1051/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1052    0x22,0x22,0x22,0x0,0xbb,0x1,
1053    0x22,0x22,0x22,0x0,0xbb,0x2,
1054};
1055
1056/*  Software interface identification VPD page */
1057static int inquiry_vpd_84(unsigned char *arr)
1058{
1059	memcpy(arr, vpd84_data, sizeof(vpd84_data));
1060	return sizeof(vpd84_data);
1061}
1062
1063/* Management network addresses VPD page */
1064static int inquiry_vpd_85(unsigned char *arr)
1065{
1066	int num = 0;
1067	const char * na1 = "https://www.kernel.org/config";
1068	const char * na2 = "http://www.kernel.org/log";
1069	int plen, olen;
1070
1071	arr[num++] = 0x1;	/* lu, storage config */
1072	arr[num++] = 0x0;	/* reserved */
1073	arr[num++] = 0x0;
1074	olen = strlen(na1);
1075	plen = olen + 1;
1076	if (plen % 4)
1077		plen = ((plen / 4) + 1) * 4;
1078	arr[num++] = plen;	/* length, null termianted, padded */
1079	memcpy(arr + num, na1, olen);
1080	memset(arr + num + olen, 0, plen - olen);
1081	num += plen;
1082
1083	arr[num++] = 0x4;	/* lu, logging */
1084	arr[num++] = 0x0;	/* reserved */
1085	arr[num++] = 0x0;
1086	olen = strlen(na2);
1087	plen = olen + 1;
1088	if (plen % 4)
1089		plen = ((plen / 4) + 1) * 4;
1090	arr[num++] = plen;	/* length, null terminated, padded */
1091	memcpy(arr + num, na2, olen);
1092	memset(arr + num + olen, 0, plen - olen);
1093	num += plen;
1094
1095	return num;
1096}
1097
1098/* SCSI ports VPD page */
1099static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
1100{
1101	int num = 0;
1102	int port_a, port_b;
1103
1104	port_a = target_dev_id + 1;
1105	port_b = port_a + 1;
1106	arr[num++] = 0x0;	/* reserved */
1107	arr[num++] = 0x0;	/* reserved */
1108	arr[num++] = 0x0;
1109	arr[num++] = 0x1;	/* relative port 1 (primary) */
1110	memset(arr + num, 0, 6);
1111	num += 6;
1112	arr[num++] = 0x0;
1113	arr[num++] = 12;	/* length tp descriptor */
1114	/* naa-5 target port identifier (A) */
1115	arr[num++] = 0x61;	/* proto=sas, binary */
1116	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1117	arr[num++] = 0x0;	/* reserved */
1118	arr[num++] = 0x8;	/* length */
1119	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1120	num += 8;
1121	arr[num++] = 0x0;	/* reserved */
1122	arr[num++] = 0x0;	/* reserved */
1123	arr[num++] = 0x0;
1124	arr[num++] = 0x2;	/* relative port 2 (secondary) */
1125	memset(arr + num, 0, 6);
1126	num += 6;
1127	arr[num++] = 0x0;
1128	arr[num++] = 12;	/* length tp descriptor */
1129	/* naa-5 target port identifier (B) */
1130	arr[num++] = 0x61;	/* proto=sas, binary */
1131	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1132	arr[num++] = 0x0;	/* reserved */
1133	arr[num++] = 0x8;	/* length */
1134	put_unaligned_be64(naa3_comp_a + port_b, arr + num);
1135	num += 8;
1136
1137	return num;
1138}
1139
1140
1141static unsigned char vpd89_data[] = {
1142/* from 4th byte */ 0,0,0,0,
1143'l','i','n','u','x',' ',' ',' ',
1144'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1145'1','2','3','4',
11460x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
11470xec,0,0,0,
11480x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
11490,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
11500x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
11510x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
11520x53,0x41,
11530x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
11540x20,0x20,
11550x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
11560x10,0x80,
11570,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
11580x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
11590x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
11600,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
11610x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
11620x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
11630,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
11640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11650,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11660,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11670x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
11680,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
11690xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
11700,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
11710,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11730,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11780,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11790,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11810,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11820,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1183};
1184
1185/* ATA Information VPD page */
1186static int inquiry_vpd_89(unsigned char *arr)
1187{
1188	memcpy(arr, vpd89_data, sizeof(vpd89_data));
1189	return sizeof(vpd89_data);
1190}
1191
1192
1193static unsigned char vpdb0_data[] = {
1194	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1195	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1196	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1197	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1198};
1199
1200/* Block limits VPD page (SBC-3) */
1201static int inquiry_vpd_b0(unsigned char *arr)
1202{
1203	unsigned int gran;
1204
1205	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
1206
1207	/* Optimal transfer length granularity */
1208	gran = 1 << sdebug_physblk_exp;
 
 
 
 
1209	put_unaligned_be16(gran, arr + 2);
1210
1211	/* Maximum Transfer Length */
1212	if (sdebug_store_sectors > 0x400)
1213		put_unaligned_be32(sdebug_store_sectors, arr + 4);
1214
1215	/* Optimal Transfer Length */
1216	put_unaligned_be32(sdebug_opt_blks, &arr[8]);
1217
1218	if (sdebug_lbpu) {
1219		/* Maximum Unmap LBA Count */
1220		put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
1221
1222		/* Maximum Unmap Block Descriptor Count */
1223		put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
1224	}
1225
1226	/* Unmap Granularity Alignment */
1227	if (sdebug_unmap_alignment) {
1228		put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
1229		arr[28] |= 0x80; /* UGAVALID */
1230	}
1231
1232	/* Optimal Unmap Granularity */
1233	put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
1234
1235	/* Maximum WRITE SAME Length */
1236	put_unaligned_be64(sdebug_write_same_length, &arr[32]);
1237
1238	return 0x3c; /* Mandatory page length for Logical Block Provisioning */
1239
1240	return sizeof(vpdb0_data);
1241}
1242
1243/* Block device characteristics VPD page (SBC-3) */
1244static int inquiry_vpd_b1(unsigned char *arr)
1245{
1246	memset(arr, 0, 0x3c);
1247	arr[0] = 0;
1248	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
1249	arr[2] = 0;
1250	arr[3] = 5;	/* less than 1.8" */
 
 
1251
1252	return 0x3c;
1253}
1254
1255/* Logical block provisioning VPD page (SBC-4) */
1256static int inquiry_vpd_b2(unsigned char *arr)
1257{
1258	memset(arr, 0, 0x4);
1259	arr[0] = 0;			/* threshold exponent */
1260	if (sdebug_lbpu)
1261		arr[1] = 1 << 7;
1262	if (sdebug_lbpws)
1263		arr[1] |= 1 << 6;
1264	if (sdebug_lbpws10)
1265		arr[1] |= 1 << 5;
1266	if (sdebug_lbprz && scsi_debug_lbp())
1267		arr[1] |= (sdebug_lbprz & 0x7) << 2;  /* sbc4r07 and later */
1268	/* anc_sup=0; dp=0 (no provisioning group descriptor) */
1269	/* minimum_percentage=0; provisioning_type=0 (unknown) */
1270	/* threshold_percentage=0 */
1271	return 0x4;
1272}
1273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1274#define SDEBUG_LONG_INQ_SZ 96
1275#define SDEBUG_MAX_INQ_ARR_SZ 584
1276
1277static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1278{
1279	unsigned char pq_pdt;
1280	unsigned char * arr;
1281	unsigned char *cmd = scp->cmnd;
1282	int alloc_len, n, ret;
1283	bool have_wlun, is_disk;
1284
1285	alloc_len = get_unaligned_be16(cmd + 3);
1286	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1287	if (! arr)
1288		return DID_REQUEUE << 16;
1289	is_disk = (sdebug_ptype == TYPE_DISK);
 
 
1290	have_wlun = scsi_is_wlun(scp->device->lun);
1291	if (have_wlun)
1292		pq_pdt = TYPE_WLUN;	/* present, wlun */
1293	else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1294		pq_pdt = 0x7f;	/* not present, PQ=3, PDT=0x1f */
1295	else
1296		pq_pdt = (sdebug_ptype & 0x1f);
1297	arr[0] = pq_pdt;
1298	if (0x2 & cmd[1]) {  /* CMDDT bit set */
1299		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
1300		kfree(arr);
1301		return check_condition_result;
1302	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
1303		int lu_id_num, port_group_id, target_dev_id, len;
1304		char lu_id_str[6];
1305		int host_no = devip->sdbg_host->shost->host_no;
1306		
1307		port_group_id = (((host_no + 1) & 0x7f) << 8) +
1308		    (devip->channel & 0x7f);
1309		if (sdebug_vpd_use_hostno == 0)
1310			host_no = 0;
1311		lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
1312			    (devip->target * 1000) + devip->lun);
1313		target_dev_id = ((host_no + 1) * 2000) +
1314				 (devip->target * 1000) - 3;
1315		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1316		if (0 == cmd[2]) { /* supported vital product data pages */
1317			arr[1] = cmd[2];	/*sanity */
1318			n = 4;
1319			arr[n++] = 0x0;   /* this page */
1320			arr[n++] = 0x80;  /* unit serial number */
1321			arr[n++] = 0x83;  /* device identification */
1322			arr[n++] = 0x84;  /* software interface ident. */
1323			arr[n++] = 0x85;  /* management network addresses */
1324			arr[n++] = 0x86;  /* extended inquiry */
1325			arr[n++] = 0x87;  /* mode page policy */
1326			arr[n++] = 0x88;  /* SCSI ports */
1327			if (is_disk) {	  /* SBC only */
1328				arr[n++] = 0x89;  /* ATA information */
1329				arr[n++] = 0xb0;  /* Block limits */
1330				arr[n++] = 0xb1;  /* Block characteristics */
1331				arr[n++] = 0xb2;  /* Logical Block Prov */
 
 
 
1332			}
1333			arr[3] = n - 4;	  /* number of supported VPD pages */
1334		} else if (0x80 == cmd[2]) { /* unit serial number */
1335			arr[1] = cmd[2];	/*sanity */
1336			arr[3] = len;
1337			memcpy(&arr[4], lu_id_str, len);
1338		} else if (0x83 == cmd[2]) { /* device identification */
1339			arr[1] = cmd[2];	/*sanity */
1340			arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1341						target_dev_id, lu_id_num,
1342						lu_id_str, len,
1343						&devip->lu_name);
1344		} else if (0x84 == cmd[2]) { /* Software interface ident. */
1345			arr[1] = cmd[2];	/*sanity */
1346			arr[3] = inquiry_vpd_84(&arr[4]);
1347		} else if (0x85 == cmd[2]) { /* Management network addresses */
1348			arr[1] = cmd[2];	/*sanity */
1349			arr[3] = inquiry_vpd_85(&arr[4]);
1350		} else if (0x86 == cmd[2]) { /* extended inquiry */
1351			arr[1] = cmd[2];	/*sanity */
1352			arr[3] = 0x3c;	/* number of following entries */
1353			if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
1354				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
1355			else if (have_dif_prot)
1356				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
1357			else
1358				arr[4] = 0x0;   /* no protection stuff */
1359			arr[5] = 0x7;   /* head of q, ordered + simple q's */
1360		} else if (0x87 == cmd[2]) { /* mode page policy */
1361			arr[1] = cmd[2];	/*sanity */
1362			arr[3] = 0x8;	/* number of following entries */
1363			arr[4] = 0x2;	/* disconnect-reconnect mp */
1364			arr[6] = 0x80;	/* mlus, shared */
1365			arr[8] = 0x18;	 /* protocol specific lu */
1366			arr[10] = 0x82;	 /* mlus, per initiator port */
1367		} else if (0x88 == cmd[2]) { /* SCSI Ports */
1368			arr[1] = cmd[2];	/*sanity */
1369			arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1370		} else if (is_disk && 0x89 == cmd[2]) { /* ATA information */
1371			arr[1] = cmd[2];        /*sanity */
1372			n = inquiry_vpd_89(&arr[4]);
1373			put_unaligned_be16(n, arr + 2);
1374		} else if (is_disk && 0xb0 == cmd[2]) { /* Block limits */
1375			arr[1] = cmd[2];        /*sanity */
1376			arr[3] = inquiry_vpd_b0(&arr[4]);
1377		} else if (is_disk && 0xb1 == cmd[2]) { /* Block char. */
1378			arr[1] = cmd[2];        /*sanity */
1379			arr[3] = inquiry_vpd_b1(&arr[4]);
1380		} else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
1381			arr[1] = cmd[2];        /*sanity */
1382			arr[3] = inquiry_vpd_b2(&arr[4]);
 
 
 
1383		} else {
1384			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
1385			kfree(arr);
1386			return check_condition_result;
1387		}
1388		len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
1389		ret = fill_from_dev_buffer(scp, arr,
1390			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1391		kfree(arr);
1392		return ret;
1393	}
1394	/* drops through here for a standard inquiry */
1395	arr[1] = sdebug_removable ? 0x80 : 0;	/* Removable disk */
1396	arr[2] = sdebug_scsi_level;
1397	arr[3] = 2;    /* response_data_format==2 */
1398	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1399	arr[5] = (int)have_dif_prot;	/* PROTECT bit */
1400	if (sdebug_vpd_use_hostno == 0)
1401		arr[5] = 0x10; /* claim: implicit TGPS */
1402	arr[6] = 0x10; /* claim: MultiP */
1403	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1404	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1405	memcpy(&arr[8], inq_vendor_id, 8);
1406	memcpy(&arr[16], inq_product_id, 16);
1407	memcpy(&arr[32], inq_product_rev, 4);
 
 
1408	/* version descriptors (2 bytes each) follow */
1409	put_unaligned_be16(0xc0, arr + 58);   /* SAM-6 no version claimed */
1410	put_unaligned_be16(0x5c0, arr + 60);  /* SPC-5 no version claimed */
1411	n = 62;
1412	if (is_disk) {		/* SBC-4 no version claimed */
1413		put_unaligned_be16(0x600, arr + n);
1414		n += 2;
1415	} else if (sdebug_ptype == TYPE_TAPE) {	/* SSC-4 rev 3 */
1416		put_unaligned_be16(0x525, arr + n);
1417		n += 2;
 
 
 
1418	}
1419	put_unaligned_be16(0x2100, arr + n);	/* SPL-4 no version claimed */
1420	ret = fill_from_dev_buffer(scp, arr,
1421			    min(alloc_len, SDEBUG_LONG_INQ_SZ));
1422	kfree(arr);
1423	return ret;
1424}
1425
 
1426static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1427				   0, 0, 0x0, 0x0};
1428
1429static int resp_requests(struct scsi_cmnd * scp,
1430			 struct sdebug_dev_info * devip)
1431{
1432	unsigned char * sbuff;
1433	unsigned char *cmd = scp->cmnd;
1434	unsigned char arr[SCSI_SENSE_BUFFERSIZE];
1435	bool dsense;
 
1436	int len = 18;
 
1437
1438	memset(arr, 0, sizeof(arr));
1439	dsense = !!(cmd[1] & 1);
1440	sbuff = scp->sense_buffer;
1441	if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
 
 
 
 
 
 
 
 
 
 
 
 
 
1442		if (dsense) {
1443			arr[0] = 0x72;
1444			arr[1] = 0x0;		/* NO_SENSE in sense_key */
1445			arr[2] = THRESHOLD_EXCEEDED;
1446			arr[3] = 0xff;		/* TEST set and MRIE==6 */
1447			len = 8;
1448		} else {
1449			arr[0] = 0x70;
1450			arr[2] = 0x0;		/* NO_SENSE in sense_key */
1451			arr[7] = 0xa;   	/* 18 byte sense buffer */
1452			arr[12] = THRESHOLD_EXCEEDED;
1453			arr[13] = 0xff;		/* TEST set and MRIE==6 */
1454		}
1455	} else {
1456		memcpy(arr, sbuff, SCSI_SENSE_BUFFERSIZE);
1457		if (arr[0] >= 0x70 && dsense == sdebug_dsense)
1458			;	/* have sense and formats match */
1459		else if (arr[0] <= 0x70) {
1460			if (dsense) {
1461				memset(arr, 0, 8);
1462				arr[0] = 0x72;
1463				len = 8;
1464			} else {
1465				memset(arr, 0, 18);
1466				arr[0] = 0x70;
1467				arr[7] = 0xa;
1468			}
1469		} else if (dsense) {
1470			memset(arr, 0, 8);
1471			arr[0] = 0x72;
1472			arr[1] = sbuff[2];     /* sense key */
1473			arr[2] = sbuff[12];    /* asc */
1474			arr[3] = sbuff[13];    /* ascq */
1475			len = 8;
 
 
1476		} else {
1477			memset(arr, 0, 18);
1478			arr[0] = 0x70;
1479			arr[2] = sbuff[1];
1480			arr[7] = 0xa;
1481			arr[12] = sbuff[1];
1482			arr[13] = sbuff[3];
1483		}
1484
1485	}
1486	mk_sense_buffer(scp, 0, NO_ADDITIONAL_SENSE, 0);
1487	return fill_from_dev_buffer(scp, arr, len);
1488}
1489
1490static int resp_start_stop(struct scsi_cmnd * scp,
1491			   struct sdebug_dev_info * devip)
1492{
1493	unsigned char *cmd = scp->cmnd;
1494	int power_cond, stop;
 
1495
1496	power_cond = (cmd[4] & 0xf0) >> 4;
1497	if (power_cond) {
1498		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
1499		return check_condition_result;
1500	}
1501	stop = !(cmd[4] & 1);
1502	atomic_xchg(&devip->stopped, stop);
1503	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1504}
1505
1506static sector_t get_sdebug_capacity(void)
1507{
1508	static const unsigned int gibibyte = 1073741824;
1509
1510	if (sdebug_virtual_gb > 0)
1511		return (sector_t)sdebug_virtual_gb *
1512			(gibibyte / sdebug_sector_size);
1513	else
1514		return sdebug_store_sectors;
1515}
1516
1517#define SDEBUG_READCAP_ARR_SZ 8
1518static int resp_readcap(struct scsi_cmnd * scp,
1519			struct sdebug_dev_info * devip)
1520{
1521	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1522	unsigned int capac;
1523
1524	/* following just in case virtual_gb changed */
1525	sdebug_capacity = get_sdebug_capacity();
1526	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1527	if (sdebug_capacity < 0xffffffff) {
1528		capac = (unsigned int)sdebug_capacity - 1;
1529		put_unaligned_be32(capac, arr + 0);
1530	} else
1531		put_unaligned_be32(0xffffffff, arr + 0);
1532	put_unaligned_be16(sdebug_sector_size, arr + 6);
1533	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1534}
1535
1536#define SDEBUG_READCAP16_ARR_SZ 32
1537static int resp_readcap16(struct scsi_cmnd * scp,
1538			  struct sdebug_dev_info * devip)
1539{
1540	unsigned char *cmd = scp->cmnd;
1541	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1542	int alloc_len;
1543
1544	alloc_len = get_unaligned_be32(cmd + 10);
1545	/* following just in case virtual_gb changed */
1546	sdebug_capacity = get_sdebug_capacity();
1547	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1548	put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1549	put_unaligned_be32(sdebug_sector_size, arr + 8);
1550	arr[13] = sdebug_physblk_exp & 0xf;
1551	arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
1552
1553	if (scsi_debug_lbp()) {
1554		arr[14] |= 0x80; /* LBPME */
1555		/* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1556		 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1557		 * in the wider field maps to 0 in this field.
1558		 */
1559		if (sdebug_lbprz & 1)	/* precisely what the draft requires */
1560			arr[14] |= 0x40;
1561	}
1562
1563	arr[15] = sdebug_lowest_aligned & 0xff;
1564
1565	if (have_dif_prot) {
1566		arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
1567		arr[12] |= 1; /* PROT_EN */
1568	}
1569
1570	return fill_from_dev_buffer(scp, arr,
1571				    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1572}
1573
1574#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1575
1576static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1577			      struct sdebug_dev_info * devip)
1578{
1579	unsigned char *cmd = scp->cmnd;
1580	unsigned char * arr;
1581	int host_no = devip->sdbg_host->shost->host_no;
1582	int n, ret, alen, rlen;
1583	int port_group_a, port_group_b, port_a, port_b;
1584
1585	alen = get_unaligned_be32(cmd + 6);
1586	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1587	if (! arr)
1588		return DID_REQUEUE << 16;
1589	/*
1590	 * EVPD page 0x88 states we have two ports, one
1591	 * real and a fake port with no device connected.
1592	 * So we create two port groups with one port each
1593	 * and set the group with port B to unavailable.
1594	 */
1595	port_a = 0x1; /* relative port A */
1596	port_b = 0x2; /* relative port B */
1597	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1598			(devip->channel & 0x7f);
1599	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1600			(devip->channel & 0x7f) + 0x80;
1601
1602	/*
1603	 * The asymmetric access state is cycled according to the host_id.
1604	 */
1605	n = 4;
1606	if (sdebug_vpd_use_hostno == 0) {
1607		arr[n++] = host_no % 3; /* Asymm access state */
1608		arr[n++] = 0x0F; /* claim: all states are supported */
1609	} else {
1610		arr[n++] = 0x0; /* Active/Optimized path */
1611		arr[n++] = 0x01; /* only support active/optimized paths */
1612	}
1613	put_unaligned_be16(port_group_a, arr + n);
1614	n += 2;
1615	arr[n++] = 0;    /* Reserved */
1616	arr[n++] = 0;    /* Status code */
1617	arr[n++] = 0;    /* Vendor unique */
1618	arr[n++] = 0x1;  /* One port per group */
1619	arr[n++] = 0;    /* Reserved */
1620	arr[n++] = 0;    /* Reserved */
1621	put_unaligned_be16(port_a, arr + n);
1622	n += 2;
1623	arr[n++] = 3;    /* Port unavailable */
1624	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1625	put_unaligned_be16(port_group_b, arr + n);
1626	n += 2;
1627	arr[n++] = 0;    /* Reserved */
1628	arr[n++] = 0;    /* Status code */
1629	arr[n++] = 0;    /* Vendor unique */
1630	arr[n++] = 0x1;  /* One port per group */
1631	arr[n++] = 0;    /* Reserved */
1632	arr[n++] = 0;    /* Reserved */
1633	put_unaligned_be16(port_b, arr + n);
1634	n += 2;
1635
1636	rlen = n - 4;
1637	put_unaligned_be32(rlen, arr + 0);
1638
1639	/*
1640	 * Return the smallest value of either
1641	 * - The allocated length
1642	 * - The constructed command length
1643	 * - The maximum array size
1644	 */
1645	rlen = min(alen,n);
1646	ret = fill_from_dev_buffer(scp, arr,
1647				   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1648	kfree(arr);
1649	return ret;
1650}
1651
1652static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1653			     struct sdebug_dev_info *devip)
1654{
1655	bool rctd;
1656	u8 reporting_opts, req_opcode, sdeb_i, supp;
1657	u16 req_sa, u;
1658	u32 alloc_len, a_len;
1659	int k, offset, len, errsts, count, bump, na;
1660	const struct opcode_info_t *oip;
1661	const struct opcode_info_t *r_oip;
1662	u8 *arr;
1663	u8 *cmd = scp->cmnd;
1664
1665	rctd = !!(cmd[2] & 0x80);
1666	reporting_opts = cmd[2] & 0x7;
1667	req_opcode = cmd[3];
1668	req_sa = get_unaligned_be16(cmd + 4);
1669	alloc_len = get_unaligned_be32(cmd + 6);
1670	if (alloc_len < 4 || alloc_len > 0xffff) {
1671		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1672		return check_condition_result;
1673	}
1674	if (alloc_len > 8192)
1675		a_len = 8192;
1676	else
1677		a_len = alloc_len;
1678	arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
1679	if (NULL == arr) {
1680		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
1681				INSUFF_RES_ASCQ);
1682		return check_condition_result;
1683	}
1684	switch (reporting_opts) {
1685	case 0:	/* all commands */
1686		/* count number of commands */
1687		for (count = 0, oip = opcode_info_arr;
1688		     oip->num_attached != 0xff; ++oip) {
1689			if (F_INV_OP & oip->flags)
1690				continue;
1691			count += (oip->num_attached + 1);
1692		}
1693		bump = rctd ? 20 : 8;
1694		put_unaligned_be32(count * bump, arr);
1695		for (offset = 4, oip = opcode_info_arr;
1696		     oip->num_attached != 0xff && offset < a_len; ++oip) {
1697			if (F_INV_OP & oip->flags)
1698				continue;
1699			na = oip->num_attached;
1700			arr[offset] = oip->opcode;
1701			put_unaligned_be16(oip->sa, arr + offset + 2);
1702			if (rctd)
1703				arr[offset + 5] |= 0x2;
1704			if (FF_SA & oip->flags)
1705				arr[offset + 5] |= 0x1;
1706			put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
1707			if (rctd)
1708				put_unaligned_be16(0xa, arr + offset + 8);
1709			r_oip = oip;
1710			for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
1711				if (F_INV_OP & oip->flags)
1712					continue;
1713				offset += bump;
1714				arr[offset] = oip->opcode;
1715				put_unaligned_be16(oip->sa, arr + offset + 2);
1716				if (rctd)
1717					arr[offset + 5] |= 0x2;
1718				if (FF_SA & oip->flags)
1719					arr[offset + 5] |= 0x1;
1720				put_unaligned_be16(oip->len_mask[0],
1721						   arr + offset + 6);
1722				if (rctd)
1723					put_unaligned_be16(0xa,
1724							   arr + offset + 8);
1725			}
1726			oip = r_oip;
1727			offset += bump;
1728		}
1729		break;
1730	case 1:	/* one command: opcode only */
1731	case 2:	/* one command: opcode plus service action */
1732	case 3:	/* one command: if sa==0 then opcode only else opcode+sa */
1733		sdeb_i = opcode_ind_arr[req_opcode];
1734		oip = &opcode_info_arr[sdeb_i];
1735		if (F_INV_OP & oip->flags) {
1736			supp = 1;
1737			offset = 4;
1738		} else {
1739			if (1 == reporting_opts) {
1740				if (FF_SA & oip->flags) {
1741					mk_sense_invalid_fld(scp, SDEB_IN_CDB,
1742							     2, 2);
1743					kfree(arr);
1744					return check_condition_result;
1745				}
1746				req_sa = 0;
1747			} else if (2 == reporting_opts &&
1748				   0 == (FF_SA & oip->flags)) {
1749				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
1750				kfree(arr);	/* point at requested sa */
1751				return check_condition_result;
1752			}
1753			if (0 == (FF_SA & oip->flags) &&
1754			    req_opcode == oip->opcode)
1755				supp = 3;
1756			else if (0 == (FF_SA & oip->flags)) {
1757				na = oip->num_attached;
1758				for (k = 0, oip = oip->arrp; k < na;
1759				     ++k, ++oip) {
1760					if (req_opcode == oip->opcode)
1761						break;
1762				}
1763				supp = (k >= na) ? 1 : 3;
1764			} else if (req_sa != oip->sa) {
1765				na = oip->num_attached;
1766				for (k = 0, oip = oip->arrp; k < na;
1767				     ++k, ++oip) {
1768					if (req_sa == oip->sa)
1769						break;
1770				}
1771				supp = (k >= na) ? 1 : 3;
1772			} else
1773				supp = 3;
1774			if (3 == supp) {
1775				u = oip->len_mask[0];
1776				put_unaligned_be16(u, arr + 2);
1777				arr[4] = oip->opcode;
1778				for (k = 1; k < u; ++k)
1779					arr[4 + k] = (k < 16) ?
1780						 oip->len_mask[k] : 0xff;
1781				offset = 4 + u;
1782			} else
1783				offset = 4;
1784		}
1785		arr[1] = (rctd ? 0x80 : 0) | supp;
1786		if (rctd) {
1787			put_unaligned_be16(0xa, arr + offset);
1788			offset += 12;
1789		}
1790		break;
1791	default:
1792		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
1793		kfree(arr);
1794		return check_condition_result;
1795	}
1796	offset = (offset < a_len) ? offset : a_len;
1797	len = (offset < alloc_len) ? offset : alloc_len;
1798	errsts = fill_from_dev_buffer(scp, arr, len);
1799	kfree(arr);
1800	return errsts;
1801}
1802
1803static int resp_rsup_tmfs(struct scsi_cmnd *scp,
1804			  struct sdebug_dev_info *devip)
1805{
1806	bool repd;
1807	u32 alloc_len, len;
1808	u8 arr[16];
1809	u8 *cmd = scp->cmnd;
1810
1811	memset(arr, 0, sizeof(arr));
1812	repd = !!(cmd[2] & 0x80);
1813	alloc_len = get_unaligned_be32(cmd + 6);
1814	if (alloc_len < 4) {
1815		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1816		return check_condition_result;
1817	}
1818	arr[0] = 0xc8;		/* ATS | ATSS | LURS */
1819	arr[1] = 0x1;		/* ITNRS */
1820	if (repd) {
1821		arr[3] = 0xc;
1822		len = 16;
1823	} else
1824		len = 4;
1825
1826	len = (len < alloc_len) ? len : alloc_len;
1827	return fill_from_dev_buffer(scp, arr, len);
1828}
1829
1830/* <<Following mode page info copied from ST318451LW>> */
1831
1832static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1833{	/* Read-Write Error Recovery page for mode_sense */
1834	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1835					5, 0, 0xff, 0xff};
1836
1837	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1838	if (1 == pcontrol)
1839		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1840	return sizeof(err_recov_pg);
1841}
1842
1843static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1844{ 	/* Disconnect-Reconnect page for mode_sense */
1845	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1846					 0, 0, 0, 0, 0, 0, 0, 0};
1847
1848	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1849	if (1 == pcontrol)
1850		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1851	return sizeof(disconnect_pg);
1852}
1853
1854static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1855{       /* Format device page for mode_sense */
1856	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1857				     0, 0, 0, 0, 0, 0, 0, 0,
1858				     0, 0, 0, 0, 0x40, 0, 0, 0};
1859
1860	memcpy(p, format_pg, sizeof(format_pg));
1861	put_unaligned_be16(sdebug_sectors_per, p + 10);
1862	put_unaligned_be16(sdebug_sector_size, p + 12);
1863	if (sdebug_removable)
1864		p[20] |= 0x20; /* should agree with INQUIRY */
1865	if (1 == pcontrol)
1866		memset(p + 2, 0, sizeof(format_pg) - 2);
1867	return sizeof(format_pg);
1868}
1869
1870static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1871				     0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
1872				     0, 0, 0, 0};
1873
1874static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1875{ 	/* Caching page for mode_sense */
1876	unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
1877		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1878	unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1879		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1880
1881	if (SDEBUG_OPT_N_WCE & sdebug_opts)
1882		caching_pg[2] &= ~0x4;	/* set WCE=0 (default WCE=1) */
1883	memcpy(p, caching_pg, sizeof(caching_pg));
1884	if (1 == pcontrol)
1885		memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
1886	else if (2 == pcontrol)
1887		memcpy(p, d_caching_pg, sizeof(d_caching_pg));
1888	return sizeof(caching_pg);
1889}
1890
1891static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1892				    0, 0, 0x2, 0x4b};
1893
1894static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1895{ 	/* Control mode page for mode_sense */
1896	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1897				        0, 0, 0, 0};
1898	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1899				     0, 0, 0x2, 0x4b};
1900
1901	if (sdebug_dsense)
1902		ctrl_m_pg[2] |= 0x4;
1903	else
1904		ctrl_m_pg[2] &= ~0x4;
1905
1906	if (sdebug_ato)
1907		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1908
1909	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1910	if (1 == pcontrol)
1911		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1912	else if (2 == pcontrol)
1913		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1914	return sizeof(ctrl_m_pg);
1915}
1916
1917
1918static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1919{	/* Informational Exceptions control mode page for mode_sense */
1920	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1921				       0, 0, 0x0, 0x0};
1922	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1923				      0, 0, 0x0, 0x0};
1924
1925	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1926	if (1 == pcontrol)
1927		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1928	else if (2 == pcontrol)
1929		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1930	return sizeof(iec_m_pg);
1931}
1932
1933static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1934{	/* SAS SSP mode page - short format for mode_sense */
1935	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1936		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1937
1938	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1939	if (1 == pcontrol)
1940		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1941	return sizeof(sas_sf_m_pg);
1942}
1943
1944
1945static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1946			      int target_dev_id)
1947{	/* SAS phy control and discover mode page for mode_sense */
1948	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1949		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1950		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
1951		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
1952		    0x2, 0, 0, 0, 0, 0, 0, 0,
1953		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1954		    0, 0, 0, 0, 0, 0, 0, 0,
1955		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1956		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
1957		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
1958		    0x3, 0, 0, 0, 0, 0, 0, 0,
1959		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1960		    0, 0, 0, 0, 0, 0, 0, 0,
1961		};
1962	int port_a, port_b;
1963
1964	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
1965	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
1966	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
1967	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
1968	port_a = target_dev_id + 1;
1969	port_b = port_a + 1;
1970	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1971	put_unaligned_be32(port_a, p + 20);
1972	put_unaligned_be32(port_b, p + 48 + 20);
1973	if (1 == pcontrol)
1974		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1975	return sizeof(sas_pcd_m_pg);
1976}
1977
1978static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1979{	/* SAS SSP shared protocol specific port mode subpage */
1980	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1981		    0, 0, 0, 0, 0, 0, 0, 0,
1982		};
1983
1984	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1985	if (1 == pcontrol)
1986		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1987	return sizeof(sas_sha_m_pg);
1988}
1989
1990#define SDEBUG_MAX_MSENSE_SZ 256
1991
1992static int resp_mode_sense(struct scsi_cmnd *scp,
1993			   struct sdebug_dev_info *devip)
1994{
1995	int pcontrol, pcode, subpcode, bd_len;
1996	unsigned char dev_spec;
1997	int alloc_len, offset, len, target_dev_id;
1998	int target = scp->device->id;
1999	unsigned char * ap;
2000	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
2001	unsigned char *cmd = scp->cmnd;
2002	bool dbd, llbaa, msense_6, is_disk, bad_pcode;
2003
2004	dbd = !!(cmd[1] & 0x8);		/* disable block descriptors */
2005	pcontrol = (cmd[2] & 0xc0) >> 6;
2006	pcode = cmd[2] & 0x3f;
2007	subpcode = cmd[3];
2008	msense_6 = (MODE_SENSE == cmd[0]);
2009	llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2010	is_disk = (sdebug_ptype == TYPE_DISK);
2011	if (is_disk && !dbd)
 
2012		bd_len = llbaa ? 16 : 8;
2013	else
2014		bd_len = 0;
2015	alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2016	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2017	if (0x3 == pcontrol) {  /* Saving values not supported */
2018		mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
2019		return check_condition_result;
2020	}
2021	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2022			(devip->target * 1000) - 3;
2023	/* for disks set DPOFUA bit and clear write protect (WP) bit */
2024	if (is_disk)
2025		dev_spec = 0x10;	/* =0x90 if WP=1 implies read-only */
2026	else
 
 
2027		dev_spec = 0x0;
2028	if (msense_6) {
2029		arr[2] = dev_spec;
2030		arr[3] = bd_len;
2031		offset = 4;
2032	} else {
2033		arr[3] = dev_spec;
2034		if (16 == bd_len)
2035			arr[4] = 0x1;	/* set LONGLBA bit */
2036		arr[7] = bd_len;	/* assume 255 or less */
2037		offset = 8;
2038	}
2039	ap = arr + offset;
2040	if ((bd_len > 0) && (!sdebug_capacity))
2041		sdebug_capacity = get_sdebug_capacity();
2042
2043	if (8 == bd_len) {
2044		if (sdebug_capacity > 0xfffffffe)
2045			put_unaligned_be32(0xffffffff, ap + 0);
2046		else
2047			put_unaligned_be32(sdebug_capacity, ap + 0);
2048		put_unaligned_be16(sdebug_sector_size, ap + 6);
2049		offset += bd_len;
2050		ap = arr + offset;
2051	} else if (16 == bd_len) {
2052		put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2053		put_unaligned_be32(sdebug_sector_size, ap + 12);
2054		offset += bd_len;
2055		ap = arr + offset;
2056	}
2057
2058	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2059		/* TODO: Control Extension page */
2060		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2061		return check_condition_result;
2062	}
2063	bad_pcode = false;
2064
2065	switch (pcode) {
2066	case 0x1:	/* Read-Write error recovery page, direct access */
2067		len = resp_err_recov_pg(ap, pcontrol, target);
2068		offset += len;
2069		break;
2070	case 0x2:	/* Disconnect-Reconnect page, all devices */
2071		len = resp_disconnect_pg(ap, pcontrol, target);
2072		offset += len;
2073		break;
2074        case 0x3:       /* Format device page, direct access */
2075		if (is_disk) {
2076			len = resp_format_pg(ap, pcontrol, target);
2077			offset += len;
2078		} else
2079			bad_pcode = true;
2080                break;
2081	case 0x8:	/* Caching page, direct access */
2082		if (is_disk) {
2083			len = resp_caching_pg(ap, pcontrol, target);
2084			offset += len;
2085		} else
2086			bad_pcode = true;
2087		break;
2088	case 0xa:	/* Control Mode page, all devices */
2089		len = resp_ctrl_m_pg(ap, pcontrol, target);
2090		offset += len;
2091		break;
2092	case 0x19:	/* if spc==1 then sas phy, control+discover */
2093		if ((subpcode > 0x2) && (subpcode < 0xff)) {
2094			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2095			return check_condition_result;
2096	        }
2097		len = 0;
2098		if ((0x0 == subpcode) || (0xff == subpcode))
2099			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2100		if ((0x1 == subpcode) || (0xff == subpcode))
2101			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2102						  target_dev_id);
2103		if ((0x2 == subpcode) || (0xff == subpcode))
2104			len += resp_sas_sha_m_spg(ap + len, pcontrol);
2105		offset += len;
2106		break;
2107	case 0x1c:	/* Informational Exceptions Mode page, all devices */
2108		len = resp_iec_m_pg(ap, pcontrol, target);
2109		offset += len;
2110		break;
2111	case 0x3f:	/* Read all Mode pages */
2112		if ((0 == subpcode) || (0xff == subpcode)) {
2113			len = resp_err_recov_pg(ap, pcontrol, target);
2114			len += resp_disconnect_pg(ap + len, pcontrol, target);
2115			if (is_disk) {
2116				len += resp_format_pg(ap + len, pcontrol,
2117						      target);
2118				len += resp_caching_pg(ap + len, pcontrol,
2119						       target);
 
 
 
2120			}
2121			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2122			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2123			if (0xff == subpcode) {
2124				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2125						  target, target_dev_id);
2126				len += resp_sas_sha_m_spg(ap + len, pcontrol);
2127			}
2128			len += resp_iec_m_pg(ap + len, pcontrol, target);
2129			offset += len;
2130		} else {
2131			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2132			return check_condition_result;
2133                }
2134		break;
2135	default:
2136		bad_pcode = true;
2137		break;
2138	}
2139	if (bad_pcode) {
2140		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2141		return check_condition_result;
2142	}
2143	if (msense_6)
2144		arr[0] = offset - 1;
2145	else
2146		put_unaligned_be16((offset - 2), arr + 0);
2147	return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
2148}
2149
2150#define SDEBUG_MAX_MSELECT_SZ 512
2151
2152static int resp_mode_select(struct scsi_cmnd *scp,
2153			    struct sdebug_dev_info *devip)
2154{
2155	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
2156	int param_len, res, mpage;
2157	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
2158	unsigned char *cmd = scp->cmnd;
2159	int mselect6 = (MODE_SELECT == cmd[0]);
2160
2161	memset(arr, 0, sizeof(arr));
2162	pf = cmd[1] & 0x10;
2163	sp = cmd[1] & 0x1;
2164	param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2165	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
2166		mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
2167		return check_condition_result;
2168	}
2169        res = fetch_to_dev_buffer(scp, arr, param_len);
2170        if (-1 == res)
2171		return DID_ERROR << 16;
2172	else if (sdebug_verbose && (res < param_len))
2173		sdev_printk(KERN_INFO, scp->device,
2174			    "%s: cdb indicated=%d, IO sent=%d bytes\n",
2175			    __func__, param_len, res);
2176	md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2177	bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
2178	if (md_len > 2) {
2179		mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
2180		return check_condition_result;
2181	}
2182	off = bd_len + (mselect6 ? 4 : 8);
2183	mpage = arr[off] & 0x3f;
2184	ps = !!(arr[off] & 0x80);
2185	if (ps) {
2186		mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
2187		return check_condition_result;
2188	}
2189	spf = !!(arr[off] & 0x40);
2190	pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
2191		       (arr[off + 1] + 2);
2192	if ((pg_len + off) > param_len) {
2193		mk_sense_buffer(scp, ILLEGAL_REQUEST,
2194				PARAMETER_LIST_LENGTH_ERR, 0);
2195		return check_condition_result;
2196	}
2197	switch (mpage) {
2198	case 0x8:      /* Caching Mode page */
2199		if (caching_pg[1] == arr[off + 1]) {
2200			memcpy(caching_pg + 2, arr + off + 2,
2201			       sizeof(caching_pg) - 2);
2202			goto set_mode_changed_ua;
2203		}
2204		break;
2205	case 0xa:      /* Control Mode page */
2206		if (ctrl_m_pg[1] == arr[off + 1]) {
2207			memcpy(ctrl_m_pg + 2, arr + off + 2,
2208			       sizeof(ctrl_m_pg) - 2);
 
 
 
 
2209			sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
2210			goto set_mode_changed_ua;
2211		}
2212		break;
2213	case 0x1c:      /* Informational Exceptions Mode page */
2214		if (iec_m_pg[1] == arr[off + 1]) {
2215			memcpy(iec_m_pg + 2, arr + off + 2,
2216			       sizeof(iec_m_pg) - 2);
2217			goto set_mode_changed_ua;
2218		}
2219		break;
2220	default:
2221		break;
2222	}
2223	mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
2224	return check_condition_result;
2225set_mode_changed_ua:
2226	set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2227	return 0;
2228}
2229
2230static int resp_temp_l_pg(unsigned char * arr)
2231{
2232	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2233				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
2234		};
2235
2236        memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2237        return sizeof(temp_l_pg);
2238}
2239
2240static int resp_ie_l_pg(unsigned char * arr)
2241{
2242	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2243		};
2244
2245        memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2246	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
2247		arr[4] = THRESHOLD_EXCEEDED;
2248		arr[5] = 0xff;
2249	}
2250        return sizeof(ie_l_pg);
2251}
2252
2253#define SDEBUG_MAX_LSENSE_SZ 512
2254
2255static int resp_log_sense(struct scsi_cmnd * scp,
2256                          struct sdebug_dev_info * devip)
2257{
2258	int ppc, sp, pcontrol, pcode, subpcode, alloc_len, len, n;
2259	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
2260	unsigned char *cmd = scp->cmnd;
2261
2262	memset(arr, 0, sizeof(arr));
2263	ppc = cmd[1] & 0x2;
2264	sp = cmd[1] & 0x1;
2265	if (ppc || sp) {
2266		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
2267		return check_condition_result;
2268	}
2269	pcontrol = (cmd[2] & 0xc0) >> 6;
2270	pcode = cmd[2] & 0x3f;
2271	subpcode = cmd[3] & 0xff;
2272	alloc_len = get_unaligned_be16(cmd + 7);
2273	arr[0] = pcode;
2274	if (0 == subpcode) {
2275		switch (pcode) {
2276		case 0x0:	/* Supported log pages log page */
2277			n = 4;
2278			arr[n++] = 0x0;		/* this page */
2279			arr[n++] = 0xd;		/* Temperature */
2280			arr[n++] = 0x2f;	/* Informational exceptions */
2281			arr[3] = n - 4;
2282			break;
2283		case 0xd:	/* Temperature log page */
2284			arr[3] = resp_temp_l_pg(arr + 4);
2285			break;
2286		case 0x2f:	/* Informational exceptions log page */
2287			arr[3] = resp_ie_l_pg(arr + 4);
2288			break;
2289		default:
2290			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2291			return check_condition_result;
2292		}
2293	} else if (0xff == subpcode) {
2294		arr[0] |= 0x40;
2295		arr[1] = subpcode;
2296		switch (pcode) {
2297		case 0x0:	/* Supported log pages and subpages log page */
2298			n = 4;
2299			arr[n++] = 0x0;
2300			arr[n++] = 0x0;		/* 0,0 page */
2301			arr[n++] = 0x0;
2302			arr[n++] = 0xff;	/* this page */
2303			arr[n++] = 0xd;
2304			arr[n++] = 0x0;		/* Temperature */
2305			arr[n++] = 0x2f;
2306			arr[n++] = 0x0;	/* Informational exceptions */
2307			arr[3] = n - 4;
2308			break;
2309		case 0xd:	/* Temperature subpages */
2310			n = 4;
2311			arr[n++] = 0xd;
2312			arr[n++] = 0x0;		/* Temperature */
2313			arr[3] = n - 4;
2314			break;
2315		case 0x2f:	/* Informational exceptions subpages */
2316			n = 4;
2317			arr[n++] = 0x2f;
2318			arr[n++] = 0x0;		/* Informational exceptions */
2319			arr[3] = n - 4;
2320			break;
2321		default:
2322			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2323			return check_condition_result;
2324		}
2325	} else {
2326		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2327		return check_condition_result;
2328	}
2329	len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
2330	return fill_from_dev_buffer(scp, arr,
2331		    min(len, SDEBUG_MAX_INQ_ARR_SZ));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2332}
2333
2334static int check_device_access_params(struct scsi_cmnd *scp,
2335				      unsigned long long lba, unsigned int num)
2336{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2337	if (lba + num > sdebug_capacity) {
2338		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2339		return check_condition_result;
2340	}
2341	/* transfer length excessive (tie in to block limits VPD page) */
2342	if (num > sdebug_store_sectors) {
2343		/* needs work to find which cdb byte 'num' comes from */
2344		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2345		return check_condition_result;
2346	}
 
 
 
 
 
 
 
2347	return 0;
2348}
2349
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2350/* Returns number of bytes copied or -1 if error. */
2351static int do_device_access(struct scsi_cmnd *scmd, u64 lba, u32 num,
2352			    bool do_write)
2353{
2354	int ret;
2355	u64 block, rest = 0;
2356	struct scsi_data_buffer *sdb;
2357	enum dma_data_direction dir;
 
 
2358
2359	if (do_write) {
2360		sdb = scsi_out(scmd);
2361		dir = DMA_TO_DEVICE;
 
2362	} else {
2363		sdb = scsi_in(scmd);
2364		dir = DMA_FROM_DEVICE;
2365	}
2366
2367	if (!sdb->length)
2368		return 0;
2369	if (!(scsi_bidi_cmnd(scmd) || scmd->sc_data_direction == dir))
2370		return -1;
 
2371
2372	block = do_div(lba, sdebug_store_sectors);
2373	if (block + num > sdebug_store_sectors)
2374		rest = block + num - sdebug_store_sectors;
2375
2376	ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2377		   fake_storep + (block * sdebug_sector_size),
2378		   (num - rest) * sdebug_sector_size, 0, do_write);
2379	if (ret != (num - rest) * sdebug_sector_size)
2380		return ret;
2381
2382	if (rest) {
2383		ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2384			    fake_storep, rest * sdebug_sector_size,
2385			    (num - rest) * sdebug_sector_size, do_write);
 
2386	}
2387
2388	return ret;
2389}
2390
2391/* If fake_store(lba,num) compares equal to arr(num), then copy top half of
2392 * arr into fake_store(lba,num) and return true. If comparison fails then
 
 
 
 
 
 
 
 
 
 
 
 
 
2393 * return false. */
2394static bool comp_write_worker(u64 lba, u32 num, const u8 *arr)
 
2395{
2396	bool res;
2397	u64 block, rest = 0;
2398	u32 store_blks = sdebug_store_sectors;
2399	u32 lb_size = sdebug_sector_size;
 
2400
2401	block = do_div(lba, store_blks);
2402	if (block + num > store_blks)
2403		rest = block + num - store_blks;
2404
2405	res = !memcmp(fake_storep + (block * lb_size), arr,
2406		      (num - rest) * lb_size);
2407	if (!res)
2408		return res;
2409	if (rest)
2410		res = memcmp(fake_storep, arr + ((num - rest) * lb_size),
2411			     rest * lb_size);
2412	if (!res)
2413		return res;
 
 
2414	arr += num * lb_size;
2415	memcpy(fake_storep + (block * lb_size), arr, (num - rest) * lb_size);
2416	if (rest)
2417		memcpy(fake_storep, arr + ((num - rest) * lb_size),
2418		       rest * lb_size);
2419	return res;
2420}
2421
2422static __be16 dif_compute_csum(const void *buf, int len)
2423{
2424	__be16 csum;
2425
2426	if (sdebug_guard)
2427		csum = (__force __be16)ip_compute_csum(buf, len);
2428	else
2429		csum = cpu_to_be16(crc_t10dif(buf, len));
2430
2431	return csum;
2432}
2433
2434static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
2435		      sector_t sector, u32 ei_lba)
2436{
2437	__be16 csum = dif_compute_csum(data, sdebug_sector_size);
2438
2439	if (sdt->guard_tag != csum) {
2440		pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
2441			(unsigned long)sector,
2442			be16_to_cpu(sdt->guard_tag),
2443			be16_to_cpu(csum));
2444		return 0x01;
2445	}
2446	if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
2447	    be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
2448		pr_err("REF check failed on sector %lu\n",
2449			(unsigned long)sector);
2450		return 0x03;
2451	}
2452	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2453	    be32_to_cpu(sdt->ref_tag) != ei_lba) {
2454		pr_err("REF check failed on sector %lu\n",
2455			(unsigned long)sector);
2456		return 0x03;
2457	}
2458	return 0;
2459}
2460
2461static void dif_copy_prot(struct scsi_cmnd *SCpnt, sector_t sector,
2462			  unsigned int sectors, bool read)
2463{
2464	size_t resid;
2465	void *paddr;
 
 
 
2466	const void *dif_store_end = dif_storep + sdebug_store_sectors;
2467	struct sg_mapping_iter miter;
2468
2469	/* Bytes of protection data to copy into sgl */
2470	resid = sectors * sizeof(*dif_storep);
2471
2472	sg_miter_start(&miter, scsi_prot_sglist(SCpnt),
2473			scsi_prot_sg_count(SCpnt), SG_MITER_ATOMIC |
2474			(read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
2475
2476	while (sg_miter_next(&miter) && resid > 0) {
2477		size_t len = min(miter.length, resid);
2478		void *start = dif_store(sector);
2479		size_t rest = 0;
2480
2481		if (dif_store_end < start + len)
2482			rest = start + len - dif_store_end;
2483
2484		paddr = miter.addr;
2485
2486		if (read)
2487			memcpy(paddr, start, len - rest);
2488		else
2489			memcpy(start, paddr, len - rest);
2490
2491		if (rest) {
2492			if (read)
2493				memcpy(paddr + len - rest, dif_storep, rest);
2494			else
2495				memcpy(dif_storep, paddr + len - rest, rest);
2496		}
2497
2498		sector += len / sizeof(*dif_storep);
2499		resid -= len;
2500	}
2501	sg_miter_stop(&miter);
2502}
2503
2504static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
2505			    unsigned int sectors, u32 ei_lba)
2506{
2507	unsigned int i;
2508	struct t10_pi_tuple *sdt;
2509	sector_t sector;
 
 
 
2510
2511	for (i = 0; i < sectors; i++, ei_lba++) {
2512		int ret;
2513
2514		sector = start_sec + i;
2515		sdt = dif_store(sector);
2516
2517		if (sdt->app_tag == cpu_to_be16(0xffff))
2518			continue;
2519
2520		ret = dif_verify(sdt, fake_store(sector), sector, ei_lba);
 
2521		if (ret) {
2522			dif_errors++;
2523			return ret;
2524		}
2525	}
2526
2527	dif_copy_prot(SCpnt, start_sec, sectors, true);
2528	dix_reads++;
2529
2530	return 0;
2531}
2532
2533static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
2534{
2535	u8 *cmd = scp->cmnd;
2536	struct sdebug_queued_cmd *sqcp;
2537	u64 lba;
2538	u32 num;
2539	u32 ei_lba;
2540	unsigned long iflags;
2541	int ret;
2542	bool check_prot;
 
 
 
2543
2544	switch (cmd[0]) {
2545	case READ_16:
2546		ei_lba = 0;
2547		lba = get_unaligned_be64(cmd + 2);
2548		num = get_unaligned_be32(cmd + 10);
2549		check_prot = true;
2550		break;
2551	case READ_10:
2552		ei_lba = 0;
2553		lba = get_unaligned_be32(cmd + 2);
2554		num = get_unaligned_be16(cmd + 7);
2555		check_prot = true;
2556		break;
2557	case READ_6:
2558		ei_lba = 0;
2559		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2560		      (u32)(cmd[1] & 0x1f) << 16;
2561		num = (0 == cmd[4]) ? 256 : cmd[4];
2562		check_prot = true;
2563		break;
2564	case READ_12:
2565		ei_lba = 0;
2566		lba = get_unaligned_be32(cmd + 2);
2567		num = get_unaligned_be32(cmd + 6);
2568		check_prot = true;
2569		break;
2570	case XDWRITEREAD_10:
2571		ei_lba = 0;
2572		lba = get_unaligned_be32(cmd + 2);
2573		num = get_unaligned_be16(cmd + 7);
2574		check_prot = false;
2575		break;
2576	default:	/* assume READ(32) */
2577		lba = get_unaligned_be64(cmd + 12);
2578		ei_lba = get_unaligned_be32(cmd + 20);
2579		num = get_unaligned_be32(cmd + 28);
2580		check_prot = false;
2581		break;
2582	}
2583	if (unlikely(have_dif_prot && check_prot)) {
2584		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2585		    (cmd[1] & 0xe0)) {
2586			mk_sense_invalid_opcode(scp);
2587			return check_condition_result;
2588		}
2589		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
2590		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
2591		    (cmd[1] & 0xe0) == 0)
2592			sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
2593				    "to DIF device\n");
2594	}
2595	if (unlikely(sdebug_any_injecting_opt)) {
2596		sqcp = (struct sdebug_queued_cmd *)scp->host_scribble;
2597
2598		if (sqcp) {
2599			if (sqcp->inj_short)
2600				num /= 2;
2601		}
2602	} else
2603		sqcp = NULL;
2604
2605	/* inline check_device_access_params() */
2606	if (unlikely(lba + num > sdebug_capacity)) {
2607		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2608		return check_condition_result;
2609	}
2610	/* transfer length excessive (tie in to block limits VPD page) */
2611	if (unlikely(num > sdebug_store_sectors)) {
2612		/* needs work to find which cdb byte 'num' comes from */
2613		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2614		return check_condition_result;
2615	}
2616
 
 
 
2617	if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
2618		     (lba <= (OPT_MEDIUM_ERR_ADDR + OPT_MEDIUM_ERR_NUM - 1)) &&
2619		     ((lba + num) > OPT_MEDIUM_ERR_ADDR))) {
2620		/* claim unrecoverable read error */
2621		mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
2622		/* set info field and valid bit for fixed descriptor */
2623		if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
2624			scp->sense_buffer[0] |= 0x80;	/* Valid bit */
2625			ret = (lba < OPT_MEDIUM_ERR_ADDR)
2626			      ? OPT_MEDIUM_ERR_ADDR : (int)lba;
2627			put_unaligned_be32(ret, scp->sense_buffer + 3);
2628		}
2629		scsi_set_resid(scp, scsi_bufflen(scp));
2630		return check_condition_result;
2631	}
2632
2633	read_lock_irqsave(&atomic_rw, iflags);
2634
2635	/* DIX + T10 DIF */
2636	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
2637		int prot_ret = prot_verify_read(scp, lba, num, ei_lba);
2638
2639		if (prot_ret) {
2640			read_unlock_irqrestore(&atomic_rw, iflags);
2641			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, prot_ret);
2642			return illegal_condition_result;
2643		}
2644	}
2645
2646	ret = do_device_access(scp, lba, num, false);
2647	read_unlock_irqrestore(&atomic_rw, iflags);
2648	if (unlikely(ret == -1))
2649		return DID_ERROR << 16;
2650
2651	scsi_in(scp)->resid = scsi_bufflen(scp) - ret;
2652
2653	if (unlikely(sqcp)) {
2654		if (sqcp->inj_recovered) {
2655			mk_sense_buffer(scp, RECOVERED_ERROR,
2656					THRESHOLD_EXCEEDED, 0);
2657			return check_condition_result;
2658		} else if (sqcp->inj_transport) {
2659			mk_sense_buffer(scp, ABORTED_COMMAND,
2660					TRANSPORT_PROBLEM, ACK_NAK_TO);
2661			return check_condition_result;
2662		} else if (sqcp->inj_dif) {
2663			/* Logical block guard check failed */
2664			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
 
2665			return illegal_condition_result;
2666		} else if (sqcp->inj_dix) {
2667			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
 
2668			return illegal_condition_result;
2669		}
2670	}
2671	return 0;
2672}
2673
2674static void dump_sector(unsigned char *buf, int len)
2675{
2676	int i, j, n;
2677
2678	pr_err(">>> Sector Dump <<<\n");
2679	for (i = 0 ; i < len ; i += 16) {
2680		char b[128];
2681
2682		for (j = 0, n = 0; j < 16; j++) {
2683			unsigned char c = buf[i+j];
2684
2685			if (c >= 0x20 && c < 0x7e)
2686				n += scnprintf(b + n, sizeof(b) - n,
2687					       " %c ", buf[i+j]);
2688			else
2689				n += scnprintf(b + n, sizeof(b) - n,
2690					       "%02x ", buf[i+j]);
2691		}
2692		pr_err("%04d: %s\n", i, b);
2693	}
2694}
2695
2696static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
2697			     unsigned int sectors, u32 ei_lba)
2698{
2699	int ret;
2700	struct t10_pi_tuple *sdt;
2701	void *daddr;
2702	sector_t sector = start_sec;
2703	int ppage_offset;
2704	int dpage_offset;
2705	struct sg_mapping_iter diter;
2706	struct sg_mapping_iter piter;
2707
2708	BUG_ON(scsi_sg_count(SCpnt) == 0);
2709	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
2710
2711	sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
2712			scsi_prot_sg_count(SCpnt),
2713			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2714	sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
2715			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2716
2717	/* For each protection page */
2718	while (sg_miter_next(&piter)) {
2719		dpage_offset = 0;
2720		if (WARN_ON(!sg_miter_next(&diter))) {
2721			ret = 0x01;
2722			goto out;
2723		}
2724
2725		for (ppage_offset = 0; ppage_offset < piter.length;
2726		     ppage_offset += sizeof(struct t10_pi_tuple)) {
2727			/* If we're at the end of the current
2728			 * data page advance to the next one
2729			 */
2730			if (dpage_offset >= diter.length) {
2731				if (WARN_ON(!sg_miter_next(&diter))) {
2732					ret = 0x01;
2733					goto out;
2734				}
2735				dpage_offset = 0;
2736			}
2737
2738			sdt = piter.addr + ppage_offset;
2739			daddr = diter.addr + dpage_offset;
2740
2741			ret = dif_verify(sdt, daddr, sector, ei_lba);
2742			if (ret) {
2743				dump_sector(daddr, sdebug_sector_size);
2744				goto out;
2745			}
2746
2747			sector++;
2748			ei_lba++;
2749			dpage_offset += sdebug_sector_size;
2750		}
2751		diter.consumed = dpage_offset;
2752		sg_miter_stop(&diter);
2753	}
2754	sg_miter_stop(&piter);
2755
2756	dif_copy_prot(SCpnt, start_sec, sectors, false);
2757	dix_writes++;
2758
2759	return 0;
2760
2761out:
2762	dif_errors++;
2763	sg_miter_stop(&diter);
2764	sg_miter_stop(&piter);
2765	return ret;
2766}
2767
2768static unsigned long lba_to_map_index(sector_t lba)
2769{
2770	if (sdebug_unmap_alignment)
2771		lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
2772	sector_div(lba, sdebug_unmap_granularity);
2773	return lba;
2774}
2775
2776static sector_t map_index_to_lba(unsigned long index)
2777{
2778	sector_t lba = index * sdebug_unmap_granularity;
2779
2780	if (sdebug_unmap_alignment)
2781		lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
2782	return lba;
2783}
2784
2785static unsigned int map_state(sector_t lba, unsigned int *num)
 
2786{
2787	sector_t end;
2788	unsigned int mapped;
2789	unsigned long index;
2790	unsigned long next;
2791
2792	index = lba_to_map_index(lba);
2793	mapped = test_bit(index, map_storep);
2794
2795	if (mapped)
2796		next = find_next_zero_bit(map_storep, map_size, index);
2797	else
2798		next = find_next_bit(map_storep, map_size, index);
2799
2800	end = min_t(sector_t, sdebug_store_sectors,  map_index_to_lba(next));
2801	*num = end - lba;
2802	return mapped;
2803}
2804
2805static void map_region(sector_t lba, unsigned int len)
 
2806{
2807	sector_t end = lba + len;
2808
2809	while (lba < end) {
2810		unsigned long index = lba_to_map_index(lba);
2811
2812		if (index < map_size)
2813			set_bit(index, map_storep);
2814
2815		lba = map_index_to_lba(index + 1);
2816	}
2817}
2818
2819static void unmap_region(sector_t lba, unsigned int len)
 
2820{
2821	sector_t end = lba + len;
 
2822
2823	while (lba < end) {
2824		unsigned long index = lba_to_map_index(lba);
2825
2826		if (lba == map_index_to_lba(index) &&
2827		    lba + sdebug_unmap_granularity <= end &&
2828		    index < map_size) {
2829			clear_bit(index, map_storep);
2830			if (sdebug_lbprz) {  /* for LBPRZ=2 return 0xff_s */
2831				memset(fake_storep +
2832				       lba * sdebug_sector_size,
2833				       (sdebug_lbprz & 1) ? 0 : 0xff,
2834				       sdebug_sector_size *
2835				       sdebug_unmap_granularity);
2836			}
2837			if (dif_storep) {
2838				memset(dif_storep + lba, 0xff,
2839				       sizeof(*dif_storep) *
2840				       sdebug_unmap_granularity);
2841			}
2842		}
2843		lba = map_index_to_lba(index + 1);
2844	}
2845}
2846
2847static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
2848{
2849	u8 *cmd = scp->cmnd;
2850	u64 lba;
2851	u32 num;
2852	u32 ei_lba;
2853	unsigned long iflags;
2854	int ret;
2855	bool check_prot;
 
 
 
2856
2857	switch (cmd[0]) {
2858	case WRITE_16:
2859		ei_lba = 0;
2860		lba = get_unaligned_be64(cmd + 2);
2861		num = get_unaligned_be32(cmd + 10);
2862		check_prot = true;
2863		break;
2864	case WRITE_10:
2865		ei_lba = 0;
2866		lba = get_unaligned_be32(cmd + 2);
2867		num = get_unaligned_be16(cmd + 7);
2868		check_prot = true;
2869		break;
2870	case WRITE_6:
2871		ei_lba = 0;
2872		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2873		      (u32)(cmd[1] & 0x1f) << 16;
2874		num = (0 == cmd[4]) ? 256 : cmd[4];
2875		check_prot = true;
2876		break;
2877	case WRITE_12:
2878		ei_lba = 0;
2879		lba = get_unaligned_be32(cmd + 2);
2880		num = get_unaligned_be32(cmd + 6);
2881		check_prot = true;
2882		break;
2883	case 0x53:	/* XDWRITEREAD(10) */
2884		ei_lba = 0;
2885		lba = get_unaligned_be32(cmd + 2);
2886		num = get_unaligned_be16(cmd + 7);
2887		check_prot = false;
2888		break;
2889	default:	/* assume WRITE(32) */
2890		lba = get_unaligned_be64(cmd + 12);
2891		ei_lba = get_unaligned_be32(cmd + 20);
2892		num = get_unaligned_be32(cmd + 28);
2893		check_prot = false;
2894		break;
2895	}
2896	if (unlikely(have_dif_prot && check_prot)) {
2897		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2898		    (cmd[1] & 0xe0)) {
2899			mk_sense_invalid_opcode(scp);
2900			return check_condition_result;
2901		}
2902		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
2903		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
2904		    (cmd[1] & 0xe0) == 0)
2905			sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
2906				    "to DIF device\n");
2907	}
2908
2909	/* inline check_device_access_params() */
2910	if (unlikely(lba + num > sdebug_capacity)) {
2911		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2912		return check_condition_result;
2913	}
2914	/* transfer length excessive (tie in to block limits VPD page) */
2915	if (unlikely(num > sdebug_store_sectors)) {
2916		/* needs work to find which cdb byte 'num' comes from */
2917		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2918		return check_condition_result;
2919	}
2920
2921	write_lock_irqsave(&atomic_rw, iflags);
2922
2923	/* DIX + T10 DIF */
2924	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
2925		int prot_ret = prot_verify_write(scp, lba, num, ei_lba);
2926
2927		if (prot_ret) {
2928			write_unlock_irqrestore(&atomic_rw, iflags);
2929			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, prot_ret);
2930			return illegal_condition_result;
2931		}
2932	}
2933
2934	ret = do_device_access(scp, lba, num, true);
2935	if (unlikely(scsi_debug_lbp()))
2936		map_region(lba, num);
2937	write_unlock_irqrestore(&atomic_rw, iflags);
 
 
 
2938	if (unlikely(-1 == ret))
2939		return DID_ERROR << 16;
2940	else if (unlikely(sdebug_verbose &&
2941			  (ret < (num * sdebug_sector_size))))
2942		sdev_printk(KERN_INFO, scp->device,
2943			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
2944			    my_name, num * sdebug_sector_size, ret);
2945
2946	if (unlikely(sdebug_any_injecting_opt)) {
2947		struct sdebug_queued_cmd *sqcp =
2948				(struct sdebug_queued_cmd *)scp->host_scribble;
2949
2950		if (sqcp) {
2951			if (sqcp->inj_recovered) {
2952				mk_sense_buffer(scp, RECOVERED_ERROR,
2953						THRESHOLD_EXCEEDED, 0);
2954				return check_condition_result;
2955			} else if (sqcp->inj_dif) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2956				/* Logical block guard check failed */
2957				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
2958				return illegal_condition_result;
2959			} else if (sqcp->inj_dix) {
 
 
2960				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
2961				return illegal_condition_result;
 
 
2962			}
2963		}
 
 
2964	}
2965	return 0;
 
 
 
 
 
2966}
2967
2968static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
2969			   u32 ei_lba, bool unmap, bool ndob)
2970{
2971	unsigned long iflags;
 
2972	unsigned long long i;
 
 
2973	int ret;
2974	u64 lba_off;
2975
2976	ret = check_device_access_params(scp, lba, num);
2977	if (ret)
 
 
 
 
 
 
 
2978		return ret;
2979
2980	write_lock_irqsave(&atomic_rw, iflags);
2981
2982	if (unmap && scsi_debug_lbp()) {
2983		unmap_region(lba, num);
2984		goto out;
2985	}
2986
2987	lba_off = lba * sdebug_sector_size;
2988	/* if ndob then zero 1 logical block, else fetch 1 logical block */
 
 
2989	if (ndob) {
2990		memset(fake_storep + lba_off, 0, sdebug_sector_size);
2991		ret = 0;
2992	} else
2993		ret = fetch_to_dev_buffer(scp, fake_storep + lba_off,
2994					  sdebug_sector_size);
2995
2996	if (-1 == ret) {
2997		write_unlock_irqrestore(&atomic_rw, iflags);
2998		return DID_ERROR << 16;
2999	} else if (sdebug_verbose && (ret < (num * sdebug_sector_size)))
3000		sdev_printk(KERN_INFO, scp->device,
3001			    "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
3002			    my_name, "write same",
3003			    num * sdebug_sector_size, ret);
3004
3005	/* Copy first sector to remaining blocks */
3006	for (i = 1 ; i < num ; i++)
3007		memcpy(fake_storep + ((lba + i) * sdebug_sector_size),
3008		       fake_storep + lba_off,
3009		       sdebug_sector_size);
3010
3011	if (scsi_debug_lbp())
3012		map_region(lba, num);
 
 
 
3013out:
3014	write_unlock_irqrestore(&atomic_rw, iflags);
3015
3016	return 0;
3017}
3018
3019static int resp_write_same_10(struct scsi_cmnd *scp,
3020			      struct sdebug_dev_info *devip)
3021{
3022	u8 *cmd = scp->cmnd;
3023	u32 lba;
3024	u16 num;
3025	u32 ei_lba = 0;
3026	bool unmap = false;
3027
3028	if (cmd[1] & 0x8) {
3029		if (sdebug_lbpws10 == 0) {
3030			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3031			return check_condition_result;
3032		} else
3033			unmap = true;
3034	}
3035	lba = get_unaligned_be32(cmd + 2);
3036	num = get_unaligned_be16(cmd + 7);
3037	if (num > sdebug_write_same_length) {
3038		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3039		return check_condition_result;
3040	}
3041	return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3042}
3043
3044static int resp_write_same_16(struct scsi_cmnd *scp,
3045			      struct sdebug_dev_info *devip)
3046{
3047	u8 *cmd = scp->cmnd;
3048	u64 lba;
3049	u32 num;
3050	u32 ei_lba = 0;
3051	bool unmap = false;
3052	bool ndob = false;
3053
3054	if (cmd[1] & 0x8) {	/* UNMAP */
3055		if (sdebug_lbpws == 0) {
3056			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3057			return check_condition_result;
3058		} else
3059			unmap = true;
3060	}
3061	if (cmd[1] & 0x1)  /* NDOB (no data-out buffer, assumes zeroes) */
3062		ndob = true;
3063	lba = get_unaligned_be64(cmd + 2);
3064	num = get_unaligned_be32(cmd + 10);
3065	if (num > sdebug_write_same_length) {
3066		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3067		return check_condition_result;
3068	}
3069	return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3070}
3071
3072/* Note the mode field is in the same position as the (lower) service action
3073 * field. For the Report supported operation codes command, SPC-4 suggests
3074 * each mode of this command should be reported separately; for future. */
3075static int resp_write_buffer(struct scsi_cmnd *scp,
3076			     struct sdebug_dev_info *devip)
3077{
3078	u8 *cmd = scp->cmnd;
3079	struct scsi_device *sdp = scp->device;
3080	struct sdebug_dev_info *dp;
3081	u8 mode;
3082
3083	mode = cmd[1] & 0x1f;
3084	switch (mode) {
3085	case 0x4:	/* download microcode (MC) and activate (ACT) */
3086		/* set UAs on this device only */
3087		set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3088		set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
3089		break;
3090	case 0x5:	/* download MC, save and ACT */
3091		set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
3092		break;
3093	case 0x6:	/* download MC with offsets and ACT */
3094		/* set UAs on most devices (LUs) in this target */
3095		list_for_each_entry(dp,
3096				    &devip->sdbg_host->dev_info_list,
3097				    dev_list)
3098			if (dp->target == sdp->id) {
3099				set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
3100				if (devip != dp)
3101					set_bit(SDEBUG_UA_MICROCODE_CHANGED,
3102						dp->uas_bm);
3103			}
3104		break;
3105	case 0x7:	/* download MC with offsets, save, and ACT */
3106		/* set UA on all devices (LUs) in this target */
3107		list_for_each_entry(dp,
3108				    &devip->sdbg_host->dev_info_list,
3109				    dev_list)
3110			if (dp->target == sdp->id)
3111				set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
3112					dp->uas_bm);
3113		break;
3114	default:
3115		/* do nothing for this command for other mode values */
3116		break;
3117	}
3118	return 0;
3119}
3120
3121static int resp_comp_write(struct scsi_cmnd *scp,
3122			   struct sdebug_dev_info *devip)
3123{
3124	u8 *cmd = scp->cmnd;
3125	u8 *arr;
3126	u8 *fake_storep_hold;
 
3127	u64 lba;
3128	u32 dnum;
3129	u32 lb_size = sdebug_sector_size;
3130	u8 num;
3131	unsigned long iflags;
3132	int ret;
3133	int retval = 0;
3134
3135	lba = get_unaligned_be64(cmd + 2);
3136	num = cmd[13];		/* 1 to a maximum of 255 logical blocks */
3137	if (0 == num)
3138		return 0;	/* degenerate case, not an error */
3139	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3140	    (cmd[1] & 0xe0)) {
3141		mk_sense_invalid_opcode(scp);
3142		return check_condition_result;
3143	}
3144	if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3145	     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3146	    (cmd[1] & 0xe0) == 0)
3147		sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3148			    "to DIF device\n");
3149
3150	/* inline check_device_access_params() */
3151	if (lba + num > sdebug_capacity) {
3152		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
3153		return check_condition_result;
3154	}
3155	/* transfer length excessive (tie in to block limits VPD page) */
3156	if (num > sdebug_store_sectors) {
3157		/* needs work to find which cdb byte 'num' comes from */
3158		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3159		return check_condition_result;
3160	}
3161	dnum = 2 * num;
3162	arr = kzalloc(dnum * lb_size, GFP_ATOMIC);
3163	if (NULL == arr) {
3164		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3165				INSUFF_RES_ASCQ);
3166		return check_condition_result;
3167	}
3168
3169	write_lock_irqsave(&atomic_rw, iflags);
3170
3171	/* trick do_device_access() to fetch both compare and write buffers
3172	 * from data-in into arr. Safe (atomic) since write_lock held. */
3173	fake_storep_hold = fake_storep;
3174	fake_storep = arr;
3175	ret = do_device_access(scp, 0, dnum, true);
3176	fake_storep = fake_storep_hold;
3177	if (ret == -1) {
3178		retval = DID_ERROR << 16;
3179		goto cleanup;
3180	} else if (sdebug_verbose && (ret < (dnum * lb_size)))
3181		sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
3182			    "indicated=%u, IO sent=%d bytes\n", my_name,
3183			    dnum * lb_size, ret);
3184	if (!comp_write_worker(lba, num, arr)) {
3185		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
3186		retval = check_condition_result;
3187		goto cleanup;
3188	}
3189	if (scsi_debug_lbp())
3190		map_region(lba, num);
3191cleanup:
3192	write_unlock_irqrestore(&atomic_rw, iflags);
3193	kfree(arr);
3194	return retval;
3195}
3196
3197struct unmap_block_desc {
3198	__be64	lba;
3199	__be32	blocks;
3200	__be32	__reserved;
3201};
3202
3203static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3204{
3205	unsigned char *buf;
3206	struct unmap_block_desc *desc;
 
 
3207	unsigned int i, payload_len, descriptors;
3208	int ret;
3209	unsigned long iflags;
3210
3211
3212	if (!scsi_debug_lbp())
3213		return 0;	/* fib and say its done */
3214	payload_len = get_unaligned_be16(scp->cmnd + 7);
3215	BUG_ON(scsi_bufflen(scp) != payload_len);
3216
3217	descriptors = (payload_len - 8) / 16;
3218	if (descriptors > sdebug_unmap_max_desc) {
3219		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3220		return check_condition_result;
3221	}
3222
3223	buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
3224	if (!buf) {
3225		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3226				INSUFF_RES_ASCQ);
3227		return check_condition_result;
3228	}
3229
3230	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
3231
3232	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
3233	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
3234
3235	desc = (void *)&buf[8];
3236
3237	write_lock_irqsave(&atomic_rw, iflags);
3238
3239	for (i = 0 ; i < descriptors ; i++) {
3240		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
3241		unsigned int num = get_unaligned_be32(&desc[i].blocks);
3242
3243		ret = check_device_access_params(scp, lba, num);
3244		if (ret)
3245			goto out;
3246
3247		unmap_region(lba, num);
3248	}
3249
3250	ret = 0;
3251
3252out:
3253	write_unlock_irqrestore(&atomic_rw, iflags);
3254	kfree(buf);
3255
3256	return ret;
3257}
3258
3259#define SDEBUG_GET_LBA_STATUS_LEN 32
3260
3261static int resp_get_lba_status(struct scsi_cmnd *scp,
3262			       struct sdebug_dev_info *devip)
3263{
3264	u8 *cmd = scp->cmnd;
3265	u64 lba;
3266	u32 alloc_len, mapped, num;
3267	u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
3268	int ret;
 
3269
3270	lba = get_unaligned_be64(cmd + 2);
3271	alloc_len = get_unaligned_be32(cmd + 10);
3272
3273	if (alloc_len < 24)
3274		return 0;
3275
3276	ret = check_device_access_params(scp, lba, 1);
3277	if (ret)
3278		return ret;
3279
3280	if (scsi_debug_lbp())
3281		mapped = map_state(lba, &num);
3282	else {
 
 
3283		mapped = 1;
3284		/* following just in case virtual_gb changed */
3285		sdebug_capacity = get_sdebug_capacity();
3286		if (sdebug_capacity - lba <= 0xffffffff)
3287			num = sdebug_capacity - lba;
3288		else
3289			num = 0xffffffff;
3290	}
3291
3292	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
3293	put_unaligned_be32(20, arr);		/* Parameter Data Length */
3294	put_unaligned_be64(lba, arr + 8);	/* LBA */
3295	put_unaligned_be32(num, arr + 16);	/* Number of blocks */
3296	arr[20] = !mapped;		/* prov_stat=0: mapped; 1: dealloc */
3297
3298	return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
3299}
3300
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3301#define RL_BUCKET_ELEMS 8
3302
3303/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
3304 * (W-LUN), the normal Linux scanning logic does not associate it with a
3305 * device (e.g. /dev/sg7). The following magic will make that association:
3306 *   "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
3307 * where <n> is a host number. If there are multiple targets in a host then
3308 * the above will associate a W-LUN to each target. To only get a W-LUN
3309 * for target 2, then use "echo '- 2 49409' > scan" .
3310 */
3311static int resp_report_luns(struct scsi_cmnd *scp,
3312			    struct sdebug_dev_info *devip)
3313{
3314	unsigned char *cmd = scp->cmnd;
3315	unsigned int alloc_len;
3316	unsigned char select_report;
3317	u64 lun;
3318	struct scsi_lun *lun_p;
3319	u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
3320	unsigned int lun_cnt;	/* normal LUN count (max: 256) */
3321	unsigned int wlun_cnt;	/* report luns W-LUN count */
3322	unsigned int tlun_cnt;	/* total LUN count */
3323	unsigned int rlen;	/* response length (in bytes) */
3324	int k, j, n, res;
3325	unsigned int off_rsp = 0;
3326	const int sz_lun = sizeof(struct scsi_lun);
3327
3328	clear_luns_changed_on_target(devip);
3329
3330	select_report = cmd[2];
3331	alloc_len = get_unaligned_be32(cmd + 6);
3332
3333	if (alloc_len < 4) {
3334		pr_err("alloc len too small %d\n", alloc_len);
3335		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
3336		return check_condition_result;
3337	}
3338
3339	switch (select_report) {
3340	case 0:		/* all LUNs apart from W-LUNs */
3341		lun_cnt = sdebug_max_luns;
3342		wlun_cnt = 0;
3343		break;
3344	case 1:		/* only W-LUNs */
3345		lun_cnt = 0;
3346		wlun_cnt = 1;
3347		break;
3348	case 2:		/* all LUNs */
3349		lun_cnt = sdebug_max_luns;
3350		wlun_cnt = 1;
3351		break;
3352	case 0x10:	/* only administrative LUs */
3353	case 0x11:	/* see SPC-5 */
3354	case 0x12:	/* only subsiduary LUs owned by referenced LU */
3355	default:
3356		pr_debug("select report invalid %d\n", select_report);
3357		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
3358		return check_condition_result;
3359	}
3360
3361	if (sdebug_no_lun_0 && (lun_cnt > 0))
3362		--lun_cnt;
3363
3364	tlun_cnt = lun_cnt + wlun_cnt;
3365	rlen = tlun_cnt * sz_lun;	/* excluding 8 byte header */
3366	scsi_set_resid(scp, scsi_bufflen(scp));
3367	pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
3368		 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
3369
3370	/* loops rely on sizeof response header same as sizeof lun (both 8) */
3371	lun = sdebug_no_lun_0 ? 1 : 0;
3372	for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
3373		memset(arr, 0, sizeof(arr));
3374		lun_p = (struct scsi_lun *)&arr[0];
3375		if (k == 0) {
3376			put_unaligned_be32(rlen, &arr[0]);
3377			++lun_p;
3378			j = 1;
3379		}
3380		for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
3381			if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
3382				break;
3383			int_to_scsilun(lun++, lun_p);
3384		}
3385		if (j < RL_BUCKET_ELEMS)
3386			break;
3387		n = j * sz_lun;
3388		res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
3389		if (res)
3390			return res;
3391		off_rsp += n;
3392	}
3393	if (wlun_cnt) {
3394		int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
3395		++j;
3396	}
3397	if (j > 0)
3398		res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
3399	return res;
3400}
3401
3402static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
3403			    unsigned int num, struct sdebug_dev_info *devip)
3404{
3405	int j;
3406	unsigned char *kaddr, *buf;
3407	unsigned int offset;
3408	struct scsi_data_buffer *sdb = scsi_in(scp);
3409	struct sg_mapping_iter miter;
 
 
 
 
 
3410
3411	/* better not to use temporary buffer. */
3412	buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
3413	if (!buf) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3414		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3415				INSUFF_RES_ASCQ);
3416		return check_condition_result;
3417	}
 
 
3418
3419	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3420
3421	offset = 0;
3422	sg_miter_start(&miter, sdb->table.sgl, sdb->table.nents,
3423			SG_MITER_ATOMIC | SG_MITER_TO_SG);
3424
3425	while (sg_miter_next(&miter)) {
3426		kaddr = miter.addr;
3427		for (j = 0; j < miter.length; j++)
3428			*(kaddr + j) ^= *(buf + offset + j);
 
 
 
 
 
 
3429
3430		offset += miter.length;
 
 
3431	}
3432	sg_miter_stop(&miter);
3433	kfree(buf);
 
 
3434
3435	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3436}
3437
3438static int resp_xdwriteread_10(struct scsi_cmnd *scp,
3439			       struct sdebug_dev_info *devip)
3440{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3441	u8 *cmd = scp->cmnd;
3442	u64 lba;
3443	u32 num;
3444	int errsts;
 
3445
3446	if (!scsi_bidi_cmnd(scp)) {
3447		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3448				INSUFF_RES_ASCQ);
3449		return check_condition_result;
3450	}
3451	errsts = resp_read_dt0(scp, devip);
3452	if (errsts)
3453		return errsts;
3454	if (!(cmd[1] & 0x4)) {		/* DISABLE_WRITE is not set */
3455		errsts = resp_write_dt0(scp, devip);
3456		if (errsts)
3457			return errsts;
 
 
 
 
 
 
 
 
3458	}
3459	lba = get_unaligned_be32(cmd + 2);
3460	num = get_unaligned_be16(cmd + 7);
3461	return resp_xdwriteread(scp, lba, num, devip);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3462}
3463
3464static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
3465{
3466	struct sdebug_queue *sqp = sdebug_q_arr;
3467
3468	if (sdebug_mq_active) {
 
 
 
3469		u32 tag = blk_mq_unique_tag(cmnd->request);
3470		u16 hwq = blk_mq_unique_tag_to_hwq(tag);
3471
3472		if (unlikely(hwq >= submit_queues)) {
3473			pr_warn("Unexpected hwq=%d, apply modulo\n", hwq);
3474			hwq %= submit_queues;
3475		}
3476		pr_debug("tag=%u, hwq=%d\n", tag, hwq);
3477		return sqp + hwq;
3478	} else
3479		return sqp;
 
 
 
 
3480}
3481
3482/* Queued (deferred) command completions converge here. */
3483static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
3484{
 
3485	int qc_idx;
3486	int retiring = 0;
3487	unsigned long iflags;
3488	struct sdebug_queue *sqp;
3489	struct sdebug_queued_cmd *sqcp;
3490	struct scsi_cmnd *scp;
3491	struct sdebug_dev_info *devip;
3492
 
 
 
3493	qc_idx = sd_dp->qc_idx;
3494	sqp = sdebug_q_arr + sd_dp->sqa_idx;
3495	if (sdebug_statistics) {
3496		atomic_inc(&sdebug_completions);
3497		if (raw_smp_processor_id() != sd_dp->issuing_cpu)
3498			atomic_inc(&sdebug_miss_cpus);
3499	}
3500	if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
3501		pr_err("wild qc_idx=%d\n", qc_idx);
3502		return;
3503	}
3504	spin_lock_irqsave(&sqp->qc_lock, iflags);
3505	sqcp = &sqp->qc_arr[qc_idx];
3506	scp = sqcp->a_cmnd;
3507	if (unlikely(scp == NULL)) {
3508		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3509		pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d\n",
3510		       sd_dp->sqa_idx, qc_idx);
3511		return;
3512	}
3513	devip = (struct sdebug_dev_info *)scp->device->hostdata;
3514	if (likely(devip))
3515		atomic_dec(&devip->num_in_q);
3516	else
3517		pr_err("devip=NULL\n");
3518	if (unlikely(atomic_read(&retired_max_queue) > 0))
3519		retiring = 1;
3520
3521	sqcp->a_cmnd = NULL;
3522	if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
3523		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3524		pr_err("Unexpected completion\n");
3525		return;
3526	}
3527
3528	if (unlikely(retiring)) {	/* user has reduced max_queue */
3529		int k, retval;
3530
3531		retval = atomic_read(&retired_max_queue);
3532		if (qc_idx >= retval) {
3533			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3534			pr_err("index %d too large\n", retval);
3535			return;
3536		}
3537		k = find_last_bit(sqp->in_use_bm, retval);
3538		if ((k < sdebug_max_queue) || (k == retval))
3539			atomic_set(&retired_max_queue, 0);
3540		else
3541			atomic_set(&retired_max_queue, k + 1);
3542	}
3543	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
 
 
 
 
 
3544	scp->scsi_done(scp); /* callback to mid level */
3545}
3546
3547/* When high resolution timer goes off this function is called. */
3548static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
3549{
3550	struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
3551						  hrt);
3552	sdebug_q_cmd_complete(sd_dp);
3553	return HRTIMER_NORESTART;
3554}
3555
3556/* When work queue schedules work, it calls this function. */
3557static void sdebug_q_cmd_wq_complete(struct work_struct *work)
3558{
3559	struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
3560						  ew.work);
3561	sdebug_q_cmd_complete(sd_dp);
3562}
3563
3564static bool got_shared_uuid;
3565static uuid_be shared_uuid;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3566
3567static struct sdebug_dev_info *sdebug_device_create(
3568			struct sdebug_host_info *sdbg_host, gfp_t flags)
3569{
3570	struct sdebug_dev_info *devip;
3571
3572	devip = kzalloc(sizeof(*devip), flags);
3573	if (devip) {
3574		if (sdebug_uuid_ctl == 1)
3575			uuid_be_gen(&devip->lu_name);
3576		else if (sdebug_uuid_ctl == 2) {
3577			if (got_shared_uuid)
3578				devip->lu_name = shared_uuid;
3579			else {
3580				uuid_be_gen(&shared_uuid);
3581				got_shared_uuid = true;
3582				devip->lu_name = shared_uuid;
3583			}
3584		}
3585		devip->sdbg_host = sdbg_host;
 
 
 
 
 
 
 
 
 
 
 
 
3586		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
3587	}
3588	return devip;
3589}
3590
3591static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
3592{
3593	struct sdebug_host_info *sdbg_host;
3594	struct sdebug_dev_info *open_devip = NULL;
3595	struct sdebug_dev_info *devip;
3596
3597	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
3598	if (!sdbg_host) {
3599		pr_err("Host info NULL\n");
3600		return NULL;
3601        }
3602	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
3603		if ((devip->used) && (devip->channel == sdev->channel) &&
3604                    (devip->target == sdev->id) &&
3605                    (devip->lun == sdev->lun))
3606                        return devip;
3607		else {
3608			if ((!devip->used) && (!open_devip))
3609				open_devip = devip;
3610		}
3611	}
3612	if (!open_devip) { /* try and make a new one */
3613		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
3614		if (!open_devip) {
3615			pr_err("out of memory at line %d\n", __LINE__);
3616			return NULL;
3617		}
3618	}
3619
3620	open_devip->channel = sdev->channel;
3621	open_devip->target = sdev->id;
3622	open_devip->lun = sdev->lun;
3623	open_devip->sdbg_host = sdbg_host;
3624	atomic_set(&open_devip->num_in_q, 0);
3625	set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
3626	open_devip->used = true;
3627	return open_devip;
3628}
3629
3630static int scsi_debug_slave_alloc(struct scsi_device *sdp)
3631{
3632	if (sdebug_verbose)
3633		pr_info("slave_alloc <%u %u %u %llu>\n",
3634		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3635	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
3636	return 0;
3637}
3638
3639static int scsi_debug_slave_configure(struct scsi_device *sdp)
3640{
3641	struct sdebug_dev_info *devip =
3642			(struct sdebug_dev_info *)sdp->hostdata;
3643
3644	if (sdebug_verbose)
3645		pr_info("slave_configure <%u %u %u %llu>\n",
3646		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3647	if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
3648		sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
3649	if (devip == NULL) {
3650		devip = find_build_dev_info(sdp);
3651		if (devip == NULL)
3652			return 1;  /* no resources, will be marked offline */
3653	}
3654	sdp->hostdata = devip;
3655	blk_queue_max_segment_size(sdp->request_queue, -1U);
3656	if (sdebug_no_uld)
3657		sdp->no_uld_attach = 1;
 
3658	return 0;
3659}
3660
3661static void scsi_debug_slave_destroy(struct scsi_device *sdp)
3662{
3663	struct sdebug_dev_info *devip =
3664		(struct sdebug_dev_info *)sdp->hostdata;
3665
3666	if (sdebug_verbose)
3667		pr_info("slave_destroy <%u %u %u %llu>\n",
3668		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3669	if (devip) {
3670		/* make this slot available for re-use */
3671		devip->used = false;
3672		sdp->hostdata = NULL;
3673	}
3674}
3675
3676static void stop_qc_helper(struct sdebug_defer *sd_dp)
 
3677{
3678	if (!sd_dp)
3679		return;
3680	if ((sdebug_jdelay > 0) || (sdebug_ndelay > 0))
3681		hrtimer_cancel(&sd_dp->hrt);
3682	else if (sdebug_jdelay < 0)
3683		cancel_work_sync(&sd_dp->ew.work);
3684}
3685
3686/* If @cmnd found deletes its timer or work queue and returns true; else
3687   returns false */
3688static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
3689{
3690	unsigned long iflags;
3691	int j, k, qmax, r_qmax;
 
3692	struct sdebug_queue *sqp;
3693	struct sdebug_queued_cmd *sqcp;
3694	struct sdebug_dev_info *devip;
3695	struct sdebug_defer *sd_dp;
3696
3697	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3698		spin_lock_irqsave(&sqp->qc_lock, iflags);
3699		qmax = sdebug_max_queue;
3700		r_qmax = atomic_read(&retired_max_queue);
3701		if (r_qmax > qmax)
3702			qmax = r_qmax;
3703		for (k = 0; k < qmax; ++k) {
3704			if (test_bit(k, sqp->in_use_bm)) {
3705				sqcp = &sqp->qc_arr[k];
3706				if (cmnd != sqcp->a_cmnd)
3707					continue;
3708				/* found */
3709				devip = (struct sdebug_dev_info *)
3710						cmnd->device->hostdata;
3711				if (devip)
3712					atomic_dec(&devip->num_in_q);
3713				sqcp->a_cmnd = NULL;
3714				sd_dp = sqcp->sd_dp;
 
 
 
 
 
3715				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3716				stop_qc_helper(sd_dp);
3717				clear_bit(k, sqp->in_use_bm);
3718				return true;
3719			}
3720		}
3721		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3722	}
3723	return false;
3724}
3725
3726/* Deletes (stops) timers or work queues of all queued commands */
3727static void stop_all_queued(void)
3728{
3729	unsigned long iflags;
3730	int j, k;
 
3731	struct sdebug_queue *sqp;
3732	struct sdebug_queued_cmd *sqcp;
3733	struct sdebug_dev_info *devip;
3734	struct sdebug_defer *sd_dp;
3735
3736	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3737		spin_lock_irqsave(&sqp->qc_lock, iflags);
3738		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
3739			if (test_bit(k, sqp->in_use_bm)) {
3740				sqcp = &sqp->qc_arr[k];
3741				if (sqcp->a_cmnd == NULL)
3742					continue;
3743				devip = (struct sdebug_dev_info *)
3744					sqcp->a_cmnd->device->hostdata;
3745				if (devip)
3746					atomic_dec(&devip->num_in_q);
3747				sqcp->a_cmnd = NULL;
3748				sd_dp = sqcp->sd_dp;
 
 
 
 
 
3749				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3750				stop_qc_helper(sd_dp);
3751				clear_bit(k, sqp->in_use_bm);
3752				spin_lock_irqsave(&sqp->qc_lock, iflags);
3753			}
3754		}
3755		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3756	}
3757}
3758
3759/* Free queued command memory on heap */
3760static void free_all_queued(void)
3761{
3762	int j, k;
3763	struct sdebug_queue *sqp;
3764	struct sdebug_queued_cmd *sqcp;
3765
3766	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3767		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
3768			sqcp = &sqp->qc_arr[k];
3769			kfree(sqcp->sd_dp);
3770			sqcp->sd_dp = NULL;
3771		}
3772	}
3773}
3774
3775static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
3776{
3777	bool ok;
3778
3779	++num_aborts;
3780	if (SCpnt) {
3781		ok = stop_queued_cmnd(SCpnt);
3782		if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
3783			sdev_printk(KERN_INFO, SCpnt->device,
3784				    "%s: command%s found\n", __func__,
3785				    ok ? "" : " not");
3786	}
3787	return SUCCESS;
3788}
3789
3790static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
3791{
3792	++num_dev_resets;
3793	if (SCpnt && SCpnt->device) {
3794		struct scsi_device *sdp = SCpnt->device;
3795		struct sdebug_dev_info *devip =
3796				(struct sdebug_dev_info *)sdp->hostdata;
3797
3798		if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
3799			sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
3800		if (devip)
3801			set_bit(SDEBUG_UA_POR, devip->uas_bm);
3802	}
3803	return SUCCESS;
3804}
3805
3806static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
3807{
3808	struct sdebug_host_info *sdbg_host;
3809	struct sdebug_dev_info *devip;
3810	struct scsi_device *sdp;
3811	struct Scsi_Host *hp;
3812	int k = 0;
3813
3814	++num_target_resets;
3815	if (!SCpnt)
3816		goto lie;
3817	sdp = SCpnt->device;
3818	if (!sdp)
3819		goto lie;
3820	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
3821		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
3822	hp = sdp->host;
3823	if (!hp)
3824		goto lie;
3825	sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
3826	if (sdbg_host) {
3827		list_for_each_entry(devip,
3828				    &sdbg_host->dev_info_list,
3829				    dev_list)
3830			if (devip->target == sdp->id) {
3831				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3832				++k;
3833			}
3834	}
3835	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
3836		sdev_printk(KERN_INFO, sdp,
3837			    "%s: %d device(s) found in target\n", __func__, k);
3838lie:
3839	return SUCCESS;
3840}
3841
3842static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
3843{
3844	struct sdebug_host_info *sdbg_host;
3845	struct sdebug_dev_info *devip;
3846        struct scsi_device * sdp;
3847        struct Scsi_Host * hp;
3848	int k = 0;
3849
3850	++num_bus_resets;
3851	if (!(SCpnt && SCpnt->device))
3852		goto lie;
3853	sdp = SCpnt->device;
3854	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
3855		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
3856	hp = sdp->host;
3857	if (hp) {
3858		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
3859		if (sdbg_host) {
3860			list_for_each_entry(devip,
3861                                            &sdbg_host->dev_info_list,
3862					    dev_list) {
3863				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3864				++k;
3865			}
3866		}
3867	}
3868	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
3869		sdev_printk(KERN_INFO, sdp,
3870			    "%s: %d device(s) found in host\n", __func__, k);
3871lie:
3872	return SUCCESS;
3873}
3874
3875static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
3876{
3877	struct sdebug_host_info * sdbg_host;
3878	struct sdebug_dev_info *devip;
3879	int k = 0;
3880
3881	++num_host_resets;
3882	if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
3883		sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
3884        spin_lock(&sdebug_host_list_lock);
3885        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
3886		list_for_each_entry(devip, &sdbg_host->dev_info_list,
3887				    dev_list) {
3888			set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3889			++k;
3890		}
3891        }
3892        spin_unlock(&sdebug_host_list_lock);
3893	stop_all_queued();
3894	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
3895		sdev_printk(KERN_INFO, SCpnt->device,
3896			    "%s: %d device(s) found\n", __func__, k);
3897	return SUCCESS;
3898}
3899
3900static void __init sdebug_build_parts(unsigned char *ramp,
3901				      unsigned long store_size)
3902{
3903	struct partition * pp;
3904	int starts[SDEBUG_MAX_PARTS + 2];
3905	int sectors_per_part, num_sectors, k;
3906	int heads_by_sects, start_sec, end_sec;
3907
3908	/* assume partition table already zeroed */
3909	if ((sdebug_num_parts < 1) || (store_size < 1048576))
3910		return;
3911	if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
3912		sdebug_num_parts = SDEBUG_MAX_PARTS;
3913		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
3914	}
3915	num_sectors = (int)sdebug_store_sectors;
3916	sectors_per_part = (num_sectors - sdebug_sectors_per)
3917			   / sdebug_num_parts;
3918	heads_by_sects = sdebug_heads * sdebug_sectors_per;
3919        starts[0] = sdebug_sectors_per;
3920	for (k = 1; k < sdebug_num_parts; ++k)
3921		starts[k] = ((k * sectors_per_part) / heads_by_sects)
3922			    * heads_by_sects;
3923	starts[sdebug_num_parts] = num_sectors;
3924	starts[sdebug_num_parts + 1] = 0;
3925
3926	ramp[510] = 0x55;	/* magic partition markings */
3927	ramp[511] = 0xAA;
3928	pp = (struct partition *)(ramp + 0x1be);
3929	for (k = 0; starts[k + 1]; ++k, ++pp) {
3930		start_sec = starts[k];
3931		end_sec = starts[k + 1] - 1;
3932		pp->boot_ind = 0;
3933
3934		pp->cyl = start_sec / heads_by_sects;
3935		pp->head = (start_sec - (pp->cyl * heads_by_sects))
3936			   / sdebug_sectors_per;
3937		pp->sector = (start_sec % sdebug_sectors_per) + 1;
3938
3939		pp->end_cyl = end_sec / heads_by_sects;
3940		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
3941			       / sdebug_sectors_per;
3942		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
3943
3944		pp->start_sect = cpu_to_le32(start_sec);
3945		pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
3946		pp->sys_ind = 0x83;	/* plain Linux partition */
3947	}
3948}
3949
3950static void block_unblock_all_queues(bool block)
3951{
3952	int j;
3953	struct sdebug_queue *sqp;
3954
3955	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
3956		atomic_set(&sqp->blocked, (int)block);
3957}
3958
3959/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
3960 * commands will be processed normally before triggers occur.
3961 */
3962static void tweak_cmnd_count(void)
3963{
3964	int count, modulo;
3965
3966	modulo = abs(sdebug_every_nth);
3967	if (modulo < 2)
3968		return;
3969	block_unblock_all_queues(true);
3970	count = atomic_read(&sdebug_cmnd_count);
3971	atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
3972	block_unblock_all_queues(false);
3973}
3974
3975static void clear_queue_stats(void)
3976{
3977	atomic_set(&sdebug_cmnd_count, 0);
3978	atomic_set(&sdebug_completions, 0);
3979	atomic_set(&sdebug_miss_cpus, 0);
3980	atomic_set(&sdebug_a_tsf, 0);
3981}
3982
3983static void setup_inject(struct sdebug_queue *sqp,
3984			 struct sdebug_queued_cmd *sqcp)
3985{
3986	if ((atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) > 0)
3987		return;
3988	sqcp->inj_recovered = !!(SDEBUG_OPT_RECOVERED_ERR & sdebug_opts);
3989	sqcp->inj_transport = !!(SDEBUG_OPT_TRANSPORT_ERR & sdebug_opts);
3990	sqcp->inj_dif = !!(SDEBUG_OPT_DIF_ERR & sdebug_opts);
3991	sqcp->inj_dix = !!(SDEBUG_OPT_DIX_ERR & sdebug_opts);
3992	sqcp->inj_short = !!(SDEBUG_OPT_SHORT_TRANSFER & sdebug_opts);
3993}
3994
 
 
3995/* Complete the processing of the thread that queued a SCSI command to this
3996 * driver. It either completes the command by calling cmnd_done() or
3997 * schedules a hr timer or work queue then returns 0. Returns
3998 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
3999 */
4000static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
4001			 int scsi_result, int delta_jiff)
4002{
 
 
 
 
 
 
4003	unsigned long iflags;
4004	int k, num_in_q, qdepth, inject;
4005	struct sdebug_queue *sqp;
4006	struct sdebug_queued_cmd *sqcp;
4007	struct scsi_device *sdp;
4008	struct sdebug_defer *sd_dp;
4009
4010	if (unlikely(devip == NULL)) {
4011		if (scsi_result == 0)
4012			scsi_result = DID_NO_CONNECT << 16;
4013		goto respond_in_thread;
4014	}
4015	sdp = cmnd->device;
4016
4017	if (unlikely(sdebug_verbose && scsi_result))
4018		sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
4019			    __func__, scsi_result);
4020	if (delta_jiff == 0)
4021		goto respond_in_thread;
4022
4023	/* schedule the response at a later time if resources permit */
4024	sqp = get_queue(cmnd);
4025	spin_lock_irqsave(&sqp->qc_lock, iflags);
4026	if (unlikely(atomic_read(&sqp->blocked))) {
4027		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4028		return SCSI_MLQUEUE_HOST_BUSY;
4029	}
4030	num_in_q = atomic_read(&devip->num_in_q);
4031	qdepth = cmnd->device->queue_depth;
4032	inject = 0;
4033	if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
4034		if (scsi_result) {
4035			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4036			goto respond_in_thread;
4037		} else
4038			scsi_result = device_qfull_result;
4039	} else if (unlikely(sdebug_every_nth &&
4040			    (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
4041			    (scsi_result == 0))) {
4042		if ((num_in_q == (qdepth - 1)) &&
4043		    (atomic_inc_return(&sdebug_a_tsf) >=
4044		     abs(sdebug_every_nth))) {
4045			atomic_set(&sdebug_a_tsf, 0);
4046			inject = 1;
4047			scsi_result = device_qfull_result;
4048		}
4049	}
4050
4051	k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
4052	if (unlikely(k >= sdebug_max_queue)) {
4053		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4054		if (scsi_result)
4055			goto respond_in_thread;
4056		else if (SDEBUG_OPT_ALL_TSF & sdebug_opts)
4057			scsi_result = device_qfull_result;
4058		if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
4059			sdev_printk(KERN_INFO, sdp,
4060				    "%s: max_queue=%d exceeded, %s\n",
4061				    __func__, sdebug_max_queue,
4062				    (scsi_result ?  "status: TASK SET FULL" :
4063						    "report: host busy"));
4064		if (scsi_result)
4065			goto respond_in_thread;
4066		else
4067			return SCSI_MLQUEUE_HOST_BUSY;
4068	}
4069	__set_bit(k, sqp->in_use_bm);
4070	atomic_inc(&devip->num_in_q);
4071	sqcp = &sqp->qc_arr[k];
4072	sqcp->a_cmnd = cmnd;
4073	cmnd->host_scribble = (unsigned char *)sqcp;
4074	cmnd->result = scsi_result;
4075	sd_dp = sqcp->sd_dp;
4076	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4077	if (unlikely(sdebug_every_nth && sdebug_any_injecting_opt))
4078		setup_inject(sqp, sqcp);
4079	if (delta_jiff > 0 || sdebug_ndelay > 0) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4080		ktime_t kt;
4081
4082		if (delta_jiff > 0) {
4083			struct timespec ts;
4084
4085			jiffies_to_timespec(delta_jiff, &ts);
4086			kt = ktime_set(ts.tv_sec, ts.tv_nsec);
4087		} else
4088			kt = sdebug_ndelay;
4089		if (NULL == sd_dp) {
4090			sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
4091			if (NULL == sd_dp)
4092				return SCSI_MLQUEUE_HOST_BUSY;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4093			sqcp->sd_dp = sd_dp;
4094			hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
4095				     HRTIMER_MODE_REL_PINNED);
4096			sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
4097			sd_dp->sqa_idx = sqp - sdebug_q_arr;
4098			sd_dp->qc_idx = k;
4099		}
4100		if (sdebug_statistics)
4101			sd_dp->issuing_cpu = raw_smp_processor_id();
 
 
4102		hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
4103	} else {	/* jdelay < 0, use work queue */
4104		if (NULL == sd_dp) {
4105			sd_dp = kzalloc(sizeof(*sqcp->sd_dp), GFP_ATOMIC);
4106			if (NULL == sd_dp)
4107				return SCSI_MLQUEUE_HOST_BUSY;
4108			sqcp->sd_dp = sd_dp;
4109			sd_dp->sqa_idx = sqp - sdebug_q_arr;
4110			sd_dp->qc_idx = k;
4111			INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
4112		}
4113		if (sdebug_statistics)
4114			sd_dp->issuing_cpu = raw_smp_processor_id();
 
 
 
 
4115		schedule_work(&sd_dp->ew.work);
 
 
 
 
 
 
4116	}
4117	if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) &&
4118		     (scsi_result == device_qfull_result)))
4119		sdev_printk(KERN_INFO, sdp,
4120			    "%s: num_in_q=%d +1, %s%s\n", __func__,
4121			    num_in_q, (inject ? "<inject> " : ""),
4122			    "status: TASK SET FULL");
4123	return 0;
4124
4125respond_in_thread:	/* call back to mid-layer using invocation thread */
4126	cmnd->result = scsi_result;
 
 
 
4127	cmnd->scsi_done(cmnd);
4128	return 0;
4129}
4130
4131/* Note: The following macros create attribute files in the
4132   /sys/module/scsi_debug/parameters directory. Unfortunately this
4133   driver is unaware of a change and cannot trigger auxiliary actions
4134   as it can when the corresponding attribute in the
4135   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
4136 */
4137module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
4138module_param_named(ato, sdebug_ato, int, S_IRUGO);
 
4139module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
4140module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
4141module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
4142module_param_named(dif, sdebug_dif, int, S_IRUGO);
4143module_param_named(dix, sdebug_dix, int, S_IRUGO);
4144module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
4145module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
4146module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
4147module_param_named(guard, sdebug_guard, uint, S_IRUGO);
4148module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
 
 
 
 
 
 
 
 
4149module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
4150module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
4151module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
4152module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
4153module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
4154module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
4155module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
 
 
 
 
4156module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
4157module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
4158module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
4159module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
4160module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
4161module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
 
4162module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
 
 
4163module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
4164module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
 
4165module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
4166module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
4167module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
4168module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
4169module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
4170module_param_named(submit_queues, submit_queues, int, S_IRUGO);
 
4171module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
4172module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
4173module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
4174module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
4175module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
4176module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
 
4177module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
4178		   S_IRUGO | S_IWUSR);
 
4179module_param_named(write_same_length, sdebug_write_same_length, int,
4180		   S_IRUGO | S_IWUSR);
 
 
 
 
4181
4182MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
4183MODULE_DESCRIPTION("SCSI debug adapter driver");
4184MODULE_LICENSE("GPL");
4185MODULE_VERSION(SDEBUG_VERSION);
4186
4187MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
4188MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
 
4189MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
4190MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
4191MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
4192MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
4193MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
4194MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
4195MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
4196MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
4197MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
4198MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
 
 
 
 
 
 
 
 
4199MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
4200MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
4201MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
4202MODULE_PARM_DESC(lbprz,
4203	"on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
4204MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
4205MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
4206MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
 
 
4207MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
4208MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
4209MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
4210MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
4211MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
4212MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
 
4213MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
 
4214MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
4215MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
 
4216MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
4217MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
4218MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
4219MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
4220MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
4221MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
 
4222MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
4223MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
4224MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
4225MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
4226MODULE_PARM_DESC(uuid_ctl,
4227		 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
4228MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
4229MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
 
4230MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
 
 
 
 
4231
4232#define SDEBUG_INFO_LEN 256
4233static char sdebug_info[SDEBUG_INFO_LEN];
4234
4235static const char * scsi_debug_info(struct Scsi_Host * shp)
4236{
4237	int k;
4238
4239	k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
4240		      my_name, SDEBUG_VERSION, sdebug_version_date);
4241	if (k >= (SDEBUG_INFO_LEN - 1))
4242		return sdebug_info;
4243	scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
4244		  "  dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
4245		  sdebug_dev_size_mb, sdebug_opts, submit_queues,
4246		  "statistics", (int)sdebug_statistics);
4247	return sdebug_info;
4248}
4249
4250/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
4251static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
4252				 int length)
4253{
4254	char arr[16];
4255	int opts;
4256	int minLen = length > 15 ? 15 : length;
4257
4258	if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
4259		return -EACCES;
4260	memcpy(arr, buffer, minLen);
4261	arr[minLen] = '\0';
4262	if (1 != sscanf(arr, "%d", &opts))
4263		return -EINVAL;
4264	sdebug_opts = opts;
4265	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4266	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4267	if (sdebug_every_nth != 0)
4268		tweak_cmnd_count();
4269	return length;
4270}
4271
4272/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
4273 * same for each scsi_debug host (if more than one). Some of the counters
4274 * output are not atomics so might be inaccurate in a busy system. */
4275static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
4276{
4277	int f, j, l;
4278	struct sdebug_queue *sqp;
 
4279
4280	seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
4281		   SDEBUG_VERSION, sdebug_version_date);
4282	seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
4283		   sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
4284		   sdebug_opts, sdebug_every_nth);
4285	seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
4286		   sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
4287		   sdebug_sector_size, "bytes");
4288	seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
4289		   sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
4290		   num_aborts);
4291	seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
4292		   num_dev_resets, num_target_resets, num_bus_resets,
4293		   num_host_resets);
4294	seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
4295		   dix_reads, dix_writes, dif_errors);
4296	seq_printf(m, "usec_in_jiffy=%lu, %s=%d, mq_active=%d\n",
4297		   TICK_NSEC / 1000, "statistics", sdebug_statistics,
4298		   sdebug_mq_active);
4299	seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d\n",
4300		   atomic_read(&sdebug_cmnd_count),
4301		   atomic_read(&sdebug_completions),
4302		   "miss_cpus", atomic_read(&sdebug_miss_cpus),
4303		   atomic_read(&sdebug_a_tsf));
4304
4305	seq_printf(m, "submit_queues=%d\n", submit_queues);
4306	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
4307		seq_printf(m, "  queue %d:\n", j);
4308		f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
4309		if (f != sdebug_max_queue) {
4310			l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
4311			seq_printf(m, "    in_use_bm BUSY: %s: %d,%d\n",
4312				   "first,last bits", f, l);
4313		}
4314	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4315	return 0;
4316}
4317
4318static ssize_t delay_show(struct device_driver *ddp, char *buf)
4319{
4320	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
4321}
4322/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
4323 * of delay is jiffies.
4324 */
4325static ssize_t delay_store(struct device_driver *ddp, const char *buf,
4326			   size_t count)
4327{
4328	int jdelay, res;
4329
4330	if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
4331		res = count;
4332		if (sdebug_jdelay != jdelay) {
4333			int j, k;
4334			struct sdebug_queue *sqp;
4335
4336			block_unblock_all_queues(true);
4337			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4338			     ++j, ++sqp) {
4339				k = find_first_bit(sqp->in_use_bm,
4340						   sdebug_max_queue);
4341				if (k != sdebug_max_queue) {
4342					res = -EBUSY;   /* queued commands */
4343					break;
4344				}
4345			}
4346			if (res > 0) {
4347				/* make sure sdebug_defer instances get
4348				 * re-allocated for new delay variant */
4349				free_all_queued();
4350				sdebug_jdelay = jdelay;
4351				sdebug_ndelay = 0;
4352			}
4353			block_unblock_all_queues(false);
4354		}
4355		return res;
4356	}
4357	return -EINVAL;
4358}
4359static DRIVER_ATTR_RW(delay);
4360
4361static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
4362{
4363	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
4364}
4365/* Returns -EBUSY if ndelay is being changed and commands are queued */
4366/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
4367static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
4368			    size_t count)
4369{
4370	int ndelay, res;
4371
4372	if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
4373	    (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
4374		res = count;
4375		if (sdebug_ndelay != ndelay) {
4376			int j, k;
4377			struct sdebug_queue *sqp;
4378
4379			block_unblock_all_queues(true);
4380			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4381			     ++j, ++sqp) {
4382				k = find_first_bit(sqp->in_use_bm,
4383						   sdebug_max_queue);
4384				if (k != sdebug_max_queue) {
4385					res = -EBUSY;   /* queued commands */
4386					break;
4387				}
4388			}
4389			if (res > 0) {
4390				/* make sure sdebug_defer instances get
4391				 * re-allocated for new delay variant */
4392				free_all_queued();
4393				sdebug_ndelay = ndelay;
4394				sdebug_jdelay = ndelay  ? JDELAY_OVERRIDDEN
4395							: DEF_JDELAY;
4396			}
4397			block_unblock_all_queues(false);
4398		}
4399		return res;
4400	}
4401	return -EINVAL;
4402}
4403static DRIVER_ATTR_RW(ndelay);
4404
4405static ssize_t opts_show(struct device_driver *ddp, char *buf)
4406{
4407	return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
4408}
4409
4410static ssize_t opts_store(struct device_driver *ddp, const char *buf,
4411			  size_t count)
4412{
4413        int opts;
4414	char work[20];
4415
4416        if (1 == sscanf(buf, "%10s", work)) {
4417		if (0 == strncasecmp(work,"0x", 2)) {
4418			if (1 == sscanf(&work[2], "%x", &opts))
4419				goto opts_done;
4420		} else {
4421			if (1 == sscanf(work, "%d", &opts))
4422				goto opts_done;
4423		}
4424	}
4425	return -EINVAL;
4426opts_done:
4427	sdebug_opts = opts;
4428	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4429	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4430	tweak_cmnd_count();
4431	return count;
4432}
4433static DRIVER_ATTR_RW(opts);
4434
4435static ssize_t ptype_show(struct device_driver *ddp, char *buf)
4436{
4437	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
4438}
4439static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
4440			   size_t count)
4441{
4442        int n;
 
 
 
 
4443
4444	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
 
 
4445		sdebug_ptype = n;
4446		return count;
4447	}
4448	return -EINVAL;
4449}
4450static DRIVER_ATTR_RW(ptype);
4451
4452static ssize_t dsense_show(struct device_driver *ddp, char *buf)
4453{
4454	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
4455}
4456static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
4457			    size_t count)
4458{
4459        int n;
4460
4461	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4462		sdebug_dsense = n;
4463		return count;
4464	}
4465	return -EINVAL;
4466}
4467static DRIVER_ATTR_RW(dsense);
4468
4469static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
4470{
4471	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
4472}
4473static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
4474			     size_t count)
4475{
4476        int n;
4477
4478	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
 
 
 
4479		n = (n > 0);
4480		sdebug_fake_rw = (sdebug_fake_rw > 0);
4481		if (sdebug_fake_rw != n) {
4482			if ((0 == n) && (NULL == fake_storep)) {
4483				unsigned long sz =
4484					(unsigned long)sdebug_dev_size_mb *
4485					1048576;
4486
4487				fake_storep = vmalloc(sz);
4488				if (NULL == fake_storep) {
4489					pr_err("out of memory, 9\n");
4490					return -ENOMEM;
 
 
 
 
 
 
 
 
 
 
4491				}
4492				memset(fake_storep, 0, sz);
4493			}
4494			sdebug_fake_rw = n;
 
 
4495		}
 
4496		return count;
4497	}
4498	return -EINVAL;
4499}
4500static DRIVER_ATTR_RW(fake_rw);
4501
4502static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
4503{
4504	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
4505}
4506static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
4507			      size_t count)
4508{
4509        int n;
4510
4511	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4512		sdebug_no_lun_0 = n;
4513		return count;
4514	}
4515	return -EINVAL;
4516}
4517static DRIVER_ATTR_RW(no_lun_0);
4518
4519static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
4520{
4521	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
4522}
4523static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
4524			      size_t count)
4525{
4526        int n;
4527
4528	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4529		sdebug_num_tgts = n;
4530		sdebug_max_tgts_luns();
4531		return count;
4532	}
4533	return -EINVAL;
4534}
4535static DRIVER_ATTR_RW(num_tgts);
4536
4537static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
4538{
4539	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
4540}
4541static DRIVER_ATTR_RO(dev_size_mb);
4542
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4543static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
4544{
4545	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
4546}
4547static DRIVER_ATTR_RO(num_parts);
4548
4549static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
4550{
4551	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
4552}
4553static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
4554			       size_t count)
4555{
4556        int nth;
 
4557
4558	if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
4559		sdebug_every_nth = nth;
4560		if (nth && !sdebug_statistics) {
4561			pr_info("every_nth needs statistics=1, set it\n");
4562			sdebug_statistics = true;
 
 
4563		}
4564		tweak_cmnd_count();
4565		return count;
4566	}
4567	return -EINVAL;
 
 
 
 
 
 
 
 
 
4568}
4569static DRIVER_ATTR_RW(every_nth);
4570
4571static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
4572{
4573	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
4574}
4575static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
4576			      size_t count)
4577{
4578        int n;
4579	bool changed;
4580
4581	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4582		if (n > 256) {
4583			pr_warn("max_luns can be no more than 256\n");
4584			return -EINVAL;
4585		}
4586		changed = (sdebug_max_luns != n);
4587		sdebug_max_luns = n;
4588		sdebug_max_tgts_luns();
4589		if (changed && (sdebug_scsi_level >= 5)) {	/* >= SPC-3 */
4590			struct sdebug_host_info *sdhp;
4591			struct sdebug_dev_info *dp;
4592
4593			spin_lock(&sdebug_host_list_lock);
4594			list_for_each_entry(sdhp, &sdebug_host_list,
4595					    host_list) {
4596				list_for_each_entry(dp, &sdhp->dev_info_list,
4597						    dev_list) {
4598					set_bit(SDEBUG_UA_LUNS_CHANGED,
4599						dp->uas_bm);
4600				}
4601			}
4602			spin_unlock(&sdebug_host_list_lock);
4603		}
4604		return count;
4605	}
4606	return -EINVAL;
4607}
4608static DRIVER_ATTR_RW(max_luns);
4609
4610static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
4611{
4612	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
4613}
4614/* N.B. max_queue can be changed while there are queued commands. In flight
4615 * commands beyond the new max_queue will be completed. */
4616static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
4617			       size_t count)
4618{
4619	int j, n, k, a;
4620	struct sdebug_queue *sqp;
4621
4622	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
4623	    (n <= SDEBUG_CANQUEUE)) {
 
4624		block_unblock_all_queues(true);
4625		k = 0;
4626		for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4627		     ++j, ++sqp) {
4628			a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
4629			if (a > k)
4630				k = a;
4631		}
4632		sdebug_max_queue = n;
4633		if (k == SDEBUG_CANQUEUE)
4634			atomic_set(&retired_max_queue, 0);
4635		else if (k >= n)
4636			atomic_set(&retired_max_queue, k + 1);
4637		else
4638			atomic_set(&retired_max_queue, 0);
4639		block_unblock_all_queues(false);
4640		return count;
4641	}
4642	return -EINVAL;
4643}
4644static DRIVER_ATTR_RW(max_queue);
4645
 
 
 
 
 
 
 
 
 
 
 
4646static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
4647{
4648	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
4649}
4650static DRIVER_ATTR_RO(no_uld);
4651
4652static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
4653{
4654	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
4655}
4656static DRIVER_ATTR_RO(scsi_level);
4657
4658static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
4659{
4660	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
4661}
4662static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
4663				size_t count)
4664{
4665        int n;
4666	bool changed;
4667
 
 
 
 
4668	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4669		changed = (sdebug_virtual_gb != n);
4670		sdebug_virtual_gb = n;
4671		sdebug_capacity = get_sdebug_capacity();
4672		if (changed) {
4673			struct sdebug_host_info *sdhp;
4674			struct sdebug_dev_info *dp;
4675
4676			spin_lock(&sdebug_host_list_lock);
4677			list_for_each_entry(sdhp, &sdebug_host_list,
4678					    host_list) {
4679				list_for_each_entry(dp, &sdhp->dev_info_list,
4680						    dev_list) {
4681					set_bit(SDEBUG_UA_CAPACITY_CHANGED,
4682						dp->uas_bm);
4683				}
4684			}
4685			spin_unlock(&sdebug_host_list_lock);
4686		}
4687		return count;
4688	}
4689	return -EINVAL;
4690}
4691static DRIVER_ATTR_RW(virtual_gb);
4692
4693static ssize_t add_host_show(struct device_driver *ddp, char *buf)
4694{
4695	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_add_host);
 
4696}
4697
4698static int sdebug_add_adapter(void);
4699static void sdebug_remove_adapter(void);
4700
4701static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
4702			      size_t count)
4703{
 
 
 
 
4704	int delta_hosts;
4705
4706	if (sscanf(buf, "%d", &delta_hosts) != 1)
4707		return -EINVAL;
4708	if (delta_hosts > 0) {
4709		do {
4710			sdebug_add_adapter();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4711		} while (--delta_hosts);
4712	} else if (delta_hosts < 0) {
4713		do {
4714			sdebug_remove_adapter();
4715		} while (++delta_hosts);
4716	}
4717	return count;
4718}
4719static DRIVER_ATTR_RW(add_host);
4720
4721static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
4722{
4723	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
4724}
4725static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
4726				    size_t count)
4727{
4728	int n;
4729
4730	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4731		sdebug_vpd_use_hostno = n;
4732		return count;
4733	}
4734	return -EINVAL;
4735}
4736static DRIVER_ATTR_RW(vpd_use_hostno);
4737
4738static ssize_t statistics_show(struct device_driver *ddp, char *buf)
4739{
4740	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
4741}
4742static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
4743				size_t count)
4744{
4745	int n;
4746
4747	if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
4748		if (n > 0)
4749			sdebug_statistics = true;
4750		else {
4751			clear_queue_stats();
4752			sdebug_statistics = false;
4753		}
4754		return count;
4755	}
4756	return -EINVAL;
4757}
4758static DRIVER_ATTR_RW(statistics);
4759
4760static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
4761{
4762	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
4763}
4764static DRIVER_ATTR_RO(sector_size);
4765
4766static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
4767{
4768	return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
4769}
4770static DRIVER_ATTR_RO(submit_queues);
4771
4772static ssize_t dix_show(struct device_driver *ddp, char *buf)
4773{
4774	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
4775}
4776static DRIVER_ATTR_RO(dix);
4777
4778static ssize_t dif_show(struct device_driver *ddp, char *buf)
4779{
4780	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
4781}
4782static DRIVER_ATTR_RO(dif);
4783
4784static ssize_t guard_show(struct device_driver *ddp, char *buf)
4785{
4786	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
4787}
4788static DRIVER_ATTR_RO(guard);
4789
4790static ssize_t ato_show(struct device_driver *ddp, char *buf)
4791{
4792	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
4793}
4794static DRIVER_ATTR_RO(ato);
4795
4796static ssize_t map_show(struct device_driver *ddp, char *buf)
4797{
4798	ssize_t count;
4799
4800	if (!scsi_debug_lbp())
4801		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
4802				 sdebug_store_sectors);
4803
4804	count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
4805			  (int)map_size, map_storep);
 
 
 
 
 
4806	buf[count++] = '\n';
4807	buf[count] = '\0';
4808
4809	return count;
4810}
4811static DRIVER_ATTR_RO(map);
4812
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4813static ssize_t removable_show(struct device_driver *ddp, char *buf)
4814{
4815	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
4816}
4817static ssize_t removable_store(struct device_driver *ddp, const char *buf,
4818			       size_t count)
4819{
4820	int n;
4821
4822	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4823		sdebug_removable = (n > 0);
4824		return count;
4825	}
4826	return -EINVAL;
4827}
4828static DRIVER_ATTR_RW(removable);
4829
4830static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
4831{
4832	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
4833}
4834/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
4835static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
4836			       size_t count)
4837{
4838	int n;
4839
4840	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4841		sdebug_host_lock = (n > 0);
4842		return count;
4843	}
4844	return -EINVAL;
4845}
4846static DRIVER_ATTR_RW(host_lock);
4847
4848static ssize_t strict_show(struct device_driver *ddp, char *buf)
4849{
4850	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
4851}
4852static ssize_t strict_store(struct device_driver *ddp, const char *buf,
4853			    size_t count)
4854{
4855	int n;
4856
4857	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4858		sdebug_strict = (n > 0);
4859		return count;
4860	}
4861	return -EINVAL;
4862}
4863static DRIVER_ATTR_RW(strict);
4864
4865static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
4866{
4867	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
4868}
4869static DRIVER_ATTR_RO(uuid_ctl);
4870
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4871
4872/* Note: The following array creates attribute files in the
4873   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
4874   files (over those found in the /sys/module/scsi_debug/parameters
4875   directory) is that auxiliary actions can be triggered when an attribute
4876   is changed. For example see: sdebug_add_host_store() above.
4877 */
4878
4879static struct attribute *sdebug_drv_attrs[] = {
4880	&driver_attr_delay.attr,
4881	&driver_attr_opts.attr,
4882	&driver_attr_ptype.attr,
4883	&driver_attr_dsense.attr,
4884	&driver_attr_fake_rw.attr,
 
4885	&driver_attr_no_lun_0.attr,
4886	&driver_attr_num_tgts.attr,
4887	&driver_attr_dev_size_mb.attr,
4888	&driver_attr_num_parts.attr,
4889	&driver_attr_every_nth.attr,
4890	&driver_attr_max_luns.attr,
4891	&driver_attr_max_queue.attr,
4892	&driver_attr_no_uld.attr,
4893	&driver_attr_scsi_level.attr,
4894	&driver_attr_virtual_gb.attr,
4895	&driver_attr_add_host.attr,
 
4896	&driver_attr_vpd_use_hostno.attr,
4897	&driver_attr_sector_size.attr,
4898	&driver_attr_statistics.attr,
4899	&driver_attr_submit_queues.attr,
4900	&driver_attr_dix.attr,
4901	&driver_attr_dif.attr,
4902	&driver_attr_guard.attr,
4903	&driver_attr_ato.attr,
4904	&driver_attr_map.attr,
 
4905	&driver_attr_removable.attr,
4906	&driver_attr_host_lock.attr,
4907	&driver_attr_ndelay.attr,
4908	&driver_attr_strict.attr,
4909	&driver_attr_uuid_ctl.attr,
 
 
 
4910	NULL,
4911};
4912ATTRIBUTE_GROUPS(sdebug_drv);
4913
4914static struct device *pseudo_primary;
4915
4916static int __init scsi_debug_init(void)
4917{
 
4918	unsigned long sz;
4919	int host_to_add;
4920	int k;
4921	int ret;
4922
 
 
4923	atomic_set(&retired_max_queue, 0);
4924
4925	if (sdebug_ndelay >= 1000 * 1000 * 1000) {
4926		pr_warn("ndelay must be less than 1 second, ignored\n");
4927		sdebug_ndelay = 0;
4928	} else if (sdebug_ndelay > 0)
4929		sdebug_jdelay = JDELAY_OVERRIDDEN;
4930
4931	switch (sdebug_sector_size) {
4932	case  512:
4933	case 1024:
4934	case 2048:
4935	case 4096:
4936		break;
4937	default:
4938		pr_err("invalid sector_size %d\n", sdebug_sector_size);
4939		return -EINVAL;
4940	}
4941
4942	switch (sdebug_dif) {
4943	case T10_PI_TYPE0_PROTECTION:
4944		break;
4945	case T10_PI_TYPE1_PROTECTION:
4946	case T10_PI_TYPE2_PROTECTION:
4947	case T10_PI_TYPE3_PROTECTION:
4948		have_dif_prot = true;
4949		break;
4950
4951	default:
4952		pr_err("dif must be 0, 1, 2 or 3\n");
4953		return -EINVAL;
4954	}
4955
 
 
 
 
 
4956	if (sdebug_guard > 1) {
4957		pr_err("guard must be 0 or 1\n");
4958		return -EINVAL;
4959	}
4960
4961	if (sdebug_ato > 1) {
4962		pr_err("ato must be 0 or 1\n");
4963		return -EINVAL;
4964	}
4965
4966	if (sdebug_physblk_exp > 15) {
4967		pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
4968		return -EINVAL;
4969	}
4970	if (sdebug_max_luns > 256) {
4971		pr_warn("max_luns can be no more than 256, use default\n");
4972		sdebug_max_luns = DEF_MAX_LUNS;
4973	}
4974
4975	if (sdebug_lowest_aligned > 0x3fff) {
4976		pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
4977		return -EINVAL;
4978	}
4979
4980	if (submit_queues < 1) {
4981		pr_err("submit_queues must be 1 or more\n");
4982		return -EINVAL;
4983	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4984	sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
4985			       GFP_KERNEL);
4986	if (sdebug_q_arr == NULL)
4987		return -ENOMEM;
4988	for (k = 0; k < submit_queues; ++k)
4989		spin_lock_init(&sdebug_q_arr[k].qc_lock);
4990
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4991	if (sdebug_dev_size_mb < 1)
4992		sdebug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
4993	sz = (unsigned long)sdebug_dev_size_mb * 1048576;
4994	sdebug_store_sectors = sz / sdebug_sector_size;
4995	sdebug_capacity = get_sdebug_capacity();
4996
4997	/* play around with geometry, don't waste too much on track 0 */
4998	sdebug_heads = 8;
4999	sdebug_sectors_per = 32;
5000	if (sdebug_dev_size_mb >= 256)
5001		sdebug_heads = 64;
5002	else if (sdebug_dev_size_mb >= 16)
5003		sdebug_heads = 32;
5004	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
5005			       (sdebug_sectors_per * sdebug_heads);
5006	if (sdebug_cylinders_per >= 1024) {
5007		/* other LLDs do this; implies >= 1GB ram disk ... */
5008		sdebug_heads = 255;
5009		sdebug_sectors_per = 63;
5010		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
5011			       (sdebug_sectors_per * sdebug_heads);
5012	}
5013
5014	if (sdebug_fake_rw == 0) {
5015		fake_storep = vmalloc(sz);
5016		if (NULL == fake_storep) {
5017			pr_err("out of memory, 1\n");
5018			ret = -ENOMEM;
5019			goto free_q_arr;
5020		}
5021		memset(fake_storep, 0, sz);
5022		if (sdebug_num_parts > 0)
5023			sdebug_build_parts(fake_storep, sz);
5024	}
5025
5026	if (sdebug_dix) {
5027		int dif_size;
5028
5029		dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
5030		dif_storep = vmalloc(dif_size);
5031
5032		pr_err("dif_storep %u bytes @ %p\n", dif_size, dif_storep);
5033
5034		if (dif_storep == NULL) {
5035			pr_err("out of mem. (DIX)\n");
5036			ret = -ENOMEM;
5037			goto free_vm;
5038		}
5039
5040		memset(dif_storep, 0xff, dif_size);
5041	}
5042
5043	/* Logical Block Provisioning */
5044	if (scsi_debug_lbp()) {
5045		sdebug_unmap_max_blocks =
5046			clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
5047
5048		sdebug_unmap_max_desc =
5049			clamp(sdebug_unmap_max_desc, 0U, 256U);
5050
5051		sdebug_unmap_granularity =
5052			clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
5053
5054		if (sdebug_unmap_alignment &&
5055		    sdebug_unmap_granularity <=
5056		    sdebug_unmap_alignment) {
5057			pr_err("ERR: unmap_granularity <= unmap_alignment\n");
5058			ret = -EINVAL;
5059			goto free_vm;
5060		}
5061
5062		map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
5063		map_storep = vmalloc(BITS_TO_LONGS(map_size) * sizeof(long));
5064
5065		pr_info("%lu provisioning blocks\n", map_size);
5066
5067		if (map_storep == NULL) {
5068			pr_err("out of mem. (MAP)\n");
5069			ret = -ENOMEM;
5070			goto free_vm;
5071		}
5072
5073		bitmap_zero(map_storep, map_size);
5074
5075		/* Map first 1KB for partition table */
5076		if (sdebug_num_parts)
5077			map_region(0, 2);
5078	}
5079
5080	pseudo_primary = root_device_register("pseudo_0");
5081	if (IS_ERR(pseudo_primary)) {
5082		pr_warn("root_device_register() error\n");
5083		ret = PTR_ERR(pseudo_primary);
5084		goto free_vm;
5085	}
5086	ret = bus_register(&pseudo_lld_bus);
5087	if (ret < 0) {
5088		pr_warn("bus_register error: %d\n", ret);
5089		goto dev_unreg;
5090	}
5091	ret = driver_register(&sdebug_driverfs_driver);
5092	if (ret < 0) {
5093		pr_warn("driver_register error: %d\n", ret);
5094		goto bus_unreg;
5095	}
5096
5097	host_to_add = sdebug_add_host;
5098	sdebug_add_host = 0;
5099
5100        for (k = 0; k < host_to_add; k++) {
5101                if (sdebug_add_adapter()) {
5102			pr_err("sdebug_add_adapter failed k=%d\n", k);
5103                        break;
5104                }
5105        }
5106
 
 
 
 
 
 
 
 
 
 
5107	if (sdebug_verbose)
5108		pr_info("built %d host(s)\n", sdebug_add_host);
5109
5110	return 0;
5111
5112bus_unreg:
5113	bus_unregister(&pseudo_lld_bus);
5114dev_unreg:
5115	root_device_unregister(pseudo_primary);
5116free_vm:
5117	vfree(map_storep);
5118	vfree(dif_storep);
5119	vfree(fake_storep);
5120free_q_arr:
5121	kfree(sdebug_q_arr);
5122	return ret;
5123}
5124
5125static void __exit scsi_debug_exit(void)
5126{
5127	int k = sdebug_add_host;
5128
5129	stop_all_queued();
5130	free_all_queued();
5131	for (; k; k--)
5132		sdebug_remove_adapter();
 
5133	driver_unregister(&sdebug_driverfs_driver);
5134	bus_unregister(&pseudo_lld_bus);
5135	root_device_unregister(pseudo_primary);
5136
5137	vfree(map_storep);
5138	vfree(dif_storep);
5139	vfree(fake_storep);
5140	kfree(sdebug_q_arr);
5141}
5142
5143device_initcall(scsi_debug_init);
5144module_exit(scsi_debug_exit);
5145
5146static void sdebug_release_adapter(struct device * dev)
5147{
5148        struct sdebug_host_info *sdbg_host;
5149
5150	sdbg_host = to_sdebug_host(dev);
5151        kfree(sdbg_host);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5152}
5153
5154static int sdebug_add_adapter(void)
5155{
5156	int k, devs_per_host;
5157        int error = 0;
5158        struct sdebug_host_info *sdbg_host;
5159	struct sdebug_dev_info *sdbg_devinfo, *tmp;
5160
5161        sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
5162        if (NULL == sdbg_host) {
5163		pr_err("out of memory at line %d\n", __LINE__);
5164                return -ENOMEM;
5165        }
 
 
5166
5167        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
5168
5169	devs_per_host = sdebug_num_tgts * sdebug_max_luns;
5170        for (k = 0; k < devs_per_host; k++) {
5171		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
5172		if (!sdbg_devinfo) {
5173			pr_err("out of memory at line %d\n", __LINE__);
5174                        error = -ENOMEM;
5175			goto clean;
5176                }
5177        }
5178
5179        spin_lock(&sdebug_host_list_lock);
5180        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
5181        spin_unlock(&sdebug_host_list_lock);
5182
5183        sdbg_host->dev.bus = &pseudo_lld_bus;
5184        sdbg_host->dev.parent = pseudo_primary;
5185        sdbg_host->dev.release = &sdebug_release_adapter;
5186	dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_add_host);
5187
5188        error = device_register(&sdbg_host->dev);
 
 
 
5189
5190        if (error)
 
5191		goto clean;
5192
5193	++sdebug_add_host;
5194        return error;
5195
5196clean:
5197	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5198				 dev_list) {
5199		list_del(&sdbg_devinfo->dev_list);
 
5200		kfree(sdbg_devinfo);
5201	}
5202
5203	kfree(sdbg_host);
5204        return error;
 
5205}
5206
5207static void sdebug_remove_adapter(void)
5208{
5209        struct sdebug_host_info * sdbg_host = NULL;
5210
5211        spin_lock(&sdebug_host_list_lock);
5212        if (!list_empty(&sdebug_host_list)) {
5213                sdbg_host = list_entry(sdebug_host_list.prev,
5214                                       struct sdebug_host_info, host_list);
5215		list_del(&sdbg_host->host_list);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5216	}
5217        spin_unlock(&sdebug_host_list_lock);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5218
5219	if (!sdbg_host)
5220		return;
5221
5222	device_unregister(&sdbg_host->dev);
5223	--sdebug_add_host;
5224}
5225
5226static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
5227{
5228	int num_in_q = 0;
5229	struct sdebug_dev_info *devip;
5230
5231	block_unblock_all_queues(true);
5232	devip = (struct sdebug_dev_info *)sdev->hostdata;
5233	if (NULL == devip) {
5234		block_unblock_all_queues(false);
5235		return	-ENODEV;
5236	}
5237	num_in_q = atomic_read(&devip->num_in_q);
5238
5239	if (qdepth < 1)
5240		qdepth = 1;
5241	/* allow to exceed max host qc_arr elements for testing */
5242	if (qdepth > SDEBUG_CANQUEUE + 10)
5243		qdepth = SDEBUG_CANQUEUE + 10;
5244	scsi_change_queue_depth(sdev, qdepth);
5245
5246	if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
5247		sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
5248			    __func__, qdepth, num_in_q);
5249	}
5250	block_unblock_all_queues(false);
5251	return sdev->queue_depth;
5252}
5253
5254static bool fake_timeout(struct scsi_cmnd *scp)
5255{
5256	if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
5257		if (sdebug_every_nth < -1)
5258			sdebug_every_nth = -1;
5259		if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
5260			return true; /* ignore command causing timeout */
5261		else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
5262			 scsi_medium_access_command(scp))
5263			return true; /* time out reads and writes */
5264	}
5265	return false;
5266}
5267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5268static int scsi_debug_queuecommand(struct Scsi_Host *shost,
5269				   struct scsi_cmnd *scp)
5270{
5271	u8 sdeb_i;
5272	struct scsi_device *sdp = scp->device;
5273	const struct opcode_info_t *oip;
5274	const struct opcode_info_t *r_oip;
5275	struct sdebug_dev_info *devip;
5276	u8 *cmd = scp->cmnd;
5277	int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
 
5278	int k, na;
5279	int errsts = 0;
5280	u32 flags;
5281	u16 sa;
5282	u8 opcode = cmd[0];
5283	bool has_wlun_rl;
 
5284
5285	scsi_set_resid(scp, 0);
5286	if (sdebug_statistics)
5287		atomic_inc(&sdebug_cmnd_count);
 
 
 
 
5288	if (unlikely(sdebug_verbose &&
5289		     !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
5290		char b[120];
5291		int n, len, sb;
5292
5293		len = scp->cmd_len;
5294		sb = (int)sizeof(b);
5295		if (len > 32)
5296			strcpy(b, "too long, over 32 bytes");
5297		else {
5298			for (k = 0, n = 0; k < len && n < sb; ++k)
5299				n += scnprintf(b + n, sb - n, "%02x ",
5300					       (u32)cmd[k]);
5301		}
5302		if (sdebug_mq_active)
5303			sdev_printk(KERN_INFO, sdp, "%s: tag=%u, cmd %s\n",
5304				    my_name, blk_mq_unique_tag(scp->request),
5305				    b);
5306		else
5307			sdev_printk(KERN_INFO, sdp, "%s: cmd %s\n", my_name,
5308				    b);
5309	}
 
 
5310	has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
5311	if (unlikely((sdp->lun >= sdebug_max_luns) && !has_wlun_rl))
5312		goto err_out;
5313
5314	sdeb_i = opcode_ind_arr[opcode];	/* fully mapped */
5315	oip = &opcode_info_arr[sdeb_i];		/* safe if table consistent */
5316	devip = (struct sdebug_dev_info *)sdp->hostdata;
5317	if (unlikely(!devip)) {
5318		devip = find_build_dev_info(sdp);
5319		if (NULL == devip)
5320			goto err_out;
5321	}
 
 
 
5322	na = oip->num_attached;
5323	r_pfp = oip->pfp;
5324	if (na) {	/* multiple commands with this opcode */
5325		r_oip = oip;
5326		if (FF_SA & r_oip->flags) {
5327			if (F_SA_LOW & oip->flags)
5328				sa = 0x1f & cmd[1];
5329			else
5330				sa = get_unaligned_be16(cmd + 8);
5331			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5332				if (opcode == oip->opcode && sa == oip->sa)
5333					break;
5334			}
5335		} else {   /* since no service action only check opcode */
5336			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5337				if (opcode == oip->opcode)
5338					break;
5339			}
5340		}
5341		if (k > na) {
5342			if (F_SA_LOW & r_oip->flags)
5343				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
5344			else if (F_SA_HIGH & r_oip->flags)
5345				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
5346			else
5347				mk_sense_invalid_opcode(scp);
5348			goto check_cond;
5349		}
5350	}	/* else (when na==0) we assume the oip is a match */
5351	flags = oip->flags;
5352	if (unlikely(F_INV_OP & flags)) {
5353		mk_sense_invalid_opcode(scp);
5354		goto check_cond;
5355	}
5356	if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
5357		if (sdebug_verbose)
5358			sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
5359				    my_name, opcode, " supported for wlun");
5360		mk_sense_invalid_opcode(scp);
5361		goto check_cond;
5362	}
5363	if (unlikely(sdebug_strict)) {	/* check cdb against mask */
5364		u8 rem;
5365		int j;
5366
5367		for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
5368			rem = ~oip->len_mask[k] & cmd[k];
5369			if (rem) {
5370				for (j = 7; j >= 0; --j, rem <<= 1) {
5371					if (0x80 & rem)
5372						break;
5373				}
5374				mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
5375				goto check_cond;
5376			}
5377		}
5378	}
5379	if (unlikely(!(F_SKIP_UA & flags) &&
5380		     find_first_bit(devip->uas_bm,
5381				    SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
5382		errsts = make_ua(scp, devip);
5383		if (errsts)
5384			goto check_cond;
5385	}
5386	if (unlikely((F_M_ACCESS & flags) && atomic_read(&devip->stopped))) {
5387		mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
5388		if (sdebug_verbose)
5389			sdev_printk(KERN_INFO, sdp, "%s reports: Not ready: "
5390				    "%s\n", my_name, "initializing command "
5391				    "required");
5392		errsts = check_condition_result;
5393		goto fini;
5394	}
5395	if (sdebug_fake_rw && (F_FAKE_RW & flags))
5396		goto fini;
5397	if (unlikely(sdebug_every_nth)) {
5398		if (fake_timeout(scp))
5399			return 0;	/* ignore command: make trouble */
5400	}
5401	if (likely(oip->pfp))
5402		errsts = oip->pfp(scp, devip);	/* calls a resp_* function */
5403	else if (r_pfp)	/* if leaf function ptr NULL, try the root's */
5404		errsts = r_pfp(scp, devip);
5405
5406fini:
5407	return schedule_resp(scp, devip, errsts,
5408			     ((F_DELAY_OVERR & flags) ? 0 : sdebug_jdelay));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5409check_cond:
5410	return schedule_resp(scp, devip, check_condition_result, 0);
5411err_out:
5412	return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, 0);
5413}
5414
5415static struct scsi_host_template sdebug_driver_template = {
5416	.show_info =		scsi_debug_show_info,
5417	.write_info =		scsi_debug_write_info,
5418	.proc_name =		sdebug_proc_name,
5419	.name =			"SCSI DEBUG",
5420	.info =			scsi_debug_info,
5421	.slave_alloc =		scsi_debug_slave_alloc,
5422	.slave_configure =	scsi_debug_slave_configure,
5423	.slave_destroy =	scsi_debug_slave_destroy,
5424	.ioctl =		scsi_debug_ioctl,
5425	.queuecommand =		scsi_debug_queuecommand,
5426	.change_queue_depth =	sdebug_change_qdepth,
5427	.eh_abort_handler =	scsi_debug_abort,
5428	.eh_device_reset_handler = scsi_debug_device_reset,
5429	.eh_target_reset_handler = scsi_debug_target_reset,
5430	.eh_bus_reset_handler = scsi_debug_bus_reset,
5431	.eh_host_reset_handler = scsi_debug_host_reset,
5432	.can_queue =		SDEBUG_CANQUEUE,
5433	.this_id =		7,
5434	.sg_tablesize =		SG_MAX_SEGMENTS,
5435	.cmd_per_lun =		DEF_CMD_PER_LUN,
5436	.max_sectors =		-1U,
5437	.use_clustering = 	DISABLE_CLUSTERING,
5438	.module =		THIS_MODULE,
5439	.track_queue_depth =	1,
5440};
5441
5442static int sdebug_driver_probe(struct device * dev)
5443{
5444	int error = 0;
5445	struct sdebug_host_info *sdbg_host;
5446	struct Scsi_Host *hpnt;
5447	int hprot;
5448
5449	sdbg_host = to_sdebug_host(dev);
5450
5451	sdebug_driver_template.can_queue = sdebug_max_queue;
5452	if (sdebug_clustering)
5453		sdebug_driver_template.use_clustering = ENABLE_CLUSTERING;
 
 
 
 
5454	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
5455	if (NULL == hpnt) {
5456		pr_err("scsi_host_alloc failed\n");
5457		error = -ENODEV;
5458		return error;
5459	}
5460	if (submit_queues > nr_cpu_ids) {
5461		pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%d\n",
5462			my_name, submit_queues, nr_cpu_ids);
5463		submit_queues = nr_cpu_ids;
5464	}
5465	/* Decide whether to tell scsi subsystem that we want mq */
5466	/* Following should give the same answer for each host */
5467	sdebug_mq_active = shost_use_blk_mq(hpnt) && (submit_queues > 1);
5468	if (sdebug_mq_active)
 
 
5469		hpnt->nr_hw_queues = submit_queues;
5470
5471        sdbg_host->shost = hpnt;
5472	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
5473	if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
5474		hpnt->max_id = sdebug_num_tgts + 1;
5475	else
5476		hpnt->max_id = sdebug_num_tgts;
5477	/* = sdebug_max_luns; */
5478	hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
5479
5480	hprot = 0;
5481
5482	switch (sdebug_dif) {
5483
5484	case T10_PI_TYPE1_PROTECTION:
5485		hprot = SHOST_DIF_TYPE1_PROTECTION;
5486		if (sdebug_dix)
5487			hprot |= SHOST_DIX_TYPE1_PROTECTION;
5488		break;
5489
5490	case T10_PI_TYPE2_PROTECTION:
5491		hprot = SHOST_DIF_TYPE2_PROTECTION;
5492		if (sdebug_dix)
5493			hprot |= SHOST_DIX_TYPE2_PROTECTION;
5494		break;
5495
5496	case T10_PI_TYPE3_PROTECTION:
5497		hprot = SHOST_DIF_TYPE3_PROTECTION;
5498		if (sdebug_dix)
5499			hprot |= SHOST_DIX_TYPE3_PROTECTION;
5500		break;
5501
5502	default:
5503		if (sdebug_dix)
5504			hprot |= SHOST_DIX_TYPE0_PROTECTION;
5505		break;
5506	}
5507
5508	scsi_host_set_prot(hpnt, hprot);
5509
5510	if (have_dif_prot || sdebug_dix)
5511		pr_info("host protection%s%s%s%s%s%s%s\n",
5512			(hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
5513			(hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
5514			(hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
5515			(hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
5516			(hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
5517			(hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
5518			(hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
5519
5520	if (sdebug_guard == 1)
5521		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
5522	else
5523		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
5524
5525	sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
5526	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
5527	if (sdebug_every_nth)	/* need stats counters for every_nth */
5528		sdebug_statistics = true;
5529        error = scsi_add_host(hpnt, &sdbg_host->dev);
5530        if (error) {
5531		pr_err("scsi_add_host failed\n");
5532                error = -ENODEV;
5533		scsi_host_put(hpnt);
5534        } else
5535		scsi_scan_host(hpnt);
 
5536
5537	return error;
5538}
5539
5540static int sdebug_driver_remove(struct device * dev)
5541{
5542        struct sdebug_host_info *sdbg_host;
5543	struct sdebug_dev_info *sdbg_devinfo, *tmp;
5544
5545	sdbg_host = to_sdebug_host(dev);
5546
5547	if (!sdbg_host) {
5548		pr_err("Unable to locate host info\n");
5549		return -ENODEV;
5550	}
5551
5552        scsi_remove_host(sdbg_host->shost);
5553
5554	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5555				 dev_list) {
5556                list_del(&sdbg_devinfo->dev_list);
5557                kfree(sdbg_devinfo);
5558        }
 
5559
5560        scsi_host_put(sdbg_host->shost);
5561        return 0;
5562}
5563
5564static int pseudo_lld_bus_match(struct device *dev,
5565				struct device_driver *dev_driver)
5566{
5567	return 1;
5568}
5569
5570static struct bus_type pseudo_lld_bus = {
5571	.name = "pseudo",
5572	.match = pseudo_lld_bus_match,
5573	.probe = sdebug_driver_probe,
5574	.remove = sdebug_driver_remove,
5575	.drv_groups = sdebug_drv_groups,
5576};
v5.9
   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/* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
 213 * or "peripheral device" addressing (value 0) */
 214#define SAM2_LUN_ADDRESS_METHOD 0
 215
 216/* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
 217 * (for response) per submit queue at one time. Can be reduced by max_queue
 218 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
 219 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
 220 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
 221 * but cannot exceed SDEBUG_CANQUEUE .
 222 */
 223#define SDEBUG_CANQUEUE_WORDS  3	/* a WORD is bits in a long */
 224#define SDEBUG_CANQUEUE  (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
 225#define DEF_CMD_PER_LUN  255
 226
 227/* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */
 228#define F_D_IN			1	/* Data-in command (e.g. READ) */
 229#define F_D_OUT			2	/* Data-out command (e.g. WRITE) */
 230#define F_D_OUT_MAYBE		4	/* WRITE SAME, NDOB bit */
 231#define F_D_UNKN		8
 232#define F_RL_WLUN_OK		0x10	/* allowed with REPORT LUNS W-LUN */
 233#define F_SKIP_UA		0x20	/* bypass UAs (e.g. INQUIRY command) */
 234#define F_DELAY_OVERR		0x40	/* for commands like INQUIRY */
 235#define F_SA_LOW		0x80	/* SA is in cdb byte 1, bits 4 to 0 */
 236#define F_SA_HIGH		0x100	/* SA is in cdb bytes 8 and 9 */
 237#define F_INV_OP		0x200	/* invalid opcode (not supported) */
 238#define F_FAKE_RW		0x400	/* bypass resp_*() when fake_rw set */
 239#define F_M_ACCESS		0x800	/* media access, reacts to SSU state */
 240#define F_SSU_DELAY		0x1000	/* SSU command delay (long-ish) */
 241#define F_SYNC_DELAY		0x2000	/* SYNCHRONIZE CACHE delay */
 242
 243/* Useful combinations of the above flags */
 244#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
 245#define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
 246#define FF_SA (F_SA_HIGH | F_SA_LOW)
 247#define F_LONG_DELAY		(F_SSU_DELAY | F_SYNC_DELAY)
 248
 249#define SDEBUG_MAX_PARTS 4
 250
 251#define SDEBUG_MAX_CMD_LEN 32
 252
 253#define SDEB_XA_NOT_IN_USE XA_MARK_1
 254
 255/* Zone types (zbcr05 table 25) */
 256enum sdebug_z_type {
 257	ZBC_ZONE_TYPE_CNV	= 0x1,
 258	ZBC_ZONE_TYPE_SWR	= 0x2,
 259	ZBC_ZONE_TYPE_SWP	= 0x3,
 260};
 261
 262/* enumeration names taken from table 26, zbcr05 */
 263enum sdebug_z_cond {
 264	ZBC_NOT_WRITE_POINTER	= 0x0,
 265	ZC1_EMPTY		= 0x1,
 266	ZC2_IMPLICIT_OPEN	= 0x2,
 267	ZC3_EXPLICIT_OPEN	= 0x3,
 268	ZC4_CLOSED		= 0x4,
 269	ZC6_READ_ONLY		= 0xd,
 270	ZC5_FULL		= 0xe,
 271	ZC7_OFFLINE		= 0xf,
 272};
 273
 274struct sdeb_zone_state {	/* ZBC: per zone state */
 275	enum sdebug_z_type z_type;
 276	enum sdebug_z_cond z_cond;
 277	bool z_non_seq_resource;
 278	unsigned int z_size;
 279	sector_t z_start;
 280	sector_t z_wp;
 281};
 282
 283struct sdebug_dev_info {
 284	struct list_head dev_list;
 285	unsigned int channel;
 286	unsigned int target;
 287	u64 lun;
 288	uuid_t lu_name;
 289	struct sdebug_host_info *sdbg_host;
 290	unsigned long uas_bm[1];
 291	atomic_t num_in_q;
 292	atomic_t stopped;	/* 1: by SSU, 2: device start */
 293	bool used;
 294
 295	/* For ZBC devices */
 296	enum blk_zoned_model zmodel;
 297	unsigned int zsize;
 298	unsigned int zsize_shift;
 299	unsigned int nr_zones;
 300	unsigned int nr_conv_zones;
 301	unsigned int nr_imp_open;
 302	unsigned int nr_exp_open;
 303	unsigned int nr_closed;
 304	unsigned int max_open;
 305	ktime_t create_ts;	/* time since bootup that this device was created */
 306	struct sdeb_zone_state *zstate;
 307};
 308
 309struct sdebug_host_info {
 310	struct list_head host_list;
 311	int si_idx;	/* sdeb_store_info (per host) xarray index */
 312	struct Scsi_Host *shost;
 313	struct device dev;
 314	struct list_head dev_info_list;
 315};
 316
 317/* There is an xarray of pointers to this struct's objects, one per host */
 318struct sdeb_store_info {
 319	rwlock_t macc_lck;	/* for atomic media access on this store */
 320	u8 *storep;		/* user data storage (ram) */
 321	struct t10_pi_tuple *dif_storep; /* protection info */
 322	void *map_storep;	/* provisioning map */
 323};
 324
 325#define to_sdebug_host(d)	\
 326	container_of(d, struct sdebug_host_info, dev)
 327
 328enum sdeb_defer_type {SDEB_DEFER_NONE = 0, SDEB_DEFER_HRT = 1,
 329		      SDEB_DEFER_WQ = 2};
 330
 331struct sdebug_defer {
 332	struct hrtimer hrt;
 333	struct execute_work ew;
 334	int sqa_idx;	/* index of sdebug_queue array */
 335	int qc_idx;	/* index of sdebug_queued_cmd array within sqa_idx */
 336	int hc_idx;	/* hostwide tag index */
 337	int issuing_cpu;
 338	bool init_hrt;
 339	bool init_wq;
 340	bool aborted;	/* true when blk_abort_request() already called */
 341	enum sdeb_defer_type defer_t;
 342};
 343
 344struct sdebug_queued_cmd {
 345	/* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
 346	 * instance indicates this slot is in use.
 347	 */
 348	struct sdebug_defer *sd_dp;
 349	struct scsi_cmnd *a_cmnd;
 
 
 
 
 
 350};
 351
 352struct sdebug_queue {
 353	struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
 354	unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
 355	spinlock_t qc_lock;
 356	atomic_t blocked;	/* to temporarily stop more being queued */
 357};
 358
 359static atomic_t sdebug_cmnd_count;   /* number of incoming commands */
 360static atomic_t sdebug_completions;  /* count of deferred completions */
 361static atomic_t sdebug_miss_cpus;    /* submission + completion cpus differ */
 362static atomic_t sdebug_a_tsf;	     /* 'almost task set full' counter */
 363static atomic_t sdeb_inject_pending;
 364
 365struct opcode_info_t {
 366	u8 num_attached;	/* 0 if this is it (i.e. a leaf); use 0xff */
 367				/* for terminating element */
 368	u8 opcode;		/* if num_attached > 0, preferred */
 369	u16 sa;			/* service action */
 370	u32 flags;		/* OR-ed set of SDEB_F_* */
 371	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
 372	const struct opcode_info_t *arrp;  /* num_attached elements or NULL */
 373	u8 len_mask[16];	/* len_mask[0]-->cdb_len, then mask for cdb */
 374				/* 1 to min(cdb_len, 15); ignore cdb[15...] */
 375};
 376
 377/* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
 378enum sdeb_opcode_index {
 379	SDEB_I_INVALID_OPCODE =	0,
 380	SDEB_I_INQUIRY = 1,
 381	SDEB_I_REPORT_LUNS = 2,
 382	SDEB_I_REQUEST_SENSE = 3,
 383	SDEB_I_TEST_UNIT_READY = 4,
 384	SDEB_I_MODE_SENSE = 5,		/* 6, 10 */
 385	SDEB_I_MODE_SELECT = 6,		/* 6, 10 */
 386	SDEB_I_LOG_SENSE = 7,
 387	SDEB_I_READ_CAPACITY = 8,	/* 10; 16 is in SA_IN(16) */
 388	SDEB_I_READ = 9,		/* 6, 10, 12, 16 */
 389	SDEB_I_WRITE = 10,		/* 6, 10, 12, 16 */
 390	SDEB_I_START_STOP = 11,
 391	SDEB_I_SERV_ACT_IN_16 = 12,	/* add ...SERV_ACT_IN_12 if needed */
 392	SDEB_I_SERV_ACT_OUT_16 = 13,	/* add ...SERV_ACT_OUT_12 if needed */
 393	SDEB_I_MAINT_IN = 14,
 394	SDEB_I_MAINT_OUT = 15,
 395	SDEB_I_VERIFY = 16,		/* VERIFY(10), VERIFY(16) */
 396	SDEB_I_VARIABLE_LEN = 17,	/* READ(32), WRITE(32), WR_SCAT(32) */
 397	SDEB_I_RESERVE = 18,		/* 6, 10 */
 398	SDEB_I_RELEASE = 19,		/* 6, 10 */
 399	SDEB_I_ALLOW_REMOVAL = 20,	/* PREVENT ALLOW MEDIUM REMOVAL */
 400	SDEB_I_REZERO_UNIT = 21,	/* REWIND in SSC */
 401	SDEB_I_ATA_PT = 22,		/* 12, 16 */
 402	SDEB_I_SEND_DIAG = 23,
 403	SDEB_I_UNMAP = 24,
 404	SDEB_I_WRITE_BUFFER = 25,
 405	SDEB_I_WRITE_SAME = 26,		/* 10, 16 */
 406	SDEB_I_SYNC_CACHE = 27,		/* 10, 16 */
 407	SDEB_I_COMP_WRITE = 28,
 408	SDEB_I_PRE_FETCH = 29,		/* 10, 16 */
 409	SDEB_I_ZONE_OUT = 30,		/* 0x94+SA; includes no data xfer */
 410	SDEB_I_ZONE_IN = 31,		/* 0x95+SA; all have data-in */
 411	SDEB_I_LAST_ELEM_P1 = 32,	/* keep this last (previous + 1) */
 412};
 413
 414
 415static const unsigned char opcode_ind_arr[256] = {
 416/* 0x0; 0x0->0x1f: 6 byte cdbs */
 417	SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
 418	    0, 0, 0, 0,
 419	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
 420	0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 421	    SDEB_I_RELEASE,
 422	0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
 423	    SDEB_I_ALLOW_REMOVAL, 0,
 424/* 0x20; 0x20->0x3f: 10 byte cdbs */
 425	0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
 426	SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
 427	0, 0, 0, 0, SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, 0,
 428	0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
 429/* 0x40; 0x40->0x5f: 10 byte cdbs */
 430	0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
 431	0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
 432	0, 0, 0, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
 433	    SDEB_I_RELEASE,
 434	0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
 435/* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
 436	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 437	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 438	0, SDEB_I_VARIABLE_LEN,
 439/* 0x80; 0x80->0x9f: 16 byte cdbs */
 440	0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
 441	SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0,
 442	0, 0, 0, SDEB_I_VERIFY,
 443	SDEB_I_PRE_FETCH, SDEB_I_SYNC_CACHE, 0, SDEB_I_WRITE_SAME,
 444	SDEB_I_ZONE_OUT, SDEB_I_ZONE_IN, 0, 0,
 445	0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
 446/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
 447	SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
 448	     SDEB_I_MAINT_OUT, 0, 0, 0,
 449	SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
 450	     0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
 451	0, 0, 0, 0, 0, 0, 0, 0,
 452	0, 0, 0, 0, 0, 0, 0, 0,
 453/* 0xc0; 0xc0->0xff: vendor specific */
 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	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 458};
 459
 460/*
 461 * The following "response" functions return the SCSI mid-level's 4 byte
 462 * tuple-in-an-int. To handle commands with an IMMED bit, for a faster
 463 * command completion, they can mask their return value with
 464 * SDEG_RES_IMMED_MASK .
 465 */
 466#define SDEG_RES_IMMED_MASK 0x40000000
 467
 468static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
 469static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
 470static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
 471static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 472static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
 473static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
 474static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
 475static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 476static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
 477static int resp_write_scat(struct scsi_cmnd *, struct sdebug_dev_info *);
 478static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
 479static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
 480static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
 481static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
 482static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
 483static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
 484static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
 485static int resp_verify(struct scsi_cmnd *, struct sdebug_dev_info *);
 486static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
 487static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
 
 488static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
 489static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
 490static int resp_sync_cache(struct scsi_cmnd *, struct sdebug_dev_info *);
 491static int resp_pre_fetch(struct scsi_cmnd *, struct sdebug_dev_info *);
 492static int resp_report_zones(struct scsi_cmnd *, struct sdebug_dev_info *);
 493static int resp_open_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 494static int resp_close_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 495static int resp_finish_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 496static int resp_rwp_zone(struct scsi_cmnd *, struct sdebug_dev_info *);
 497
 498static int sdebug_do_add_host(bool mk_new_store);
 499static int sdebug_add_host_helper(int per_host_idx);
 500static void sdebug_do_remove_host(bool the_end);
 501static int sdebug_add_store(void);
 502static void sdebug_erase_store(int idx, struct sdeb_store_info *sip);
 503static void sdebug_erase_all_stores(bool apart_from_first);
 504
 505/*
 506 * The following are overflow arrays for cdbs that "hit" the same index in
 507 * the opcode_info_arr array. The most time sensitive (or commonly used) cdb
 508 * should be placed in opcode_info_arr[], the others should be placed here.
 509 */
 510static const struct opcode_info_t msense_iarr[] = {
 511	{0, 0x1a, 0, F_D_IN, NULL, NULL,
 512	    {6,  0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 513};
 514
 515static const struct opcode_info_t mselect_iarr[] = {
 516	{0, 0x15, 0, F_D_OUT, NULL, NULL,
 517	    {6,  0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 518};
 519
 520static const struct opcode_info_t read_iarr[] = {
 521	{0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
 522	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 523	     0, 0, 0, 0} },
 524	{0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
 525	    {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 526	{0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
 527	    {12,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
 528	     0xc7, 0, 0, 0, 0} },
 529};
 530
 531static const struct opcode_info_t write_iarr[] = {
 532	{0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(10) */
 533	    NULL, {10,  0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
 534		   0, 0, 0, 0, 0, 0} },
 535	{0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,   /* WRITE(6) */
 536	    NULL, {6,  0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
 537		   0, 0, 0} },
 538	{0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0,  /* WRITE(12) */
 539	    NULL, {12,  0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 540		   0xbf, 0xc7, 0, 0, 0, 0} },
 541};
 542
 543static const struct opcode_info_t verify_iarr[] = {
 544	{0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,/* VERIFY(10) */
 545	    NULL, {10,  0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc7,
 546		   0, 0, 0, 0, 0, 0} },
 547};
 548
 549static const struct opcode_info_t sa_in_16_iarr[] = {
 550	{0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
 551	    {16,  0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 552	     0xff, 0xff, 0xff, 0, 0xc7} },	/* GET LBA STATUS(16) */
 553};
 554
 555static const struct opcode_info_t vl_iarr[] = {	/* VARIABLE LENGTH */
 556	{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
 557	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
 558		   0, 0xff, 0xff, 0xff, 0xff} },	/* WRITE(32) */
 559	{0, 0x7f, 0x11, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 560	    NULL, {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x11, 0xf8,
 561		   0, 0xff, 0xff, 0x0, 0x0} },	/* WRITE SCATTERED(32) */
 562};
 563
 564static const struct opcode_info_t maint_in_iarr[] = {	/* MAINT IN */
 565	{0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
 566	    {12,  0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
 567	     0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
 568	{0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
 569	    {12,  0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 570	     0, 0} },	/* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
 571};
 572
 573static const struct opcode_info_t write_same_iarr[] = {
 574	{0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
 575	    {16,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 576	     0xff, 0xff, 0xff, 0x3f, 0xc7} },		/* WRITE SAME(16) */
 577};
 578
 579static const struct opcode_info_t reserve_iarr[] = {
 580	{0, 0x16, 0, F_D_OUT, NULL, NULL,		/* RESERVE(6) */
 581	    {6,  0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 582};
 583
 584static const struct opcode_info_t release_iarr[] = {
 585	{0, 0x17, 0, F_D_OUT, NULL, NULL,		/* RELEASE(6) */
 586	    {6,  0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 587};
 588
 589static const struct opcode_info_t sync_cache_iarr[] = {
 590	{0, 0x91, 0, F_SYNC_DELAY | F_M_ACCESS, resp_sync_cache, NULL,
 591	    {16,  0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 592	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* SYNC_CACHE (16) */
 593};
 594
 595static const struct opcode_info_t pre_fetch_iarr[] = {
 596	{0, 0x90, 0, F_SYNC_DELAY | FF_MEDIA_IO, resp_pre_fetch, NULL,
 597	    {16,  0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 598	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },	/* PRE-FETCH (16) */
 599};
 600
 601static const struct opcode_info_t zone_out_iarr[] = {	/* ZONE OUT(16) */
 602	{0, 0x94, 0x1, F_SA_LOW | F_M_ACCESS, resp_close_zone, NULL,
 603	    {16, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 604	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },	/* CLOSE ZONE */
 605	{0, 0x94, 0x2, F_SA_LOW | F_M_ACCESS, resp_finish_zone, NULL,
 606	    {16, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 607	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },	/* FINISH ZONE */
 608	{0, 0x94, 0x4, F_SA_LOW | F_M_ACCESS, resp_rwp_zone, NULL,
 609	    {16, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 610	     0xff, 0, 0, 0xff, 0xff, 0x1, 0xc7} },  /* RESET WRITE POINTER */
 611};
 612
 613static const struct opcode_info_t zone_in_iarr[] = {	/* ZONE IN(16) */
 614	{0, 0x95, 0x6, F_SA_LOW | F_D_IN | F_M_ACCESS, NULL, NULL,
 615	    {16, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 616	     0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* REPORT ZONES */
 617};
 618
 619
 620/* This array is accessed via SDEB_I_* values. Make sure all are mapped,
 621 * plus the terminating elements for logic that scans this table such as
 622 * REPORT SUPPORTED OPERATION CODES. */
 623static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEM_P1 + 1] = {
 624/* 0 */
 625	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,	/* unknown opcodes */
 626	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 627	{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
 628	    {6,  0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 629	{0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
 630	    {12,  0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
 631	     0, 0} },					/* REPORT LUNS */
 632	{0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
 633	    {6,  0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 634	{0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
 635	    {6,  0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 636/* 5 */
 637	{ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN,	/* MODE SENSE(10) */
 638	    resp_mode_sense, msense_iarr, {10,  0xf8, 0xff, 0xff, 0, 0, 0,
 639		0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 640	{ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT,	/* MODE SELECT(10) */
 641	    resp_mode_select, mselect_iarr, {10,  0xf1, 0, 0, 0, 0, 0, 0xff,
 642		0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 643	{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,	/* LOG SENSE */
 644	    {10,  0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
 645	     0, 0, 0} },
 646	{0, 0x25, 0, F_D_IN, resp_readcap, NULL,    /* READ CAPACITY(10) */
 647	    {10,  0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
 648	     0, 0} },
 649	{ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
 650	    resp_read_dt0, read_iarr, {16,  0xfe, 0xff, 0xff, 0xff, 0xff,
 651	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 652/* 10 */
 653	{ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
 654	    resp_write_dt0, write_iarr,			/* WRITE(16) */
 655		{16,  0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 656		 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
 657	{0, 0x1b, 0, F_SSU_DELAY, resp_start_stop, NULL,/* START STOP UNIT */
 658	    {6,  0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 659	{ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
 660	    resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
 661		{16,  0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 662		 0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
 663	{0, 0x9f, 0x12, F_SA_LOW | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
 664	    NULL, {16,  0x12, 0xf9, 0x0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff,
 665	    0xff, 0xff, 0xff, 0xff, 0xc7} },  /* SA_OUT(16), WRITE SCAT(16) */
 666	{ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
 667	    resp_report_tgtpgs,	/* MAINT IN, REPORT TARGET PORT GROUPS */
 668		maint_in_iarr, {12,  0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
 669				0xff, 0, 0xc7, 0, 0, 0, 0} },
 670/* 15 */
 671	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
 672	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 673	{ARRAY_SIZE(verify_iarr), 0x8f, 0,
 674	    F_D_OUT_MAYBE | FF_MEDIA_IO, resp_verify,	/* VERIFY(16) */
 675	    verify_iarr, {16,  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 676			  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} },
 677	{ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
 678	    resp_read_dt0, vl_iarr,	/* VARIABLE LENGTH, READ(32) */
 679	    {32,  0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
 680	     0xff, 0xff} },
 681	{ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
 682	    NULL, reserve_iarr,	/* RESERVE(10) <no response function> */
 683	    {10,  0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 684	     0} },
 685	{ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
 686	    NULL, release_iarr, /* RELEASE(10) <no response function> */
 687	    {10,  0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
 688	     0} },
 689/* 20 */
 690	{0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
 691	    {6,  0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 692	{0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
 693	    {6,  0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 694	{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
 695	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 696	{0, 0x1d, F_D_OUT, 0, NULL, NULL,	/* SEND DIAGNOSTIC */
 697	    {6,  0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 698	{0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
 699	    {10,  0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
 700/* 25 */
 
 
 701	{0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
 702	    {10,  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
 703	     0, 0, 0, 0} },			/* WRITE_BUFFER */
 704	{ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
 705	    resp_write_same_10, write_same_iarr,	/* WRITE SAME(10) */
 706		{10,  0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
 707		 0, 0, 0, 0, 0} },
 708	{ARRAY_SIZE(sync_cache_iarr), 0x35, 0, F_SYNC_DELAY | F_M_ACCESS,
 709	    resp_sync_cache, sync_cache_iarr,
 710	    {10,  0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 711	     0, 0, 0, 0} },			/* SYNC_CACHE (10) */
 712	{0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
 713	    {16,  0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
 714	     0, 0xff, 0x3f, 0xc7} },		/* COMPARE AND WRITE */
 715	{ARRAY_SIZE(pre_fetch_iarr), 0x34, 0, F_SYNC_DELAY | FF_MEDIA_IO,
 716	    resp_pre_fetch, pre_fetch_iarr,
 717	    {10,  0x2, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
 718	     0, 0, 0, 0} },			/* PRE-FETCH (10) */
 719
 720/* 30 */
 721	{ARRAY_SIZE(zone_out_iarr), 0x94, 0x3, F_SA_LOW | F_M_ACCESS,
 722	    resp_open_zone, zone_out_iarr, /* ZONE_OUT(16), OPEN ZONE) */
 723		{16,  0x3 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 724		 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x1, 0xc7} },
 725	{ARRAY_SIZE(zone_in_iarr), 0x95, 0x0, F_SA_LOW | F_M_ACCESS,
 726	    resp_report_zones, zone_in_iarr, /* ZONE_IN(16), REPORT ZONES) */
 727		{16,  0x0 /* SA */, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 728		 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc7} },
 729/* sentinel */
 730	{0xff, 0, 0, 0, NULL, NULL,		/* terminating element */
 731	    {0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
 732};
 733
 734static int sdebug_num_hosts;
 735static int sdebug_add_host = DEF_NUM_HOST;  /* in sysfs this is relative */
 736static int sdebug_ato = DEF_ATO;
 737static int sdebug_cdb_len = DEF_CDB_LEN;
 738static int sdebug_jdelay = DEF_JDELAY;	/* if > 0 then unit is jiffies */
 739static int sdebug_dev_size_mb = DEF_DEV_SIZE_PRE_INIT;
 740static int sdebug_dif = DEF_DIF;
 741static int sdebug_dix = DEF_DIX;
 742static int sdebug_dsense = DEF_D_SENSE;
 743static int sdebug_every_nth = DEF_EVERY_NTH;
 744static int sdebug_fake_rw = DEF_FAKE_RW;
 745static unsigned int sdebug_guard = DEF_GUARD;
 746static int sdebug_host_max_queue;	/* per host */
 747static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
 748static int sdebug_max_luns = DEF_MAX_LUNS;
 749static int sdebug_max_queue = SDEBUG_CANQUEUE;	/* per submit queue */
 750static unsigned int sdebug_medium_error_start = OPT_MEDIUM_ERR_ADDR;
 751static int sdebug_medium_error_count = OPT_MEDIUM_ERR_NUM;
 752static atomic_t retired_max_queue;	/* if > 0 then was prior max_queue */
 753static int sdebug_ndelay = DEF_NDELAY;	/* if > 0 then unit is nanoseconds */
 754static int sdebug_no_lun_0 = DEF_NO_LUN_0;
 755static int sdebug_no_uld;
 756static int sdebug_num_parts = DEF_NUM_PARTS;
 757static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
 758static int sdebug_opt_blks = DEF_OPT_BLKS;
 759static int sdebug_opts = DEF_OPTS;
 760static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
 761static int sdebug_opt_xferlen_exp = DEF_OPT_XFERLEN_EXP;
 762static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
 763static int sdebug_scsi_level = DEF_SCSI_LEVEL;
 764static int sdebug_sector_size = DEF_SECTOR_SIZE;
 765static int sdeb_tur_ms_to_ready = DEF_TUR_MS_TO_READY;
 766static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
 767static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
 768static unsigned int sdebug_lbpu = DEF_LBPU;
 769static unsigned int sdebug_lbpws = DEF_LBPWS;
 770static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
 771static unsigned int sdebug_lbprz = DEF_LBPRZ;
 772static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
 773static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
 774static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
 775static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
 776static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
 777static int sdebug_uuid_ctl = DEF_UUID_CTL;
 778static bool sdebug_random = DEF_RANDOM;
 779static bool sdebug_per_host_store = DEF_PER_HOST_STORE;
 780static bool sdebug_removable = DEF_REMOVABLE;
 781static bool sdebug_clustering;
 782static bool sdebug_host_lock = DEF_HOST_LOCK;
 783static bool sdebug_strict = DEF_STRICT;
 784static bool sdebug_any_injecting_opt;
 785static bool sdebug_verbose;
 786static bool have_dif_prot;
 787static bool write_since_sync;
 788static bool sdebug_statistics = DEF_STATISTICS;
 789static bool sdebug_wp;
 790/* Following enum: 0: no zbc, def; 1: host aware; 2: host managed */
 791static enum blk_zoned_model sdeb_zbc_model = BLK_ZONED_NONE;
 792static char *sdeb_zbc_model_s;
 793
 794static unsigned int sdebug_store_sectors;
 795static sector_t sdebug_capacity;	/* in sectors */
 796
 797/* old BIOS stuff, kernel may get rid of them but some mode sense pages
 798   may still need them */
 799static int sdebug_heads;		/* heads per disk */
 800static int sdebug_cylinders_per;	/* cylinders per surface */
 801static int sdebug_sectors_per;		/* sectors per cylinder */
 802
 803static LIST_HEAD(sdebug_host_list);
 804static DEFINE_SPINLOCK(sdebug_host_list_lock);
 805
 806static struct xarray per_store_arr;
 807static struct xarray *per_store_ap = &per_store_arr;
 808static int sdeb_first_idx = -1;		/* invalid index ==> none created */
 809static int sdeb_most_recent_idx = -1;
 810static DEFINE_RWLOCK(sdeb_fake_rw_lck);	/* need a RW lock when fake_rw=1 */
 811
 812static unsigned long map_size;
 813static int num_aborts;
 814static int num_dev_resets;
 815static int num_target_resets;
 816static int num_bus_resets;
 817static int num_host_resets;
 818static int dix_writes;
 819static int dix_reads;
 820static int dif_errors;
 821
 822/* ZBC global data */
 823static bool sdeb_zbc_in_use;	/* true for host-aware and host-managed disks */
 824static int sdeb_zbc_zone_size_mb;
 825static int sdeb_zbc_max_open = DEF_ZBC_MAX_OPEN_ZONES;
 826static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
 827
 828static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
 829static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
 830
 831static DEFINE_RWLOCK(atomic_rw);
 832static DEFINE_RWLOCK(atomic_rw2);
 833
 834static rwlock_t *ramdisk_lck_a[2];
 835
 836static char sdebug_proc_name[] = MY_NAME;
 837static const char *my_name = MY_NAME;
 838
 839static struct bus_type pseudo_lld_bus;
 840
 841static struct device_driver sdebug_driverfs_driver = {
 842	.name 		= sdebug_proc_name,
 843	.bus		= &pseudo_lld_bus,
 844};
 845
 846static const int check_condition_result =
 847		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
 848
 849static const int illegal_condition_result =
 850	(DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
 851
 852static const int device_qfull_result =
 853	(DID_OK << 16) | (COMMAND_COMPLETE << 8) | SAM_STAT_TASK_SET_FULL;
 854
 855static const int condition_met_result = SAM_STAT_CONDITION_MET;
 856
 857
 858/* Only do the extra work involved in logical block provisioning if one or
 859 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
 860 * real reads and writes (i.e. not skipping them for speed).
 861 */
 862static inline bool scsi_debug_lbp(void)
 863{
 864	return 0 == sdebug_fake_rw &&
 865		(sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
 866}
 867
 868static void *lba2fake_store(struct sdeb_store_info *sip,
 869			    unsigned long long lba)
 870{
 871	struct sdeb_store_info *lsip = sip;
 872
 873	lba = do_div(lba, sdebug_store_sectors);
 874	if (!sip || !sip->storep) {
 875		WARN_ON_ONCE(true);
 876		lsip = xa_load(per_store_ap, 0);  /* should never be NULL */
 877	}
 878	return lsip->storep + lba * sdebug_sector_size;
 879}
 880
 881static struct t10_pi_tuple *dif_store(struct sdeb_store_info *sip,
 882				      sector_t sector)
 883{
 884	sector = sector_div(sector, sdebug_store_sectors);
 885
 886	return sip->dif_storep + sector;
 887}
 888
 889static void sdebug_max_tgts_luns(void)
 890{
 891	struct sdebug_host_info *sdbg_host;
 892	struct Scsi_Host *hpnt;
 893
 894	spin_lock(&sdebug_host_list_lock);
 895	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
 896		hpnt = sdbg_host->shost;
 897		if ((hpnt->this_id >= 0) &&
 898		    (sdebug_num_tgts > hpnt->this_id))
 899			hpnt->max_id = sdebug_num_tgts + 1;
 900		else
 901			hpnt->max_id = sdebug_num_tgts;
 902		/* sdebug_max_luns; */
 903		hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
 904	}
 905	spin_unlock(&sdebug_host_list_lock);
 906}
 907
 908enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
 909
 910/* Set in_bit to -1 to indicate no bit position of invalid field */
 911static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
 912				 enum sdeb_cmd_data c_d,
 913				 int in_byte, int in_bit)
 914{
 915	unsigned char *sbuff;
 916	u8 sks[4];
 917	int sl, asc;
 918
 919	sbuff = scp->sense_buffer;
 920	if (!sbuff) {
 921		sdev_printk(KERN_ERR, scp->device,
 922			    "%s: sense_buffer is NULL\n", __func__);
 923		return;
 924	}
 925	asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
 926	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 927	scsi_build_sense_buffer(sdebug_dsense, sbuff, ILLEGAL_REQUEST, asc, 0);
 928	memset(sks, 0, sizeof(sks));
 929	sks[0] = 0x80;
 930	if (c_d)
 931		sks[0] |= 0x40;
 932	if (in_bit >= 0) {
 933		sks[0] |= 0x8;
 934		sks[0] |= 0x7 & in_bit;
 935	}
 936	put_unaligned_be16(in_byte, sks + 1);
 937	if (sdebug_dsense) {
 938		sl = sbuff[7] + 8;
 939		sbuff[7] = sl;
 940		sbuff[sl] = 0x2;
 941		sbuff[sl + 1] = 0x6;
 942		memcpy(sbuff + sl + 4, sks, 3);
 943	} else
 944		memcpy(sbuff + 15, sks, 3);
 945	if (sdebug_verbose)
 946		sdev_printk(KERN_INFO, scp->device, "%s:  [sense_key,asc,ascq"
 947			    "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
 948			    my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
 949}
 950
 951static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
 952{
 953	unsigned char *sbuff;
 954
 955	sbuff = scp->sense_buffer;
 956	if (!sbuff) {
 957		sdev_printk(KERN_ERR, scp->device,
 958			    "%s: sense_buffer is NULL\n", __func__);
 959		return;
 960	}
 961	memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
 962
 963	scsi_build_sense_buffer(sdebug_dsense, sbuff, key, asc, asq);
 964
 965	if (sdebug_verbose)
 966		sdev_printk(KERN_INFO, scp->device,
 967			    "%s:  [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
 968			    my_name, key, asc, asq);
 969}
 970
 971static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
 972{
 973	mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
 974}
 975
 976static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
 977			    void __user *arg)
 978{
 979	if (sdebug_verbose) {
 980		if (0x1261 == cmd)
 981			sdev_printk(KERN_INFO, dev,
 982				    "%s: BLKFLSBUF [0x1261]\n", __func__);
 983		else if (0x5331 == cmd)
 984			sdev_printk(KERN_INFO, dev,
 985				    "%s: CDROM_GET_CAPABILITY [0x5331]\n",
 986				    __func__);
 987		else
 988			sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
 989				    __func__, cmd);
 990	}
 991	return -EINVAL;
 992	/* return -ENOTTY; // correct return but upsets fdisk */
 993}
 994
 995static void config_cdb_len(struct scsi_device *sdev)
 996{
 997	switch (sdebug_cdb_len) {
 998	case 6:	/* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
 999		sdev->use_10_for_rw = false;
1000		sdev->use_16_for_rw = false;
1001		sdev->use_10_for_ms = false;
1002		break;
1003	case 10: /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
1004		sdev->use_10_for_rw = true;
1005		sdev->use_16_for_rw = false;
1006		sdev->use_10_for_ms = false;
1007		break;
1008	case 12: /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
1009		sdev->use_10_for_rw = true;
1010		sdev->use_16_for_rw = false;
1011		sdev->use_10_for_ms = true;
1012		break;
1013	case 16:
1014		sdev->use_10_for_rw = false;
1015		sdev->use_16_for_rw = true;
1016		sdev->use_10_for_ms = true;
1017		break;
1018	case 32: /* No knobs to suggest this so same as 16 for now */
1019		sdev->use_10_for_rw = false;
1020		sdev->use_16_for_rw = true;
1021		sdev->use_10_for_ms = true;
1022		break;
1023	default:
1024		pr_warn("unexpected cdb_len=%d, force to 10\n",
1025			sdebug_cdb_len);
1026		sdev->use_10_for_rw = true;
1027		sdev->use_16_for_rw = false;
1028		sdev->use_10_for_ms = false;
1029		sdebug_cdb_len = 10;
1030		break;
1031	}
1032}
1033
1034static void all_config_cdb_len(void)
1035{
1036	struct sdebug_host_info *sdbg_host;
1037	struct Scsi_Host *shost;
1038	struct scsi_device *sdev;
1039
1040	spin_lock(&sdebug_host_list_lock);
1041	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1042		shost = sdbg_host->shost;
1043		shost_for_each_device(sdev, shost) {
1044			config_cdb_len(sdev);
1045		}
1046	}
1047	spin_unlock(&sdebug_host_list_lock);
1048}
1049
1050static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
1051{
1052	struct sdebug_host_info *sdhp;
1053	struct sdebug_dev_info *dp;
1054
1055	spin_lock(&sdebug_host_list_lock);
1056	list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
1057		list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
1058			if ((devip->sdbg_host == dp->sdbg_host) &&
1059			    (devip->target == dp->target))
1060				clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
1061		}
1062	}
1063	spin_unlock(&sdebug_host_list_lock);
1064}
1065
1066static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1067{
1068	int k;
1069
1070	k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
1071	if (k != SDEBUG_NUM_UAS) {
1072		const char *cp = NULL;
1073
1074		switch (k) {
1075		case SDEBUG_UA_POR:
1076			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1077					POWER_ON_RESET_ASCQ);
1078			if (sdebug_verbose)
1079				cp = "power on reset";
1080			break;
1081		case SDEBUG_UA_BUS_RESET:
1082			mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
1083					BUS_RESET_ASCQ);
1084			if (sdebug_verbose)
1085				cp = "bus reset";
1086			break;
1087		case SDEBUG_UA_MODE_CHANGED:
1088			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1089					MODE_CHANGED_ASCQ);
1090			if (sdebug_verbose)
1091				cp = "mode parameters changed";
1092			break;
1093		case SDEBUG_UA_CAPACITY_CHANGED:
1094			mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
1095					CAPACITY_CHANGED_ASCQ);
1096			if (sdebug_verbose)
1097				cp = "capacity data changed";
1098			break;
1099		case SDEBUG_UA_MICROCODE_CHANGED:
1100			mk_sense_buffer(scp, UNIT_ATTENTION,
1101					TARGET_CHANGED_ASC,
1102					MICROCODE_CHANGED_ASCQ);
1103			if (sdebug_verbose)
1104				cp = "microcode has been changed";
1105			break;
1106		case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
1107			mk_sense_buffer(scp, UNIT_ATTENTION,
1108					TARGET_CHANGED_ASC,
1109					MICROCODE_CHANGED_WO_RESET_ASCQ);
1110			if (sdebug_verbose)
1111				cp = "microcode has been changed without reset";
1112			break;
1113		case SDEBUG_UA_LUNS_CHANGED:
1114			/*
1115			 * SPC-3 behavior is to report a UNIT ATTENTION with
1116			 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
1117			 * on the target, until a REPORT LUNS command is
1118			 * received.  SPC-4 behavior is to report it only once.
1119			 * NOTE:  sdebug_scsi_level does not use the same
1120			 * values as struct scsi_device->scsi_level.
1121			 */
1122			if (sdebug_scsi_level >= 6)	/* SPC-4 and above */
1123				clear_luns_changed_on_target(devip);
1124			mk_sense_buffer(scp, UNIT_ATTENTION,
1125					TARGET_CHANGED_ASC,
1126					LUNS_CHANGED_ASCQ);
1127			if (sdebug_verbose)
1128				cp = "reported luns data has changed";
1129			break;
1130		default:
1131			pr_warn("unexpected unit attention code=%d\n", k);
1132			if (sdebug_verbose)
1133				cp = "unknown";
1134			break;
1135		}
1136		clear_bit(k, devip->uas_bm);
1137		if (sdebug_verbose)
1138			sdev_printk(KERN_INFO, scp->device,
1139				   "%s reports: Unit attention: %s\n",
1140				   my_name, cp);
1141		return check_condition_result;
1142	}
1143	return 0;
1144}
1145
1146/* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
1147static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1148				int arr_len)
1149{
1150	int act_len;
1151	struct scsi_data_buffer *sdb = &scp->sdb;
1152
1153	if (!sdb->length)
1154		return 0;
1155	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1156		return DID_ERROR << 16;
1157
1158	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
1159				      arr, arr_len);
1160	scsi_set_resid(scp, scsi_bufflen(scp) - act_len);
1161
1162	return 0;
1163}
1164
1165/* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
1166 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
1167 * calls, not required to write in ascending offset order. Assumes resid
1168 * set to scsi_bufflen() prior to any calls.
1169 */
1170static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
1171				  int arr_len, unsigned int off_dst)
1172{
1173	unsigned int act_len, n;
1174	struct scsi_data_buffer *sdb = &scp->sdb;
1175	off_t skip = off_dst;
1176
1177	if (sdb->length <= off_dst)
1178		return 0;
1179	if (scp->sc_data_direction != DMA_FROM_DEVICE)
1180		return DID_ERROR << 16;
1181
1182	act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
1183				       arr, arr_len, skip);
1184	pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
1185		 __func__, off_dst, scsi_bufflen(scp), act_len,
1186		 scsi_get_resid(scp));
1187	n = scsi_bufflen(scp) - (off_dst + act_len);
1188	scsi_set_resid(scp, min_t(int, scsi_get_resid(scp), n));
1189	return 0;
1190}
1191
1192/* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
1193 * 'arr' or -1 if error.
1194 */
1195static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1196			       int arr_len)
1197{
1198	if (!scsi_bufflen(scp))
1199		return 0;
1200	if (scp->sc_data_direction != DMA_TO_DEVICE)
1201		return -1;
1202
1203	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1204}
1205
1206
1207static char sdebug_inq_vendor_id[9] = "Linux   ";
1208static char sdebug_inq_product_id[17] = "scsi_debug      ";
1209static char sdebug_inq_product_rev[5] = SDEBUG_VERSION;
1210/* Use some locally assigned NAAs for SAS addresses. */
1211static const u64 naa3_comp_a = 0x3222222000000000ULL;
1212static const u64 naa3_comp_b = 0x3333333000000000ULL;
1213static const u64 naa3_comp_c = 0x3111111000000000ULL;
1214
1215/* Device identification VPD page. Returns number of bytes placed in arr */
1216static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
1217			  int target_dev_id, int dev_id_num,
1218			  const char *dev_id_str, int dev_id_str_len,
1219			  const uuid_t *lu_name)
1220{
1221	int num, port_a;
1222	char b[32];
1223
1224	port_a = target_dev_id + 1;
1225	/* T10 vendor identifier field format (faked) */
1226	arr[0] = 0x2;	/* ASCII */
1227	arr[1] = 0x1;
1228	arr[2] = 0x0;
1229	memcpy(&arr[4], sdebug_inq_vendor_id, 8);
1230	memcpy(&arr[12], sdebug_inq_product_id, 16);
1231	memcpy(&arr[28], dev_id_str, dev_id_str_len);
1232	num = 8 + 16 + dev_id_str_len;
1233	arr[3] = num;
1234	num += 4;
1235	if (dev_id_num >= 0) {
1236		if (sdebug_uuid_ctl) {
1237			/* Locally assigned UUID */
1238			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1239			arr[num++] = 0xa;  /* PIV=0, lu, naa */
1240			arr[num++] = 0x0;
1241			arr[num++] = 0x12;
1242			arr[num++] = 0x10; /* uuid type=1, locally assigned */
1243			arr[num++] = 0x0;
1244			memcpy(arr + num, lu_name, 16);
1245			num += 16;
1246		} else {
1247			/* NAA-3, Logical unit identifier (binary) */
1248			arr[num++] = 0x1;  /* binary (not necessarily sas) */
1249			arr[num++] = 0x3;  /* PIV=0, lu, naa */
1250			arr[num++] = 0x0;
1251			arr[num++] = 0x8;
1252			put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
1253			num += 8;
1254		}
1255		/* Target relative port number */
1256		arr[num++] = 0x61;	/* proto=sas, binary */
1257		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
1258		arr[num++] = 0x0;	/* reserved */
1259		arr[num++] = 0x4;	/* length */
1260		arr[num++] = 0x0;	/* reserved */
1261		arr[num++] = 0x0;	/* reserved */
1262		arr[num++] = 0x0;
1263		arr[num++] = 0x1;	/* relative port A */
1264	}
1265	/* NAA-3, Target port identifier */
1266	arr[num++] = 0x61;	/* proto=sas, binary */
1267	arr[num++] = 0x93;	/* piv=1, target port, naa */
1268	arr[num++] = 0x0;
1269	arr[num++] = 0x8;
1270	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1271	num += 8;
1272	/* NAA-3, Target port group identifier */
1273	arr[num++] = 0x61;	/* proto=sas, binary */
1274	arr[num++] = 0x95;	/* piv=1, target port group id */
1275	arr[num++] = 0x0;
1276	arr[num++] = 0x4;
1277	arr[num++] = 0;
1278	arr[num++] = 0;
1279	put_unaligned_be16(port_group_id, arr + num);
1280	num += 2;
1281	/* NAA-3, Target device identifier */
1282	arr[num++] = 0x61;	/* proto=sas, binary */
1283	arr[num++] = 0xa3;	/* piv=1, target device, naa */
1284	arr[num++] = 0x0;
1285	arr[num++] = 0x8;
1286	put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
1287	num += 8;
1288	/* SCSI name string: Target device identifier */
1289	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
1290	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
1291	arr[num++] = 0x0;
1292	arr[num++] = 24;
1293	memcpy(arr + num, "naa.32222220", 12);
1294	num += 12;
1295	snprintf(b, sizeof(b), "%08X", target_dev_id);
1296	memcpy(arr + num, b, 8);
1297	num += 8;
1298	memset(arr + num, 0, 4);
1299	num += 4;
1300	return num;
1301}
1302
1303static unsigned char vpd84_data[] = {
1304/* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1305    0x22,0x22,0x22,0x0,0xbb,0x1,
1306    0x22,0x22,0x22,0x0,0xbb,0x2,
1307};
1308
1309/*  Software interface identification VPD page */
1310static int inquiry_vpd_84(unsigned char *arr)
1311{
1312	memcpy(arr, vpd84_data, sizeof(vpd84_data));
1313	return sizeof(vpd84_data);
1314}
1315
1316/* Management network addresses VPD page */
1317static int inquiry_vpd_85(unsigned char *arr)
1318{
1319	int num = 0;
1320	const char *na1 = "https://www.kernel.org/config";
1321	const char *na2 = "http://www.kernel.org/log";
1322	int plen, olen;
1323
1324	arr[num++] = 0x1;	/* lu, storage config */
1325	arr[num++] = 0x0;	/* reserved */
1326	arr[num++] = 0x0;
1327	olen = strlen(na1);
1328	plen = olen + 1;
1329	if (plen % 4)
1330		plen = ((plen / 4) + 1) * 4;
1331	arr[num++] = plen;	/* length, null termianted, padded */
1332	memcpy(arr + num, na1, olen);
1333	memset(arr + num + olen, 0, plen - olen);
1334	num += plen;
1335
1336	arr[num++] = 0x4;	/* lu, logging */
1337	arr[num++] = 0x0;	/* reserved */
1338	arr[num++] = 0x0;
1339	olen = strlen(na2);
1340	plen = olen + 1;
1341	if (plen % 4)
1342		plen = ((plen / 4) + 1) * 4;
1343	arr[num++] = plen;	/* length, null terminated, padded */
1344	memcpy(arr + num, na2, olen);
1345	memset(arr + num + olen, 0, plen - olen);
1346	num += plen;
1347
1348	return num;
1349}
1350
1351/* SCSI ports VPD page */
1352static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
1353{
1354	int num = 0;
1355	int port_a, port_b;
1356
1357	port_a = target_dev_id + 1;
1358	port_b = port_a + 1;
1359	arr[num++] = 0x0;	/* reserved */
1360	arr[num++] = 0x0;	/* reserved */
1361	arr[num++] = 0x0;
1362	arr[num++] = 0x1;	/* relative port 1 (primary) */
1363	memset(arr + num, 0, 6);
1364	num += 6;
1365	arr[num++] = 0x0;
1366	arr[num++] = 12;	/* length tp descriptor */
1367	/* naa-5 target port identifier (A) */
1368	arr[num++] = 0x61;	/* proto=sas, binary */
1369	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1370	arr[num++] = 0x0;	/* reserved */
1371	arr[num++] = 0x8;	/* length */
1372	put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1373	num += 8;
1374	arr[num++] = 0x0;	/* reserved */
1375	arr[num++] = 0x0;	/* reserved */
1376	arr[num++] = 0x0;
1377	arr[num++] = 0x2;	/* relative port 2 (secondary) */
1378	memset(arr + num, 0, 6);
1379	num += 6;
1380	arr[num++] = 0x0;
1381	arr[num++] = 12;	/* length tp descriptor */
1382	/* naa-5 target port identifier (B) */
1383	arr[num++] = 0x61;	/* proto=sas, binary */
1384	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
1385	arr[num++] = 0x0;	/* reserved */
1386	arr[num++] = 0x8;	/* length */
1387	put_unaligned_be64(naa3_comp_a + port_b, arr + num);
1388	num += 8;
1389
1390	return num;
1391}
1392
1393
1394static unsigned char vpd89_data[] = {
1395/* from 4th byte */ 0,0,0,0,
1396'l','i','n','u','x',' ',' ',' ',
1397'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1398'1','2','3','4',
13990x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
14000xec,0,0,0,
14010x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
14020,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
14030x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
14040x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
14050x53,0x41,
14060x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14070x20,0x20,
14080x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
14090x10,0x80,
14100,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
14110x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
14120x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
14130,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
14140x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
14150x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
14160,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
14170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14200x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
14210,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
14220xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
14230,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
14240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0xa5,0x51,
1436};
1437
1438/* ATA Information VPD page */
1439static int inquiry_vpd_89(unsigned char *arr)
1440{
1441	memcpy(arr, vpd89_data, sizeof(vpd89_data));
1442	return sizeof(vpd89_data);
1443}
1444
1445
1446static unsigned char vpdb0_data[] = {
1447	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1448	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1449	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1450	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1451};
1452
1453/* Block limits VPD page (SBC-3) */
1454static int inquiry_vpd_b0(unsigned char *arr)
1455{
1456	unsigned int gran;
1457
1458	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
1459
1460	/* Optimal transfer length granularity */
1461	if (sdebug_opt_xferlen_exp != 0 &&
1462	    sdebug_physblk_exp < sdebug_opt_xferlen_exp)
1463		gran = 1 << sdebug_opt_xferlen_exp;
1464	else
1465		gran = 1 << sdebug_physblk_exp;
1466	put_unaligned_be16(gran, arr + 2);
1467
1468	/* Maximum Transfer Length */
1469	if (sdebug_store_sectors > 0x400)
1470		put_unaligned_be32(sdebug_store_sectors, arr + 4);
1471
1472	/* Optimal Transfer Length */
1473	put_unaligned_be32(sdebug_opt_blks, &arr[8]);
1474
1475	if (sdebug_lbpu) {
1476		/* Maximum Unmap LBA Count */
1477		put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
1478
1479		/* Maximum Unmap Block Descriptor Count */
1480		put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
1481	}
1482
1483	/* Unmap Granularity Alignment */
1484	if (sdebug_unmap_alignment) {
1485		put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
1486		arr[28] |= 0x80; /* UGAVALID */
1487	}
1488
1489	/* Optimal Unmap Granularity */
1490	put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
1491
1492	/* Maximum WRITE SAME Length */
1493	put_unaligned_be64(sdebug_write_same_length, &arr[32]);
1494
1495	return 0x3c; /* Mandatory page length for Logical Block Provisioning */
1496
1497	return sizeof(vpdb0_data);
1498}
1499
1500/* Block device characteristics VPD page (SBC-3) */
1501static int inquiry_vpd_b1(struct sdebug_dev_info *devip, unsigned char *arr)
1502{
1503	memset(arr, 0, 0x3c);
1504	arr[0] = 0;
1505	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
1506	arr[2] = 0;
1507	arr[3] = 5;	/* less than 1.8" */
1508	if (devip->zmodel == BLK_ZONED_HA)
1509		arr[4] = 1 << 4;	/* zoned field = 01b */
1510
1511	return 0x3c;
1512}
1513
1514/* Logical block provisioning VPD page (SBC-4) */
1515static int inquiry_vpd_b2(unsigned char *arr)
1516{
1517	memset(arr, 0, 0x4);
1518	arr[0] = 0;			/* threshold exponent */
1519	if (sdebug_lbpu)
1520		arr[1] = 1 << 7;
1521	if (sdebug_lbpws)
1522		arr[1] |= 1 << 6;
1523	if (sdebug_lbpws10)
1524		arr[1] |= 1 << 5;
1525	if (sdebug_lbprz && scsi_debug_lbp())
1526		arr[1] |= (sdebug_lbprz & 0x7) << 2;  /* sbc4r07 and later */
1527	/* anc_sup=0; dp=0 (no provisioning group descriptor) */
1528	/* minimum_percentage=0; provisioning_type=0 (unknown) */
1529	/* threshold_percentage=0 */
1530	return 0x4;
1531}
1532
1533/* Zoned block device characteristics VPD page (ZBC mandatory) */
1534static int inquiry_vpd_b6(struct sdebug_dev_info *devip, unsigned char *arr)
1535{
1536	memset(arr, 0, 0x3c);
1537	arr[0] = 0x1; /* set URSWRZ (unrestricted read in seq. wr req zone) */
1538	/*
1539	 * Set Optimal number of open sequential write preferred zones and
1540	 * Optimal number of non-sequentially written sequential write
1541	 * preferred zones fields to 'not reported' (0xffffffff). Leave other
1542	 * fields set to zero, apart from Max. number of open swrz_s field.
1543	 */
1544	put_unaligned_be32(0xffffffff, &arr[4]);
1545	put_unaligned_be32(0xffffffff, &arr[8]);
1546	if (sdeb_zbc_model == BLK_ZONED_HM && devip->max_open)
1547		put_unaligned_be32(devip->max_open, &arr[12]);
1548	else
1549		put_unaligned_be32(0xffffffff, &arr[12]);
1550	return 0x3c;
1551}
1552
1553#define SDEBUG_LONG_INQ_SZ 96
1554#define SDEBUG_MAX_INQ_ARR_SZ 584
1555
1556static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1557{
1558	unsigned char pq_pdt;
1559	unsigned char *arr;
1560	unsigned char *cmd = scp->cmnd;
1561	int alloc_len, n, ret;
1562	bool have_wlun, is_disk, is_zbc, is_disk_zbc;
1563
1564	alloc_len = get_unaligned_be16(cmd + 3);
1565	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1566	if (! arr)
1567		return DID_REQUEUE << 16;
1568	is_disk = (sdebug_ptype == TYPE_DISK);
1569	is_zbc = (devip->zmodel != BLK_ZONED_NONE);
1570	is_disk_zbc = (is_disk || is_zbc);
1571	have_wlun = scsi_is_wlun(scp->device->lun);
1572	if (have_wlun)
1573		pq_pdt = TYPE_WLUN;	/* present, wlun */
1574	else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1575		pq_pdt = 0x7f;	/* not present, PQ=3, PDT=0x1f */
1576	else
1577		pq_pdt = (sdebug_ptype & 0x1f);
1578	arr[0] = pq_pdt;
1579	if (0x2 & cmd[1]) {  /* CMDDT bit set */
1580		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
1581		kfree(arr);
1582		return check_condition_result;
1583	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
1584		int lu_id_num, port_group_id, target_dev_id, len;
1585		char lu_id_str[6];
1586		int host_no = devip->sdbg_host->shost->host_no;
1587		
1588		port_group_id = (((host_no + 1) & 0x7f) << 8) +
1589		    (devip->channel & 0x7f);
1590		if (sdebug_vpd_use_hostno == 0)
1591			host_no = 0;
1592		lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
1593			    (devip->target * 1000) + devip->lun);
1594		target_dev_id = ((host_no + 1) * 2000) +
1595				 (devip->target * 1000) - 3;
1596		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1597		if (0 == cmd[2]) { /* supported vital product data pages */
1598			arr[1] = cmd[2];	/*sanity */
1599			n = 4;
1600			arr[n++] = 0x0;   /* this page */
1601			arr[n++] = 0x80;  /* unit serial number */
1602			arr[n++] = 0x83;  /* device identification */
1603			arr[n++] = 0x84;  /* software interface ident. */
1604			arr[n++] = 0x85;  /* management network addresses */
1605			arr[n++] = 0x86;  /* extended inquiry */
1606			arr[n++] = 0x87;  /* mode page policy */
1607			arr[n++] = 0x88;  /* SCSI ports */
1608			if (is_disk_zbc) {	  /* SBC or ZBC */
1609				arr[n++] = 0x89;  /* ATA information */
1610				arr[n++] = 0xb0;  /* Block limits */
1611				arr[n++] = 0xb1;  /* Block characteristics */
1612				if (is_disk)
1613					arr[n++] = 0xb2;  /* LB Provisioning */
1614				if (is_zbc)
1615					arr[n++] = 0xb6;  /* ZB dev. char. */
1616			}
1617			arr[3] = n - 4;	  /* number of supported VPD pages */
1618		} else if (0x80 == cmd[2]) { /* unit serial number */
1619			arr[1] = cmd[2];	/*sanity */
1620			arr[3] = len;
1621			memcpy(&arr[4], lu_id_str, len);
1622		} else if (0x83 == cmd[2]) { /* device identification */
1623			arr[1] = cmd[2];	/*sanity */
1624			arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1625						target_dev_id, lu_id_num,
1626						lu_id_str, len,
1627						&devip->lu_name);
1628		} else if (0x84 == cmd[2]) { /* Software interface ident. */
1629			arr[1] = cmd[2];	/*sanity */
1630			arr[3] = inquiry_vpd_84(&arr[4]);
1631		} else if (0x85 == cmd[2]) { /* Management network addresses */
1632			arr[1] = cmd[2];	/*sanity */
1633			arr[3] = inquiry_vpd_85(&arr[4]);
1634		} else if (0x86 == cmd[2]) { /* extended inquiry */
1635			arr[1] = cmd[2];	/*sanity */
1636			arr[3] = 0x3c;	/* number of following entries */
1637			if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
1638				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
1639			else if (have_dif_prot)
1640				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
1641			else
1642				arr[4] = 0x0;   /* no protection stuff */
1643			arr[5] = 0x7;   /* head of q, ordered + simple q's */
1644		} else if (0x87 == cmd[2]) { /* mode page policy */
1645			arr[1] = cmd[2];	/*sanity */
1646			arr[3] = 0x8;	/* number of following entries */
1647			arr[4] = 0x2;	/* disconnect-reconnect mp */
1648			arr[6] = 0x80;	/* mlus, shared */
1649			arr[8] = 0x18;	 /* protocol specific lu */
1650			arr[10] = 0x82;	 /* mlus, per initiator port */
1651		} else if (0x88 == cmd[2]) { /* SCSI Ports */
1652			arr[1] = cmd[2];	/*sanity */
1653			arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1654		} else if (is_disk_zbc && 0x89 == cmd[2]) { /* ATA info */
1655			arr[1] = cmd[2];        /*sanity */
1656			n = inquiry_vpd_89(&arr[4]);
1657			put_unaligned_be16(n, arr + 2);
1658		} else if (is_disk_zbc && 0xb0 == cmd[2]) { /* Block limits */
1659			arr[1] = cmd[2];        /*sanity */
1660			arr[3] = inquiry_vpd_b0(&arr[4]);
1661		} else if (is_disk_zbc && 0xb1 == cmd[2]) { /* Block char. */
1662			arr[1] = cmd[2];        /*sanity */
1663			arr[3] = inquiry_vpd_b1(devip, &arr[4]);
1664		} else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
1665			arr[1] = cmd[2];        /*sanity */
1666			arr[3] = inquiry_vpd_b2(&arr[4]);
1667		} else if (is_zbc && cmd[2] == 0xb6) { /* ZB dev. charact. */
1668			arr[1] = cmd[2];        /*sanity */
1669			arr[3] = inquiry_vpd_b6(devip, &arr[4]);
1670		} else {
1671			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
1672			kfree(arr);
1673			return check_condition_result;
1674		}
1675		len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
1676		ret = fill_from_dev_buffer(scp, arr,
1677			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1678		kfree(arr);
1679		return ret;
1680	}
1681	/* drops through here for a standard inquiry */
1682	arr[1] = sdebug_removable ? 0x80 : 0;	/* Removable disk */
1683	arr[2] = sdebug_scsi_level;
1684	arr[3] = 2;    /* response_data_format==2 */
1685	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1686	arr[5] = (int)have_dif_prot;	/* PROTECT bit */
1687	if (sdebug_vpd_use_hostno == 0)
1688		arr[5] |= 0x10; /* claim: implicit TPGS */
1689	arr[6] = 0x10; /* claim: MultiP */
1690	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1691	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1692	memcpy(&arr[8], sdebug_inq_vendor_id, 8);
1693	memcpy(&arr[16], sdebug_inq_product_id, 16);
1694	memcpy(&arr[32], sdebug_inq_product_rev, 4);
1695	/* Use Vendor Specific area to place driver date in ASCII hex */
1696	memcpy(&arr[36], sdebug_version_date, 8);
1697	/* version descriptors (2 bytes each) follow */
1698	put_unaligned_be16(0xc0, arr + 58);   /* SAM-6 no version claimed */
1699	put_unaligned_be16(0x5c0, arr + 60);  /* SPC-5 no version claimed */
1700	n = 62;
1701	if (is_disk) {		/* SBC-4 no version claimed */
1702		put_unaligned_be16(0x600, arr + n);
1703		n += 2;
1704	} else if (sdebug_ptype == TYPE_TAPE) {	/* SSC-4 rev 3 */
1705		put_unaligned_be16(0x525, arr + n);
1706		n += 2;
1707	} else if (is_zbc) {	/* ZBC BSR INCITS 536 revision 05 */
1708		put_unaligned_be16(0x624, arr + n);
1709		n += 2;
1710	}
1711	put_unaligned_be16(0x2100, arr + n);	/* SPL-4 no version claimed */
1712	ret = fill_from_dev_buffer(scp, arr,
1713			    min_t(int, alloc_len, SDEBUG_LONG_INQ_SZ));
1714	kfree(arr);
1715	return ret;
1716}
1717
1718/* See resp_iec_m_pg() for how this data is manipulated */
1719static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1720				   0, 0, 0x0, 0x0};
1721
1722static int resp_requests(struct scsi_cmnd *scp,
1723			 struct sdebug_dev_info *devip)
1724{
 
1725	unsigned char *cmd = scp->cmnd;
1726	unsigned char arr[SCSI_SENSE_BUFFERSIZE];	/* assume >= 18 bytes */
1727	bool dsense = !!(cmd[1] & 1);
1728	int alloc_len = cmd[4];
1729	int len = 18;
1730	int stopped_state = atomic_read(&devip->stopped);
1731
1732	memset(arr, 0, sizeof(arr));
1733	if (stopped_state > 0) {	/* some "pollable" data [spc6r02: 5.12.2] */
1734		if (dsense) {
1735			arr[0] = 0x72;
1736			arr[1] = NOT_READY;
1737			arr[2] = LOGICAL_UNIT_NOT_READY;
1738			arr[3] = (stopped_state == 2) ? 0x1 : 0x2;
1739			len = 8;
1740		} else {
1741			arr[0] = 0x70;
1742			arr[2] = NOT_READY;		/* NO_SENSE in sense_key */
1743			arr[7] = 0xa;			/* 18 byte sense buffer */
1744			arr[12] = LOGICAL_UNIT_NOT_READY;
1745			arr[13] = (stopped_state == 2) ? 0x1 : 0x2;
1746		}
1747	} else if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1748		/* Information exceptions control mode page: TEST=1, MRIE=6 */
1749		if (dsense) {
1750			arr[0] = 0x72;
1751			arr[1] = 0x0;		/* NO_SENSE in sense_key */
1752			arr[2] = THRESHOLD_EXCEEDED;
1753			arr[3] = 0xff;		/* Failure prediction(false) */
1754			len = 8;
1755		} else {
1756			arr[0] = 0x70;
1757			arr[2] = 0x0;		/* NO_SENSE in sense_key */
1758			arr[7] = 0xa;   	/* 18 byte sense buffer */
1759			arr[12] = THRESHOLD_EXCEEDED;
1760			arr[13] = 0xff;		/* Failure prediction(false) */
1761		}
1762	} else {	/* nothing to report */
1763		if (dsense) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1764			len = 8;
1765			memset(arr, 0, len);
1766			arr[0] = 0x72;
1767		} else {
1768			memset(arr, 0, len);
1769			arr[0] = 0x70;
 
1770			arr[7] = 0xa;
 
 
1771		}
 
1772	}
1773	return fill_from_dev_buffer(scp, arr, min_t(int, len, alloc_len));
 
1774}
1775
1776static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
1777{
1778	unsigned char *cmd = scp->cmnd;
1779	int power_cond, want_stop, stopped_state;
1780	bool changing;
1781
1782	power_cond = (cmd[4] & 0xf0) >> 4;
1783	if (power_cond) {
1784		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
1785		return check_condition_result;
1786	}
1787	want_stop = !(cmd[4] & 1);
1788	stopped_state = atomic_read(&devip->stopped);
1789	if (stopped_state == 2) {
1790		ktime_t now_ts = ktime_get_boottime();
1791
1792		if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
1793			u64 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
1794
1795			if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
1796				/* tur_ms_to_ready timer extinguished */
1797				atomic_set(&devip->stopped, 0);
1798				stopped_state = 0;
1799			}
1800		}
1801		if (stopped_state == 2) {
1802			if (want_stop) {
1803				stopped_state = 1;	/* dummy up success */
1804			} else {	/* Disallow tur_ms_to_ready delay to be overridden */
1805				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 0 /* START bit */);
1806				return check_condition_result;
1807			}
1808		}
1809	}
1810	changing = (stopped_state != want_stop);
1811	if (changing)
1812		atomic_xchg(&devip->stopped, want_stop);
1813	if (!changing || (cmd[1] & 0x1))  /* state unchanged or IMMED bit set in cdb */
1814		return SDEG_RES_IMMED_MASK;
1815	else
1816		return 0;
1817}
1818
1819static sector_t get_sdebug_capacity(void)
1820{
1821	static const unsigned int gibibyte = 1073741824;
1822
1823	if (sdebug_virtual_gb > 0)
1824		return (sector_t)sdebug_virtual_gb *
1825			(gibibyte / sdebug_sector_size);
1826	else
1827		return sdebug_store_sectors;
1828}
1829
1830#define SDEBUG_READCAP_ARR_SZ 8
1831static int resp_readcap(struct scsi_cmnd *scp,
1832			struct sdebug_dev_info *devip)
1833{
1834	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1835	unsigned int capac;
1836
1837	/* following just in case virtual_gb changed */
1838	sdebug_capacity = get_sdebug_capacity();
1839	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1840	if (sdebug_capacity < 0xffffffff) {
1841		capac = (unsigned int)sdebug_capacity - 1;
1842		put_unaligned_be32(capac, arr + 0);
1843	} else
1844		put_unaligned_be32(0xffffffff, arr + 0);
1845	put_unaligned_be16(sdebug_sector_size, arr + 6);
1846	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1847}
1848
1849#define SDEBUG_READCAP16_ARR_SZ 32
1850static int resp_readcap16(struct scsi_cmnd *scp,
1851			  struct sdebug_dev_info *devip)
1852{
1853	unsigned char *cmd = scp->cmnd;
1854	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1855	int alloc_len;
1856
1857	alloc_len = get_unaligned_be32(cmd + 10);
1858	/* following just in case virtual_gb changed */
1859	sdebug_capacity = get_sdebug_capacity();
1860	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1861	put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1862	put_unaligned_be32(sdebug_sector_size, arr + 8);
1863	arr[13] = sdebug_physblk_exp & 0xf;
1864	arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
1865
1866	if (scsi_debug_lbp()) {
1867		arr[14] |= 0x80; /* LBPME */
1868		/* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1869		 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1870		 * in the wider field maps to 0 in this field.
1871		 */
1872		if (sdebug_lbprz & 1)	/* precisely what the draft requires */
1873			arr[14] |= 0x40;
1874	}
1875
1876	arr[15] = sdebug_lowest_aligned & 0xff;
1877
1878	if (have_dif_prot) {
1879		arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
1880		arr[12] |= 1; /* PROT_EN */
1881	}
1882
1883	return fill_from_dev_buffer(scp, arr,
1884			    min_t(int, alloc_len, SDEBUG_READCAP16_ARR_SZ));
1885}
1886
1887#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1888
1889static int resp_report_tgtpgs(struct scsi_cmnd *scp,
1890			      struct sdebug_dev_info *devip)
1891{
1892	unsigned char *cmd = scp->cmnd;
1893	unsigned char *arr;
1894	int host_no = devip->sdbg_host->shost->host_no;
1895	int n, ret, alen, rlen;
1896	int port_group_a, port_group_b, port_a, port_b;
1897
1898	alen = get_unaligned_be32(cmd + 6);
1899	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1900	if (! arr)
1901		return DID_REQUEUE << 16;
1902	/*
1903	 * EVPD page 0x88 states we have two ports, one
1904	 * real and a fake port with no device connected.
1905	 * So we create two port groups with one port each
1906	 * and set the group with port B to unavailable.
1907	 */
1908	port_a = 0x1; /* relative port A */
1909	port_b = 0x2; /* relative port B */
1910	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1911			(devip->channel & 0x7f);
1912	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1913			(devip->channel & 0x7f) + 0x80;
1914
1915	/*
1916	 * The asymmetric access state is cycled according to the host_id.
1917	 */
1918	n = 4;
1919	if (sdebug_vpd_use_hostno == 0) {
1920		arr[n++] = host_no % 3; /* Asymm access state */
1921		arr[n++] = 0x0F; /* claim: all states are supported */
1922	} else {
1923		arr[n++] = 0x0; /* Active/Optimized path */
1924		arr[n++] = 0x01; /* only support active/optimized paths */
1925	}
1926	put_unaligned_be16(port_group_a, arr + n);
1927	n += 2;
1928	arr[n++] = 0;    /* Reserved */
1929	arr[n++] = 0;    /* Status code */
1930	arr[n++] = 0;    /* Vendor unique */
1931	arr[n++] = 0x1;  /* One port per group */
1932	arr[n++] = 0;    /* Reserved */
1933	arr[n++] = 0;    /* Reserved */
1934	put_unaligned_be16(port_a, arr + n);
1935	n += 2;
1936	arr[n++] = 3;    /* Port unavailable */
1937	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1938	put_unaligned_be16(port_group_b, arr + n);
1939	n += 2;
1940	arr[n++] = 0;    /* Reserved */
1941	arr[n++] = 0;    /* Status code */
1942	arr[n++] = 0;    /* Vendor unique */
1943	arr[n++] = 0x1;  /* One port per group */
1944	arr[n++] = 0;    /* Reserved */
1945	arr[n++] = 0;    /* Reserved */
1946	put_unaligned_be16(port_b, arr + n);
1947	n += 2;
1948
1949	rlen = n - 4;
1950	put_unaligned_be32(rlen, arr + 0);
1951
1952	/*
1953	 * Return the smallest value of either
1954	 * - The allocated length
1955	 * - The constructed command length
1956	 * - The maximum array size
1957	 */
1958	rlen = min_t(int, alen, n);
1959	ret = fill_from_dev_buffer(scp, arr,
1960			   min_t(int, rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1961	kfree(arr);
1962	return ret;
1963}
1964
1965static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1966			     struct sdebug_dev_info *devip)
1967{
1968	bool rctd;
1969	u8 reporting_opts, req_opcode, sdeb_i, supp;
1970	u16 req_sa, u;
1971	u32 alloc_len, a_len;
1972	int k, offset, len, errsts, count, bump, na;
1973	const struct opcode_info_t *oip;
1974	const struct opcode_info_t *r_oip;
1975	u8 *arr;
1976	u8 *cmd = scp->cmnd;
1977
1978	rctd = !!(cmd[2] & 0x80);
1979	reporting_opts = cmd[2] & 0x7;
1980	req_opcode = cmd[3];
1981	req_sa = get_unaligned_be16(cmd + 4);
1982	alloc_len = get_unaligned_be32(cmd + 6);
1983	if (alloc_len < 4 || alloc_len > 0xffff) {
1984		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1985		return check_condition_result;
1986	}
1987	if (alloc_len > 8192)
1988		a_len = 8192;
1989	else
1990		a_len = alloc_len;
1991	arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
1992	if (NULL == arr) {
1993		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
1994				INSUFF_RES_ASCQ);
1995		return check_condition_result;
1996	}
1997	switch (reporting_opts) {
1998	case 0:	/* all commands */
1999		/* count number of commands */
2000		for (count = 0, oip = opcode_info_arr;
2001		     oip->num_attached != 0xff; ++oip) {
2002			if (F_INV_OP & oip->flags)
2003				continue;
2004			count += (oip->num_attached + 1);
2005		}
2006		bump = rctd ? 20 : 8;
2007		put_unaligned_be32(count * bump, arr);
2008		for (offset = 4, oip = opcode_info_arr;
2009		     oip->num_attached != 0xff && offset < a_len; ++oip) {
2010			if (F_INV_OP & oip->flags)
2011				continue;
2012			na = oip->num_attached;
2013			arr[offset] = oip->opcode;
2014			put_unaligned_be16(oip->sa, arr + offset + 2);
2015			if (rctd)
2016				arr[offset + 5] |= 0x2;
2017			if (FF_SA & oip->flags)
2018				arr[offset + 5] |= 0x1;
2019			put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
2020			if (rctd)
2021				put_unaligned_be16(0xa, arr + offset + 8);
2022			r_oip = oip;
2023			for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
2024				if (F_INV_OP & oip->flags)
2025					continue;
2026				offset += bump;
2027				arr[offset] = oip->opcode;
2028				put_unaligned_be16(oip->sa, arr + offset + 2);
2029				if (rctd)
2030					arr[offset + 5] |= 0x2;
2031				if (FF_SA & oip->flags)
2032					arr[offset + 5] |= 0x1;
2033				put_unaligned_be16(oip->len_mask[0],
2034						   arr + offset + 6);
2035				if (rctd)
2036					put_unaligned_be16(0xa,
2037							   arr + offset + 8);
2038			}
2039			oip = r_oip;
2040			offset += bump;
2041		}
2042		break;
2043	case 1:	/* one command: opcode only */
2044	case 2:	/* one command: opcode plus service action */
2045	case 3:	/* one command: if sa==0 then opcode only else opcode+sa */
2046		sdeb_i = opcode_ind_arr[req_opcode];
2047		oip = &opcode_info_arr[sdeb_i];
2048		if (F_INV_OP & oip->flags) {
2049			supp = 1;
2050			offset = 4;
2051		} else {
2052			if (1 == reporting_opts) {
2053				if (FF_SA & oip->flags) {
2054					mk_sense_invalid_fld(scp, SDEB_IN_CDB,
2055							     2, 2);
2056					kfree(arr);
2057					return check_condition_result;
2058				}
2059				req_sa = 0;
2060			} else if (2 == reporting_opts &&
2061				   0 == (FF_SA & oip->flags)) {
2062				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
2063				kfree(arr);	/* point at requested sa */
2064				return check_condition_result;
2065			}
2066			if (0 == (FF_SA & oip->flags) &&
2067			    req_opcode == oip->opcode)
2068				supp = 3;
2069			else if (0 == (FF_SA & oip->flags)) {
2070				na = oip->num_attached;
2071				for (k = 0, oip = oip->arrp; k < na;
2072				     ++k, ++oip) {
2073					if (req_opcode == oip->opcode)
2074						break;
2075				}
2076				supp = (k >= na) ? 1 : 3;
2077			} else if (req_sa != oip->sa) {
2078				na = oip->num_attached;
2079				for (k = 0, oip = oip->arrp; k < na;
2080				     ++k, ++oip) {
2081					if (req_sa == oip->sa)
2082						break;
2083				}
2084				supp = (k >= na) ? 1 : 3;
2085			} else
2086				supp = 3;
2087			if (3 == supp) {
2088				u = oip->len_mask[0];
2089				put_unaligned_be16(u, arr + 2);
2090				arr[4] = oip->opcode;
2091				for (k = 1; k < u; ++k)
2092					arr[4 + k] = (k < 16) ?
2093						 oip->len_mask[k] : 0xff;
2094				offset = 4 + u;
2095			} else
2096				offset = 4;
2097		}
2098		arr[1] = (rctd ? 0x80 : 0) | supp;
2099		if (rctd) {
2100			put_unaligned_be16(0xa, arr + offset);
2101			offset += 12;
2102		}
2103		break;
2104	default:
2105		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
2106		kfree(arr);
2107		return check_condition_result;
2108	}
2109	offset = (offset < a_len) ? offset : a_len;
2110	len = (offset < alloc_len) ? offset : alloc_len;
2111	errsts = fill_from_dev_buffer(scp, arr, len);
2112	kfree(arr);
2113	return errsts;
2114}
2115
2116static int resp_rsup_tmfs(struct scsi_cmnd *scp,
2117			  struct sdebug_dev_info *devip)
2118{
2119	bool repd;
2120	u32 alloc_len, len;
2121	u8 arr[16];
2122	u8 *cmd = scp->cmnd;
2123
2124	memset(arr, 0, sizeof(arr));
2125	repd = !!(cmd[2] & 0x80);
2126	alloc_len = get_unaligned_be32(cmd + 6);
2127	if (alloc_len < 4) {
2128		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
2129		return check_condition_result;
2130	}
2131	arr[0] = 0xc8;		/* ATS | ATSS | LURS */
2132	arr[1] = 0x1;		/* ITNRS */
2133	if (repd) {
2134		arr[3] = 0xc;
2135		len = 16;
2136	} else
2137		len = 4;
2138
2139	len = (len < alloc_len) ? len : alloc_len;
2140	return fill_from_dev_buffer(scp, arr, len);
2141}
2142
2143/* <<Following mode page info copied from ST318451LW>> */
2144
2145static int resp_err_recov_pg(unsigned char *p, int pcontrol, int target)
2146{	/* Read-Write Error Recovery page for mode_sense */
2147	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
2148					5, 0, 0xff, 0xff};
2149
2150	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
2151	if (1 == pcontrol)
2152		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
2153	return sizeof(err_recov_pg);
2154}
2155
2156static int resp_disconnect_pg(unsigned char *p, int pcontrol, int target)
2157{ 	/* Disconnect-Reconnect page for mode_sense */
2158	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
2159					 0, 0, 0, 0, 0, 0, 0, 0};
2160
2161	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
2162	if (1 == pcontrol)
2163		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
2164	return sizeof(disconnect_pg);
2165}
2166
2167static int resp_format_pg(unsigned char *p, int pcontrol, int target)
2168{       /* Format device page for mode_sense */
2169	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
2170				     0, 0, 0, 0, 0, 0, 0, 0,
2171				     0, 0, 0, 0, 0x40, 0, 0, 0};
2172
2173	memcpy(p, format_pg, sizeof(format_pg));
2174	put_unaligned_be16(sdebug_sectors_per, p + 10);
2175	put_unaligned_be16(sdebug_sector_size, p + 12);
2176	if (sdebug_removable)
2177		p[20] |= 0x20; /* should agree with INQUIRY */
2178	if (1 == pcontrol)
2179		memset(p + 2, 0, sizeof(format_pg) - 2);
2180	return sizeof(format_pg);
2181}
2182
2183static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2184				     0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
2185				     0, 0, 0, 0};
2186
2187static int resp_caching_pg(unsigned char *p, int pcontrol, int target)
2188{ 	/* Caching page for mode_sense */
2189	unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
2190		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2191	unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
2192		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
2193
2194	if (SDEBUG_OPT_N_WCE & sdebug_opts)
2195		caching_pg[2] &= ~0x4;	/* set WCE=0 (default WCE=1) */
2196	memcpy(p, caching_pg, sizeof(caching_pg));
2197	if (1 == pcontrol)
2198		memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
2199	else if (2 == pcontrol)
2200		memcpy(p, d_caching_pg, sizeof(d_caching_pg));
2201	return sizeof(caching_pg);
2202}
2203
2204static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2205				    0, 0, 0x2, 0x4b};
2206
2207static int resp_ctrl_m_pg(unsigned char *p, int pcontrol, int target)
2208{ 	/* Control mode page for mode_sense */
2209	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
2210					0, 0, 0, 0};
2211	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2212				     0, 0, 0x2, 0x4b};
2213
2214	if (sdebug_dsense)
2215		ctrl_m_pg[2] |= 0x4;
2216	else
2217		ctrl_m_pg[2] &= ~0x4;
2218
2219	if (sdebug_ato)
2220		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
2221
2222	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
2223	if (1 == pcontrol)
2224		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
2225	else if (2 == pcontrol)
2226		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
2227	return sizeof(ctrl_m_pg);
2228}
2229
2230
2231static int resp_iec_m_pg(unsigned char *p, int pcontrol, int target)
2232{	/* Informational Exceptions control mode page for mode_sense */
2233	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
2234				       0, 0, 0x0, 0x0};
2235	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
2236				      0, 0, 0x0, 0x0};
2237
2238	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
2239	if (1 == pcontrol)
2240		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
2241	else if (2 == pcontrol)
2242		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
2243	return sizeof(iec_m_pg);
2244}
2245
2246static int resp_sas_sf_m_pg(unsigned char *p, int pcontrol, int target)
2247{	/* SAS SSP mode page - short format for mode_sense */
2248	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
2249		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
2250
2251	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
2252	if (1 == pcontrol)
2253		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
2254	return sizeof(sas_sf_m_pg);
2255}
2256
2257
2258static int resp_sas_pcd_m_spg(unsigned char *p, int pcontrol, int target,
2259			      int target_dev_id)
2260{	/* SAS phy control and discover mode page for mode_sense */
2261	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
2262		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
2263		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2264		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2265		    0x2, 0, 0, 0, 0, 0, 0, 0,
2266		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2267		    0, 0, 0, 0, 0, 0, 0, 0,
2268		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
2269		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2270		    0, 0, 0, 0, 0, 0, 0, 0,	/* insert SAS addr */
2271		    0x3, 0, 0, 0, 0, 0, 0, 0,
2272		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
2273		    0, 0, 0, 0, 0, 0, 0, 0,
2274		};
2275	int port_a, port_b;
2276
2277	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
2278	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
2279	put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
2280	put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
2281	port_a = target_dev_id + 1;
2282	port_b = port_a + 1;
2283	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
2284	put_unaligned_be32(port_a, p + 20);
2285	put_unaligned_be32(port_b, p + 48 + 20);
2286	if (1 == pcontrol)
2287		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
2288	return sizeof(sas_pcd_m_pg);
2289}
2290
2291static int resp_sas_sha_m_spg(unsigned char *p, int pcontrol)
2292{	/* SAS SSP shared protocol specific port mode subpage */
2293	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
2294		    0, 0, 0, 0, 0, 0, 0, 0,
2295		};
2296
2297	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
2298	if (1 == pcontrol)
2299		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
2300	return sizeof(sas_sha_m_pg);
2301}
2302
2303#define SDEBUG_MAX_MSENSE_SZ 256
2304
2305static int resp_mode_sense(struct scsi_cmnd *scp,
2306			   struct sdebug_dev_info *devip)
2307{
2308	int pcontrol, pcode, subpcode, bd_len;
2309	unsigned char dev_spec;
2310	int alloc_len, offset, len, target_dev_id;
2311	int target = scp->device->id;
2312	unsigned char *ap;
2313	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
2314	unsigned char *cmd = scp->cmnd;
2315	bool dbd, llbaa, msense_6, is_disk, is_zbc, bad_pcode;
2316
2317	dbd = !!(cmd[1] & 0x8);		/* disable block descriptors */
2318	pcontrol = (cmd[2] & 0xc0) >> 6;
2319	pcode = cmd[2] & 0x3f;
2320	subpcode = cmd[3];
2321	msense_6 = (MODE_SENSE == cmd[0]);
2322	llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2323	is_disk = (sdebug_ptype == TYPE_DISK);
2324	is_zbc = (devip->zmodel != BLK_ZONED_NONE);
2325	if ((is_disk || is_zbc) && !dbd)
2326		bd_len = llbaa ? 16 : 8;
2327	else
2328		bd_len = 0;
2329	alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2330	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2331	if (0x3 == pcontrol) {  /* Saving values not supported */
2332		mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
2333		return check_condition_result;
2334	}
2335	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2336			(devip->target * 1000) - 3;
2337	/* for disks+zbc set DPOFUA bit and clear write protect (WP) bit */
2338	if (is_disk || is_zbc) {
2339		dev_spec = 0x10;	/* =0x90 if WP=1 implies read-only */
2340		if (sdebug_wp)
2341			dev_spec |= 0x80;
2342	} else
2343		dev_spec = 0x0;
2344	if (msense_6) {
2345		arr[2] = dev_spec;
2346		arr[3] = bd_len;
2347		offset = 4;
2348	} else {
2349		arr[3] = dev_spec;
2350		if (16 == bd_len)
2351			arr[4] = 0x1;	/* set LONGLBA bit */
2352		arr[7] = bd_len;	/* assume 255 or less */
2353		offset = 8;
2354	}
2355	ap = arr + offset;
2356	if ((bd_len > 0) && (!sdebug_capacity))
2357		sdebug_capacity = get_sdebug_capacity();
2358
2359	if (8 == bd_len) {
2360		if (sdebug_capacity > 0xfffffffe)
2361			put_unaligned_be32(0xffffffff, ap + 0);
2362		else
2363			put_unaligned_be32(sdebug_capacity, ap + 0);
2364		put_unaligned_be16(sdebug_sector_size, ap + 6);
2365		offset += bd_len;
2366		ap = arr + offset;
2367	} else if (16 == bd_len) {
2368		put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2369		put_unaligned_be32(sdebug_sector_size, ap + 12);
2370		offset += bd_len;
2371		ap = arr + offset;
2372	}
2373
2374	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2375		/* TODO: Control Extension page */
2376		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2377		return check_condition_result;
2378	}
2379	bad_pcode = false;
2380
2381	switch (pcode) {
2382	case 0x1:	/* Read-Write error recovery page, direct access */
2383		len = resp_err_recov_pg(ap, pcontrol, target);
2384		offset += len;
2385		break;
2386	case 0x2:	/* Disconnect-Reconnect page, all devices */
2387		len = resp_disconnect_pg(ap, pcontrol, target);
2388		offset += len;
2389		break;
2390	case 0x3:       /* Format device page, direct access */
2391		if (is_disk) {
2392			len = resp_format_pg(ap, pcontrol, target);
2393			offset += len;
2394		} else
2395			bad_pcode = true;
2396		break;
2397	case 0x8:	/* Caching page, direct access */
2398		if (is_disk || is_zbc) {
2399			len = resp_caching_pg(ap, pcontrol, target);
2400			offset += len;
2401		} else
2402			bad_pcode = true;
2403		break;
2404	case 0xa:	/* Control Mode page, all devices */
2405		len = resp_ctrl_m_pg(ap, pcontrol, target);
2406		offset += len;
2407		break;
2408	case 0x19:	/* if spc==1 then sas phy, control+discover */
2409		if ((subpcode > 0x2) && (subpcode < 0xff)) {
2410			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2411			return check_condition_result;
2412		}
2413		len = 0;
2414		if ((0x0 == subpcode) || (0xff == subpcode))
2415			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2416		if ((0x1 == subpcode) || (0xff == subpcode))
2417			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2418						  target_dev_id);
2419		if ((0x2 == subpcode) || (0xff == subpcode))
2420			len += resp_sas_sha_m_spg(ap + len, pcontrol);
2421		offset += len;
2422		break;
2423	case 0x1c:	/* Informational Exceptions Mode page, all devices */
2424		len = resp_iec_m_pg(ap, pcontrol, target);
2425		offset += len;
2426		break;
2427	case 0x3f:	/* Read all Mode pages */
2428		if ((0 == subpcode) || (0xff == subpcode)) {
2429			len = resp_err_recov_pg(ap, pcontrol, target);
2430			len += resp_disconnect_pg(ap + len, pcontrol, target);
2431			if (is_disk) {
2432				len += resp_format_pg(ap + len, pcontrol,
2433						      target);
2434				len += resp_caching_pg(ap + len, pcontrol,
2435						       target);
2436			} else if (is_zbc) {
2437				len += resp_caching_pg(ap + len, pcontrol,
2438						       target);
2439			}
2440			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2441			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2442			if (0xff == subpcode) {
2443				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2444						  target, target_dev_id);
2445				len += resp_sas_sha_m_spg(ap + len, pcontrol);
2446			}
2447			len += resp_iec_m_pg(ap + len, pcontrol, target);
2448			offset += len;
2449		} else {
2450			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2451			return check_condition_result;
2452		}
2453		break;
2454	default:
2455		bad_pcode = true;
2456		break;
2457	}
2458	if (bad_pcode) {
2459		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2460		return check_condition_result;
2461	}
2462	if (msense_6)
2463		arr[0] = offset - 1;
2464	else
2465		put_unaligned_be16((offset - 2), arr + 0);
2466	return fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, offset));
2467}
2468
2469#define SDEBUG_MAX_MSELECT_SZ 512
2470
2471static int resp_mode_select(struct scsi_cmnd *scp,
2472			    struct sdebug_dev_info *devip)
2473{
2474	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
2475	int param_len, res, mpage;
2476	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
2477	unsigned char *cmd = scp->cmnd;
2478	int mselect6 = (MODE_SELECT == cmd[0]);
2479
2480	memset(arr, 0, sizeof(arr));
2481	pf = cmd[1] & 0x10;
2482	sp = cmd[1] & 0x1;
2483	param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2484	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
2485		mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
2486		return check_condition_result;
2487	}
2488	res = fetch_to_dev_buffer(scp, arr, param_len);
2489	if (-1 == res)
2490		return DID_ERROR << 16;
2491	else if (sdebug_verbose && (res < param_len))
2492		sdev_printk(KERN_INFO, scp->device,
2493			    "%s: cdb indicated=%d, IO sent=%d bytes\n",
2494			    __func__, param_len, res);
2495	md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2496	bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
2497	if (md_len > 2) {
2498		mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
2499		return check_condition_result;
2500	}
2501	off = bd_len + (mselect6 ? 4 : 8);
2502	mpage = arr[off] & 0x3f;
2503	ps = !!(arr[off] & 0x80);
2504	if (ps) {
2505		mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
2506		return check_condition_result;
2507	}
2508	spf = !!(arr[off] & 0x40);
2509	pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
2510		       (arr[off + 1] + 2);
2511	if ((pg_len + off) > param_len) {
2512		mk_sense_buffer(scp, ILLEGAL_REQUEST,
2513				PARAMETER_LIST_LENGTH_ERR, 0);
2514		return check_condition_result;
2515	}
2516	switch (mpage) {
2517	case 0x8:      /* Caching Mode page */
2518		if (caching_pg[1] == arr[off + 1]) {
2519			memcpy(caching_pg + 2, arr + off + 2,
2520			       sizeof(caching_pg) - 2);
2521			goto set_mode_changed_ua;
2522		}
2523		break;
2524	case 0xa:      /* Control Mode page */
2525		if (ctrl_m_pg[1] == arr[off + 1]) {
2526			memcpy(ctrl_m_pg + 2, arr + off + 2,
2527			       sizeof(ctrl_m_pg) - 2);
2528			if (ctrl_m_pg[4] & 0x8)
2529				sdebug_wp = true;
2530			else
2531				sdebug_wp = false;
2532			sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
2533			goto set_mode_changed_ua;
2534		}
2535		break;
2536	case 0x1c:      /* Informational Exceptions Mode page */
2537		if (iec_m_pg[1] == arr[off + 1]) {
2538			memcpy(iec_m_pg + 2, arr + off + 2,
2539			       sizeof(iec_m_pg) - 2);
2540			goto set_mode_changed_ua;
2541		}
2542		break;
2543	default:
2544		break;
2545	}
2546	mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
2547	return check_condition_result;
2548set_mode_changed_ua:
2549	set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2550	return 0;
2551}
2552
2553static int resp_temp_l_pg(unsigned char *arr)
2554{
2555	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2556				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
2557		};
2558
2559	memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2560	return sizeof(temp_l_pg);
2561}
2562
2563static int resp_ie_l_pg(unsigned char *arr)
2564{
2565	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2566		};
2567
2568	memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2569	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
2570		arr[4] = THRESHOLD_EXCEEDED;
2571		arr[5] = 0xff;
2572	}
2573	return sizeof(ie_l_pg);
2574}
2575
2576#define SDEBUG_MAX_LSENSE_SZ 512
2577
2578static int resp_log_sense(struct scsi_cmnd *scp,
2579			  struct sdebug_dev_info *devip)
2580{
2581	int ppc, sp, pcode, subpcode, alloc_len, len, n;
2582	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
2583	unsigned char *cmd = scp->cmnd;
2584
2585	memset(arr, 0, sizeof(arr));
2586	ppc = cmd[1] & 0x2;
2587	sp = cmd[1] & 0x1;
2588	if (ppc || sp) {
2589		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
2590		return check_condition_result;
2591	}
 
2592	pcode = cmd[2] & 0x3f;
2593	subpcode = cmd[3] & 0xff;
2594	alloc_len = get_unaligned_be16(cmd + 7);
2595	arr[0] = pcode;
2596	if (0 == subpcode) {
2597		switch (pcode) {
2598		case 0x0:	/* Supported log pages log page */
2599			n = 4;
2600			arr[n++] = 0x0;		/* this page */
2601			arr[n++] = 0xd;		/* Temperature */
2602			arr[n++] = 0x2f;	/* Informational exceptions */
2603			arr[3] = n - 4;
2604			break;
2605		case 0xd:	/* Temperature log page */
2606			arr[3] = resp_temp_l_pg(arr + 4);
2607			break;
2608		case 0x2f:	/* Informational exceptions log page */
2609			arr[3] = resp_ie_l_pg(arr + 4);
2610			break;
2611		default:
2612			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2613			return check_condition_result;
2614		}
2615	} else if (0xff == subpcode) {
2616		arr[0] |= 0x40;
2617		arr[1] = subpcode;
2618		switch (pcode) {
2619		case 0x0:	/* Supported log pages and subpages log page */
2620			n = 4;
2621			arr[n++] = 0x0;
2622			arr[n++] = 0x0;		/* 0,0 page */
2623			arr[n++] = 0x0;
2624			arr[n++] = 0xff;	/* this page */
2625			arr[n++] = 0xd;
2626			arr[n++] = 0x0;		/* Temperature */
2627			arr[n++] = 0x2f;
2628			arr[n++] = 0x0;	/* Informational exceptions */
2629			arr[3] = n - 4;
2630			break;
2631		case 0xd:	/* Temperature subpages */
2632			n = 4;
2633			arr[n++] = 0xd;
2634			arr[n++] = 0x0;		/* Temperature */
2635			arr[3] = n - 4;
2636			break;
2637		case 0x2f:	/* Informational exceptions subpages */
2638			n = 4;
2639			arr[n++] = 0x2f;
2640			arr[n++] = 0x0;		/* Informational exceptions */
2641			arr[3] = n - 4;
2642			break;
2643		default:
2644			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2645			return check_condition_result;
2646		}
2647	} else {
2648		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2649		return check_condition_result;
2650	}
2651	len = min_t(int, get_unaligned_be16(arr + 2) + 4, alloc_len);
2652	return fill_from_dev_buffer(scp, arr,
2653		    min_t(int, len, SDEBUG_MAX_INQ_ARR_SZ));
2654}
2655
2656static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip)
2657{
2658	return devip->nr_zones != 0;
2659}
2660
2661static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip,
2662					unsigned long long lba)
2663{
2664	return &devip->zstate[lba >> devip->zsize_shift];
2665}
2666
2667static inline bool zbc_zone_is_conv(struct sdeb_zone_state *zsp)
2668{
2669	return zsp->z_type == ZBC_ZONE_TYPE_CNV;
2670}
2671
2672static void zbc_close_zone(struct sdebug_dev_info *devip,
2673			   struct sdeb_zone_state *zsp)
2674{
2675	enum sdebug_z_cond zc;
2676
2677	if (zbc_zone_is_conv(zsp))
2678		return;
2679
2680	zc = zsp->z_cond;
2681	if (!(zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN))
2682		return;
2683
2684	if (zc == ZC2_IMPLICIT_OPEN)
2685		devip->nr_imp_open--;
2686	else
2687		devip->nr_exp_open--;
2688
2689	if (zsp->z_wp == zsp->z_start) {
2690		zsp->z_cond = ZC1_EMPTY;
2691	} else {
2692		zsp->z_cond = ZC4_CLOSED;
2693		devip->nr_closed++;
2694	}
2695}
2696
2697static void zbc_close_imp_open_zone(struct sdebug_dev_info *devip)
2698{
2699	struct sdeb_zone_state *zsp = &devip->zstate[0];
2700	unsigned int i;
2701
2702	for (i = 0; i < devip->nr_zones; i++, zsp++) {
2703		if (zsp->z_cond == ZC2_IMPLICIT_OPEN) {
2704			zbc_close_zone(devip, zsp);
2705			return;
2706		}
2707	}
2708}
2709
2710static void zbc_open_zone(struct sdebug_dev_info *devip,
2711			  struct sdeb_zone_state *zsp, bool explicit)
2712{
2713	enum sdebug_z_cond zc;
2714
2715	if (zbc_zone_is_conv(zsp))
2716		return;
2717
2718	zc = zsp->z_cond;
2719	if ((explicit && zc == ZC3_EXPLICIT_OPEN) ||
2720	    (!explicit && zc == ZC2_IMPLICIT_OPEN))
2721		return;
2722
2723	/* Close an implicit open zone if necessary */
2724	if (explicit && zsp->z_cond == ZC2_IMPLICIT_OPEN)
2725		zbc_close_zone(devip, zsp);
2726	else if (devip->max_open &&
2727		 devip->nr_imp_open + devip->nr_exp_open >= devip->max_open)
2728		zbc_close_imp_open_zone(devip);
2729
2730	if (zsp->z_cond == ZC4_CLOSED)
2731		devip->nr_closed--;
2732	if (explicit) {
2733		zsp->z_cond = ZC3_EXPLICIT_OPEN;
2734		devip->nr_exp_open++;
2735	} else {
2736		zsp->z_cond = ZC2_IMPLICIT_OPEN;
2737		devip->nr_imp_open++;
2738	}
2739}
2740
2741static void zbc_inc_wp(struct sdebug_dev_info *devip,
2742		       unsigned long long lba, unsigned int num)
2743{
2744	struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2745	unsigned long long n, end, zend = zsp->z_start + zsp->z_size;
2746
2747	if (zbc_zone_is_conv(zsp))
2748		return;
2749
2750	if (zsp->z_type == ZBC_ZONE_TYPE_SWR) {
2751		zsp->z_wp += num;
2752		if (zsp->z_wp >= zend)
2753			zsp->z_cond = ZC5_FULL;
2754		return;
2755	}
2756
2757	while (num) {
2758		if (lba != zsp->z_wp)
2759			zsp->z_non_seq_resource = true;
2760
2761		end = lba + num;
2762		if (end >= zend) {
2763			n = zend - lba;
2764			zsp->z_wp = zend;
2765		} else if (end > zsp->z_wp) {
2766			n = num;
2767			zsp->z_wp = end;
2768		} else {
2769			n = num;
2770		}
2771		if (zsp->z_wp >= zend)
2772			zsp->z_cond = ZC5_FULL;
2773
2774		num -= n;
2775		lba += n;
2776		if (num) {
2777			zsp++;
2778			zend = zsp->z_start + zsp->z_size;
2779		}
2780	}
2781}
2782
2783static int check_zbc_access_params(struct scsi_cmnd *scp,
2784			unsigned long long lba, unsigned int num, bool write)
2785{
2786	struct scsi_device *sdp = scp->device;
2787	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2788	struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
2789	struct sdeb_zone_state *zsp_end = zbc_zone(devip, lba + num - 1);
2790
2791	if (!write) {
2792		if (devip->zmodel == BLK_ZONED_HA)
2793			return 0;
2794		/* For host-managed, reads cannot cross zone types boundaries */
2795		if (zsp_end != zsp &&
2796		    zbc_zone_is_conv(zsp) &&
2797		    !zbc_zone_is_conv(zsp_end)) {
2798			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2799					LBA_OUT_OF_RANGE,
2800					READ_INVDATA_ASCQ);
2801			return check_condition_result;
2802		}
2803		return 0;
2804	}
2805
2806	/* No restrictions for writes within conventional zones */
2807	if (zbc_zone_is_conv(zsp)) {
2808		if (!zbc_zone_is_conv(zsp_end)) {
2809			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2810					LBA_OUT_OF_RANGE,
2811					WRITE_BOUNDARY_ASCQ);
2812			return check_condition_result;
2813		}
2814		return 0;
2815	}
2816
2817	if (zsp->z_type == ZBC_ZONE_TYPE_SWR) {
2818		/* Writes cannot cross sequential zone boundaries */
2819		if (zsp_end != zsp) {
2820			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2821					LBA_OUT_OF_RANGE,
2822					WRITE_BOUNDARY_ASCQ);
2823			return check_condition_result;
2824		}
2825		/* Cannot write full zones */
2826		if (zsp->z_cond == ZC5_FULL) {
2827			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2828					INVALID_FIELD_IN_CDB, 0);
2829			return check_condition_result;
2830		}
2831		/* Writes must be aligned to the zone WP */
2832		if (lba != zsp->z_wp) {
2833			mk_sense_buffer(scp, ILLEGAL_REQUEST,
2834					LBA_OUT_OF_RANGE,
2835					UNALIGNED_WRITE_ASCQ);
2836			return check_condition_result;
2837		}
2838	}
2839
2840	/* Handle implicit open of closed and empty zones */
2841	if (zsp->z_cond == ZC1_EMPTY || zsp->z_cond == ZC4_CLOSED) {
2842		if (devip->max_open &&
2843		    devip->nr_exp_open >= devip->max_open) {
2844			mk_sense_buffer(scp, DATA_PROTECT,
2845					INSUFF_RES_ASC,
2846					INSUFF_ZONE_ASCQ);
2847			return check_condition_result;
2848		}
2849		zbc_open_zone(devip, zsp, false);
2850	}
2851
2852	return 0;
2853}
2854
2855static inline int check_device_access_params
2856			(struct scsi_cmnd *scp, unsigned long long lba,
2857			 unsigned int num, bool write)
2858{
2859	struct scsi_device *sdp = scp->device;
2860	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
2861
2862	if (lba + num > sdebug_capacity) {
2863		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2864		return check_condition_result;
2865	}
2866	/* transfer length excessive (tie in to block limits VPD page) */
2867	if (num > sdebug_store_sectors) {
2868		/* needs work to find which cdb byte 'num' comes from */
2869		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2870		return check_condition_result;
2871	}
2872	if (write && unlikely(sdebug_wp)) {
2873		mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
2874		return check_condition_result;
2875	}
2876	if (sdebug_dev_is_zoned(devip))
2877		return check_zbc_access_params(scp, lba, num, write);
2878
2879	return 0;
2880}
2881
2882/*
2883 * Note: if BUG_ON() fires it usually indicates a problem with the parser
2884 * tables. Perhaps a missing F_FAKE_RW or FF_MEDIA_IO flag. Response functions
2885 * that access any of the "stores" in struct sdeb_store_info should call this
2886 * function with bug_if_fake_rw set to true.
2887 */
2888static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip,
2889						bool bug_if_fake_rw)
2890{
2891	if (sdebug_fake_rw) {
2892		BUG_ON(bug_if_fake_rw);	/* See note above */
2893		return NULL;
2894	}
2895	return xa_load(per_store_ap, devip->sdbg_host->si_idx);
2896}
2897
2898/* Returns number of bytes copied or -1 if error. */
2899static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
2900			    u32 sg_skip, u64 lba, u32 num, bool do_write)
2901{
2902	int ret;
2903	u64 block, rest = 0;
 
2904	enum dma_data_direction dir;
2905	struct scsi_data_buffer *sdb = &scp->sdb;
2906	u8 *fsp;
2907
2908	if (do_write) {
 
2909		dir = DMA_TO_DEVICE;
2910		write_since_sync = true;
2911	} else {
 
2912		dir = DMA_FROM_DEVICE;
2913	}
2914
2915	if (!sdb->length || !sip)
2916		return 0;
2917	if (scp->sc_data_direction != dir)
2918		return -1;
2919	fsp = sip->storep;
2920
2921	block = do_div(lba, sdebug_store_sectors);
2922	if (block + num > sdebug_store_sectors)
2923		rest = block + num - sdebug_store_sectors;
2924
2925	ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2926		   fsp + (block * sdebug_sector_size),
2927		   (num - rest) * sdebug_sector_size, sg_skip, do_write);
2928	if (ret != (num - rest) * sdebug_sector_size)
2929		return ret;
2930
2931	if (rest) {
2932		ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2933			    fsp, rest * sdebug_sector_size,
2934			    sg_skip + ((num - rest) * sdebug_sector_size),
2935			    do_write);
2936	}
2937
2938	return ret;
2939}
2940
2941/* Returns number of bytes copied or -1 if error. */
2942static int do_dout_fetch(struct scsi_cmnd *scp, u32 num, u8 *doutp)
2943{
2944	struct scsi_data_buffer *sdb = &scp->sdb;
2945
2946	if (!sdb->length)
2947		return 0;
2948	if (scp->sc_data_direction != DMA_TO_DEVICE)
2949		return -1;
2950	return sg_copy_buffer(sdb->table.sgl, sdb->table.nents, doutp,
2951			      num * sdebug_sector_size, 0, true);
2952}
2953
2954/* If sip->storep+lba compares equal to arr(num), then copy top half of
2955 * arr into sip->storep+lba and return true. If comparison fails then
2956 * return false. */
2957static bool comp_write_worker(struct sdeb_store_info *sip, u64 lba, u32 num,
2958			      const u8 *arr, bool compare_only)
2959{
2960	bool res;
2961	u64 block, rest = 0;
2962	u32 store_blks = sdebug_store_sectors;
2963	u32 lb_size = sdebug_sector_size;
2964	u8 *fsp = sip->storep;
2965
2966	block = do_div(lba, store_blks);
2967	if (block + num > store_blks)
2968		rest = block + num - store_blks;
2969
2970	res = !memcmp(fsp + (block * lb_size), arr, (num - rest) * lb_size);
 
2971	if (!res)
2972		return res;
2973	if (rest)
2974		res = memcmp(fsp, arr + ((num - rest) * lb_size),
2975			     rest * lb_size);
2976	if (!res)
2977		return res;
2978	if (compare_only)
2979		return true;
2980	arr += num * lb_size;
2981	memcpy(fsp + (block * lb_size), arr, (num - rest) * lb_size);
2982	if (rest)
2983		memcpy(fsp, arr + ((num - rest) * lb_size), rest * lb_size);
 
2984	return res;
2985}
2986
2987static __be16 dif_compute_csum(const void *buf, int len)
2988{
2989	__be16 csum;
2990
2991	if (sdebug_guard)
2992		csum = (__force __be16)ip_compute_csum(buf, len);
2993	else
2994		csum = cpu_to_be16(crc_t10dif(buf, len));
2995
2996	return csum;
2997}
2998
2999static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
3000		      sector_t sector, u32 ei_lba)
3001{
3002	__be16 csum = dif_compute_csum(data, sdebug_sector_size);
3003
3004	if (sdt->guard_tag != csum) {
3005		pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
3006			(unsigned long)sector,
3007			be16_to_cpu(sdt->guard_tag),
3008			be16_to_cpu(csum));
3009		return 0x01;
3010	}
3011	if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
3012	    be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
3013		pr_err("REF check failed on sector %lu\n",
3014			(unsigned long)sector);
3015		return 0x03;
3016	}
3017	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3018	    be32_to_cpu(sdt->ref_tag) != ei_lba) {
3019		pr_err("REF check failed on sector %lu\n",
3020			(unsigned long)sector);
3021		return 0x03;
3022	}
3023	return 0;
3024}
3025
3026static void dif_copy_prot(struct scsi_cmnd *scp, sector_t sector,
3027			  unsigned int sectors, bool read)
3028{
3029	size_t resid;
3030	void *paddr;
3031	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3032						scp->device->hostdata, true);
3033	struct t10_pi_tuple *dif_storep = sip->dif_storep;
3034	const void *dif_store_end = dif_storep + sdebug_store_sectors;
3035	struct sg_mapping_iter miter;
3036
3037	/* Bytes of protection data to copy into sgl */
3038	resid = sectors * sizeof(*dif_storep);
3039
3040	sg_miter_start(&miter, scsi_prot_sglist(scp),
3041		       scsi_prot_sg_count(scp), SG_MITER_ATOMIC |
3042		       (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
3043
3044	while (sg_miter_next(&miter) && resid > 0) {
3045		size_t len = min_t(size_t, miter.length, resid);
3046		void *start = dif_store(sip, sector);
3047		size_t rest = 0;
3048
3049		if (dif_store_end < start + len)
3050			rest = start + len - dif_store_end;
3051
3052		paddr = miter.addr;
3053
3054		if (read)
3055			memcpy(paddr, start, len - rest);
3056		else
3057			memcpy(start, paddr, len - rest);
3058
3059		if (rest) {
3060			if (read)
3061				memcpy(paddr + len - rest, dif_storep, rest);
3062			else
3063				memcpy(dif_storep, paddr + len - rest, rest);
3064		}
3065
3066		sector += len / sizeof(*dif_storep);
3067		resid -= len;
3068	}
3069	sg_miter_stop(&miter);
3070}
3071
3072static int prot_verify_read(struct scsi_cmnd *scp, sector_t start_sec,
3073			    unsigned int sectors, u32 ei_lba)
3074{
3075	unsigned int i;
 
3076	sector_t sector;
3077	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3078						scp->device->hostdata, true);
3079	struct t10_pi_tuple *sdt;
3080
3081	for (i = 0; i < sectors; i++, ei_lba++) {
3082		int ret;
3083
3084		sector = start_sec + i;
3085		sdt = dif_store(sip, sector);
3086
3087		if (sdt->app_tag == cpu_to_be16(0xffff))
3088			continue;
3089
3090		ret = dif_verify(sdt, lba2fake_store(sip, sector), sector,
3091				 ei_lba);
3092		if (ret) {
3093			dif_errors++;
3094			return ret;
3095		}
3096	}
3097
3098	dif_copy_prot(scp, start_sec, sectors, true);
3099	dix_reads++;
3100
3101	return 0;
3102}
3103
3104static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3105{
3106	bool check_prot;
 
 
3107	u32 num;
3108	u32 ei_lba;
 
3109	int ret;
3110	u64 lba;
3111	struct sdeb_store_info *sip = devip2sip(devip, true);
3112	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
3113	u8 *cmd = scp->cmnd;
3114
3115	switch (cmd[0]) {
3116	case READ_16:
3117		ei_lba = 0;
3118		lba = get_unaligned_be64(cmd + 2);
3119		num = get_unaligned_be32(cmd + 10);
3120		check_prot = true;
3121		break;
3122	case READ_10:
3123		ei_lba = 0;
3124		lba = get_unaligned_be32(cmd + 2);
3125		num = get_unaligned_be16(cmd + 7);
3126		check_prot = true;
3127		break;
3128	case READ_6:
3129		ei_lba = 0;
3130		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3131		      (u32)(cmd[1] & 0x1f) << 16;
3132		num = (0 == cmd[4]) ? 256 : cmd[4];
3133		check_prot = true;
3134		break;
3135	case READ_12:
3136		ei_lba = 0;
3137		lba = get_unaligned_be32(cmd + 2);
3138		num = get_unaligned_be32(cmd + 6);
3139		check_prot = true;
3140		break;
3141	case XDWRITEREAD_10:
3142		ei_lba = 0;
3143		lba = get_unaligned_be32(cmd + 2);
3144		num = get_unaligned_be16(cmd + 7);
3145		check_prot = false;
3146		break;
3147	default:	/* assume READ(32) */
3148		lba = get_unaligned_be64(cmd + 12);
3149		ei_lba = get_unaligned_be32(cmd + 20);
3150		num = get_unaligned_be32(cmd + 28);
3151		check_prot = false;
3152		break;
3153	}
3154	if (unlikely(have_dif_prot && check_prot)) {
3155		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3156		    (cmd[1] & 0xe0)) {
3157			mk_sense_invalid_opcode(scp);
3158			return check_condition_result;
3159		}
3160		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3161		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3162		    (cmd[1] & 0xe0) == 0)
3163			sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
3164				    "to DIF device\n");
3165	}
3166	if (unlikely((sdebug_opts & SDEBUG_OPT_SHORT_TRANSFER) &&
3167		     atomic_read(&sdeb_inject_pending))) {
3168		num /= 2;
3169		atomic_set(&sdeb_inject_pending, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3170	}
3171
3172	ret = check_device_access_params(scp, lba, num, false);
3173	if (ret)
3174		return ret;
3175	if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
3176		     (lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
3177		     ((lba + num) > sdebug_medium_error_start))) {
3178		/* claim unrecoverable read error */
3179		mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
3180		/* set info field and valid bit for fixed descriptor */
3181		if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
3182			scp->sense_buffer[0] |= 0x80;	/* Valid bit */
3183			ret = (lba < OPT_MEDIUM_ERR_ADDR)
3184			      ? OPT_MEDIUM_ERR_ADDR : (int)lba;
3185			put_unaligned_be32(ret, scp->sense_buffer + 3);
3186		}
3187		scsi_set_resid(scp, scsi_bufflen(scp));
3188		return check_condition_result;
3189	}
3190
3191	read_lock(macc_lckp);
3192
3193	/* DIX + T10 DIF */
3194	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3195		int prot_ret = prot_verify_read(scp, lba, num, ei_lba);
3196
3197		if (prot_ret) {
3198			read_unlock(macc_lckp);
3199			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, prot_ret);
3200			return illegal_condition_result;
3201		}
3202	}
3203
3204	ret = do_device_access(sip, scp, 0, lba, num, false);
3205	read_unlock(macc_lckp);
3206	if (unlikely(ret == -1))
3207		return DID_ERROR << 16;
3208
3209	scsi_set_resid(scp, scsi_bufflen(scp) - ret);
3210
3211	if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3212		     atomic_read(&sdeb_inject_pending))) {
3213		if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3214			mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3215			atomic_set(&sdeb_inject_pending, 0);
 
 
 
3216			return check_condition_result;
3217		} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3218			/* Logical block guard check failed */
3219			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3220			atomic_set(&sdeb_inject_pending, 0);
3221			return illegal_condition_result;
3222		} else if (SDEBUG_OPT_DIX_ERR & sdebug_opts) {
3223			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3224			atomic_set(&sdeb_inject_pending, 0);
3225			return illegal_condition_result;
3226		}
3227	}
3228	return 0;
3229}
3230
3231static void dump_sector(unsigned char *buf, int len)
3232{
3233	int i, j, n;
3234
3235	pr_err(">>> Sector Dump <<<\n");
3236	for (i = 0 ; i < len ; i += 16) {
3237		char b[128];
3238
3239		for (j = 0, n = 0; j < 16; j++) {
3240			unsigned char c = buf[i+j];
3241
3242			if (c >= 0x20 && c < 0x7e)
3243				n += scnprintf(b + n, sizeof(b) - n,
3244					       " %c ", buf[i+j]);
3245			else
3246				n += scnprintf(b + n, sizeof(b) - n,
3247					       "%02x ", buf[i+j]);
3248		}
3249		pr_err("%04d: %s\n", i, b);
3250	}
3251}
3252
3253static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
3254			     unsigned int sectors, u32 ei_lba)
3255{
3256	int ret;
3257	struct t10_pi_tuple *sdt;
3258	void *daddr;
3259	sector_t sector = start_sec;
3260	int ppage_offset;
3261	int dpage_offset;
3262	struct sg_mapping_iter diter;
3263	struct sg_mapping_iter piter;
3264
3265	BUG_ON(scsi_sg_count(SCpnt) == 0);
3266	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
3267
3268	sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
3269			scsi_prot_sg_count(SCpnt),
3270			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3271	sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
3272			SG_MITER_ATOMIC | SG_MITER_FROM_SG);
3273
3274	/* For each protection page */
3275	while (sg_miter_next(&piter)) {
3276		dpage_offset = 0;
3277		if (WARN_ON(!sg_miter_next(&diter))) {
3278			ret = 0x01;
3279			goto out;
3280		}
3281
3282		for (ppage_offset = 0; ppage_offset < piter.length;
3283		     ppage_offset += sizeof(struct t10_pi_tuple)) {
3284			/* If we're at the end of the current
3285			 * data page advance to the next one
3286			 */
3287			if (dpage_offset >= diter.length) {
3288				if (WARN_ON(!sg_miter_next(&diter))) {
3289					ret = 0x01;
3290					goto out;
3291				}
3292				dpage_offset = 0;
3293			}
3294
3295			sdt = piter.addr + ppage_offset;
3296			daddr = diter.addr + dpage_offset;
3297
3298			ret = dif_verify(sdt, daddr, sector, ei_lba);
3299			if (ret) {
3300				dump_sector(daddr, sdebug_sector_size);
3301				goto out;
3302			}
3303
3304			sector++;
3305			ei_lba++;
3306			dpage_offset += sdebug_sector_size;
3307		}
3308		diter.consumed = dpage_offset;
3309		sg_miter_stop(&diter);
3310	}
3311	sg_miter_stop(&piter);
3312
3313	dif_copy_prot(SCpnt, start_sec, sectors, false);
3314	dix_writes++;
3315
3316	return 0;
3317
3318out:
3319	dif_errors++;
3320	sg_miter_stop(&diter);
3321	sg_miter_stop(&piter);
3322	return ret;
3323}
3324
3325static unsigned long lba_to_map_index(sector_t lba)
3326{
3327	if (sdebug_unmap_alignment)
3328		lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
3329	sector_div(lba, sdebug_unmap_granularity);
3330	return lba;
3331}
3332
3333static sector_t map_index_to_lba(unsigned long index)
3334{
3335	sector_t lba = index * sdebug_unmap_granularity;
3336
3337	if (sdebug_unmap_alignment)
3338		lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
3339	return lba;
3340}
3341
3342static unsigned int map_state(struct sdeb_store_info *sip, sector_t lba,
3343			      unsigned int *num)
3344{
3345	sector_t end;
3346	unsigned int mapped;
3347	unsigned long index;
3348	unsigned long next;
3349
3350	index = lba_to_map_index(lba);
3351	mapped = test_bit(index, sip->map_storep);
3352
3353	if (mapped)
3354		next = find_next_zero_bit(sip->map_storep, map_size, index);
3355	else
3356		next = find_next_bit(sip->map_storep, map_size, index);
3357
3358	end = min_t(sector_t, sdebug_store_sectors,  map_index_to_lba(next));
3359	*num = end - lba;
3360	return mapped;
3361}
3362
3363static void map_region(struct sdeb_store_info *sip, sector_t lba,
3364		       unsigned int len)
3365{
3366	sector_t end = lba + len;
3367
3368	while (lba < end) {
3369		unsigned long index = lba_to_map_index(lba);
3370
3371		if (index < map_size)
3372			set_bit(index, sip->map_storep);
3373
3374		lba = map_index_to_lba(index + 1);
3375	}
3376}
3377
3378static void unmap_region(struct sdeb_store_info *sip, sector_t lba,
3379			 unsigned int len)
3380{
3381	sector_t end = lba + len;
3382	u8 *fsp = sip->storep;
3383
3384	while (lba < end) {
3385		unsigned long index = lba_to_map_index(lba);
3386
3387		if (lba == map_index_to_lba(index) &&
3388		    lba + sdebug_unmap_granularity <= end &&
3389		    index < map_size) {
3390			clear_bit(index, sip->map_storep);
3391			if (sdebug_lbprz) {  /* for LBPRZ=2 return 0xff_s */
3392				memset(fsp + lba * sdebug_sector_size,
 
3393				       (sdebug_lbprz & 1) ? 0 : 0xff,
3394				       sdebug_sector_size *
3395				       sdebug_unmap_granularity);
3396			}
3397			if (sip->dif_storep) {
3398				memset(sip->dif_storep + lba, 0xff,
3399				       sizeof(*sip->dif_storep) *
3400				       sdebug_unmap_granularity);
3401			}
3402		}
3403		lba = map_index_to_lba(index + 1);
3404	}
3405}
3406
3407static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3408{
3409	bool check_prot;
 
3410	u32 num;
3411	u32 ei_lba;
 
3412	int ret;
3413	u64 lba;
3414	struct sdeb_store_info *sip = devip2sip(devip, true);
3415	rwlock_t *macc_lckp = &sip->macc_lck;
3416	u8 *cmd = scp->cmnd;
3417
3418	switch (cmd[0]) {
3419	case WRITE_16:
3420		ei_lba = 0;
3421		lba = get_unaligned_be64(cmd + 2);
3422		num = get_unaligned_be32(cmd + 10);
3423		check_prot = true;
3424		break;
3425	case WRITE_10:
3426		ei_lba = 0;
3427		lba = get_unaligned_be32(cmd + 2);
3428		num = get_unaligned_be16(cmd + 7);
3429		check_prot = true;
3430		break;
3431	case WRITE_6:
3432		ei_lba = 0;
3433		lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
3434		      (u32)(cmd[1] & 0x1f) << 16;
3435		num = (0 == cmd[4]) ? 256 : cmd[4];
3436		check_prot = true;
3437		break;
3438	case WRITE_12:
3439		ei_lba = 0;
3440		lba = get_unaligned_be32(cmd + 2);
3441		num = get_unaligned_be32(cmd + 6);
3442		check_prot = true;
3443		break;
3444	case 0x53:	/* XDWRITEREAD(10) */
3445		ei_lba = 0;
3446		lba = get_unaligned_be32(cmd + 2);
3447		num = get_unaligned_be16(cmd + 7);
3448		check_prot = false;
3449		break;
3450	default:	/* assume WRITE(32) */
3451		lba = get_unaligned_be64(cmd + 12);
3452		ei_lba = get_unaligned_be32(cmd + 20);
3453		num = get_unaligned_be32(cmd + 28);
3454		check_prot = false;
3455		break;
3456	}
3457	if (unlikely(have_dif_prot && check_prot)) {
3458		if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3459		    (cmd[1] & 0xe0)) {
3460			mk_sense_invalid_opcode(scp);
3461			return check_condition_result;
3462		}
3463		if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3464		     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3465		    (cmd[1] & 0xe0) == 0)
3466			sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3467				    "to DIF device\n");
3468	}
3469
3470	write_lock(macc_lckp);
3471	ret = check_device_access_params(scp, lba, num, true);
3472	if (ret) {
3473		write_unlock(macc_lckp);
3474		return ret;
 
 
 
 
 
3475	}
3476
 
 
3477	/* DIX + T10 DIF */
3478	if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3479		int prot_ret = prot_verify_write(scp, lba, num, ei_lba);
3480
3481		if (prot_ret) {
3482			write_unlock(macc_lckp);
3483			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, prot_ret);
3484			return illegal_condition_result;
3485		}
3486	}
3487
3488	ret = do_device_access(sip, scp, 0, lba, num, true);
3489	if (unlikely(scsi_debug_lbp()))
3490		map_region(sip, lba, num);
3491	/* If ZBC zone then bump its write pointer */
3492	if (sdebug_dev_is_zoned(devip))
3493		zbc_inc_wp(devip, lba, num);
3494	write_unlock(macc_lckp);
3495	if (unlikely(-1 == ret))
3496		return DID_ERROR << 16;
3497	else if (unlikely(sdebug_verbose &&
3498			  (ret < (num * sdebug_sector_size))))
3499		sdev_printk(KERN_INFO, scp->device,
3500			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3501			    my_name, num * sdebug_sector_size, ret);
3502
3503	if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3504		     atomic_read(&sdeb_inject_pending))) {
3505		if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3506			mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3507			atomic_set(&sdeb_inject_pending, 0);
3508			return check_condition_result;
3509		} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3510			/* Logical block guard check failed */
3511			mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3512			atomic_set(&sdeb_inject_pending, 0);
3513			return illegal_condition_result;
3514		} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3515			mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3516			atomic_set(&sdeb_inject_pending, 0);
3517			return illegal_condition_result;
3518		}
3519	}
3520	return 0;
3521}
3522
3523/*
3524 * T10 has only specified WRITE SCATTERED(16) and WRITE SCATTERED(32).
3525 * No READ GATHERED yet (requires bidi or long cdb holding gather list).
3526 */
3527static int resp_write_scat(struct scsi_cmnd *scp,
3528			   struct sdebug_dev_info *devip)
3529{
3530	u8 *cmd = scp->cmnd;
3531	u8 *lrdp = NULL;
3532	u8 *up;
3533	struct sdeb_store_info *sip = devip2sip(devip, true);
3534	rwlock_t *macc_lckp = &sip->macc_lck;
3535	u8 wrprotect;
3536	u16 lbdof, num_lrd, k;
3537	u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
3538	u32 lb_size = sdebug_sector_size;
3539	u32 ei_lba;
3540	u64 lba;
3541	int ret, res;
3542	bool is_16;
3543	static const u32 lrd_size = 32; /* + parameter list header size */
3544
3545	if (cmd[0] == VARIABLE_LENGTH_CMD) {
3546		is_16 = false;
3547		wrprotect = (cmd[10] >> 5) & 0x7;
3548		lbdof = get_unaligned_be16(cmd + 12);
3549		num_lrd = get_unaligned_be16(cmd + 16);
3550		bt_len = get_unaligned_be32(cmd + 28);
3551	} else {        /* that leaves WRITE SCATTERED(16) */
3552		is_16 = true;
3553		wrprotect = (cmd[2] >> 5) & 0x7;
3554		lbdof = get_unaligned_be16(cmd + 4);
3555		num_lrd = get_unaligned_be16(cmd + 8);
3556		bt_len = get_unaligned_be32(cmd + 10);
3557		if (unlikely(have_dif_prot)) {
3558			if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3559			    wrprotect) {
3560				mk_sense_invalid_opcode(scp);
3561				return illegal_condition_result;
3562			}
3563			if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3564			     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3565			     wrprotect == 0)
3566				sdev_printk(KERN_ERR, scp->device,
3567					    "Unprotected WR to DIF device\n");
3568		}
3569	}
3570	if ((num_lrd == 0) || (bt_len == 0))
3571		return 0;       /* T10 says these do-nothings are not errors */
3572	if (lbdof == 0) {
3573		if (sdebug_verbose)
3574			sdev_printk(KERN_INFO, scp->device,
3575				"%s: %s: LB Data Offset field bad\n",
3576				my_name, __func__);
3577		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3578		return illegal_condition_result;
3579	}
3580	lbdof_blen = lbdof * lb_size;
3581	if ((lrd_size + (num_lrd * lrd_size)) > lbdof_blen) {
3582		if (sdebug_verbose)
3583			sdev_printk(KERN_INFO, scp->device,
3584				"%s: %s: LBA range descriptors don't fit\n",
3585				my_name, __func__);
3586		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3587		return illegal_condition_result;
3588	}
3589	lrdp = kzalloc(lbdof_blen, GFP_ATOMIC);
3590	if (lrdp == NULL)
3591		return SCSI_MLQUEUE_HOST_BUSY;
3592	if (sdebug_verbose)
3593		sdev_printk(KERN_INFO, scp->device,
3594			"%s: %s: Fetch header+scatter_list, lbdof_blen=%u\n",
3595			my_name, __func__, lbdof_blen);
3596	res = fetch_to_dev_buffer(scp, lrdp, lbdof_blen);
3597	if (res == -1) {
3598		ret = DID_ERROR << 16;
3599		goto err_out;
3600	}
3601
3602	write_lock(macc_lckp);
3603	sg_off = lbdof_blen;
3604	/* Spec says Buffer xfer Length field in number of LBs in dout */
3605	cum_lb = 0;
3606	for (k = 0, up = lrdp + lrd_size; k < num_lrd; ++k, up += lrd_size) {
3607		lba = get_unaligned_be64(up + 0);
3608		num = get_unaligned_be32(up + 8);
3609		if (sdebug_verbose)
3610			sdev_printk(KERN_INFO, scp->device,
3611				"%s: %s: k=%d  LBA=0x%llx num=%u  sg_off=%u\n",
3612				my_name, __func__, k, lba, num, sg_off);
3613		if (num == 0)
3614			continue;
3615		ret = check_device_access_params(scp, lba, num, true);
3616		if (ret)
3617			goto err_out_unlock;
3618		num_by = num * lb_size;
3619		ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
3620
3621		if ((cum_lb + num) > bt_len) {
3622			if (sdebug_verbose)
3623				sdev_printk(KERN_INFO, scp->device,
3624				    "%s: %s: sum of blocks > data provided\n",
3625				    my_name, __func__);
3626			mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
3627					0);
3628			ret = illegal_condition_result;
3629			goto err_out_unlock;
3630		}
3631
3632		/* DIX + T10 DIF */
3633		if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3634			int prot_ret = prot_verify_write(scp, lba, num,
3635							 ei_lba);
3636
3637			if (prot_ret) {
3638				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
3639						prot_ret);
3640				ret = illegal_condition_result;
3641				goto err_out_unlock;
3642			}
3643		}
3644
3645		ret = do_device_access(sip, scp, sg_off, lba, num, true);
3646		/* If ZBC zone then bump its write pointer */
3647		if (sdebug_dev_is_zoned(devip))
3648			zbc_inc_wp(devip, lba, num);
3649		if (unlikely(scsi_debug_lbp()))
3650			map_region(sip, lba, num);
3651		if (unlikely(-1 == ret)) {
3652			ret = DID_ERROR << 16;
3653			goto err_out_unlock;
3654		} else if (unlikely(sdebug_verbose && (ret < num_by)))
3655			sdev_printk(KERN_INFO, scp->device,
3656			    "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3657			    my_name, num_by, ret);
3658
3659		if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
3660			     atomic_read(&sdeb_inject_pending))) {
3661			if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
3662				mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
3663				atomic_set(&sdeb_inject_pending, 0);
3664				ret = check_condition_result;
3665				goto err_out_unlock;
3666			} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
3667				/* Logical block guard check failed */
3668				mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3669				atomic_set(&sdeb_inject_pending, 0);
3670				ret = illegal_condition_result;
3671				goto err_out_unlock;
3672			} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
3673				mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3674				atomic_set(&sdeb_inject_pending, 0);
3675				ret = illegal_condition_result;
3676				goto err_out_unlock;
3677			}
3678		}
3679		sg_off += num_by;
3680		cum_lb += num;
3681	}
3682	ret = 0;
3683err_out_unlock:
3684	write_unlock(macc_lckp);
3685err_out:
3686	kfree(lrdp);
3687	return ret;
3688}
3689
3690static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
3691			   u32 ei_lba, bool unmap, bool ndob)
3692{
3693	struct scsi_device *sdp = scp->device;
3694	struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
3695	unsigned long long i;
3696	u64 block, lbaa;
3697	u32 lb_size = sdebug_sector_size;
3698	int ret;
3699	struct sdeb_store_info *sip = devip2sip((struct sdebug_dev_info *)
3700						scp->device->hostdata, true);
3701	rwlock_t *macc_lckp = &sip->macc_lck;
3702	u8 *fs1p;
3703	u8 *fsp;
3704
3705	write_lock(macc_lckp);
3706
3707	ret = check_device_access_params(scp, lba, num, true);
3708	if (ret) {
3709		write_unlock(macc_lckp);
3710		return ret;
3711	}
 
3712
3713	if (unmap && scsi_debug_lbp()) {
3714		unmap_region(sip, lba, num);
3715		goto out;
3716	}
3717	lbaa = lba;
3718	block = do_div(lbaa, sdebug_store_sectors);
3719	/* if ndob then zero 1 logical block, else fetch 1 logical block */
3720	fsp = sip->storep;
3721	fs1p = fsp + (block * lb_size);
3722	if (ndob) {
3723		memset(fs1p, 0, lb_size);
3724		ret = 0;
3725	} else
3726		ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
 
3727
3728	if (-1 == ret) {
3729		write_unlock(&sip->macc_lck);
3730		return DID_ERROR << 16;
3731	} else if (sdebug_verbose && !ndob && (ret < lb_size))
3732		sdev_printk(KERN_INFO, scp->device,
3733			    "%s: %s: lb size=%u, IO sent=%d bytes\n",
3734			    my_name, "write same", lb_size, ret);
 
3735
3736	/* Copy first sector to remaining blocks */
3737	for (i = 1 ; i < num ; i++) {
3738		lbaa = lba + i;
3739		block = do_div(lbaa, sdebug_store_sectors);
3740		memmove(fsp + (block * lb_size), fs1p, lb_size);
3741	}
3742	if (scsi_debug_lbp())
3743		map_region(sip, lba, num);
3744	/* If ZBC zone then bump its write pointer */
3745	if (sdebug_dev_is_zoned(devip))
3746		zbc_inc_wp(devip, lba, num);
3747out:
3748	write_unlock(macc_lckp);
3749
3750	return 0;
3751}
3752
3753static int resp_write_same_10(struct scsi_cmnd *scp,
3754			      struct sdebug_dev_info *devip)
3755{
3756	u8 *cmd = scp->cmnd;
3757	u32 lba;
3758	u16 num;
3759	u32 ei_lba = 0;
3760	bool unmap = false;
3761
3762	if (cmd[1] & 0x8) {
3763		if (sdebug_lbpws10 == 0) {
3764			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3765			return check_condition_result;
3766		} else
3767			unmap = true;
3768	}
3769	lba = get_unaligned_be32(cmd + 2);
3770	num = get_unaligned_be16(cmd + 7);
3771	if (num > sdebug_write_same_length) {
3772		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3773		return check_condition_result;
3774	}
3775	return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3776}
3777
3778static int resp_write_same_16(struct scsi_cmnd *scp,
3779			      struct sdebug_dev_info *devip)
3780{
3781	u8 *cmd = scp->cmnd;
3782	u64 lba;
3783	u32 num;
3784	u32 ei_lba = 0;
3785	bool unmap = false;
3786	bool ndob = false;
3787
3788	if (cmd[1] & 0x8) {	/* UNMAP */
3789		if (sdebug_lbpws == 0) {
3790			mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3791			return check_condition_result;
3792		} else
3793			unmap = true;
3794	}
3795	if (cmd[1] & 0x1)  /* NDOB (no data-out buffer, assumes zeroes) */
3796		ndob = true;
3797	lba = get_unaligned_be64(cmd + 2);
3798	num = get_unaligned_be32(cmd + 10);
3799	if (num > sdebug_write_same_length) {
3800		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3801		return check_condition_result;
3802	}
3803	return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3804}
3805
3806/* Note the mode field is in the same position as the (lower) service action
3807 * field. For the Report supported operation codes command, SPC-4 suggests
3808 * each mode of this command should be reported separately; for future. */
3809static int resp_write_buffer(struct scsi_cmnd *scp,
3810			     struct sdebug_dev_info *devip)
3811{
3812	u8 *cmd = scp->cmnd;
3813	struct scsi_device *sdp = scp->device;
3814	struct sdebug_dev_info *dp;
3815	u8 mode;
3816
3817	mode = cmd[1] & 0x1f;
3818	switch (mode) {
3819	case 0x4:	/* download microcode (MC) and activate (ACT) */
3820		/* set UAs on this device only */
3821		set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3822		set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
3823		break;
3824	case 0x5:	/* download MC, save and ACT */
3825		set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
3826		break;
3827	case 0x6:	/* download MC with offsets and ACT */
3828		/* set UAs on most devices (LUs) in this target */
3829		list_for_each_entry(dp,
3830				    &devip->sdbg_host->dev_info_list,
3831				    dev_list)
3832			if (dp->target == sdp->id) {
3833				set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
3834				if (devip != dp)
3835					set_bit(SDEBUG_UA_MICROCODE_CHANGED,
3836						dp->uas_bm);
3837			}
3838		break;
3839	case 0x7:	/* download MC with offsets, save, and ACT */
3840		/* set UA on all devices (LUs) in this target */
3841		list_for_each_entry(dp,
3842				    &devip->sdbg_host->dev_info_list,
3843				    dev_list)
3844			if (dp->target == sdp->id)
3845				set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
3846					dp->uas_bm);
3847		break;
3848	default:
3849		/* do nothing for this command for other mode values */
3850		break;
3851	}
3852	return 0;
3853}
3854
3855static int resp_comp_write(struct scsi_cmnd *scp,
3856			   struct sdebug_dev_info *devip)
3857{
3858	u8 *cmd = scp->cmnd;
3859	u8 *arr;
3860	struct sdeb_store_info *sip = devip2sip(devip, true);
3861	rwlock_t *macc_lckp = &sip->macc_lck;
3862	u64 lba;
3863	u32 dnum;
3864	u32 lb_size = sdebug_sector_size;
3865	u8 num;
 
3866	int ret;
3867	int retval = 0;
3868
3869	lba = get_unaligned_be64(cmd + 2);
3870	num = cmd[13];		/* 1 to a maximum of 255 logical blocks */
3871	if (0 == num)
3872		return 0;	/* degenerate case, not an error */
3873	if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3874	    (cmd[1] & 0xe0)) {
3875		mk_sense_invalid_opcode(scp);
3876		return check_condition_result;
3877	}
3878	if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3879	     sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3880	    (cmd[1] & 0xe0) == 0)
3881		sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3882			    "to DIF device\n");
3883	ret = check_device_access_params(scp, lba, num, false);
3884	if (ret)
3885		return ret;
 
 
 
 
 
 
 
 
 
3886	dnum = 2 * num;
3887	arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
3888	if (NULL == arr) {
3889		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3890				INSUFF_RES_ASCQ);
3891		return check_condition_result;
3892	}
3893
3894	write_lock(macc_lckp);
3895
3896	ret = do_dout_fetch(scp, dnum, arr);
 
 
 
 
 
3897	if (ret == -1) {
3898		retval = DID_ERROR << 16;
3899		goto cleanup;
3900	} else if (sdebug_verbose && (ret < (dnum * lb_size)))
3901		sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
3902			    "indicated=%u, IO sent=%d bytes\n", my_name,
3903			    dnum * lb_size, ret);
3904	if (!comp_write_worker(sip, lba, num, arr, false)) {
3905		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
3906		retval = check_condition_result;
3907		goto cleanup;
3908	}
3909	if (scsi_debug_lbp())
3910		map_region(sip, lba, num);
3911cleanup:
3912	write_unlock(macc_lckp);
3913	kfree(arr);
3914	return retval;
3915}
3916
3917struct unmap_block_desc {
3918	__be64	lba;
3919	__be32	blocks;
3920	__be32	__reserved;
3921};
3922
3923static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3924{
3925	unsigned char *buf;
3926	struct unmap_block_desc *desc;
3927	struct sdeb_store_info *sip = devip2sip(devip, true);
3928	rwlock_t *macc_lckp = &sip->macc_lck;
3929	unsigned int i, payload_len, descriptors;
3930	int ret;
 
 
3931
3932	if (!scsi_debug_lbp())
3933		return 0;	/* fib and say its done */
3934	payload_len = get_unaligned_be16(scp->cmnd + 7);
3935	BUG_ON(scsi_bufflen(scp) != payload_len);
3936
3937	descriptors = (payload_len - 8) / 16;
3938	if (descriptors > sdebug_unmap_max_desc) {
3939		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3940		return check_condition_result;
3941	}
3942
3943	buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
3944	if (!buf) {
3945		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3946				INSUFF_RES_ASCQ);
3947		return check_condition_result;
3948	}
3949
3950	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
3951
3952	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
3953	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
3954
3955	desc = (void *)&buf[8];
3956
3957	write_lock(macc_lckp);
3958
3959	for (i = 0 ; i < descriptors ; i++) {
3960		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
3961		unsigned int num = get_unaligned_be32(&desc[i].blocks);
3962
3963		ret = check_device_access_params(scp, lba, num, true);
3964		if (ret)
3965			goto out;
3966
3967		unmap_region(sip, lba, num);
3968	}
3969
3970	ret = 0;
3971
3972out:
3973	write_unlock(macc_lckp);
3974	kfree(buf);
3975
3976	return ret;
3977}
3978
3979#define SDEBUG_GET_LBA_STATUS_LEN 32
3980
3981static int resp_get_lba_status(struct scsi_cmnd *scp,
3982			       struct sdebug_dev_info *devip)
3983{
3984	u8 *cmd = scp->cmnd;
3985	u64 lba;
3986	u32 alloc_len, mapped, num;
 
3987	int ret;
3988	u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
3989
3990	lba = get_unaligned_be64(cmd + 2);
3991	alloc_len = get_unaligned_be32(cmd + 10);
3992
3993	if (alloc_len < 24)
3994		return 0;
3995
3996	ret = check_device_access_params(scp, lba, 1, false);
3997	if (ret)
3998		return ret;
3999
4000	if (scsi_debug_lbp()) {
4001		struct sdeb_store_info *sip = devip2sip(devip, true);
4002
4003		mapped = map_state(sip, lba, &num);
4004	} else {
4005		mapped = 1;
4006		/* following just in case virtual_gb changed */
4007		sdebug_capacity = get_sdebug_capacity();
4008		if (sdebug_capacity - lba <= 0xffffffff)
4009			num = sdebug_capacity - lba;
4010		else
4011			num = 0xffffffff;
4012	}
4013
4014	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
4015	put_unaligned_be32(20, arr);		/* Parameter Data Length */
4016	put_unaligned_be64(lba, arr + 8);	/* LBA */
4017	put_unaligned_be32(num, arr + 16);	/* Number of blocks */
4018	arr[20] = !mapped;		/* prov_stat=0: mapped; 1: dealloc */
4019
4020	return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
4021}
4022
4023static int resp_sync_cache(struct scsi_cmnd *scp,
4024			   struct sdebug_dev_info *devip)
4025{
4026	int res = 0;
4027	u64 lba;
4028	u32 num_blocks;
4029	u8 *cmd = scp->cmnd;
4030
4031	if (cmd[0] == SYNCHRONIZE_CACHE) {	/* 10 byte cdb */
4032		lba = get_unaligned_be32(cmd + 2);
4033		num_blocks = get_unaligned_be16(cmd + 7);
4034	} else {				/* SYNCHRONIZE_CACHE(16) */
4035		lba = get_unaligned_be64(cmd + 2);
4036		num_blocks = get_unaligned_be32(cmd + 10);
4037	}
4038	if (lba + num_blocks > sdebug_capacity) {
4039		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4040		return check_condition_result;
4041	}
4042	if (!write_since_sync || (cmd[1] & 0x2))
4043		res = SDEG_RES_IMMED_MASK;
4044	else		/* delay if write_since_sync and IMMED clear */
4045		write_since_sync = false;
4046	return res;
4047}
4048
4049/*
4050 * Assuming the LBA+num_blocks is not out-of-range, this function will return
4051 * CONDITION MET if the specified blocks will/have fitted in the cache, and
4052 * a GOOD status otherwise. Model a disk with a big cache and yield
4053 * CONDITION MET. Actually tries to bring range in main memory into the
4054 * cache associated with the CPU(s).
4055 */
4056static int resp_pre_fetch(struct scsi_cmnd *scp,
4057			  struct sdebug_dev_info *devip)
4058{
4059	int res = 0;
4060	u64 lba;
4061	u64 block, rest = 0;
4062	u32 nblks;
4063	u8 *cmd = scp->cmnd;
4064	struct sdeb_store_info *sip = devip2sip(devip, true);
4065	rwlock_t *macc_lckp = &sip->macc_lck;
4066	u8 *fsp = sip->storep;
4067
4068	if (cmd[0] == PRE_FETCH) {	/* 10 byte cdb */
4069		lba = get_unaligned_be32(cmd + 2);
4070		nblks = get_unaligned_be16(cmd + 7);
4071	} else {			/* PRE-FETCH(16) */
4072		lba = get_unaligned_be64(cmd + 2);
4073		nblks = get_unaligned_be32(cmd + 10);
4074	}
4075	if (lba + nblks > sdebug_capacity) {
4076		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4077		return check_condition_result;
4078	}
4079	if (!fsp)
4080		goto fini;
4081	/* PRE-FETCH spec says nothing about LBP or PI so skip them */
4082	block = do_div(lba, sdebug_store_sectors);
4083	if (block + nblks > sdebug_store_sectors)
4084		rest = block + nblks - sdebug_store_sectors;
4085
4086	/* Try to bring the PRE-FETCH range into CPU's cache */
4087	read_lock(macc_lckp);
4088	prefetch_range(fsp + (sdebug_sector_size * block),
4089		       (nblks - rest) * sdebug_sector_size);
4090	if (rest)
4091		prefetch_range(fsp, rest * sdebug_sector_size);
4092	read_unlock(macc_lckp);
4093fini:
4094	if (cmd[1] & 0x2)
4095		res = SDEG_RES_IMMED_MASK;
4096	return res | condition_met_result;
4097}
4098
4099#define RL_BUCKET_ELEMS 8
4100
4101/* Even though each pseudo target has a REPORT LUNS "well known logical unit"
4102 * (W-LUN), the normal Linux scanning logic does not associate it with a
4103 * device (e.g. /dev/sg7). The following magic will make that association:
4104 *   "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
4105 * where <n> is a host number. If there are multiple targets in a host then
4106 * the above will associate a W-LUN to each target. To only get a W-LUN
4107 * for target 2, then use "echo '- 2 49409' > scan" .
4108 */
4109static int resp_report_luns(struct scsi_cmnd *scp,
4110			    struct sdebug_dev_info *devip)
4111{
4112	unsigned char *cmd = scp->cmnd;
4113	unsigned int alloc_len;
4114	unsigned char select_report;
4115	u64 lun;
4116	struct scsi_lun *lun_p;
4117	u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
4118	unsigned int lun_cnt;	/* normal LUN count (max: 256) */
4119	unsigned int wlun_cnt;	/* report luns W-LUN count */
4120	unsigned int tlun_cnt;	/* total LUN count */
4121	unsigned int rlen;	/* response length (in bytes) */
4122	int k, j, n, res;
4123	unsigned int off_rsp = 0;
4124	const int sz_lun = sizeof(struct scsi_lun);
4125
4126	clear_luns_changed_on_target(devip);
4127
4128	select_report = cmd[2];
4129	alloc_len = get_unaligned_be32(cmd + 6);
4130
4131	if (alloc_len < 4) {
4132		pr_err("alloc len too small %d\n", alloc_len);
4133		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
4134		return check_condition_result;
4135	}
4136
4137	switch (select_report) {
4138	case 0:		/* all LUNs apart from W-LUNs */
4139		lun_cnt = sdebug_max_luns;
4140		wlun_cnt = 0;
4141		break;
4142	case 1:		/* only W-LUNs */
4143		lun_cnt = 0;
4144		wlun_cnt = 1;
4145		break;
4146	case 2:		/* all LUNs */
4147		lun_cnt = sdebug_max_luns;
4148		wlun_cnt = 1;
4149		break;
4150	case 0x10:	/* only administrative LUs */
4151	case 0x11:	/* see SPC-5 */
4152	case 0x12:	/* only subsiduary LUs owned by referenced LU */
4153	default:
4154		pr_debug("select report invalid %d\n", select_report);
4155		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
4156		return check_condition_result;
4157	}
4158
4159	if (sdebug_no_lun_0 && (lun_cnt > 0))
4160		--lun_cnt;
4161
4162	tlun_cnt = lun_cnt + wlun_cnt;
4163	rlen = tlun_cnt * sz_lun;	/* excluding 8 byte header */
4164	scsi_set_resid(scp, scsi_bufflen(scp));
4165	pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
4166		 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
4167
4168	/* loops rely on sizeof response header same as sizeof lun (both 8) */
4169	lun = sdebug_no_lun_0 ? 1 : 0;
4170	for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
4171		memset(arr, 0, sizeof(arr));
4172		lun_p = (struct scsi_lun *)&arr[0];
4173		if (k == 0) {
4174			put_unaligned_be32(rlen, &arr[0]);
4175			++lun_p;
4176			j = 1;
4177		}
4178		for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
4179			if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
4180				break;
4181			int_to_scsilun(lun++, lun_p);
4182		}
4183		if (j < RL_BUCKET_ELEMS)
4184			break;
4185		n = j * sz_lun;
4186		res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
4187		if (res)
4188			return res;
4189		off_rsp += n;
4190	}
4191	if (wlun_cnt) {
4192		int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
4193		++j;
4194	}
4195	if (j > 0)
4196		res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
4197	return res;
4198}
4199
4200static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 
4201{
4202	bool is_bytchk3 = false;
4203	u8 bytchk;
4204	int ret, j;
4205	u32 vnum, a_num, off;
4206	const u32 lb_size = sdebug_sector_size;
4207	u64 lba;
4208	u8 *arr;
4209	u8 *cmd = scp->cmnd;
4210	struct sdeb_store_info *sip = devip2sip(devip, true);
4211	rwlock_t *macc_lckp = &sip->macc_lck;
4212
4213	bytchk = (cmd[1] >> 1) & 0x3;
4214	if (bytchk == 0) {
4215		return 0;	/* always claim internal verify okay */
4216	} else if (bytchk == 2) {
4217		mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
4218		return check_condition_result;
4219	} else if (bytchk == 3) {
4220		is_bytchk3 = true;	/* 1 block sent, compared repeatedly */
4221	}
4222	switch (cmd[0]) {
4223	case VERIFY_16:
4224		lba = get_unaligned_be64(cmd + 2);
4225		vnum = get_unaligned_be32(cmd + 10);
4226		break;
4227	case VERIFY:		/* is VERIFY(10) */
4228		lba = get_unaligned_be32(cmd + 2);
4229		vnum = get_unaligned_be16(cmd + 7);
4230		break;
4231	default:
4232		mk_sense_invalid_opcode(scp);
4233		return check_condition_result;
4234	}
4235	a_num = is_bytchk3 ? 1 : vnum;
4236	/* Treat following check like one for read (i.e. no write) access */
4237	ret = check_device_access_params(scp, lba, a_num, false);
4238	if (ret)
4239		return ret;
4240
4241	arr = kcalloc(lb_size, vnum, GFP_ATOMIC);
4242	if (!arr) {
4243		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4244				INSUFF_RES_ASCQ);
4245		return check_condition_result;
4246	}
4247	/* Not changing store, so only need read access */
4248	read_lock(macc_lckp);
4249
4250	ret = do_dout_fetch(scp, a_num, arr);
4251	if (ret == -1) {
4252		ret = DID_ERROR << 16;
4253		goto cleanup;
4254	} else if (sdebug_verbose && (ret < (a_num * lb_size))) {
4255		sdev_printk(KERN_INFO, scp->device,
4256			    "%s: %s: cdb indicated=%u, IO sent=%d bytes\n",
4257			    my_name, __func__, a_num * lb_size, ret);
4258	}
4259	if (is_bytchk3) {
4260		for (j = 1, off = lb_size; j < vnum; ++j, off += lb_size)
4261			memcpy(arr + off, arr, lb_size);
4262	}
4263	ret = 0;
4264	if (!comp_write_worker(sip, lba, vnum, arr, true)) {
4265		mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
4266		ret = check_condition_result;
4267		goto cleanup;
4268	}
4269cleanup:
4270	read_unlock(macc_lckp);
4271	kfree(arr);
4272	return ret;
4273}
4274
4275#define RZONES_DESC_HD 64
4276
4277/* Report zones depending on start LBA nad reporting options */
4278static int resp_report_zones(struct scsi_cmnd *scp,
4279			     struct sdebug_dev_info *devip)
4280{
4281	unsigned int i, max_zones, rep_max_zones, nrz = 0;
4282	int ret = 0;
4283	u32 alloc_len, rep_opts, rep_len;
4284	bool partial;
4285	u64 lba, zs_lba;
4286	u8 *arr = NULL, *desc;
4287	u8 *cmd = scp->cmnd;
4288	struct sdeb_zone_state *zsp;
4289	struct sdeb_store_info *sip = devip2sip(devip, false);
4290	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4291
4292	if (!sdebug_dev_is_zoned(devip)) {
4293		mk_sense_invalid_opcode(scp);
4294		return check_condition_result;
4295	}
4296	zs_lba = get_unaligned_be64(cmd + 2);
4297	alloc_len = get_unaligned_be32(cmd + 10);
4298	rep_opts = cmd[14] & 0x3f;
4299	partial = cmd[14] & 0x80;
4300
4301	if (zs_lba >= sdebug_capacity) {
4302		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4303		return check_condition_result;
4304	}
4305
4306	max_zones = devip->nr_zones - (zs_lba >> devip->zsize_shift);
4307	rep_max_zones = min((alloc_len - 64) >> ilog2(RZONES_DESC_HD),
4308			    max_zones);
4309
4310	arr = kcalloc(RZONES_DESC_HD, alloc_len, GFP_ATOMIC);
4311	if (!arr) {
4312		mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
4313				INSUFF_RES_ASCQ);
4314		return check_condition_result;
4315	}
4316
4317	read_lock(macc_lckp);
4318
4319	desc = arr + 64;
4320	for (i = 0; i < max_zones; i++) {
4321		lba = zs_lba + devip->zsize * i;
4322		if (lba > sdebug_capacity)
4323			break;
4324		zsp = zbc_zone(devip, lba);
4325		switch (rep_opts) {
4326		case 0x00:
4327			/* All zones */
4328			break;
4329		case 0x01:
4330			/* Empty zones */
4331			if (zsp->z_cond != ZC1_EMPTY)
4332				continue;
4333			break;
4334		case 0x02:
4335			/* Implicit open zones */
4336			if (zsp->z_cond != ZC2_IMPLICIT_OPEN)
4337				continue;
4338			break;
4339		case 0x03:
4340			/* Explicit open zones */
4341			if (zsp->z_cond != ZC3_EXPLICIT_OPEN)
4342				continue;
4343			break;
4344		case 0x04:
4345			/* Closed zones */
4346			if (zsp->z_cond != ZC4_CLOSED)
4347				continue;
4348			break;
4349		case 0x05:
4350			/* Full zones */
4351			if (zsp->z_cond != ZC5_FULL)
4352				continue;
4353			break;
4354		case 0x06:
4355		case 0x07:
4356		case 0x10:
4357			/*
4358			 * Read-only, offline, reset WP recommended are
4359			 * not emulated: no zones to report;
4360			 */
4361			continue;
4362		case 0x11:
4363			/* non-seq-resource set */
4364			if (!zsp->z_non_seq_resource)
4365				continue;
4366			break;
4367		case 0x3f:
4368			/* Not write pointer (conventional) zones */
4369			if (!zbc_zone_is_conv(zsp))
4370				continue;
4371			break;
4372		default:
4373			mk_sense_buffer(scp, ILLEGAL_REQUEST,
4374					INVALID_FIELD_IN_CDB, 0);
4375			ret = check_condition_result;
4376			goto fini;
4377		}
4378
4379		if (nrz < rep_max_zones) {
4380			/* Fill zone descriptor */
4381			desc[0] = zsp->z_type;
4382			desc[1] = zsp->z_cond << 4;
4383			if (zsp->z_non_seq_resource)
4384				desc[1] |= 1 << 1;
4385			put_unaligned_be64((u64)zsp->z_size, desc + 8);
4386			put_unaligned_be64((u64)zsp->z_start, desc + 16);
4387			put_unaligned_be64((u64)zsp->z_wp, desc + 24);
4388			desc += 64;
4389		}
4390
4391		if (partial && nrz >= rep_max_zones)
4392			break;
4393
4394		nrz++;
4395	}
4396
4397	/* Report header */
4398	put_unaligned_be32(nrz * RZONES_DESC_HD, arr + 0);
4399	put_unaligned_be64(sdebug_capacity - 1, arr + 8);
4400
4401	rep_len = (unsigned long)desc - (unsigned long)arr;
4402	ret = fill_from_dev_buffer(scp, arr, min_t(int, alloc_len, rep_len));
4403
4404fini:
4405	read_unlock(macc_lckp);
4406	kfree(arr);
4407	return ret;
4408}
4409
4410/* Logic transplanted from tcmu-runner, file_zbc.c */
4411static void zbc_open_all(struct sdebug_dev_info *devip)
4412{
4413	struct sdeb_zone_state *zsp = &devip->zstate[0];
4414	unsigned int i;
4415
4416	for (i = 0; i < devip->nr_zones; i++, zsp++) {
4417		if (zsp->z_cond == ZC4_CLOSED)
4418			zbc_open_zone(devip, &devip->zstate[i], true);
4419	}
4420}
4421
4422static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4423{
4424	int res = 0;
4425	u64 z_id;
4426	enum sdebug_z_cond zc;
4427	u8 *cmd = scp->cmnd;
4428	struct sdeb_zone_state *zsp;
4429	bool all = cmd[14] & 0x01;
4430	struct sdeb_store_info *sip = devip2sip(devip, false);
4431	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4432
4433	if (!sdebug_dev_is_zoned(devip)) {
4434		mk_sense_invalid_opcode(scp);
 
4435		return check_condition_result;
4436	}
4437
4438	write_lock(macc_lckp);
4439
4440	if (all) {
4441		/* Check if all closed zones can be open */
4442		if (devip->max_open &&
4443		    devip->nr_exp_open + devip->nr_closed > devip->max_open) {
4444			mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4445					INSUFF_ZONE_ASCQ);
4446			res = check_condition_result;
4447			goto fini;
4448		}
4449		/* Open all closed zones */
4450		zbc_open_all(devip);
4451		goto fini;
4452	}
4453
4454	/* Open the specified zone */
4455	z_id = get_unaligned_be64(cmd + 2);
4456	if (z_id >= sdebug_capacity) {
4457		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4458		res = check_condition_result;
4459		goto fini;
4460	}
4461
4462	zsp = zbc_zone(devip, z_id);
4463	if (z_id != zsp->z_start) {
4464		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4465		res = check_condition_result;
4466		goto fini;
4467	}
4468	if (zbc_zone_is_conv(zsp)) {
4469		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4470		res = check_condition_result;
4471		goto fini;
4472	}
4473
4474	zc = zsp->z_cond;
4475	if (zc == ZC3_EXPLICIT_OPEN || zc == ZC5_FULL)
4476		goto fini;
4477
4478	if (devip->max_open && devip->nr_exp_open >= devip->max_open) {
4479		mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
4480				INSUFF_ZONE_ASCQ);
4481		res = check_condition_result;
4482		goto fini;
4483	}
4484
4485	zbc_open_zone(devip, zsp, true);
4486fini:
4487	write_unlock(macc_lckp);
4488	return res;
4489}
4490
4491static void zbc_close_all(struct sdebug_dev_info *devip)
4492{
4493	unsigned int i;
4494
4495	for (i = 0; i < devip->nr_zones; i++)
4496		zbc_close_zone(devip, &devip->zstate[i]);
4497}
4498
4499static int resp_close_zone(struct scsi_cmnd *scp,
4500			   struct sdebug_dev_info *devip)
4501{
4502	int res = 0;
4503	u64 z_id;
4504	u8 *cmd = scp->cmnd;
4505	struct sdeb_zone_state *zsp;
4506	bool all = cmd[14] & 0x01;
4507	struct sdeb_store_info *sip = devip2sip(devip, false);
4508	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4509
4510	if (!sdebug_dev_is_zoned(devip)) {
4511		mk_sense_invalid_opcode(scp);
4512		return check_condition_result;
4513	}
4514
4515	write_lock(macc_lckp);
4516
4517	if (all) {
4518		zbc_close_all(devip);
4519		goto fini;
4520	}
4521
4522	/* Close specified zone */
4523	z_id = get_unaligned_be64(cmd + 2);
4524	if (z_id >= sdebug_capacity) {
4525		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4526		res = check_condition_result;
4527		goto fini;
4528	}
4529
4530	zsp = zbc_zone(devip, z_id);
4531	if (z_id != zsp->z_start) {
4532		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4533		res = check_condition_result;
4534		goto fini;
4535	}
4536	if (zbc_zone_is_conv(zsp)) {
4537		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4538		res = check_condition_result;
4539		goto fini;
4540	}
4541
4542	zbc_close_zone(devip, zsp);
4543fini:
4544	write_unlock(macc_lckp);
4545	return res;
4546}
4547
4548static void zbc_finish_zone(struct sdebug_dev_info *devip,
4549			    struct sdeb_zone_state *zsp, bool empty)
4550{
4551	enum sdebug_z_cond zc = zsp->z_cond;
4552
4553	if (zc == ZC4_CLOSED || zc == ZC2_IMPLICIT_OPEN ||
4554	    zc == ZC3_EXPLICIT_OPEN || (empty && zc == ZC1_EMPTY)) {
4555		if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4556			zbc_close_zone(devip, zsp);
4557		if (zsp->z_cond == ZC4_CLOSED)
4558			devip->nr_closed--;
4559		zsp->z_wp = zsp->z_start + zsp->z_size;
4560		zsp->z_cond = ZC5_FULL;
4561	}
4562}
4563
4564static void zbc_finish_all(struct sdebug_dev_info *devip)
4565{
4566	unsigned int i;
4567
4568	for (i = 0; i < devip->nr_zones; i++)
4569		zbc_finish_zone(devip, &devip->zstate[i], false);
4570}
4571
4572static int resp_finish_zone(struct scsi_cmnd *scp,
4573			    struct sdebug_dev_info *devip)
4574{
4575	struct sdeb_zone_state *zsp;
4576	int res = 0;
4577	u64 z_id;
4578	u8 *cmd = scp->cmnd;
4579	bool all = cmd[14] & 0x01;
4580	struct sdeb_store_info *sip = devip2sip(devip, false);
4581	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4582
4583	if (!sdebug_dev_is_zoned(devip)) {
4584		mk_sense_invalid_opcode(scp);
4585		return check_condition_result;
4586	}
4587
4588	write_lock(macc_lckp);
4589
4590	if (all) {
4591		zbc_finish_all(devip);
4592		goto fini;
4593	}
4594
4595	/* Finish the specified zone */
4596	z_id = get_unaligned_be64(cmd + 2);
4597	if (z_id >= sdebug_capacity) {
4598		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4599		res = check_condition_result;
4600		goto fini;
4601	}
4602
4603	zsp = zbc_zone(devip, z_id);
4604	if (z_id != zsp->z_start) {
4605		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4606		res = check_condition_result;
4607		goto fini;
4608	}
4609	if (zbc_zone_is_conv(zsp)) {
4610		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4611		res = check_condition_result;
4612		goto fini;
4613	}
4614
4615	zbc_finish_zone(devip, zsp, true);
4616fini:
4617	write_unlock(macc_lckp);
4618	return res;
4619}
4620
4621static void zbc_rwp_zone(struct sdebug_dev_info *devip,
4622			 struct sdeb_zone_state *zsp)
4623{
4624	enum sdebug_z_cond zc;
4625
4626	if (zbc_zone_is_conv(zsp))
4627		return;
4628
4629	zc = zsp->z_cond;
4630	if (zc == ZC2_IMPLICIT_OPEN || zc == ZC3_EXPLICIT_OPEN)
4631		zbc_close_zone(devip, zsp);
4632
4633	if (zsp->z_cond == ZC4_CLOSED)
4634		devip->nr_closed--;
4635
4636	zsp->z_non_seq_resource = false;
4637	zsp->z_wp = zsp->z_start;
4638	zsp->z_cond = ZC1_EMPTY;
4639}
4640
4641static void zbc_rwp_all(struct sdebug_dev_info *devip)
4642{
4643	unsigned int i;
4644
4645	for (i = 0; i < devip->nr_zones; i++)
4646		zbc_rwp_zone(devip, &devip->zstate[i]);
4647}
4648
4649static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
4650{
4651	struct sdeb_zone_state *zsp;
4652	int res = 0;
4653	u64 z_id;
4654	u8 *cmd = scp->cmnd;
4655	bool all = cmd[14] & 0x01;
4656	struct sdeb_store_info *sip = devip2sip(devip, false);
4657	rwlock_t *macc_lckp = sip ? &sip->macc_lck : &sdeb_fake_rw_lck;
4658
4659	if (!sdebug_dev_is_zoned(devip)) {
4660		mk_sense_invalid_opcode(scp);
4661		return check_condition_result;
4662	}
4663
4664	write_lock(macc_lckp);
4665
4666	if (all) {
4667		zbc_rwp_all(devip);
4668		goto fini;
4669	}
4670
4671	z_id = get_unaligned_be64(cmd + 2);
4672	if (z_id >= sdebug_capacity) {
4673		mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
4674		res = check_condition_result;
4675		goto fini;
4676	}
4677
4678	zsp = zbc_zone(devip, z_id);
4679	if (z_id != zsp->z_start) {
4680		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4681		res = check_condition_result;
4682		goto fini;
4683	}
4684	if (zbc_zone_is_conv(zsp)) {
4685		mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
4686		res = check_condition_result;
4687		goto fini;
4688	}
4689
4690	zbc_rwp_zone(devip, zsp);
4691fini:
4692	write_unlock(macc_lckp);
4693	return res;
4694}
4695
4696static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
4697{
4698	u16 hwq;
4699
4700	if (sdebug_host_max_queue) {
4701		/* Provide a simple method to choose the hwq */
4702		hwq = smp_processor_id() % submit_queues;
4703	} else {
4704		u32 tag = blk_mq_unique_tag(cmnd->request);
 
4705
4706		hwq = blk_mq_unique_tag_to_hwq(tag);
4707
4708		pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
4709		if (WARN_ON_ONCE(hwq >= submit_queues))
4710			hwq = 0;
4711	}
4712	return sdebug_q_arr + hwq;
4713}
4714
4715static u32 get_tag(struct scsi_cmnd *cmnd)
4716{
4717	return blk_mq_unique_tag(cmnd->request);
4718}
4719
4720/* Queued (deferred) command completions converge here. */
4721static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
4722{
4723	bool aborted = sd_dp->aborted;
4724	int qc_idx;
4725	int retiring = 0;
4726	unsigned long iflags;
4727	struct sdebug_queue *sqp;
4728	struct sdebug_queued_cmd *sqcp;
4729	struct scsi_cmnd *scp;
4730	struct sdebug_dev_info *devip;
4731
4732	sd_dp->defer_t = SDEB_DEFER_NONE;
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	sqcp = &sqp->qc_arr[qc_idx];
4748	scp = sqcp->a_cmnd;
4749	if (unlikely(scp == NULL)) {
4750		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4751		pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d, hc_idx=%d\n",
4752		       sd_dp->sqa_idx, qc_idx, sd_dp->hc_idx);
4753		return;
4754	}
4755	devip = (struct sdebug_dev_info *)scp->device->hostdata;
4756	if (likely(devip))
4757		atomic_dec(&devip->num_in_q);
4758	else
4759		pr_err("devip=NULL\n");
4760	if (unlikely(atomic_read(&retired_max_queue) > 0))
4761		retiring = 1;
4762
4763	sqcp->a_cmnd = NULL;
4764	if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
4765		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4766		pr_err("Unexpected completion\n");
4767		return;
4768	}
4769
4770	if (unlikely(retiring)) {	/* user has reduced max_queue */
4771		int k, retval;
4772
4773		retval = atomic_read(&retired_max_queue);
4774		if (qc_idx >= retval) {
4775			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4776			pr_err("index %d too large\n", retval);
4777			return;
4778		}
4779		k = find_last_bit(sqp->in_use_bm, retval);
4780		if ((k < sdebug_max_queue) || (k == retval))
4781			atomic_set(&retired_max_queue, 0);
4782		else
4783			atomic_set(&retired_max_queue, k + 1);
4784	}
4785	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4786	if (unlikely(aborted)) {
4787		if (sdebug_verbose)
4788			pr_info("bypassing scsi_done() due to aborted cmd\n");
4789		return;
4790	}
4791	scp->scsi_done(scp); /* callback to mid level */
4792}
4793
4794/* When high resolution timer goes off this function is called. */
4795static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
4796{
4797	struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
4798						  hrt);
4799	sdebug_q_cmd_complete(sd_dp);
4800	return HRTIMER_NORESTART;
4801}
4802
4803/* When work queue schedules work, it calls this function. */
4804static void sdebug_q_cmd_wq_complete(struct work_struct *work)
4805{
4806	struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
4807						  ew.work);
4808	sdebug_q_cmd_complete(sd_dp);
4809}
4810
4811static bool got_shared_uuid;
4812static uuid_t shared_uuid;
4813
4814static int sdebug_device_create_zones(struct sdebug_dev_info *devip)
4815{
4816	struct sdeb_zone_state *zsp;
4817	sector_t capacity = get_sdebug_capacity();
4818	sector_t zstart = 0;
4819	unsigned int i;
4820
4821	/*
4822	 * Set the zone size: if sdeb_zbc_zone_size_mb is not set, figure out
4823	 * a zone size allowing for at least 4 zones on the device. Otherwise,
4824	 * use the specified zone size checking that at least 2 zones can be
4825	 * created for the device.
4826	 */
4827	if (!sdeb_zbc_zone_size_mb) {
4828		devip->zsize = (DEF_ZBC_ZONE_SIZE_MB * SZ_1M)
4829			>> ilog2(sdebug_sector_size);
4830		while (capacity < devip->zsize << 2 && devip->zsize >= 2)
4831			devip->zsize >>= 1;
4832		if (devip->zsize < 2) {
4833			pr_err("Device capacity too small\n");
4834			return -EINVAL;
4835		}
4836	} else {
4837		if (!is_power_of_2(sdeb_zbc_zone_size_mb)) {
4838			pr_err("Zone size is not a power of 2\n");
4839			return -EINVAL;
4840		}
4841		devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M)
4842			>> ilog2(sdebug_sector_size);
4843		if (devip->zsize >= capacity) {
4844			pr_err("Zone size too large for device capacity\n");
4845			return -EINVAL;
4846		}
4847	}
4848
4849	devip->zsize_shift = ilog2(devip->zsize);
4850	devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift;
4851
4852	if (sdeb_zbc_nr_conv >= devip->nr_zones) {
4853		pr_err("Number of conventional zones too large\n");
4854		return -EINVAL;
4855	}
4856	devip->nr_conv_zones = sdeb_zbc_nr_conv;
4857
4858	if (devip->zmodel == BLK_ZONED_HM) {
4859		/* zbc_max_open_zones can be 0, meaning "not reported" */
4860		if (sdeb_zbc_max_open >= devip->nr_zones - 1)
4861			devip->max_open = (devip->nr_zones - 1) / 2;
4862		else
4863			devip->max_open = sdeb_zbc_max_open;
4864	}
4865
4866	devip->zstate = kcalloc(devip->nr_zones,
4867				sizeof(struct sdeb_zone_state), GFP_KERNEL);
4868	if (!devip->zstate)
4869		return -ENOMEM;
4870
4871	for (i = 0; i < devip->nr_zones; i++) {
4872		zsp = &devip->zstate[i];
4873
4874		zsp->z_start = zstart;
4875
4876		if (i < devip->nr_conv_zones) {
4877			zsp->z_type = ZBC_ZONE_TYPE_CNV;
4878			zsp->z_cond = ZBC_NOT_WRITE_POINTER;
4879			zsp->z_wp = (sector_t)-1;
4880		} else {
4881			if (devip->zmodel == BLK_ZONED_HM)
4882				zsp->z_type = ZBC_ZONE_TYPE_SWR;
4883			else
4884				zsp->z_type = ZBC_ZONE_TYPE_SWP;
4885			zsp->z_cond = ZC1_EMPTY;
4886			zsp->z_wp = zsp->z_start;
4887		}
4888
4889		if (zsp->z_start + devip->zsize < capacity)
4890			zsp->z_size = devip->zsize;
4891		else
4892			zsp->z_size = capacity - zsp->z_start;
4893
4894		zstart += zsp->z_size;
4895	}
4896
4897	return 0;
4898}
4899
4900static struct sdebug_dev_info *sdebug_device_create(
4901			struct sdebug_host_info *sdbg_host, gfp_t flags)
4902{
4903	struct sdebug_dev_info *devip;
4904
4905	devip = kzalloc(sizeof(*devip), flags);
4906	if (devip) {
4907		if (sdebug_uuid_ctl == 1)
4908			uuid_gen(&devip->lu_name);
4909		else if (sdebug_uuid_ctl == 2) {
4910			if (got_shared_uuid)
4911				devip->lu_name = shared_uuid;
4912			else {
4913				uuid_gen(&shared_uuid);
4914				got_shared_uuid = true;
4915				devip->lu_name = shared_uuid;
4916			}
4917		}
4918		devip->sdbg_host = sdbg_host;
4919		if (sdeb_zbc_in_use) {
4920			devip->zmodel = sdeb_zbc_model;
4921			if (sdebug_device_create_zones(devip)) {
4922				kfree(devip);
4923				return NULL;
4924			}
4925		} else {
4926			devip->zmodel = BLK_ZONED_NONE;
4927		}
4928		devip->sdbg_host = sdbg_host;
4929		devip->create_ts = ktime_get_boottime();
4930		atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0));
4931		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
4932	}
4933	return devip;
4934}
4935
4936static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
4937{
4938	struct sdebug_host_info *sdbg_host;
4939	struct sdebug_dev_info *open_devip = NULL;
4940	struct sdebug_dev_info *devip;
4941
4942	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
4943	if (!sdbg_host) {
4944		pr_err("Host info NULL\n");
4945		return NULL;
4946	}
4947	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
4948		if ((devip->used) && (devip->channel == sdev->channel) &&
4949		    (devip->target == sdev->id) &&
4950		    (devip->lun == sdev->lun))
4951			return devip;
4952		else {
4953			if ((!devip->used) && (!open_devip))
4954				open_devip = devip;
4955		}
4956	}
4957	if (!open_devip) { /* try and make a new one */
4958		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
4959		if (!open_devip) {
4960			pr_err("out of memory at line %d\n", __LINE__);
4961			return NULL;
4962		}
4963	}
4964
4965	open_devip->channel = sdev->channel;
4966	open_devip->target = sdev->id;
4967	open_devip->lun = sdev->lun;
4968	open_devip->sdbg_host = sdbg_host;
4969	atomic_set(&open_devip->num_in_q, 0);
4970	set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
4971	open_devip->used = true;
4972	return open_devip;
4973}
4974
4975static int scsi_debug_slave_alloc(struct scsi_device *sdp)
4976{
4977	if (sdebug_verbose)
4978		pr_info("slave_alloc <%u %u %u %llu>\n",
4979		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
 
4980	return 0;
4981}
4982
4983static int scsi_debug_slave_configure(struct scsi_device *sdp)
4984{
4985	struct sdebug_dev_info *devip =
4986			(struct sdebug_dev_info *)sdp->hostdata;
4987
4988	if (sdebug_verbose)
4989		pr_info("slave_configure <%u %u %u %llu>\n",
4990		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
4991	if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
4992		sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
4993	if (devip == NULL) {
4994		devip = find_build_dev_info(sdp);
4995		if (devip == NULL)
4996			return 1;  /* no resources, will be marked offline */
4997	}
4998	sdp->hostdata = devip;
 
4999	if (sdebug_no_uld)
5000		sdp->no_uld_attach = 1;
5001	config_cdb_len(sdp);
5002	return 0;
5003}
5004
5005static void scsi_debug_slave_destroy(struct scsi_device *sdp)
5006{
5007	struct sdebug_dev_info *devip =
5008		(struct sdebug_dev_info *)sdp->hostdata;
5009
5010	if (sdebug_verbose)
5011		pr_info("slave_destroy <%u %u %u %llu>\n",
5012		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
5013	if (devip) {
5014		/* make this slot available for re-use */
5015		devip->used = false;
5016		sdp->hostdata = NULL;
5017	}
5018}
5019
5020static void stop_qc_helper(struct sdebug_defer *sd_dp,
5021			   enum sdeb_defer_type defer_t)
5022{
5023	if (!sd_dp)
5024		return;
5025	if (defer_t == SDEB_DEFER_HRT)
5026		hrtimer_cancel(&sd_dp->hrt);
5027	else if (defer_t == SDEB_DEFER_WQ)
5028		cancel_work_sync(&sd_dp->ew.work);
5029}
5030
5031/* If @cmnd found deletes its timer or work queue and returns true; else
5032   returns false */
5033static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
5034{
5035	unsigned long iflags;
5036	int j, k, qmax, r_qmax;
5037	enum sdeb_defer_type l_defer_t;
5038	struct sdebug_queue *sqp;
5039	struct sdebug_queued_cmd *sqcp;
5040	struct sdebug_dev_info *devip;
5041	struct sdebug_defer *sd_dp;
5042
5043	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5044		spin_lock_irqsave(&sqp->qc_lock, iflags);
5045		qmax = sdebug_max_queue;
5046		r_qmax = atomic_read(&retired_max_queue);
5047		if (r_qmax > qmax)
5048			qmax = r_qmax;
5049		for (k = 0; k < qmax; ++k) {
5050			if (test_bit(k, sqp->in_use_bm)) {
5051				sqcp = &sqp->qc_arr[k];
5052				if (cmnd != sqcp->a_cmnd)
5053					continue;
5054				/* found */
5055				devip = (struct sdebug_dev_info *)
5056						cmnd->device->hostdata;
5057				if (devip)
5058					atomic_dec(&devip->num_in_q);
5059				sqcp->a_cmnd = NULL;
5060				sd_dp = sqcp->sd_dp;
5061				if (sd_dp) {
5062					l_defer_t = sd_dp->defer_t;
5063					sd_dp->defer_t = SDEB_DEFER_NONE;
5064				} else
5065					l_defer_t = SDEB_DEFER_NONE;
5066				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5067				stop_qc_helper(sd_dp, l_defer_t);
5068				clear_bit(k, sqp->in_use_bm);
5069				return true;
5070			}
5071		}
5072		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5073	}
5074	return false;
5075}
5076
5077/* Deletes (stops) timers or work queues of all queued commands */
5078static void stop_all_queued(void)
5079{
5080	unsigned long iflags;
5081	int j, k;
5082	enum sdeb_defer_type l_defer_t;
5083	struct sdebug_queue *sqp;
5084	struct sdebug_queued_cmd *sqcp;
5085	struct sdebug_dev_info *devip;
5086	struct sdebug_defer *sd_dp;
5087
5088	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5089		spin_lock_irqsave(&sqp->qc_lock, iflags);
5090		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5091			if (test_bit(k, sqp->in_use_bm)) {
5092				sqcp = &sqp->qc_arr[k];
5093				if (sqcp->a_cmnd == NULL)
5094					continue;
5095				devip = (struct sdebug_dev_info *)
5096					sqcp->a_cmnd->device->hostdata;
5097				if (devip)
5098					atomic_dec(&devip->num_in_q);
5099				sqcp->a_cmnd = NULL;
5100				sd_dp = sqcp->sd_dp;
5101				if (sd_dp) {
5102					l_defer_t = sd_dp->defer_t;
5103					sd_dp->defer_t = SDEB_DEFER_NONE;
5104				} else
5105					l_defer_t = SDEB_DEFER_NONE;
5106				spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5107				stop_qc_helper(sd_dp, l_defer_t);
5108				clear_bit(k, sqp->in_use_bm);
5109				spin_lock_irqsave(&sqp->qc_lock, iflags);
5110			}
5111		}
5112		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5113	}
5114}
5115
5116/* Free queued command memory on heap */
5117static void free_all_queued(void)
5118{
5119	int j, k;
5120	struct sdebug_queue *sqp;
5121	struct sdebug_queued_cmd *sqcp;
5122
5123	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5124		for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
5125			sqcp = &sqp->qc_arr[k];
5126			kfree(sqcp->sd_dp);
5127			sqcp->sd_dp = NULL;
5128		}
5129	}
5130}
5131
5132static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
5133{
5134	bool ok;
5135
5136	++num_aborts;
5137	if (SCpnt) {
5138		ok = stop_queued_cmnd(SCpnt);
5139		if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5140			sdev_printk(KERN_INFO, SCpnt->device,
5141				    "%s: command%s found\n", __func__,
5142				    ok ? "" : " not");
5143	}
5144	return SUCCESS;
5145}
5146
5147static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
5148{
5149	++num_dev_resets;
5150	if (SCpnt && SCpnt->device) {
5151		struct scsi_device *sdp = SCpnt->device;
5152		struct sdebug_dev_info *devip =
5153				(struct sdebug_dev_info *)sdp->hostdata;
5154
5155		if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5156			sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5157		if (devip)
5158			set_bit(SDEBUG_UA_POR, devip->uas_bm);
5159	}
5160	return SUCCESS;
5161}
5162
5163static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
5164{
5165	struct sdebug_host_info *sdbg_host;
5166	struct sdebug_dev_info *devip;
5167	struct scsi_device *sdp;
5168	struct Scsi_Host *hp;
5169	int k = 0;
5170
5171	++num_target_resets;
5172	if (!SCpnt)
5173		goto lie;
5174	sdp = SCpnt->device;
5175	if (!sdp)
5176		goto lie;
5177	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5178		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5179	hp = sdp->host;
5180	if (!hp)
5181		goto lie;
5182	sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5183	if (sdbg_host) {
5184		list_for_each_entry(devip,
5185				    &sdbg_host->dev_info_list,
5186				    dev_list)
5187			if (devip->target == sdp->id) {
5188				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5189				++k;
5190			}
5191	}
5192	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5193		sdev_printk(KERN_INFO, sdp,
5194			    "%s: %d device(s) found in target\n", __func__, k);
5195lie:
5196	return SUCCESS;
5197}
5198
5199static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt)
5200{
5201	struct sdebug_host_info *sdbg_host;
5202	struct sdebug_dev_info *devip;
5203	struct scsi_device *sdp;
5204	struct Scsi_Host *hp;
5205	int k = 0;
5206
5207	++num_bus_resets;
5208	if (!(SCpnt && SCpnt->device))
5209		goto lie;
5210	sdp = SCpnt->device;
5211	if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
5212		sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
5213	hp = sdp->host;
5214	if (hp) {
5215		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
5216		if (sdbg_host) {
5217			list_for_each_entry(devip,
5218					    &sdbg_host->dev_info_list,
5219					    dev_list) {
5220				set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5221				++k;
5222			}
5223		}
5224	}
5225	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5226		sdev_printk(KERN_INFO, sdp,
5227			    "%s: %d device(s) found in host\n", __func__, k);
5228lie:
5229	return SUCCESS;
5230}
5231
5232static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
5233{
5234	struct sdebug_host_info *sdbg_host;
5235	struct sdebug_dev_info *devip;
5236	int k = 0;
5237
5238	++num_host_resets;
5239	if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
5240		sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
5241	spin_lock(&sdebug_host_list_lock);
5242	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
5243		list_for_each_entry(devip, &sdbg_host->dev_info_list,
5244				    dev_list) {
5245			set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
5246			++k;
5247		}
5248	}
5249	spin_unlock(&sdebug_host_list_lock);
5250	stop_all_queued();
5251	if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
5252		sdev_printk(KERN_INFO, SCpnt->device,
5253			    "%s: %d device(s) found\n", __func__, k);
5254	return SUCCESS;
5255}
5256
5257static void sdebug_build_parts(unsigned char *ramp, unsigned long store_size)
 
5258{
5259	struct msdos_partition *pp;
5260	int starts[SDEBUG_MAX_PARTS + 2];
5261	int sectors_per_part, num_sectors, k;
5262	int heads_by_sects, start_sec, end_sec;
5263
5264	/* assume partition table already zeroed */
5265	if ((sdebug_num_parts < 1) || (store_size < 1048576))
5266		return;
5267	if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
5268		sdebug_num_parts = SDEBUG_MAX_PARTS;
5269		pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
5270	}
5271	num_sectors = (int)sdebug_store_sectors;
5272	sectors_per_part = (num_sectors - sdebug_sectors_per)
5273			   / sdebug_num_parts;
5274	heads_by_sects = sdebug_heads * sdebug_sectors_per;
5275	starts[0] = sdebug_sectors_per;
5276	for (k = 1; k < sdebug_num_parts; ++k)
5277		starts[k] = ((k * sectors_per_part) / heads_by_sects)
5278			    * heads_by_sects;
5279	starts[sdebug_num_parts] = num_sectors;
5280	starts[sdebug_num_parts + 1] = 0;
5281
5282	ramp[510] = 0x55;	/* magic partition markings */
5283	ramp[511] = 0xAA;
5284	pp = (struct msdos_partition *)(ramp + 0x1be);
5285	for (k = 0; starts[k + 1]; ++k, ++pp) {
5286		start_sec = starts[k];
5287		end_sec = starts[k + 1] - 1;
5288		pp->boot_ind = 0;
5289
5290		pp->cyl = start_sec / heads_by_sects;
5291		pp->head = (start_sec - (pp->cyl * heads_by_sects))
5292			   / sdebug_sectors_per;
5293		pp->sector = (start_sec % sdebug_sectors_per) + 1;
5294
5295		pp->end_cyl = end_sec / heads_by_sects;
5296		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
5297			       / sdebug_sectors_per;
5298		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
5299
5300		pp->start_sect = cpu_to_le32(start_sec);
5301		pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
5302		pp->sys_ind = 0x83;	/* plain Linux partition */
5303	}
5304}
5305
5306static void block_unblock_all_queues(bool block)
5307{
5308	int j;
5309	struct sdebug_queue *sqp;
5310
5311	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
5312		atomic_set(&sqp->blocked, (int)block);
5313}
5314
5315/* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
5316 * commands will be processed normally before triggers occur.
5317 */
5318static void tweak_cmnd_count(void)
5319{
5320	int count, modulo;
5321
5322	modulo = abs(sdebug_every_nth);
5323	if (modulo < 2)
5324		return;
5325	block_unblock_all_queues(true);
5326	count = atomic_read(&sdebug_cmnd_count);
5327	atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
5328	block_unblock_all_queues(false);
5329}
5330
5331static void clear_queue_stats(void)
5332{
5333	atomic_set(&sdebug_cmnd_count, 0);
5334	atomic_set(&sdebug_completions, 0);
5335	atomic_set(&sdebug_miss_cpus, 0);
5336	atomic_set(&sdebug_a_tsf, 0);
5337}
5338
5339static bool inject_on_this_cmd(void)
 
5340{
5341	if (sdebug_every_nth == 0)
5342		return false;
5343	return (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) == 0;
 
 
 
 
5344}
5345
5346#define INCLUSIVE_TIMING_MAX_NS 1000000		/* 1 millisecond */
5347
5348/* Complete the processing of the thread that queued a SCSI command to this
5349 * driver. It either completes the command by calling cmnd_done() or
5350 * schedules a hr timer or work queue then returns 0. Returns
5351 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
5352 */
5353static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
5354			 int scsi_result,
5355			 int (*pfp)(struct scsi_cmnd *,
5356				    struct sdebug_dev_info *),
5357			 int delta_jiff, int ndelay)
5358{
5359	bool new_sd_dp;
5360	bool inject = false;
5361	int k, num_in_q, qdepth;
5362	unsigned long iflags;
5363	u64 ns_from_boot = 0;
5364	struct sdebug_queue *sqp;
5365	struct sdebug_queued_cmd *sqcp;
5366	struct scsi_device *sdp;
5367	struct sdebug_defer *sd_dp;
5368
5369	if (unlikely(devip == NULL)) {
5370		if (scsi_result == 0)
5371			scsi_result = DID_NO_CONNECT << 16;
5372		goto respond_in_thread;
5373	}
5374	sdp = cmnd->device;
5375
 
 
 
5376	if (delta_jiff == 0)
5377		goto respond_in_thread;
5378
 
5379	sqp = get_queue(cmnd);
5380	spin_lock_irqsave(&sqp->qc_lock, iflags);
5381	if (unlikely(atomic_read(&sqp->blocked))) {
5382		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5383		return SCSI_MLQUEUE_HOST_BUSY;
5384	}
5385	num_in_q = atomic_read(&devip->num_in_q);
5386	qdepth = cmnd->device->queue_depth;
 
5387	if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
5388		if (scsi_result) {
5389			spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5390			goto respond_in_thread;
5391		} else
5392			scsi_result = device_qfull_result;
5393	} else if (unlikely(sdebug_every_nth &&
5394			    (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
5395			    (scsi_result == 0))) {
5396		if ((num_in_q == (qdepth - 1)) &&
5397		    (atomic_inc_return(&sdebug_a_tsf) >=
5398		     abs(sdebug_every_nth))) {
5399			atomic_set(&sdebug_a_tsf, 0);
5400			inject = true;
5401			scsi_result = device_qfull_result;
5402		}
5403	}
5404
5405	k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
5406	if (unlikely(k >= sdebug_max_queue)) {
5407		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5408		if (scsi_result)
5409			goto respond_in_thread;
5410		else if (SDEBUG_OPT_ALL_TSF & sdebug_opts)
5411			scsi_result = device_qfull_result;
5412		if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
5413			sdev_printk(KERN_INFO, sdp,
5414				    "%s: max_queue=%d exceeded, %s\n",
5415				    __func__, sdebug_max_queue,
5416				    (scsi_result ?  "status: TASK SET FULL" :
5417						    "report: host busy"));
5418		if (scsi_result)
5419			goto respond_in_thread;
5420		else
5421			return SCSI_MLQUEUE_HOST_BUSY;
5422	}
5423	set_bit(k, sqp->in_use_bm);
5424	atomic_inc(&devip->num_in_q);
5425	sqcp = &sqp->qc_arr[k];
5426	sqcp->a_cmnd = cmnd;
5427	cmnd->host_scribble = (unsigned char *)sqcp;
 
5428	sd_dp = sqcp->sd_dp;
5429	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5430	if (!sd_dp) {
5431		sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
5432		if (!sd_dp) {
5433			atomic_dec(&devip->num_in_q);
5434			clear_bit(k, sqp->in_use_bm);
5435			return SCSI_MLQUEUE_HOST_BUSY;
5436		}
5437		new_sd_dp = true;
5438	} else {
5439		new_sd_dp = false;
5440	}
5441
5442	/* Set the hostwide tag */
5443	if (sdebug_host_max_queue)
5444		sd_dp->hc_idx = get_tag(cmnd);
5445
5446	if (ndelay > 0 && ndelay < INCLUSIVE_TIMING_MAX_NS)
5447		ns_from_boot = ktime_get_boottime_ns();
5448
5449	/* one of the resp_*() response functions is called here */
5450	cmnd->result = pfp ? pfp(cmnd, devip) : 0;
5451	if (cmnd->result & SDEG_RES_IMMED_MASK) {
5452		cmnd->result &= ~SDEG_RES_IMMED_MASK;
5453		delta_jiff = ndelay = 0;
5454	}
5455	if (cmnd->result == 0 && scsi_result != 0)
5456		cmnd->result = scsi_result;
5457	if (cmnd->result == 0 && unlikely(sdebug_opts & SDEBUG_OPT_TRANSPORT_ERR)) {
5458		if (atomic_read(&sdeb_inject_pending)) {
5459			mk_sense_buffer(cmnd, ABORTED_COMMAND, TRANSPORT_PROBLEM, ACK_NAK_TO);
5460			atomic_set(&sdeb_inject_pending, 0);
5461			cmnd->result = check_condition_result;
5462		}
5463	}
5464
5465	if (unlikely(sdebug_verbose && cmnd->result))
5466		sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
5467			    __func__, cmnd->result);
5468
5469	if (delta_jiff > 0 || ndelay > 0) {
5470		ktime_t kt;
5471
5472		if (delta_jiff > 0) {
5473			u64 ns = jiffies_to_nsecs(delta_jiff);
5474
5475			if (sdebug_random && ns < U32_MAX) {
5476				ns = prandom_u32_max((u32)ns);
5477			} else if (sdebug_random) {
5478				ns >>= 12;	/* scale to 4 usec precision */
5479				if (ns < U32_MAX)	/* over 4 hours max */
5480					ns = prandom_u32_max((u32)ns);
5481				ns <<= 12;
5482			}
5483			kt = ns_to_ktime(ns);
5484		} else {	/* ndelay has a 4.2 second max */
5485			kt = sdebug_random ? prandom_u32_max((u32)ndelay) :
5486					     (u32)ndelay;
5487			if (ndelay < INCLUSIVE_TIMING_MAX_NS) {
5488				u64 d = ktime_get_boottime_ns() - ns_from_boot;
5489
5490				if (kt <= d) {	/* elapsed duration >= kt */
5491					spin_lock_irqsave(&sqp->qc_lock, iflags);
5492					sqcp->a_cmnd = NULL;
5493					atomic_dec(&devip->num_in_q);
5494					clear_bit(k, sqp->in_use_bm);
5495					spin_unlock_irqrestore(&sqp->qc_lock, iflags);
5496					if (new_sd_dp)
5497						kfree(sd_dp);
5498					/* call scsi_done() from this thread */
5499					cmnd->scsi_done(cmnd);
5500					return 0;
5501				}
5502				/* otherwise reduce kt by elapsed time */
5503				kt -= d;
5504			}
5505		}
5506		if (!sd_dp->init_hrt) {
5507			sd_dp->init_hrt = true;
5508			sqcp->sd_dp = sd_dp;
5509			hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
5510				     HRTIMER_MODE_REL_PINNED);
5511			sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
5512			sd_dp->sqa_idx = sqp - sdebug_q_arr;
5513			sd_dp->qc_idx = k;
5514		}
5515		if (sdebug_statistics)
5516			sd_dp->issuing_cpu = raw_smp_processor_id();
5517		sd_dp->defer_t = SDEB_DEFER_HRT;
5518		/* schedule the invocation of scsi_done() for a later time */
5519		hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
5520	} else {	/* jdelay < 0, use work queue */
5521		if (!sd_dp->init_wq) {
5522			sd_dp->init_wq = true;
 
 
5523			sqcp->sd_dp = sd_dp;
5524			sd_dp->sqa_idx = sqp - sdebug_q_arr;
5525			sd_dp->qc_idx = k;
5526			INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
5527		}
5528		if (sdebug_statistics)
5529			sd_dp->issuing_cpu = raw_smp_processor_id();
5530		sd_dp->defer_t = SDEB_DEFER_WQ;
5531		if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) &&
5532			     atomic_read(&sdeb_inject_pending)))
5533			sd_dp->aborted = true;
5534		schedule_work(&sd_dp->ew.work);
5535		if (unlikely((sdebug_opts & SDEBUG_OPT_CMD_ABORT) &&
5536			     atomic_read(&sdeb_inject_pending))) {
5537			sdev_printk(KERN_INFO, sdp, "abort request tag %d\n", cmnd->request->tag);
5538			blk_abort_request(cmnd->request);
5539			atomic_set(&sdeb_inject_pending, 0);
5540		}
5541	}
5542	if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) && scsi_result == device_qfull_result))
5543		sdev_printk(KERN_INFO, sdp, "%s: num_in_q=%d +1, %s%s\n", __func__,
5544			    num_in_q, (inject ? "<inject> " : ""), "status: TASK SET FULL");
 
 
 
5545	return 0;
5546
5547respond_in_thread:	/* call back to mid-layer using invocation thread */
5548	cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
5549	cmnd->result &= ~SDEG_RES_IMMED_MASK;
5550	if (cmnd->result == 0 && scsi_result != 0)
5551		cmnd->result = scsi_result;
5552	cmnd->scsi_done(cmnd);
5553	return 0;
5554}
5555
5556/* Note: The following macros create attribute files in the
5557   /sys/module/scsi_debug/parameters directory. Unfortunately this
5558   driver is unaware of a change and cannot trigger auxiliary actions
5559   as it can when the corresponding attribute in the
5560   /sys/bus/pseudo/drivers/scsi_debug directory is changed.
5561 */
5562module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
5563module_param_named(ato, sdebug_ato, int, S_IRUGO);
5564module_param_named(cdb_len, sdebug_cdb_len, int, 0644);
5565module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
5566module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
5567module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
5568module_param_named(dif, sdebug_dif, int, S_IRUGO);
5569module_param_named(dix, sdebug_dix, int, S_IRUGO);
5570module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
5571module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
5572module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
5573module_param_named(guard, sdebug_guard, uint, S_IRUGO);
5574module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
5575module_param_named(host_max_queue, sdebug_host_max_queue, int, S_IRUGO);
5576module_param_string(inq_product, sdebug_inq_product_id,
5577		    sizeof(sdebug_inq_product_id), S_IRUGO | S_IWUSR);
5578module_param_string(inq_rev, sdebug_inq_product_rev,
5579		    sizeof(sdebug_inq_product_rev), S_IRUGO | S_IWUSR);
5580module_param_string(inq_vendor, sdebug_inq_vendor_id,
5581		    sizeof(sdebug_inq_vendor_id), S_IRUGO | S_IWUSR);
5582module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
5583module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
5584module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
5585module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
 
5586module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
5587module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
5588module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
5589module_param_named(medium_error_count, sdebug_medium_error_count, int,
5590		   S_IRUGO | S_IWUSR);
5591module_param_named(medium_error_start, sdebug_medium_error_start, int,
5592		   S_IRUGO | S_IWUSR);
5593module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
5594module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
5595module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
5596module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
5597module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
5598module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
5599module_param_named(opt_xferlen_exp, sdebug_opt_xferlen_exp, int, S_IRUGO);
5600module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
5601module_param_named(per_host_store, sdebug_per_host_store, bool,
5602		   S_IRUGO | S_IWUSR);
5603module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
5604module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
5605module_param_named(random, sdebug_random, bool, S_IRUGO | S_IWUSR);
5606module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
5607module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
5608module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
5609module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
5610module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
5611module_param_named(submit_queues, submit_queues, int, S_IRUGO);
5612module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO);
5613module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
5614module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
5615module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
5616module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
 
5617module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
5618module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
5619module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
5620		   S_IRUGO | S_IWUSR);
5621module_param_named(wp, sdebug_wp, bool, S_IRUGO | S_IWUSR);
5622module_param_named(write_same_length, sdebug_write_same_length, int,
5623		   S_IRUGO | S_IWUSR);
5624module_param_named(zbc, sdeb_zbc_model_s, charp, S_IRUGO);
5625module_param_named(zone_max_open, sdeb_zbc_max_open, int, S_IRUGO);
5626module_param_named(zone_nr_conv, sdeb_zbc_nr_conv, int, S_IRUGO);
5627module_param_named(zone_size_mb, sdeb_zbc_zone_size_mb, int, S_IRUGO);
5628
5629MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
5630MODULE_DESCRIPTION("SCSI debug adapter driver");
5631MODULE_LICENSE("GPL");
5632MODULE_VERSION(SDEBUG_VERSION);
5633
5634MODULE_PARM_DESC(add_host, "add n hosts, in sysfs if negative remove host(s) (def=1)");
5635MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
5636MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
5637MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
5638MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
5639MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
5640MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
5641MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
5642MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
5643MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
5644MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
5645MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
5646MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
5647MODULE_PARM_DESC(host_max_queue,
5648		 "host max # of queued cmds (0 to max(def) [max_queue fixed equal for !0])");
5649MODULE_PARM_DESC(inq_product, "SCSI INQUIRY product string (def=\"scsi_debug\")");
5650MODULE_PARM_DESC(inq_rev, "SCSI INQUIRY revision string (def=\""
5651		 SDEBUG_VERSION "\")");
5652MODULE_PARM_DESC(inq_vendor, "SCSI INQUIRY vendor string (def=\"Linux\")");
5653MODULE_PARM_DESC(lbprz,
5654		 "on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
5655MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
5656MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
5657MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
 
 
5658MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
5659MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
5660MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
5661MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
5662MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
5663MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
5664MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
5665MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
5666MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
5667MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
5668MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
5669MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent (def=physblk_exp)");
5670MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
5671MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
5672MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
5673MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
5674MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
5675MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
5676MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
5677MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
5678MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
5679MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
5680MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
5681MODULE_PARM_DESC(tur_ms_to_ready, "TEST UNIT READY millisecs before initial good status (def=0)");
5682MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
5683MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
5684MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
5685MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
5686MODULE_PARM_DESC(uuid_ctl,
5687		 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
5688MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
5689MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
5690MODULE_PARM_DESC(wp, "Write Protect (def=0)");
5691MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
5692MODULE_PARM_DESC(zbc, "'none' [0]; 'aware' [1]; 'managed' [2] (def=0). Can have 'host-' prefix");
5693MODULE_PARM_DESC(zone_max_open, "Maximum number of open zones; [0] for no limit (def=auto)");
5694MODULE_PARM_DESC(zone_nr_conv, "Number of conventional zones (def=1)");
5695MODULE_PARM_DESC(zone_size_mb, "Zone size in MiB (def=auto)");
5696
5697#define SDEBUG_INFO_LEN 256
5698static char sdebug_info[SDEBUG_INFO_LEN];
5699
5700static const char *scsi_debug_info(struct Scsi_Host *shp)
5701{
5702	int k;
5703
5704	k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
5705		      my_name, SDEBUG_VERSION, sdebug_version_date);
5706	if (k >= (SDEBUG_INFO_LEN - 1))
5707		return sdebug_info;
5708	scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
5709		  "  dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
5710		  sdebug_dev_size_mb, sdebug_opts, submit_queues,
5711		  "statistics", (int)sdebug_statistics);
5712	return sdebug_info;
5713}
5714
5715/* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
5716static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
5717				 int length)
5718{
5719	char arr[16];
5720	int opts;
5721	int minLen = length > 15 ? 15 : length;
5722
5723	if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
5724		return -EACCES;
5725	memcpy(arr, buffer, minLen);
5726	arr[minLen] = '\0';
5727	if (1 != sscanf(arr, "%d", &opts))
5728		return -EINVAL;
5729	sdebug_opts = opts;
5730	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
5731	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
5732	if (sdebug_every_nth != 0)
5733		tweak_cmnd_count();
5734	return length;
5735}
5736
5737/* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
5738 * same for each scsi_debug host (if more than one). Some of the counters
5739 * output are not atomics so might be inaccurate in a busy system. */
5740static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
5741{
5742	int f, j, l;
5743	struct sdebug_queue *sqp;
5744	struct sdebug_host_info *sdhp;
5745
5746	seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
5747		   SDEBUG_VERSION, sdebug_version_date);
5748	seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
5749		   sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
5750		   sdebug_opts, sdebug_every_nth);
5751	seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
5752		   sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
5753		   sdebug_sector_size, "bytes");
5754	seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
5755		   sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
5756		   num_aborts);
5757	seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
5758		   num_dev_resets, num_target_resets, num_bus_resets,
5759		   num_host_resets);
5760	seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
5761		   dix_reads, dix_writes, dif_errors);
5762	seq_printf(m, "usec_in_jiffy=%lu, statistics=%d\n", TICK_NSEC / 1000,
5763		   sdebug_statistics);
 
5764	seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d\n",
5765		   atomic_read(&sdebug_cmnd_count),
5766		   atomic_read(&sdebug_completions),
5767		   "miss_cpus", atomic_read(&sdebug_miss_cpus),
5768		   atomic_read(&sdebug_a_tsf));
5769
5770	seq_printf(m, "submit_queues=%d\n", submit_queues);
5771	for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
5772		seq_printf(m, "  queue %d:\n", j);
5773		f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
5774		if (f != sdebug_max_queue) {
5775			l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
5776			seq_printf(m, "    in_use_bm BUSY: %s: %d,%d\n",
5777				   "first,last bits", f, l);
5778		}
5779	}
5780
5781	seq_printf(m, "this host_no=%d\n", host->host_no);
5782	if (!xa_empty(per_store_ap)) {
5783		bool niu;
5784		int idx;
5785		unsigned long l_idx;
5786		struct sdeb_store_info *sip;
5787
5788		seq_puts(m, "\nhost list:\n");
5789		j = 0;
5790		list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
5791			idx = sdhp->si_idx;
5792			seq_printf(m, "  %d: host_no=%d, si_idx=%d\n", j,
5793				   sdhp->shost->host_no, idx);
5794			++j;
5795		}
5796		seq_printf(m, "\nper_store array [most_recent_idx=%d]:\n",
5797			   sdeb_most_recent_idx);
5798		j = 0;
5799		xa_for_each(per_store_ap, l_idx, sip) {
5800			niu = xa_get_mark(per_store_ap, l_idx,
5801					  SDEB_XA_NOT_IN_USE);
5802			idx = (int)l_idx;
5803			seq_printf(m, "  %d: idx=%d%s\n", j, idx,
5804				   (niu ? "  not_in_use" : ""));
5805			++j;
5806		}
5807	}
5808	return 0;
5809}
5810
5811static ssize_t delay_show(struct device_driver *ddp, char *buf)
5812{
5813	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
5814}
5815/* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
5816 * of delay is jiffies.
5817 */
5818static ssize_t delay_store(struct device_driver *ddp, const char *buf,
5819			   size_t count)
5820{
5821	int jdelay, res;
5822
5823	if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
5824		res = count;
5825		if (sdebug_jdelay != jdelay) {
5826			int j, k;
5827			struct sdebug_queue *sqp;
5828
5829			block_unblock_all_queues(true);
5830			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
5831			     ++j, ++sqp) {
5832				k = find_first_bit(sqp->in_use_bm,
5833						   sdebug_max_queue);
5834				if (k != sdebug_max_queue) {
5835					res = -EBUSY;   /* queued commands */
5836					break;
5837				}
5838			}
5839			if (res > 0) {
 
 
 
5840				sdebug_jdelay = jdelay;
5841				sdebug_ndelay = 0;
5842			}
5843			block_unblock_all_queues(false);
5844		}
5845		return res;
5846	}
5847	return -EINVAL;
5848}
5849static DRIVER_ATTR_RW(delay);
5850
5851static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
5852{
5853	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
5854}
5855/* Returns -EBUSY if ndelay is being changed and commands are queued */
5856/* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
5857static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
5858			    size_t count)
5859{
5860	int ndelay, res;
5861
5862	if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
5863	    (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
5864		res = count;
5865		if (sdebug_ndelay != ndelay) {
5866			int j, k;
5867			struct sdebug_queue *sqp;
5868
5869			block_unblock_all_queues(true);
5870			for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
5871			     ++j, ++sqp) {
5872				k = find_first_bit(sqp->in_use_bm,
5873						   sdebug_max_queue);
5874				if (k != sdebug_max_queue) {
5875					res = -EBUSY;   /* queued commands */
5876					break;
5877				}
5878			}
5879			if (res > 0) {
 
 
 
5880				sdebug_ndelay = ndelay;
5881				sdebug_jdelay = ndelay  ? JDELAY_OVERRIDDEN
5882							: DEF_JDELAY;
5883			}
5884			block_unblock_all_queues(false);
5885		}
5886		return res;
5887	}
5888	return -EINVAL;
5889}
5890static DRIVER_ATTR_RW(ndelay);
5891
5892static ssize_t opts_show(struct device_driver *ddp, char *buf)
5893{
5894	return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
5895}
5896
5897static ssize_t opts_store(struct device_driver *ddp, const char *buf,
5898			  size_t count)
5899{
5900	int opts;
5901	char work[20];
5902
5903	if (sscanf(buf, "%10s", work) == 1) {
5904		if (strncasecmp(work, "0x", 2) == 0) {
5905			if (kstrtoint(work + 2, 16, &opts) == 0)
5906				goto opts_done;
5907		} else {
5908			if (kstrtoint(work, 10, &opts) == 0)
5909				goto opts_done;
5910		}
5911	}
5912	return -EINVAL;
5913opts_done:
5914	sdebug_opts = opts;
5915	sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
5916	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
5917	tweak_cmnd_count();
5918	return count;
5919}
5920static DRIVER_ATTR_RW(opts);
5921
5922static ssize_t ptype_show(struct device_driver *ddp, char *buf)
5923{
5924	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
5925}
5926static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
5927			   size_t count)
5928{
5929	int n;
5930
5931	/* Cannot change from or to TYPE_ZBC with sysfs */
5932	if (sdebug_ptype == TYPE_ZBC)
5933		return -EINVAL;
5934
5935	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5936		if (n == TYPE_ZBC)
5937			return -EINVAL;
5938		sdebug_ptype = n;
5939		return count;
5940	}
5941	return -EINVAL;
5942}
5943static DRIVER_ATTR_RW(ptype);
5944
5945static ssize_t dsense_show(struct device_driver *ddp, char *buf)
5946{
5947	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
5948}
5949static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
5950			    size_t count)
5951{
5952	int n;
5953
5954	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5955		sdebug_dsense = n;
5956		return count;
5957	}
5958	return -EINVAL;
5959}
5960static DRIVER_ATTR_RW(dsense);
5961
5962static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
5963{
5964	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
5965}
5966static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
5967			     size_t count)
5968{
5969	int n, idx;
5970
5971	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5972		bool want_store = (n == 0);
5973		struct sdebug_host_info *sdhp;
5974
5975		n = (n > 0);
5976		sdebug_fake_rw = (sdebug_fake_rw > 0);
5977		if (sdebug_fake_rw == n)
5978			return count;	/* not transitioning so do nothing */
5979
5980		if (want_store) {	/* 1 --> 0 transition, set up store */
5981			if (sdeb_first_idx < 0) {
5982				idx = sdebug_add_store();
5983				if (idx < 0)
5984					return idx;
5985			} else {
5986				idx = sdeb_first_idx;
5987				xa_clear_mark(per_store_ap, idx,
5988					      SDEB_XA_NOT_IN_USE);
5989			}
5990			/* make all hosts use same store */
5991			list_for_each_entry(sdhp, &sdebug_host_list,
5992					    host_list) {
5993				if (sdhp->si_idx != idx) {
5994					xa_set_mark(per_store_ap, sdhp->si_idx,
5995						    SDEB_XA_NOT_IN_USE);
5996					sdhp->si_idx = idx;
5997				}
 
5998			}
5999			sdeb_most_recent_idx = idx;
6000		} else {	/* 0 --> 1 transition is trigger for shrink */
6001			sdebug_erase_all_stores(true /* apart from first */);
6002		}
6003		sdebug_fake_rw = n;
6004		return count;
6005	}
6006	return -EINVAL;
6007}
6008static DRIVER_ATTR_RW(fake_rw);
6009
6010static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
6011{
6012	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
6013}
6014static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
6015			      size_t count)
6016{
6017	int n;
6018
6019	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6020		sdebug_no_lun_0 = n;
6021		return count;
6022	}
6023	return -EINVAL;
6024}
6025static DRIVER_ATTR_RW(no_lun_0);
6026
6027static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
6028{
6029	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
6030}
6031static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
6032			      size_t count)
6033{
6034	int n;
6035
6036	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6037		sdebug_num_tgts = n;
6038		sdebug_max_tgts_luns();
6039		return count;
6040	}
6041	return -EINVAL;
6042}
6043static DRIVER_ATTR_RW(num_tgts);
6044
6045static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
6046{
6047	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
6048}
6049static DRIVER_ATTR_RO(dev_size_mb);
6050
6051static ssize_t per_host_store_show(struct device_driver *ddp, char *buf)
6052{
6053	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_per_host_store);
6054}
6055
6056static ssize_t per_host_store_store(struct device_driver *ddp, const char *buf,
6057				    size_t count)
6058{
6059	bool v;
6060
6061	if (kstrtobool(buf, &v))
6062		return -EINVAL;
6063
6064	sdebug_per_host_store = v;
6065	return count;
6066}
6067static DRIVER_ATTR_RW(per_host_store);
6068
6069static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
6070{
6071	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
6072}
6073static DRIVER_ATTR_RO(num_parts);
6074
6075static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
6076{
6077	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
6078}
6079static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
6080			       size_t count)
6081{
6082	int nth;
6083	char work[20];
6084
6085	if (sscanf(buf, "%10s", work) == 1) {
6086		if (strncasecmp(work, "0x", 2) == 0) {
6087			if (kstrtoint(work + 2, 16, &nth) == 0)
6088				goto every_nth_done;
6089		} else {
6090			if (kstrtoint(work, 10, &nth) == 0)
6091				goto every_nth_done;
6092		}
 
 
6093	}
6094	return -EINVAL;
6095
6096every_nth_done:
6097	sdebug_every_nth = nth;
6098	if (nth && !sdebug_statistics) {
6099		pr_info("every_nth needs statistics=1, set it\n");
6100		sdebug_statistics = true;
6101	}
6102	tweak_cmnd_count();
6103	return count;
6104}
6105static DRIVER_ATTR_RW(every_nth);
6106
6107static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
6108{
6109	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
6110}
6111static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
6112			      size_t count)
6113{
6114	int n;
6115	bool changed;
6116
6117	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6118		if (n > 256) {
6119			pr_warn("max_luns can be no more than 256\n");
6120			return -EINVAL;
6121		}
6122		changed = (sdebug_max_luns != n);
6123		sdebug_max_luns = n;
6124		sdebug_max_tgts_luns();
6125		if (changed && (sdebug_scsi_level >= 5)) {	/* >= SPC-3 */
6126			struct sdebug_host_info *sdhp;
6127			struct sdebug_dev_info *dp;
6128
6129			spin_lock(&sdebug_host_list_lock);
6130			list_for_each_entry(sdhp, &sdebug_host_list,
6131					    host_list) {
6132				list_for_each_entry(dp, &sdhp->dev_info_list,
6133						    dev_list) {
6134					set_bit(SDEBUG_UA_LUNS_CHANGED,
6135						dp->uas_bm);
6136				}
6137			}
6138			spin_unlock(&sdebug_host_list_lock);
6139		}
6140		return count;
6141	}
6142	return -EINVAL;
6143}
6144static DRIVER_ATTR_RW(max_luns);
6145
6146static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
6147{
6148	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
6149}
6150/* N.B. max_queue can be changed while there are queued commands. In flight
6151 * commands beyond the new max_queue will be completed. */
6152static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
6153			       size_t count)
6154{
6155	int j, n, k, a;
6156	struct sdebug_queue *sqp;
6157
6158	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
6159	    (n <= SDEBUG_CANQUEUE) &&
6160	    (sdebug_host_max_queue == 0)) {
6161		block_unblock_all_queues(true);
6162		k = 0;
6163		for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
6164		     ++j, ++sqp) {
6165			a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
6166			if (a > k)
6167				k = a;
6168		}
6169		sdebug_max_queue = n;
6170		if (k == SDEBUG_CANQUEUE)
6171			atomic_set(&retired_max_queue, 0);
6172		else if (k >= n)
6173			atomic_set(&retired_max_queue, k + 1);
6174		else
6175			atomic_set(&retired_max_queue, 0);
6176		block_unblock_all_queues(false);
6177		return count;
6178	}
6179	return -EINVAL;
6180}
6181static DRIVER_ATTR_RW(max_queue);
6182
6183static ssize_t host_max_queue_show(struct device_driver *ddp, char *buf)
6184{
6185	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_host_max_queue);
6186}
6187
6188/*
6189 * Since this is used for .can_queue, and we get the hc_idx tag from the bitmap
6190 * in range [0, sdebug_host_max_queue), we can't change it.
6191 */
6192static DRIVER_ATTR_RO(host_max_queue);
6193
6194static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
6195{
6196	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
6197}
6198static DRIVER_ATTR_RO(no_uld);
6199
6200static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
6201{
6202	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
6203}
6204static DRIVER_ATTR_RO(scsi_level);
6205
6206static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
6207{
6208	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
6209}
6210static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
6211				size_t count)
6212{
6213	int n;
6214	bool changed;
6215
6216	/* Ignore capacity change for ZBC drives for now */
6217	if (sdeb_zbc_in_use)
6218		return -ENOTSUPP;
6219
6220	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6221		changed = (sdebug_virtual_gb != n);
6222		sdebug_virtual_gb = n;
6223		sdebug_capacity = get_sdebug_capacity();
6224		if (changed) {
6225			struct sdebug_host_info *sdhp;
6226			struct sdebug_dev_info *dp;
6227
6228			spin_lock(&sdebug_host_list_lock);
6229			list_for_each_entry(sdhp, &sdebug_host_list,
6230					    host_list) {
6231				list_for_each_entry(dp, &sdhp->dev_info_list,
6232						    dev_list) {
6233					set_bit(SDEBUG_UA_CAPACITY_CHANGED,
6234						dp->uas_bm);
6235				}
6236			}
6237			spin_unlock(&sdebug_host_list_lock);
6238		}
6239		return count;
6240	}
6241	return -EINVAL;
6242}
6243static DRIVER_ATTR_RW(virtual_gb);
6244
6245static ssize_t add_host_show(struct device_driver *ddp, char *buf)
6246{
6247	/* absolute number of hosts currently active is what is shown */
6248	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_hosts);
6249}
6250
 
 
 
6251static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
6252			      size_t count)
6253{
6254	bool found;
6255	unsigned long idx;
6256	struct sdeb_store_info *sip;
6257	bool want_phs = (sdebug_fake_rw == 0) && sdebug_per_host_store;
6258	int delta_hosts;
6259
6260	if (sscanf(buf, "%d", &delta_hosts) != 1)
6261		return -EINVAL;
6262	if (delta_hosts > 0) {
6263		do {
6264			found = false;
6265			if (want_phs) {
6266				xa_for_each_marked(per_store_ap, idx, sip,
6267						   SDEB_XA_NOT_IN_USE) {
6268					sdeb_most_recent_idx = (int)idx;
6269					found = true;
6270					break;
6271				}
6272				if (found)	/* re-use case */
6273					sdebug_add_host_helper((int)idx);
6274				else
6275					sdebug_do_add_host(true);
6276			} else {
6277				sdebug_do_add_host(false);
6278			}
6279		} while (--delta_hosts);
6280	} else if (delta_hosts < 0) {
6281		do {
6282			sdebug_do_remove_host(false);
6283		} while (++delta_hosts);
6284	}
6285	return count;
6286}
6287static DRIVER_ATTR_RW(add_host);
6288
6289static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
6290{
6291	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
6292}
6293static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
6294				    size_t count)
6295{
6296	int n;
6297
6298	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6299		sdebug_vpd_use_hostno = n;
6300		return count;
6301	}
6302	return -EINVAL;
6303}
6304static DRIVER_ATTR_RW(vpd_use_hostno);
6305
6306static ssize_t statistics_show(struct device_driver *ddp, char *buf)
6307{
6308	return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
6309}
6310static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
6311				size_t count)
6312{
6313	int n;
6314
6315	if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
6316		if (n > 0)
6317			sdebug_statistics = true;
6318		else {
6319			clear_queue_stats();
6320			sdebug_statistics = false;
6321		}
6322		return count;
6323	}
6324	return -EINVAL;
6325}
6326static DRIVER_ATTR_RW(statistics);
6327
6328static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
6329{
6330	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
6331}
6332static DRIVER_ATTR_RO(sector_size);
6333
6334static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
6335{
6336	return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
6337}
6338static DRIVER_ATTR_RO(submit_queues);
6339
6340static ssize_t dix_show(struct device_driver *ddp, char *buf)
6341{
6342	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
6343}
6344static DRIVER_ATTR_RO(dix);
6345
6346static ssize_t dif_show(struct device_driver *ddp, char *buf)
6347{
6348	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
6349}
6350static DRIVER_ATTR_RO(dif);
6351
6352static ssize_t guard_show(struct device_driver *ddp, char *buf)
6353{
6354	return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
6355}
6356static DRIVER_ATTR_RO(guard);
6357
6358static ssize_t ato_show(struct device_driver *ddp, char *buf)
6359{
6360	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
6361}
6362static DRIVER_ATTR_RO(ato);
6363
6364static ssize_t map_show(struct device_driver *ddp, char *buf)
6365{
6366	ssize_t count = 0;
6367
6368	if (!scsi_debug_lbp())
6369		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
6370				 sdebug_store_sectors);
6371
6372	if (sdebug_fake_rw == 0 && !xa_empty(per_store_ap)) {
6373		struct sdeb_store_info *sip = xa_load(per_store_ap, 0);
6374
6375		if (sip)
6376			count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
6377					  (int)map_size, sip->map_storep);
6378	}
6379	buf[count++] = '\n';
6380	buf[count] = '\0';
6381
6382	return count;
6383}
6384static DRIVER_ATTR_RO(map);
6385
6386static ssize_t random_show(struct device_driver *ddp, char *buf)
6387{
6388	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_random);
6389}
6390
6391static ssize_t random_store(struct device_driver *ddp, const char *buf,
6392			    size_t count)
6393{
6394	bool v;
6395
6396	if (kstrtobool(buf, &v))
6397		return -EINVAL;
6398
6399	sdebug_random = v;
6400	return count;
6401}
6402static DRIVER_ATTR_RW(random);
6403
6404static ssize_t removable_show(struct device_driver *ddp, char *buf)
6405{
6406	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
6407}
6408static ssize_t removable_store(struct device_driver *ddp, const char *buf,
6409			       size_t count)
6410{
6411	int n;
6412
6413	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6414		sdebug_removable = (n > 0);
6415		return count;
6416	}
6417	return -EINVAL;
6418}
6419static DRIVER_ATTR_RW(removable);
6420
6421static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
6422{
6423	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
6424}
6425/* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
6426static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
6427			       size_t count)
6428{
6429	int n;
6430
6431	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6432		sdebug_host_lock = (n > 0);
6433		return count;
6434	}
6435	return -EINVAL;
6436}
6437static DRIVER_ATTR_RW(host_lock);
6438
6439static ssize_t strict_show(struct device_driver *ddp, char *buf)
6440{
6441	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
6442}
6443static ssize_t strict_store(struct device_driver *ddp, const char *buf,
6444			    size_t count)
6445{
6446	int n;
6447
6448	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
6449		sdebug_strict = (n > 0);
6450		return count;
6451	}
6452	return -EINVAL;
6453}
6454static DRIVER_ATTR_RW(strict);
6455
6456static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
6457{
6458	return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
6459}
6460static DRIVER_ATTR_RO(uuid_ctl);
6461
6462static ssize_t cdb_len_show(struct device_driver *ddp, char *buf)
6463{
6464	return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_cdb_len);
6465}
6466static ssize_t cdb_len_store(struct device_driver *ddp, const char *buf,
6467			     size_t count)
6468{
6469	int ret, n;
6470
6471	ret = kstrtoint(buf, 0, &n);
6472	if (ret)
6473		return ret;
6474	sdebug_cdb_len = n;
6475	all_config_cdb_len();
6476	return count;
6477}
6478static DRIVER_ATTR_RW(cdb_len);
6479
6480static const char * const zbc_model_strs_a[] = {
6481	[BLK_ZONED_NONE] = "none",
6482	[BLK_ZONED_HA]   = "host-aware",
6483	[BLK_ZONED_HM]   = "host-managed",
6484};
6485
6486static const char * const zbc_model_strs_b[] = {
6487	[BLK_ZONED_NONE] = "no",
6488	[BLK_ZONED_HA]   = "aware",
6489	[BLK_ZONED_HM]   = "managed",
6490};
6491
6492static const char * const zbc_model_strs_c[] = {
6493	[BLK_ZONED_NONE] = "0",
6494	[BLK_ZONED_HA]   = "1",
6495	[BLK_ZONED_HM]   = "2",
6496};
6497
6498static int sdeb_zbc_model_str(const char *cp)
6499{
6500	int res = sysfs_match_string(zbc_model_strs_a, cp);
6501
6502	if (res < 0) {
6503		res = sysfs_match_string(zbc_model_strs_b, cp);
6504		if (res < 0) {
6505			res = sysfs_match_string(zbc_model_strs_c, cp);
6506			if (res < 0)
6507				return -EINVAL;
6508		}
6509	}
6510	return res;
6511}
6512
6513static ssize_t zbc_show(struct device_driver *ddp, char *buf)
6514{
6515	return scnprintf(buf, PAGE_SIZE, "%s\n",
6516			 zbc_model_strs_a[sdeb_zbc_model]);
6517}
6518static DRIVER_ATTR_RO(zbc);
6519
6520static ssize_t tur_ms_to_ready_show(struct device_driver *ddp, char *buf)
6521{
6522	return scnprintf(buf, PAGE_SIZE, "%d\n", sdeb_tur_ms_to_ready);
6523}
6524static DRIVER_ATTR_RO(tur_ms_to_ready);
6525
6526/* Note: The following array creates attribute files in the
6527   /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
6528   files (over those found in the /sys/module/scsi_debug/parameters
6529   directory) is that auxiliary actions can be triggered when an attribute
6530   is changed. For example see: add_host_store() above.
6531 */
6532
6533static struct attribute *sdebug_drv_attrs[] = {
6534	&driver_attr_delay.attr,
6535	&driver_attr_opts.attr,
6536	&driver_attr_ptype.attr,
6537	&driver_attr_dsense.attr,
6538	&driver_attr_fake_rw.attr,
6539	&driver_attr_host_max_queue.attr,
6540	&driver_attr_no_lun_0.attr,
6541	&driver_attr_num_tgts.attr,
6542	&driver_attr_dev_size_mb.attr,
6543	&driver_attr_num_parts.attr,
6544	&driver_attr_every_nth.attr,
6545	&driver_attr_max_luns.attr,
6546	&driver_attr_max_queue.attr,
6547	&driver_attr_no_uld.attr,
6548	&driver_attr_scsi_level.attr,
6549	&driver_attr_virtual_gb.attr,
6550	&driver_attr_add_host.attr,
6551	&driver_attr_per_host_store.attr,
6552	&driver_attr_vpd_use_hostno.attr,
6553	&driver_attr_sector_size.attr,
6554	&driver_attr_statistics.attr,
6555	&driver_attr_submit_queues.attr,
6556	&driver_attr_dix.attr,
6557	&driver_attr_dif.attr,
6558	&driver_attr_guard.attr,
6559	&driver_attr_ato.attr,
6560	&driver_attr_map.attr,
6561	&driver_attr_random.attr,
6562	&driver_attr_removable.attr,
6563	&driver_attr_host_lock.attr,
6564	&driver_attr_ndelay.attr,
6565	&driver_attr_strict.attr,
6566	&driver_attr_uuid_ctl.attr,
6567	&driver_attr_cdb_len.attr,
6568	&driver_attr_tur_ms_to_ready.attr,
6569	&driver_attr_zbc.attr,
6570	NULL,
6571};
6572ATTRIBUTE_GROUPS(sdebug_drv);
6573
6574static struct device *pseudo_primary;
6575
6576static int __init scsi_debug_init(void)
6577{
6578	bool want_store = (sdebug_fake_rw == 0);
6579	unsigned long sz;
6580	int k, ret, hosts_to_add;
6581	int idx = -1;
 
6582
6583	ramdisk_lck_a[0] = &atomic_rw;
6584	ramdisk_lck_a[1] = &atomic_rw2;
6585	atomic_set(&retired_max_queue, 0);
6586
6587	if (sdebug_ndelay >= 1000 * 1000 * 1000) {
6588		pr_warn("ndelay must be less than 1 second, ignored\n");
6589		sdebug_ndelay = 0;
6590	} else if (sdebug_ndelay > 0)
6591		sdebug_jdelay = JDELAY_OVERRIDDEN;
6592
6593	switch (sdebug_sector_size) {
6594	case  512:
6595	case 1024:
6596	case 2048:
6597	case 4096:
6598		break;
6599	default:
6600		pr_err("invalid sector_size %d\n", sdebug_sector_size);
6601		return -EINVAL;
6602	}
6603
6604	switch (sdebug_dif) {
6605	case T10_PI_TYPE0_PROTECTION:
6606		break;
6607	case T10_PI_TYPE1_PROTECTION:
6608	case T10_PI_TYPE2_PROTECTION:
6609	case T10_PI_TYPE3_PROTECTION:
6610		have_dif_prot = true;
6611		break;
6612
6613	default:
6614		pr_err("dif must be 0, 1, 2 or 3\n");
6615		return -EINVAL;
6616	}
6617
6618	if (sdebug_num_tgts < 0) {
6619		pr_err("num_tgts must be >= 0\n");
6620		return -EINVAL;
6621	}
6622
6623	if (sdebug_guard > 1) {
6624		pr_err("guard must be 0 or 1\n");
6625		return -EINVAL;
6626	}
6627
6628	if (sdebug_ato > 1) {
6629		pr_err("ato must be 0 or 1\n");
6630		return -EINVAL;
6631	}
6632
6633	if (sdebug_physblk_exp > 15) {
6634		pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
6635		return -EINVAL;
6636	}
6637	if (sdebug_max_luns > 256) {
6638		pr_warn("max_luns can be no more than 256, use default\n");
6639		sdebug_max_luns = DEF_MAX_LUNS;
6640	}
6641
6642	if (sdebug_lowest_aligned > 0x3fff) {
6643		pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
6644		return -EINVAL;
6645	}
6646
6647	if (submit_queues < 1) {
6648		pr_err("submit_queues must be 1 or more\n");
6649		return -EINVAL;
6650	}
6651
6652	if ((sdebug_max_queue > SDEBUG_CANQUEUE) || (sdebug_max_queue < 1)) {
6653		pr_err("max_queue must be in range [1, %d]\n", SDEBUG_CANQUEUE);
6654		return -EINVAL;
6655	}
6656
6657	if ((sdebug_host_max_queue > SDEBUG_CANQUEUE) ||
6658	    (sdebug_host_max_queue < 0)) {
6659		pr_err("host_max_queue must be in range [0 %d]\n",
6660		       SDEBUG_CANQUEUE);
6661		return -EINVAL;
6662	}
6663
6664	if (sdebug_host_max_queue &&
6665	    (sdebug_max_queue != sdebug_host_max_queue)) {
6666		sdebug_max_queue = sdebug_host_max_queue;
6667		pr_warn("fixing max submit queue depth to host max queue depth, %d\n",
6668			sdebug_max_queue);
6669	}
6670
6671	sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
6672			       GFP_KERNEL);
6673	if (sdebug_q_arr == NULL)
6674		return -ENOMEM;
6675	for (k = 0; k < submit_queues; ++k)
6676		spin_lock_init(&sdebug_q_arr[k].qc_lock);
6677
6678	/*
6679	 * check for host managed zoned block device specified with
6680	 * ptype=0x14 or zbc=XXX.
6681	 */
6682	if (sdebug_ptype == TYPE_ZBC) {
6683		sdeb_zbc_model = BLK_ZONED_HM;
6684	} else if (sdeb_zbc_model_s && *sdeb_zbc_model_s) {
6685		k = sdeb_zbc_model_str(sdeb_zbc_model_s);
6686		if (k < 0) {
6687			ret = k;
6688			goto free_vm;
6689		}
6690		sdeb_zbc_model = k;
6691		switch (sdeb_zbc_model) {
6692		case BLK_ZONED_NONE:
6693		case BLK_ZONED_HA:
6694			sdebug_ptype = TYPE_DISK;
6695			break;
6696		case BLK_ZONED_HM:
6697			sdebug_ptype = TYPE_ZBC;
6698			break;
6699		default:
6700			pr_err("Invalid ZBC model\n");
6701			return -EINVAL;
6702		}
6703	}
6704	if (sdeb_zbc_model != BLK_ZONED_NONE) {
6705		sdeb_zbc_in_use = true;
6706		if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
6707			sdebug_dev_size_mb = DEF_ZBC_DEV_SIZE_MB;
6708	}
6709
6710	if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
6711		sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
6712	if (sdebug_dev_size_mb < 1)
6713		sdebug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
6714	sz = (unsigned long)sdebug_dev_size_mb * 1048576;
6715	sdebug_store_sectors = sz / sdebug_sector_size;
6716	sdebug_capacity = get_sdebug_capacity();
6717
6718	/* play around with geometry, don't waste too much on track 0 */
6719	sdebug_heads = 8;
6720	sdebug_sectors_per = 32;
6721	if (sdebug_dev_size_mb >= 256)
6722		sdebug_heads = 64;
6723	else if (sdebug_dev_size_mb >= 16)
6724		sdebug_heads = 32;
6725	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
6726			       (sdebug_sectors_per * sdebug_heads);
6727	if (sdebug_cylinders_per >= 1024) {
6728		/* other LLDs do this; implies >= 1GB ram disk ... */
6729		sdebug_heads = 255;
6730		sdebug_sectors_per = 63;
6731		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
6732			       (sdebug_sectors_per * sdebug_heads);
6733	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6734	if (scsi_debug_lbp()) {
6735		sdebug_unmap_max_blocks =
6736			clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
6737
6738		sdebug_unmap_max_desc =
6739			clamp(sdebug_unmap_max_desc, 0U, 256U);
6740
6741		sdebug_unmap_granularity =
6742			clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
6743
6744		if (sdebug_unmap_alignment &&
6745		    sdebug_unmap_granularity <=
6746		    sdebug_unmap_alignment) {
6747			pr_err("ERR: unmap_granularity <= unmap_alignment\n");
6748			ret = -EINVAL;
6749			goto free_q_arr;
6750		}
6751	}
6752	xa_init_flags(per_store_ap, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);
6753	if (want_store) {
6754		idx = sdebug_add_store();
6755		if (idx < 0) {
6756			ret = idx;
6757			goto free_q_arr;
 
 
 
6758		}
 
 
 
 
 
 
6759	}
6760
6761	pseudo_primary = root_device_register("pseudo_0");
6762	if (IS_ERR(pseudo_primary)) {
6763		pr_warn("root_device_register() error\n");
6764		ret = PTR_ERR(pseudo_primary);
6765		goto free_vm;
6766	}
6767	ret = bus_register(&pseudo_lld_bus);
6768	if (ret < 0) {
6769		pr_warn("bus_register error: %d\n", ret);
6770		goto dev_unreg;
6771	}
6772	ret = driver_register(&sdebug_driverfs_driver);
6773	if (ret < 0) {
6774		pr_warn("driver_register error: %d\n", ret);
6775		goto bus_unreg;
6776	}
6777
6778	hosts_to_add = sdebug_add_host;
6779	sdebug_add_host = 0;
6780
6781	for (k = 0; k < hosts_to_add; k++) {
6782		if (want_store && k == 0) {
6783			ret = sdebug_add_host_helper(idx);
6784			if (ret < 0) {
6785				pr_err("add_host_helper k=%d, error=%d\n",
6786				       k, -ret);
6787				break;
6788			}
6789		} else {
6790			ret = sdebug_do_add_host(want_store &&
6791						 sdebug_per_host_store);
6792			if (ret < 0) {
6793				pr_err("add_host k=%d error=%d\n", k, -ret);
6794				break;
6795			}
6796		}
6797	}
6798	if (sdebug_verbose)
6799		pr_info("built %d host(s)\n", sdebug_num_hosts);
6800
6801	return 0;
6802
6803bus_unreg:
6804	bus_unregister(&pseudo_lld_bus);
6805dev_unreg:
6806	root_device_unregister(pseudo_primary);
6807free_vm:
6808	sdebug_erase_store(idx, NULL);
 
 
6809free_q_arr:
6810	kfree(sdebug_q_arr);
6811	return ret;
6812}
6813
6814static void __exit scsi_debug_exit(void)
6815{
6816	int k = sdebug_num_hosts;
6817
6818	stop_all_queued();
 
6819	for (; k; k--)
6820		sdebug_do_remove_host(true);
6821	free_all_queued();
6822	driver_unregister(&sdebug_driverfs_driver);
6823	bus_unregister(&pseudo_lld_bus);
6824	root_device_unregister(pseudo_primary);
6825
6826	sdebug_erase_all_stores(false);
6827	xa_destroy(per_store_ap);
 
 
6828}
6829
6830device_initcall(scsi_debug_init);
6831module_exit(scsi_debug_exit);
6832
6833static void sdebug_release_adapter(struct device *dev)
6834{
6835	struct sdebug_host_info *sdbg_host;
6836
6837	sdbg_host = to_sdebug_host(dev);
6838	kfree(sdbg_host);
6839}
6840
6841/* idx must be valid, if sip is NULL then it will be obtained using idx */
6842static void sdebug_erase_store(int idx, struct sdeb_store_info *sip)
6843{
6844	if (idx < 0)
6845		return;
6846	if (!sip) {
6847		if (xa_empty(per_store_ap))
6848			return;
6849		sip = xa_load(per_store_ap, idx);
6850		if (!sip)
6851			return;
6852	}
6853	vfree(sip->map_storep);
6854	vfree(sip->dif_storep);
6855	vfree(sip->storep);
6856	xa_erase(per_store_ap, idx);
6857	kfree(sip);
6858}
6859
6860/* Assume apart_from_first==false only in shutdown case. */
6861static void sdebug_erase_all_stores(bool apart_from_first)
6862{
6863	unsigned long idx;
6864	struct sdeb_store_info *sip = NULL;
6865
6866	xa_for_each(per_store_ap, idx, sip) {
6867		if (apart_from_first)
6868			apart_from_first = false;
6869		else
6870			sdebug_erase_store(idx, sip);
6871	}
6872	if (apart_from_first)
6873		sdeb_most_recent_idx = sdeb_first_idx;
6874}
6875
6876/*
6877 * Returns store xarray new element index (idx) if >=0 else negated errno.
6878 * Limit the number of stores to 65536.
6879 */
6880static int sdebug_add_store(void)
6881{
6882	int res;
6883	u32 n_idx;
6884	unsigned long iflags;
6885	unsigned long sz = (unsigned long)sdebug_dev_size_mb * 1048576;
6886	struct sdeb_store_info *sip = NULL;
6887	struct xa_limit xal = { .max = 1 << 16, .min = 0 };
6888
6889	sip = kzalloc(sizeof(*sip), GFP_KERNEL);
6890	if (!sip)
6891		return -ENOMEM;
6892
6893	xa_lock_irqsave(per_store_ap, iflags);
6894	res = __xa_alloc(per_store_ap, &n_idx, sip, xal, GFP_ATOMIC);
6895	if (unlikely(res < 0)) {
6896		xa_unlock_irqrestore(per_store_ap, iflags);
6897		kfree(sip);
6898		pr_warn("%s: xa_alloc() errno=%d\n", __func__, -res);
6899		return res;
6900	}
6901	sdeb_most_recent_idx = n_idx;
6902	if (sdeb_first_idx < 0)
6903		sdeb_first_idx = n_idx;
6904	xa_unlock_irqrestore(per_store_ap, iflags);
6905
6906	res = -ENOMEM;
6907	sip->storep = vzalloc(sz);
6908	if (!sip->storep) {
6909		pr_err("user data oom\n");
6910		goto err;
6911	}
6912	if (sdebug_num_parts > 0)
6913		sdebug_build_parts(sip->storep, sz);
6914
6915	/* DIF/DIX: what T10 calls Protection Information (PI) */
6916	if (sdebug_dix) {
6917		int dif_size;
6918
6919		dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
6920		sip->dif_storep = vmalloc(dif_size);
6921
6922		pr_info("dif_storep %u bytes @ %pK\n", dif_size,
6923			sip->dif_storep);
6924
6925		if (!sip->dif_storep) {
6926			pr_err("DIX oom\n");
6927			goto err;
6928		}
6929		memset(sip->dif_storep, 0xff, dif_size);
6930	}
6931	/* Logical Block Provisioning */
6932	if (scsi_debug_lbp()) {
6933		map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
6934		sip->map_storep = vmalloc(array_size(sizeof(long),
6935						     BITS_TO_LONGS(map_size)));
6936
6937		pr_info("%lu provisioning blocks\n", map_size);
6938
6939		if (!sip->map_storep) {
6940			pr_err("LBP map oom\n");
6941			goto err;
6942		}
6943
6944		bitmap_zero(sip->map_storep, map_size);
6945
6946		/* Map first 1KB for partition table */
6947		if (sdebug_num_parts)
6948			map_region(sip, 0, 2);
6949	}
6950
6951	rwlock_init(&sip->macc_lck);
6952	return (int)n_idx;
6953err:
6954	sdebug_erase_store((int)n_idx, sip);
6955	pr_warn("%s: failed, errno=%d\n", __func__, -res);
6956	return res;
6957}
6958
6959static int sdebug_add_host_helper(int per_host_idx)
6960{
6961	int k, devs_per_host, idx;
6962	int error = -ENOMEM;
6963	struct sdebug_host_info *sdbg_host;
6964	struct sdebug_dev_info *sdbg_devinfo, *tmp;
6965
6966	sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL);
6967	if (!sdbg_host)
6968		return -ENOMEM;
6969	idx = (per_host_idx < 0) ? sdeb_first_idx : per_host_idx;
6970	if (xa_get_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE))
6971		xa_clear_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
6972	sdbg_host->si_idx = idx;
6973
6974	INIT_LIST_HEAD(&sdbg_host->dev_info_list);
6975
6976	devs_per_host = sdebug_num_tgts * sdebug_max_luns;
6977	for (k = 0; k < devs_per_host; k++) {
6978		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
6979		if (!sdbg_devinfo)
 
 
6980			goto clean;
6981	}
 
 
 
 
 
6982
6983	spin_lock(&sdebug_host_list_lock);
6984	list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
6985	spin_unlock(&sdebug_host_list_lock);
 
6986
6987	sdbg_host->dev.bus = &pseudo_lld_bus;
6988	sdbg_host->dev.parent = pseudo_primary;
6989	sdbg_host->dev.release = &sdebug_release_adapter;
6990	dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_num_hosts);
6991
6992	error = device_register(&sdbg_host->dev);
6993	if (error)
6994		goto clean;
6995
6996	++sdebug_num_hosts;
6997	return 0;
6998
6999clean:
7000	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7001				 dev_list) {
7002		list_del(&sdbg_devinfo->dev_list);
7003		kfree(sdbg_devinfo->zstate);
7004		kfree(sdbg_devinfo);
7005	}
 
7006	kfree(sdbg_host);
7007	pr_warn("%s: failed, errno=%d\n", __func__, -error);
7008	return error;
7009}
7010
7011static int sdebug_do_add_host(bool mk_new_store)
7012{
7013	int ph_idx = sdeb_most_recent_idx;
7014
7015	if (mk_new_store) {
7016		ph_idx = sdebug_add_store();
7017		if (ph_idx < 0)
7018			return ph_idx;
7019	}
7020	return sdebug_add_host_helper(ph_idx);
7021}
7022
7023static void sdebug_do_remove_host(bool the_end)
7024{
7025	int idx = -1;
7026	struct sdebug_host_info *sdbg_host = NULL;
7027	struct sdebug_host_info *sdbg_host2;
7028
7029	spin_lock(&sdebug_host_list_lock);
7030	if (!list_empty(&sdebug_host_list)) {
7031		sdbg_host = list_entry(sdebug_host_list.prev,
7032				       struct sdebug_host_info, host_list);
7033		idx = sdbg_host->si_idx;
7034	}
7035	if (!the_end && idx >= 0) {
7036		bool unique = true;
7037
7038		list_for_each_entry(sdbg_host2, &sdebug_host_list, host_list) {
7039			if (sdbg_host2 == sdbg_host)
7040				continue;
7041			if (idx == sdbg_host2->si_idx) {
7042				unique = false;
7043				break;
7044			}
7045		}
7046		if (unique) {
7047			xa_set_mark(per_store_ap, idx, SDEB_XA_NOT_IN_USE);
7048			if (idx == sdeb_most_recent_idx)
7049				--sdeb_most_recent_idx;
7050		}
7051	}
7052	if (sdbg_host)
7053		list_del(&sdbg_host->host_list);
7054	spin_unlock(&sdebug_host_list_lock);
7055
7056	if (!sdbg_host)
7057		return;
7058
7059	device_unregister(&sdbg_host->dev);
7060	--sdebug_num_hosts;
7061}
7062
7063static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
7064{
7065	int num_in_q = 0;
7066	struct sdebug_dev_info *devip;
7067
7068	block_unblock_all_queues(true);
7069	devip = (struct sdebug_dev_info *)sdev->hostdata;
7070	if (NULL == devip) {
7071		block_unblock_all_queues(false);
7072		return	-ENODEV;
7073	}
7074	num_in_q = atomic_read(&devip->num_in_q);
7075
7076	if (qdepth < 1)
7077		qdepth = 1;
7078	/* allow to exceed max host qc_arr elements for testing */
7079	if (qdepth > SDEBUG_CANQUEUE + 10)
7080		qdepth = SDEBUG_CANQUEUE + 10;
7081	scsi_change_queue_depth(sdev, qdepth);
7082
7083	if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
7084		sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
7085			    __func__, qdepth, num_in_q);
7086	}
7087	block_unblock_all_queues(false);
7088	return sdev->queue_depth;
7089}
7090
7091static bool fake_timeout(struct scsi_cmnd *scp)
7092{
7093	if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
7094		if (sdebug_every_nth < -1)
7095			sdebug_every_nth = -1;
7096		if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
7097			return true; /* ignore command causing timeout */
7098		else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
7099			 scsi_medium_access_command(scp))
7100			return true; /* time out reads and writes */
7101	}
7102	return false;
7103}
7104
7105/* Response to TUR or media access command when device stopped */
7106static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
7107{
7108	int stopped_state;
7109	u64 diff_ns = 0;
7110	ktime_t now_ts = ktime_get_boottime();
7111	struct scsi_device *sdp = scp->device;
7112
7113	stopped_state = atomic_read(&devip->stopped);
7114	if (stopped_state == 2) {
7115		if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) {
7116			diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts));
7117			if (diff_ns >= ((u64)sdeb_tur_ms_to_ready * 1000000)) {
7118				/* tur_ms_to_ready timer extinguished */
7119				atomic_set(&devip->stopped, 0);
7120				return 0;
7121			}
7122		}
7123		mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x1);
7124		if (sdebug_verbose)
7125			sdev_printk(KERN_INFO, sdp,
7126				    "%s: Not ready: in process of becoming ready\n", my_name);
7127		if (scp->cmnd[0] == TEST_UNIT_READY) {
7128			u64 tur_nanosecs_to_ready = (u64)sdeb_tur_ms_to_ready * 1000000;
7129
7130			if (diff_ns <= tur_nanosecs_to_ready)
7131				diff_ns = tur_nanosecs_to_ready - diff_ns;
7132			else
7133				diff_ns = tur_nanosecs_to_ready;
7134			/* As per 20-061r2 approved for spc6 by T10 on 20200716 */
7135			do_div(diff_ns, 1000000);	/* diff_ns becomes milliseconds */
7136			scsi_set_sense_information(scp->sense_buffer, SCSI_SENSE_BUFFERSIZE,
7137						   diff_ns);
7138			return check_condition_result;
7139		}
7140	}
7141	mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
7142	if (sdebug_verbose)
7143		sdev_printk(KERN_INFO, sdp, "%s: Not ready: initializing command required\n",
7144			    my_name);
7145	return check_condition_result;
7146}
7147
7148static int scsi_debug_queuecommand(struct Scsi_Host *shost,
7149				   struct scsi_cmnd *scp)
7150{
7151	u8 sdeb_i;
7152	struct scsi_device *sdp = scp->device;
7153	const struct opcode_info_t *oip;
7154	const struct opcode_info_t *r_oip;
7155	struct sdebug_dev_info *devip;
7156	u8 *cmd = scp->cmnd;
7157	int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
7158	int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *) = NULL;
7159	int k, na;
7160	int errsts = 0;
7161	u32 flags;
7162	u16 sa;
7163	u8 opcode = cmd[0];
7164	bool has_wlun_rl;
7165	bool inject_now;
7166
7167	scsi_set_resid(scp, 0);
7168	if (sdebug_statistics) {
7169		atomic_inc(&sdebug_cmnd_count);
7170		inject_now = inject_on_this_cmd();
7171	} else {
7172		inject_now = false;
7173	}
7174	if (unlikely(sdebug_verbose &&
7175		     !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
7176		char b[120];
7177		int n, len, sb;
7178
7179		len = scp->cmd_len;
7180		sb = (int)sizeof(b);
7181		if (len > 32)
7182			strcpy(b, "too long, over 32 bytes");
7183		else {
7184			for (k = 0, n = 0; k < len && n < sb; ++k)
7185				n += scnprintf(b + n, sb - n, "%02x ",
7186					       (u32)cmd[k]);
7187		}
7188		sdev_printk(KERN_INFO, sdp, "%s: tag=%#x, cmd %s\n", my_name,
7189			    blk_mq_unique_tag(scp->request), b);
 
 
 
 
 
7190	}
7191	if (unlikely(inject_now && (sdebug_opts & SDEBUG_OPT_HOST_BUSY)))
7192		return SCSI_MLQUEUE_HOST_BUSY;
7193	has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
7194	if (unlikely((sdp->lun >= sdebug_max_luns) && !has_wlun_rl))
7195		goto err_out;
7196
7197	sdeb_i = opcode_ind_arr[opcode];	/* fully mapped */
7198	oip = &opcode_info_arr[sdeb_i];		/* safe if table consistent */
7199	devip = (struct sdebug_dev_info *)sdp->hostdata;
7200	if (unlikely(!devip)) {
7201		devip = find_build_dev_info(sdp);
7202		if (NULL == devip)
7203			goto err_out;
7204	}
7205	if (unlikely(inject_now && !atomic_read(&sdeb_inject_pending)))
7206		atomic_set(&sdeb_inject_pending, 1);
7207
7208	na = oip->num_attached;
7209	r_pfp = oip->pfp;
7210	if (na) {	/* multiple commands with this opcode */
7211		r_oip = oip;
7212		if (FF_SA & r_oip->flags) {
7213			if (F_SA_LOW & oip->flags)
7214				sa = 0x1f & cmd[1];
7215			else
7216				sa = get_unaligned_be16(cmd + 8);
7217			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7218				if (opcode == oip->opcode && sa == oip->sa)
7219					break;
7220			}
7221		} else {   /* since no service action only check opcode */
7222			for (k = 0; k <= na; oip = r_oip->arrp + k++) {
7223				if (opcode == oip->opcode)
7224					break;
7225			}
7226		}
7227		if (k > na) {
7228			if (F_SA_LOW & r_oip->flags)
7229				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
7230			else if (F_SA_HIGH & r_oip->flags)
7231				mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
7232			else
7233				mk_sense_invalid_opcode(scp);
7234			goto check_cond;
7235		}
7236	}	/* else (when na==0) we assume the oip is a match */
7237	flags = oip->flags;
7238	if (unlikely(F_INV_OP & flags)) {
7239		mk_sense_invalid_opcode(scp);
7240		goto check_cond;
7241	}
7242	if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
7243		if (sdebug_verbose)
7244			sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
7245				    my_name, opcode, " supported for wlun");
7246		mk_sense_invalid_opcode(scp);
7247		goto check_cond;
7248	}
7249	if (unlikely(sdebug_strict)) {	/* check cdb against mask */
7250		u8 rem;
7251		int j;
7252
7253		for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
7254			rem = ~oip->len_mask[k] & cmd[k];
7255			if (rem) {
7256				for (j = 7; j >= 0; --j, rem <<= 1) {
7257					if (0x80 & rem)
7258						break;
7259				}
7260				mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
7261				goto check_cond;
7262			}
7263		}
7264	}
7265	if (unlikely(!(F_SKIP_UA & flags) &&
7266		     find_first_bit(devip->uas_bm,
7267				    SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
7268		errsts = make_ua(scp, devip);
7269		if (errsts)
7270			goto check_cond;
7271	}
7272	if (unlikely(((F_M_ACCESS & flags) || scp->cmnd[0] == TEST_UNIT_READY) &&
7273		     atomic_read(&devip->stopped))) {
7274		errsts = resp_not_ready(scp, devip);
7275		if (errsts)
7276			goto fini;
 
 
 
7277	}
7278	if (sdebug_fake_rw && (F_FAKE_RW & flags))
7279		goto fini;
7280	if (unlikely(sdebug_every_nth)) {
7281		if (fake_timeout(scp))
7282			return 0;	/* ignore command: make trouble */
7283	}
7284	if (likely(oip->pfp))
7285		pfp = oip->pfp;	/* calls a resp_* function */
7286	else
7287		pfp = r_pfp;    /* if leaf function ptr NULL, try the root's */
7288
7289fini:
7290	if (F_DELAY_OVERR & flags)	/* cmds like INQUIRY respond asap */
7291		return schedule_resp(scp, devip, errsts, pfp, 0, 0);
7292	else if ((flags & F_LONG_DELAY) && (sdebug_jdelay > 0 ||
7293					    sdebug_ndelay > 10000)) {
7294		/*
7295		 * Skip long delays if ndelay <= 10 microseconds. Otherwise
7296		 * for Start Stop Unit (SSU) want at least 1 second delay and
7297		 * if sdebug_jdelay>1 want a long delay of that many seconds.
7298		 * For Synchronize Cache want 1/20 of SSU's delay.
7299		 */
7300		int jdelay = (sdebug_jdelay < 2) ? 1 : sdebug_jdelay;
7301		int denom = (flags & F_SYNC_DELAY) ? 20 : 1;
7302
7303		jdelay = mult_frac(USER_HZ * jdelay, HZ, denom * USER_HZ);
7304		return schedule_resp(scp, devip, errsts, pfp, jdelay, 0);
7305	} else
7306		return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay,
7307				     sdebug_ndelay);
7308check_cond:
7309	return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0);
7310err_out:
7311	return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, NULL, 0, 0);
7312}
7313
7314static struct scsi_host_template sdebug_driver_template = {
7315	.show_info =		scsi_debug_show_info,
7316	.write_info =		scsi_debug_write_info,
7317	.proc_name =		sdebug_proc_name,
7318	.name =			"SCSI DEBUG",
7319	.info =			scsi_debug_info,
7320	.slave_alloc =		scsi_debug_slave_alloc,
7321	.slave_configure =	scsi_debug_slave_configure,
7322	.slave_destroy =	scsi_debug_slave_destroy,
7323	.ioctl =		scsi_debug_ioctl,
7324	.queuecommand =		scsi_debug_queuecommand,
7325	.change_queue_depth =	sdebug_change_qdepth,
7326	.eh_abort_handler =	scsi_debug_abort,
7327	.eh_device_reset_handler = scsi_debug_device_reset,
7328	.eh_target_reset_handler = scsi_debug_target_reset,
7329	.eh_bus_reset_handler = scsi_debug_bus_reset,
7330	.eh_host_reset_handler = scsi_debug_host_reset,
7331	.can_queue =		SDEBUG_CANQUEUE,
7332	.this_id =		7,
7333	.sg_tablesize =		SG_MAX_SEGMENTS,
7334	.cmd_per_lun =		DEF_CMD_PER_LUN,
7335	.max_sectors =		-1U,
7336	.max_segment_size =	-1U,
7337	.module =		THIS_MODULE,
7338	.track_queue_depth =	1,
7339};
7340
7341static int sdebug_driver_probe(struct device *dev)
7342{
7343	int error = 0;
7344	struct sdebug_host_info *sdbg_host;
7345	struct Scsi_Host *hpnt;
7346	int hprot;
7347
7348	sdbg_host = to_sdebug_host(dev);
7349
7350	if (sdebug_host_max_queue)
7351		sdebug_driver_template.can_queue = sdebug_host_max_queue;
7352	else
7353		sdebug_driver_template.can_queue = sdebug_max_queue;
7354	if (!sdebug_clustering)
7355		sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
7356
7357	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
7358	if (NULL == hpnt) {
7359		pr_err("scsi_host_alloc failed\n");
7360		error = -ENODEV;
7361		return error;
7362	}
7363	if (submit_queues > nr_cpu_ids) {
7364		pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%u\n",
7365			my_name, submit_queues, nr_cpu_ids);
7366		submit_queues = nr_cpu_ids;
7367	}
7368	/*
7369	 * Decide whether to tell scsi subsystem that we want mq. The
7370	 * following should give the same answer for each host. If the host
7371	 * has a limit of hostwide max commands, then do not set.
7372	 */
7373	if (!sdebug_host_max_queue)
7374		hpnt->nr_hw_queues = submit_queues;
7375
7376	sdbg_host->shost = hpnt;
7377	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
7378	if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
7379		hpnt->max_id = sdebug_num_tgts + 1;
7380	else
7381		hpnt->max_id = sdebug_num_tgts;
7382	/* = sdebug_max_luns; */
7383	hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
7384
7385	hprot = 0;
7386
7387	switch (sdebug_dif) {
7388
7389	case T10_PI_TYPE1_PROTECTION:
7390		hprot = SHOST_DIF_TYPE1_PROTECTION;
7391		if (sdebug_dix)
7392			hprot |= SHOST_DIX_TYPE1_PROTECTION;
7393		break;
7394
7395	case T10_PI_TYPE2_PROTECTION:
7396		hprot = SHOST_DIF_TYPE2_PROTECTION;
7397		if (sdebug_dix)
7398			hprot |= SHOST_DIX_TYPE2_PROTECTION;
7399		break;
7400
7401	case T10_PI_TYPE3_PROTECTION:
7402		hprot = SHOST_DIF_TYPE3_PROTECTION;
7403		if (sdebug_dix)
7404			hprot |= SHOST_DIX_TYPE3_PROTECTION;
7405		break;
7406
7407	default:
7408		if (sdebug_dix)
7409			hprot |= SHOST_DIX_TYPE0_PROTECTION;
7410		break;
7411	}
7412
7413	scsi_host_set_prot(hpnt, hprot);
7414
7415	if (have_dif_prot || sdebug_dix)
7416		pr_info("host protection%s%s%s%s%s%s%s\n",
7417			(hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
7418			(hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
7419			(hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
7420			(hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
7421			(hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
7422			(hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
7423			(hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
7424
7425	if (sdebug_guard == 1)
7426		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
7427	else
7428		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
7429
7430	sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
7431	sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
7432	if (sdebug_every_nth)	/* need stats counters for every_nth */
7433		sdebug_statistics = true;
7434	error = scsi_add_host(hpnt, &sdbg_host->dev);
7435	if (error) {
7436		pr_err("scsi_add_host failed\n");
7437		error = -ENODEV;
7438		scsi_host_put(hpnt);
7439	} else {
7440		scsi_scan_host(hpnt);
7441	}
7442
7443	return error;
7444}
7445
7446static int sdebug_driver_remove(struct device *dev)
7447{
7448	struct sdebug_host_info *sdbg_host;
7449	struct sdebug_dev_info *sdbg_devinfo, *tmp;
7450
7451	sdbg_host = to_sdebug_host(dev);
7452
7453	if (!sdbg_host) {
7454		pr_err("Unable to locate host info\n");
7455		return -ENODEV;
7456	}
7457
7458	scsi_remove_host(sdbg_host->shost);
7459
7460	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
7461				 dev_list) {
7462		list_del(&sdbg_devinfo->dev_list);
7463		kfree(sdbg_devinfo->zstate);
7464		kfree(sdbg_devinfo);
7465	}
7466
7467	scsi_host_put(sdbg_host->shost);
7468	return 0;
7469}
7470
7471static int pseudo_lld_bus_match(struct device *dev,
7472				struct device_driver *dev_driver)
7473{
7474	return 1;
7475}
7476
7477static struct bus_type pseudo_lld_bus = {
7478	.name = "pseudo",
7479	.match = pseudo_lld_bus_match,
7480	.probe = sdebug_driver_probe,
7481	.remove = sdebug_driver_remove,
7482	.drv_groups = sdebug_drv_groups,
7483};