target_core_pscsi.c 27.4 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-or-later
2 3 4 5 6
/*******************************************************************************
 * Filename:  target_core_pscsi.c
 *
 * This file contains the generic target mode <-> Linux SCSI subsystem plugin.
 *
7
 * (c) Copyright 2003-2013 Datera, Inc.
8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * Nicholas A. Bellinger <nab@kernel.org>
 *
 ******************************************************************************/

#include <linux/string.h>
#include <linux/parser.h>
#include <linux/timer.h>
#include <linux/blkdev.h>
#include <linux/blk_types.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/genhd.h>
#include <linux/cdrom.h>
22
#include <linux/ratelimit.h>
23
#include <linux/module.h>
24 25
#include <asm/unaligned.h>

26 27
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
28
#include <scsi/scsi_tcq.h>
29 30

#include <target/target_core_base.h>
31
#include <target/target_core_backend.h>
32

33
#include "target_core_alua.h"
34
#include "target_core_internal.h"
35 36 37 38
#include "target_core_pscsi.h"

#define ISPRINT(a)  ((a >= ' ') && (a <= '~'))

39 40 41 42 43
static inline struct pscsi_dev_virt *PSCSI_DEV(struct se_device *dev)
{
	return container_of(dev, struct pscsi_dev_virt, dev);
}

44
static sense_reason_t pscsi_execute_cmd(struct se_cmd *cmd);
45
static void pscsi_req_done(struct request *, blk_status_t);
46 47 48 49 50 51 52 53 54 55 56

/*	pscsi_attach_hba():
 *
 * 	pscsi_get_sh() used scsi_host_lookup() to locate struct Scsi_Host.
 *	from the passed SCSI Host ID.
 */
static int pscsi_attach_hba(struct se_hba *hba, u32 host_id)
{
	struct pscsi_hba_virt *phv;

	phv = kzalloc(sizeof(struct pscsi_hba_virt), GFP_KERNEL);
57 58
	if (!phv) {
		pr_err("Unable to allocate struct pscsi_hba_virt\n");
59
		return -ENOMEM;
60 61
	}
	phv->phv_host_id = host_id;
62
	phv->phv_mode = PHV_VIRTUAL_HOST_ID;
63

64
	hba->hba_ptr = phv;
65

66
	pr_debug("CORE_HBA[%d] - TCM SCSI HBA Driver %s on"
67
		" Generic Target Core Stack %s\n", hba->hba_id,
68
		PSCSI_VERSION, TARGET_CORE_VERSION);
69
	pr_debug("CORE_HBA[%d] - Attached SCSI HBA to Generic\n",
70
	       hba->hba_id);
71 72 73 74 75 76 77 78 79 80 81 82

	return 0;
}

static void pscsi_detach_hba(struct se_hba *hba)
{
	struct pscsi_hba_virt *phv = hba->hba_ptr;
	struct Scsi_Host *scsi_host = phv->phv_lld_host;

	if (scsi_host) {
		scsi_host_put(scsi_host);

83
		pr_debug("CORE_HBA[%d] - Detached SCSI HBA: %s from"
84 85 86 87
			" Generic Target Core\n", hba->hba_id,
			(scsi_host->hostt->name) ? (scsi_host->hostt->name) :
			"Unknown");
	} else
88
		pr_debug("CORE_HBA[%d] - Detached Virtual SCSI HBA"
89 90 91 92 93 94 95 96
			" from Generic Target Core\n", hba->hba_id);

	kfree(phv);
	hba->hba_ptr = NULL;
}

static int pscsi_pmode_enable_hba(struct se_hba *hba, unsigned long mode_flag)
{
J
Jörn Engel 已提交
97
	struct pscsi_hba_virt *phv = hba->hba_ptr;
98 99 100 101
	struct Scsi_Host *sh = phv->phv_lld_host;
	/*
	 * Release the struct Scsi_Host
	 */
102 103
	if (!mode_flag) {
		if (!sh)
104 105 106
			return 0;

		phv->phv_lld_host = NULL;
107
		phv->phv_mode = PHV_VIRTUAL_HOST_ID;
108

109
		pr_debug("CORE_HBA[%d] - Disabled pSCSI HBA Passthrough"
110 111 112 113 114 115 116 117 118 119
			" %s\n", hba->hba_id, (sh->hostt->name) ?
			(sh->hostt->name) : "Unknown");

		scsi_host_put(sh);
		return 0;
	}
	/*
	 * Otherwise, locate struct Scsi_Host from the original passed
	 * pSCSI Host ID and enable for phba mode
	 */
120
	sh = scsi_host_lookup(phv->phv_host_id);
W
Wei Yongjun 已提交
121
	if (!sh) {
122
		pr_err("pSCSI: Unable to locate SCSI Host for"
123
			" phv_host_id: %d\n", phv->phv_host_id);
W
Wei Yongjun 已提交
124
		return -EINVAL;
125 126 127 128 129
	}

	phv->phv_lld_host = sh;
	phv->phv_mode = PHV_LLD_SCSI_HOST_NO;

130
	pr_debug("CORE_HBA[%d] - Enabled pSCSI HBA Passthrough %s\n",
131 132 133 134 135 136 137 138 139 140 141 142 143
		hba->hba_id, (sh->hostt->name) ? (sh->hostt->name) : "Unknown");

	return 1;
}

static void pscsi_tape_read_blocksize(struct se_device *dev,
		struct scsi_device *sdev)
{
	unsigned char cdb[MAX_COMMAND_SIZE], *buf;
	int ret;

	buf = kzalloc(12, GFP_KERNEL);
	if (!buf)
144
		goto out_free;
145 146 147 148 149 150 151 152 153 154 155 156 157

	memset(cdb, 0, MAX_COMMAND_SIZE);
	cdb[0] = MODE_SENSE;
	cdb[4] = 0x0c; /* 12 bytes */

	ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf, 12, NULL,
			HZ, 1, NULL);
	if (ret)
		goto out_free;

	/*
	 * If MODE_SENSE still returns zero, set the default value to 1024.
	 */
158
	sdev->sector_size = get_unaligned_be24(&buf[9]);
159
out_free:
160 161
	if (!sdev->sector_size)
		sdev->sector_size = 1024;
162

163 164 165 166 167 168 169 170 171
	kfree(buf);
}

static void
pscsi_set_inquiry_info(struct scsi_device *sdev, struct t10_wwn *wwn)
{
	if (sdev->inquiry_len < INQUIRY_LEN)
		return;
	/*
172
	 * Use sdev->inquiry data from drivers/scsi/scsi_scan.c:scsi_add_lun()
173
	 */
174 175 176 177 178 179 180 181 182
	BUILD_BUG_ON(sizeof(wwn->vendor) != INQUIRY_VENDOR_LEN + 1);
	snprintf(wwn->vendor, sizeof(wwn->vendor),
		 "%." __stringify(INQUIRY_VENDOR_LEN) "s", sdev->vendor);
	BUILD_BUG_ON(sizeof(wwn->model) != INQUIRY_MODEL_LEN + 1);
	snprintf(wwn->model, sizeof(wwn->model),
		 "%." __stringify(INQUIRY_MODEL_LEN) "s", sdev->model);
	BUILD_BUG_ON(sizeof(wwn->revision) != INQUIRY_REVISION_LEN + 1);
	snprintf(wwn->revision, sizeof(wwn->revision),
		 "%." __stringify(INQUIRY_REVISION_LEN) "s", sdev->rev);
183 184 185 186 187 188 189 190 191 192
}

static int
pscsi_get_inquiry_vpd_serial(struct scsi_device *sdev, struct t10_wwn *wwn)
{
	unsigned char cdb[MAX_COMMAND_SIZE], *buf;
	int ret;

	buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
	if (!buf)
193
		return -ENOMEM;
194 195 196 197 198

	memset(cdb, 0, MAX_COMMAND_SIZE);
	cdb[0] = INQUIRY;
	cdb[1] = 0x01; /* Query VPD */
	cdb[2] = 0x80; /* Unit Serial Number */
199
	put_unaligned_be16(INQUIRY_VPD_SERIAL_LEN, &cdb[3]);
200 201 202 203 204 205 206 207

	ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
			      INQUIRY_VPD_SERIAL_LEN, NULL, HZ, 1, NULL);
	if (ret)
		goto out_free;

	snprintf(&wwn->unit_serial[0], INQUIRY_VPD_SERIAL_LEN, "%s", &buf[4]);

208
	wwn->t10_dev->dev_flags |= DF_FIRMWARE_VPD_UNIT_SERIAL;
209 210 211 212 213 214

	kfree(buf);
	return 0;

out_free:
	kfree(buf);
215
	return -EPERM;
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
}

static void
pscsi_get_inquiry_vpd_device_ident(struct scsi_device *sdev,
		struct t10_wwn *wwn)
{
	unsigned char cdb[MAX_COMMAND_SIZE], *buf, *page_83;
	int ident_len, page_len, off = 4, ret;
	struct t10_vpd *vpd;

	buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
	if (!buf)
		return;

	memset(cdb, 0, MAX_COMMAND_SIZE);
	cdb[0] = INQUIRY;
	cdb[1] = 0x01; /* Query VPD */
	cdb[2] = 0x83; /* Device Identifier */
234
	put_unaligned_be16(INQUIRY_VPD_DEVICE_IDENTIFIER_LEN, &cdb[3]);
235 236 237 238 239 240 241

	ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
			      INQUIRY_VPD_DEVICE_IDENTIFIER_LEN,
			      NULL, HZ, 1, NULL);
	if (ret)
		goto out;

242
	page_len = get_unaligned_be16(&buf[2]);
243 244 245 246 247
	while (page_len > 0) {
		/* Grab a pointer to the Identification descriptor */
		page_83 = &buf[off];
		ident_len = page_83[3];
		if (!ident_len) {
248
			pr_err("page_83[3]: identifier"
249 250 251
					" length zero!\n");
			break;
		}
252
		pr_debug("T10 VPD Identifier Length: %d\n", ident_len);
253 254 255

		vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
		if (!vpd) {
256
			pr_err("Unable to allocate memory for"
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
					" struct t10_vpd\n");
			goto out;
		}
		INIT_LIST_HEAD(&vpd->vpd_list);

		transport_set_vpd_proto_id(vpd, page_83);
		transport_set_vpd_assoc(vpd, page_83);

		if (transport_set_vpd_ident_type(vpd, page_83) < 0) {
			off += (ident_len + 4);
			page_len -= (ident_len + 4);
			kfree(vpd);
			continue;
		}
		if (transport_set_vpd_ident(vpd, page_83) < 0) {
			off += (ident_len + 4);
			page_len -= (ident_len + 4);
			kfree(vpd);
			continue;
		}

		list_add_tail(&vpd->vpd_list, &wwn->t10_vpd_list);
		off += (ident_len + 4);
		page_len -= (ident_len + 4);
	}

out:
	kfree(buf);
}

287 288
static int pscsi_add_device_to_list(struct se_device *dev,
		struct scsi_device *sd)
289
{
290 291
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct request_queue *q = sd->request_queue;
292

293
	pdv->pdv_sd = sd;
294 295 296 297

	if (!sd->queue_depth) {
		sd->queue_depth = PSCSI_DEFAULT_QUEUEDEPTH;

H
Hannes Reinecke 已提交
298
		pr_err("Set broken SCSI Device %d:%d:%llu"
299 300 301
			" queue_depth to %d\n", sd->channel, sd->id,
				sd->lun, sd->queue_depth);
	}
302

303 304
	dev->dev_attrib.hw_block_size =
		min_not_zero((int)sd->sector_size, 512);
305
	dev->dev_attrib.hw_max_sectors =
306
		min_not_zero(sd->host->max_sectors, queue_max_hw_sectors(q));
307 308
	dev->dev_attrib.hw_queue_depth = sd->queue_depth;

309 310 311
	/*
	 * Setup our standard INQUIRY info into se_dev->t10_wwn
	 */
312
	pscsi_set_inquiry_info(sd, &dev->t10_wwn);
313 314 315 316 317

	/*
	 * Locate VPD WWN Information used for various purposes within
	 * the Storage Engine.
	 */
318
	if (!pscsi_get_inquiry_vpd_serial(sd, &dev->t10_wwn)) {
319 320 321 322
		/*
		 * If VPD Unit Serial returned GOOD status, try
		 * VPD Device Identification page (0x83).
		 */
323
		pscsi_get_inquiry_vpd_device_ident(sd, &dev->t10_wwn);
324 325 326 327 328
	}

	/*
	 * For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
	 */
329
	if (sd->type == TYPE_TAPE) {
330
		pscsi_tape_read_blocksize(dev, sd);
331 332
		dev->dev_attrib.hw_block_size = sd->sector_size;
	}
333
	return 0;
334 335
}

336 337
static struct se_device *pscsi_alloc_device(struct se_hba *hba,
		const char *name)
338 339 340 341
{
	struct pscsi_dev_virt *pdv;

	pdv = kzalloc(sizeof(struct pscsi_dev_virt), GFP_KERNEL);
342 343
	if (!pdv) {
		pr_err("Unable to allocate memory for struct pscsi_dev_virt\n");
344 345 346
		return NULL;
	}

347
	pr_debug("PSCSI: Allocated pdv: %p for %s\n", pdv, name);
348
	return &pdv->dev;
349 350 351 352 353
}

/*
 * Called with struct Scsi_Host->host_lock called.
 */
354
static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd)
355
	__releases(sh->host_lock)
356
{
357 358
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
359 360
	struct Scsi_Host *sh = sd->host;
	struct block_device *bd;
361
	int ret;
362 363

	if (scsi_device_get(sd)) {
H
Hannes Reinecke 已提交
364
		pr_err("scsi_device_get() failed for %d:%d:%d:%llu\n",
365 366
			sh->host_no, sd->channel, sd->id, sd->lun);
		spin_unlock_irq(sh->host_lock);
367
		return -EIO;
368 369 370 371
	}
	spin_unlock_irq(sh->host_lock);
	/*
	 * Claim exclusive struct block_device access to struct scsi_device
372
	 * for TYPE_DISK and TYPE_ZBC using supplied udev_path
373
	 */
374
	bd = blkdev_get_by_path(dev->udev_path,
375
				FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv);
376
	if (IS_ERR(bd)) {
377
		pr_err("pSCSI: blkdev_get_by_path() failed\n");
378
		scsi_device_put(sd);
379
		return PTR_ERR(bd);
380 381 382
	}
	pdv->pdv_bd = bd;

383 384
	ret = pscsi_add_device_to_list(dev, sd);
	if (ret) {
385 386
		blkdev_put(pdv->pdv_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
		scsi_device_put(sd);
387
		return ret;
388
	}
389

390 391 392
	pr_debug("CORE_PSCSI[%d] - Added TYPE_%s for %d:%d:%d:%llu\n",
		phv->phv_host_id, sd->type == TYPE_DISK ? "DISK" : "ZBC",
		sh->host_no, sd->channel, sd->id, sd->lun);
393
	return 0;
394 395 396 397 398
}

/*
 * Called with struct Scsi_Host->host_lock called.
 */
399
static int pscsi_create_type_nondisk(struct se_device *dev, struct scsi_device *sd)
400
	__releases(sh->host_lock)
401
{
402
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
403
	struct Scsi_Host *sh = sd->host;
404
	int ret;
405 406

	if (scsi_device_get(sd)) {
H
Hannes Reinecke 已提交
407
		pr_err("scsi_device_get() failed for %d:%d:%d:%llu\n",
408 409
			sh->host_no, sd->channel, sd->id, sd->lun);
		spin_unlock_irq(sh->host_lock);
410
		return -EIO;
411 412 413
	}
	spin_unlock_irq(sh->host_lock);

414 415
	ret = pscsi_add_device_to_list(dev, sd);
	if (ret) {
416
		scsi_device_put(sd);
417
		return ret;
418
	}
H
Hannes Reinecke 已提交
419
	pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%llu\n",
420 421 422
		phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
		sd->channel, sd->id, sd->lun);

423
	return 0;
424 425
}

426
static int pscsi_configure_device(struct se_device *dev)
427
{
428 429
	struct se_hba *hba = dev->se_hba;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
430
	struct scsi_device *sd;
431
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
432 433
	struct Scsi_Host *sh = phv->phv_lld_host;
	int legacy_mode_enable = 0;
434
	int ret;
435

436 437 438 439 440 441
	if (!(pdv->pdv_flags & PDF_HAS_CHANNEL_ID) ||
	    !(pdv->pdv_flags & PDF_HAS_TARGET_ID) ||
	    !(pdv->pdv_flags & PDF_HAS_LUN_ID)) {
		pr_err("Missing scsi_channel_id=, scsi_target_id= and"
			" scsi_lun_id= parameters\n");
		return -EINVAL;
442
	}
443

444 445 446 447
	/*
	 * If not running in PHV_LLD_SCSI_HOST_NO mode, locate the
	 * struct Scsi_Host we will need to bring the TCM/pSCSI object online
	 */
448
	if (!sh) {
449
		if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
450
			pr_err("pSCSI: Unable to locate struct"
451
				" Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
452
			return -ENODEV;
453 454
		}
		/*
455
		 * For the newer PHV_VIRTUAL_HOST_ID struct scsi_device
456 457
		 * reference, we enforce that udev_path has been set
		 */
458
		if (!(dev->dev_flags & DF_USING_UDEV_PATH)) {
459
			pr_err("pSCSI: udev_path attribute has not"
460
				" been set before ENABLE=1\n");
461
			return -EINVAL;
462 463
		}
		/*
464
		 * If no scsi_host_id= was passed for PHV_VIRTUAL_HOST_ID,
465 466 467 468
		 * use the original TCM hba ID to reference Linux/SCSI Host No
		 * and enable for PHV_LLD_SCSI_HOST_NO mode.
		 */
		if (!(pdv->pdv_flags & PDF_HAS_VIRT_HOST_ID)) {
469
			if (hba->dev_count) {
470
				pr_err("pSCSI: Unable to set hba_mode"
471
					" with active devices\n");
472
				return -EEXIST;
473 474 475
			}

			if (pscsi_pmode_enable_hba(hba, 1) != 1)
476
				return -ENODEV;
477 478 479 480 481

			legacy_mode_enable = 1;
			hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
			sh = phv->phv_lld_host;
		} else {
482
			sh = scsi_host_lookup(pdv->pdv_host_id);
W
Wei Yongjun 已提交
483
			if (!sh) {
484
				pr_err("pSCSI: Unable to locate"
485
					" pdv_host_id: %d\n", pdv->pdv_host_id);
W
Wei Yongjun 已提交
486
				return -EINVAL;
487
			}
488
			pdv->pdv_lld_host = sh;
489 490
		}
	} else {
491 492
		if (phv->phv_mode == PHV_VIRTUAL_HOST_ID) {
			pr_err("pSCSI: PHV_VIRTUAL_HOST_ID set while"
493
				" struct Scsi_Host exists\n");
494
			return -EEXIST;
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
		}
	}

	spin_lock_irq(sh->host_lock);
	list_for_each_entry(sd, &sh->__devices, siblings) {
		if ((pdv->pdv_channel_id != sd->channel) ||
		    (pdv->pdv_target_id != sd->id) ||
		    (pdv->pdv_lun_id != sd->lun))
			continue;
		/*
		 * Functions will release the held struct scsi_host->host_lock
		 * before calling calling pscsi_add_device_to_list() to register
		 * struct scsi_device with target_core_mod.
		 */
		switch (sd->type) {
		case TYPE_DISK:
511
		case TYPE_ZBC:
512
			ret = pscsi_create_type_disk(dev, sd);
513 514
			break;
		default:
515
			ret = pscsi_create_type_nondisk(dev, sd);
516 517 518
			break;
		}

519
		if (ret) {
520
			if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
521 522 523 524 525 526
				scsi_host_put(sh);
			else if (legacy_mode_enable) {
				pscsi_pmode_enable_hba(hba, 0);
				hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
			}
			pdv->pdv_sd = NULL;
527
			return ret;
528
		}
529
		return 0;
530 531 532
	}
	spin_unlock_irq(sh->host_lock);

533
	pr_err("pSCSI: Unable to locate %d:%d:%d:%d\n", sh->host_no,
534 535
		pdv->pdv_channel_id,  pdv->pdv_target_id, pdv->pdv_lun_id);

536
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
537 538 539 540 541 542
		scsi_host_put(sh);
	else if (legacy_mode_enable) {
		pscsi_pmode_enable_hba(hba, 0);
		hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
	}

543
	return -ENODEV;
544 545
}

546 547 548 549 550 551 552 553
static void pscsi_dev_call_rcu(struct rcu_head *p)
{
	struct se_device *dev = container_of(p, struct se_device, rcu_head);
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);

	kfree(pdv);
}

554
static void pscsi_free_device(struct se_device *dev)
555 556 557 558 559
{
	call_rcu(&dev->rcu_head, pscsi_dev_call_rcu);
}

static void pscsi_destroy_device(struct se_device *dev)
560
{
561 562
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
563 564 565 566 567
	struct scsi_device *sd = pdv->pdv_sd;

	if (sd) {
		/*
		 * Release exclusive pSCSI internal struct block_device claim for
568 569
		 * struct scsi_device with TYPE_DISK or TYPE_ZBC
		 * from pscsi_create_type_disk()
570
		 */
571 572
		if ((sd->type == TYPE_DISK || sd->type == TYPE_ZBC) &&
		    pdv->pdv_bd) {
573 574 575 576 577 578 579 580 581 582 583
			blkdev_put(pdv->pdv_bd,
				   FMODE_WRITE|FMODE_READ|FMODE_EXCL);
			pdv->pdv_bd = NULL;
		}
		/*
		 * For HBA mode PHV_LLD_SCSI_HOST_NO, release the reference
		 * to struct Scsi_Host now.
		 */
		if ((phv->phv_mode == PHV_LLD_SCSI_HOST_NO) &&
		    (phv->phv_lld_host != NULL))
			scsi_host_put(phv->phv_lld_host);
584 585
		else if (pdv->pdv_lld_host)
			scsi_host_put(pdv->pdv_lld_host);
586

587
		scsi_device_put(sd);
588 589 590 591 592

		pdv->pdv_sd = NULL;
	}
}

593 594
static void pscsi_complete_cmd(struct se_cmd *cmd, u8 scsi_status,
			       unsigned char *req_sense)
595
{
596
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
597
	struct scsi_device *sd = pdv->pdv_sd;
598
	struct pscsi_plugin_task *pt = cmd->priv;
599 600 601 602 603 604
	unsigned char *cdb;
	/*
	 * Special case for REPORT_LUNs handling where pscsi_plugin_task has
	 * not been allocated because TCM is handling the emulation directly.
	 */
	if (!pt)
605
		return;
606

607
	cdb = &pt->pscsi_cdb[0];
608 609 610 611
	/*
	 * Hack to make sure that Write-Protect modepage is set if R/O mode is
	 * forced.
	 */
612
	if (!cmd->data_length)
613 614
		goto after_mode_sense;

615
	if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
616
	    scsi_status == SAM_STAT_GOOD) {
617 618 619
		bool read_only = target_lun_is_rdonly(cmd);

		if (read_only) {
620 621 622 623 624
			unsigned char *buf;

			buf = transport_kmap_data_sg(cmd);
			if (!buf)
				; /* XXX: TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE */
625 626 627 628 629 630 631 632

			if (cdb[0] == MODE_SENSE_10) {
				if (!(buf[3] & 0x80))
					buf[3] |= 0x80;
			} else {
				if (!(buf[2] & 0x80))
					buf[2] |= 0x80;
			}
633

634
			transport_kunmap_data_sg(cmd);
635 636 637 638
		}
	}
after_mode_sense:

639
	if (sd->type != TYPE_TAPE || !cmd->data_length)
640 641 642 643 644 645 646 647 648 649 650
		goto after_mode_select;

	/*
	 * Hack to correctly obtain the initiator requested blocksize for
	 * TYPE_TAPE.  Since this value is dependent upon each tape media,
	 * struct scsi_device->sector_size will not contain the correct value
	 * by default, so we go ahead and set it so
	 * TRANSPORT(dev)->get_blockdev() returns the correct value to the
	 * storage engine.
	 */
	if (((cdb[0] == MODE_SELECT) || (cdb[0] == MODE_SELECT_10)) &&
651
	     scsi_status == SAM_STAT_GOOD) {
652 653 654 655
		unsigned char *buf;
		u16 bdl;
		u32 blocksize;

656
		buf = sg_virt(&cmd->t_data_sg[0]);
657 658
		if (!buf) {
			pr_err("Unable to get buf for scatterlist\n");
659 660 661 662
			goto after_mode_select;
		}

		if (cdb[0] == MODE_SELECT)
663
			bdl = buf[3];
664
		else
665
			bdl = get_unaligned_be16(&buf[6]);
666 667 668 669 670

		if (!bdl)
			goto after_mode_select;

		if (cdb[0] == MODE_SELECT)
671
			blocksize = get_unaligned_be24(&buf[9]);
672
		else
673
			blocksize = get_unaligned_be24(&buf[13]);
674 675 676 677 678

		sd->sector_size = blocksize;
	}
after_mode_select:

679
	if (scsi_status == SAM_STAT_CHECK_CONDITION) {
680
		transport_copy_sense_to_cmd(cmd, req_sense);
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701

		/*
		 * check for TAPE device reads with
		 * FM/EOM/ILI set, so that we can get data
		 * back despite framework assumption that a
		 * check condition means there is no data
		 */
		if (sd->type == TYPE_TAPE &&
		    cmd->data_direction == DMA_FROM_DEVICE) {
			/*
			 * is sense data valid, fixed format,
			 * and have FM, EOM, or ILI set?
			 */
			if (req_sense[0] == 0xf0 &&	/* valid, fixed format */
			    req_sense[2] & 0xe0 &&	/* FM, EOM, or ILI */
			    (req_sense[2] & 0xf) == 0) { /* key==NO_SENSE */
				pr_debug("Tape FM/EOM/ILI status detected. Treat as normal read.\n");
				cmd->se_cmd_flags |= SCF_TREAT_READ_AS_NORMAL;
			}
		}
	}
702 703 704 705 706 707 708 709 710 711 712 713 714 715 716
}

enum {
	Opt_scsi_host_id, Opt_scsi_channel_id, Opt_scsi_target_id,
	Opt_scsi_lun_id, Opt_err
};

static match_table_t tokens = {
	{Opt_scsi_host_id, "scsi_host_id=%d"},
	{Opt_scsi_channel_id, "scsi_channel_id=%d"},
	{Opt_scsi_target_id, "scsi_target_id=%d"},
	{Opt_scsi_lun_id, "scsi_lun_id=%d"},
	{Opt_err, NULL}
};

717 718
static ssize_t pscsi_set_configfs_dev_params(struct se_device *dev,
		const char *page, ssize_t count)
719
{
720 721
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
722 723 724 725 726 727 728 729 730 731
	char *orig, *ptr, *opts;
	substring_t args[MAX_OPT_ARGS];
	int ret = 0, arg, token;

	opts = kstrdup(page, GFP_KERNEL);
	if (!opts)
		return -ENOMEM;

	orig = opts;

732
	while ((ptr = strsep(&opts, ",\n")) != NULL) {
733 734 735 736 737 738 739
		if (!*ptr)
			continue;

		token = match_token(ptr, tokens, args);
		switch (token) {
		case Opt_scsi_host_id:
			if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
740
				pr_err("PSCSI[%d]: Unable to accept"
741 742 743 744 745 746
					" scsi_host_id while phv_mode =="
					" PHV_LLD_SCSI_HOST_NO\n",
					phv->phv_host_id);
				ret = -EINVAL;
				goto out;
			}
747 748 749
			ret = match_int(args, &arg);
			if (ret)
				goto out;
750
			pdv->pdv_host_id = arg;
751
			pr_debug("PSCSI[%d]: Referencing SCSI Host ID:"
752 753 754 755
				" %d\n", phv->phv_host_id, pdv->pdv_host_id);
			pdv->pdv_flags |= PDF_HAS_VIRT_HOST_ID;
			break;
		case Opt_scsi_channel_id:
756 757 758
			ret = match_int(args, &arg);
			if (ret)
				goto out;
759
			pdv->pdv_channel_id = arg;
760
			pr_debug("PSCSI[%d]: Referencing SCSI Channel"
761 762 763 764 765
				" ID: %d\n",  phv->phv_host_id,
				pdv->pdv_channel_id);
			pdv->pdv_flags |= PDF_HAS_CHANNEL_ID;
			break;
		case Opt_scsi_target_id:
766 767 768
			ret = match_int(args, &arg);
			if (ret)
				goto out;
769
			pdv->pdv_target_id = arg;
770
			pr_debug("PSCSI[%d]: Referencing SCSI Target"
771 772 773 774 775
				" ID: %d\n", phv->phv_host_id,
				pdv->pdv_target_id);
			pdv->pdv_flags |= PDF_HAS_TARGET_ID;
			break;
		case Opt_scsi_lun_id:
776 777 778
			ret = match_int(args, &arg);
			if (ret)
				goto out;
779
			pdv->pdv_lun_id = arg;
780
			pr_debug("PSCSI[%d]: Referencing SCSI LUN ID:"
781 782 783 784 785 786 787 788 789 790 791 792 793
				" %d\n", phv->phv_host_id, pdv->pdv_lun_id);
			pdv->pdv_flags |= PDF_HAS_LUN_ID;
			break;
		default:
			break;
		}
	}

out:
	kfree(orig);
	return (!ret) ? count : ret;
}

794
static ssize_t pscsi_show_configfs_dev_params(struct se_device *dev, char *b)
795
{
796 797
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
798 799 800 801
	struct scsi_device *sd = pdv->pdv_sd;
	unsigned char host_id[16];
	ssize_t bl;

802
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
803 804 805 806 807 808 809 810 811 812
		snprintf(host_id, 16, "%d", pdv->pdv_host_id);
	else
		snprintf(host_id, 16, "PHBA Mode");

	bl = sprintf(b, "SCSI Device Bus Location:"
		" Channel ID: %d Target ID: %d LUN: %d Host ID: %s\n",
		pdv->pdv_channel_id, pdv->pdv_target_id, pdv->pdv_lun_id,
		host_id);

	if (sd) {
813 814 815 816 817 818
		bl += sprintf(b + bl, "        Vendor: %."
			__stringify(INQUIRY_VENDOR_LEN) "s", sd->vendor);
		bl += sprintf(b + bl, " Model: %."
			__stringify(INQUIRY_MODEL_LEN) "s", sd->model);
		bl += sprintf(b + bl, " Rev: %."
			__stringify(INQUIRY_REVISION_LEN) "s\n", sd->rev);
819 820 821 822
	}
	return bl;
}

823
static void pscsi_bi_endio(struct bio *bio)
824 825 826 827
{
	bio_put(bio);
}

828
static inline struct bio *pscsi_get_bio(int nr_vecs)
829 830 831 832 833 834
{
	struct bio *bio;
	/*
	 * Use bio_malloc() following the comment in for bio -> struct request
	 * in block/blk-core.c:blk_make_request()
	 */
835
	bio = bio_kmalloc(GFP_KERNEL, nr_vecs);
836 837
	if (!bio) {
		pr_err("PSCSI: bio_kmalloc() failed\n");
838 839 840 841 842 843 844
		return NULL;
	}
	bio->bi_end_io = pscsi_bi_endio;

	return bio;
}

845 846
static sense_reason_t
pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
847
		struct request *req)
848
{
849
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
850
	struct bio *bio = NULL;
851 852
	struct page *page;
	struct scatterlist *sg;
853
	u32 data_len = cmd->data_length, i, len, bytes, off;
854
	int nr_pages = (cmd->data_length + sgl[0].offset +
855
			PAGE_SIZE - 1) >> PAGE_SHIFT;
856
	int nr_vecs = 0, rc;
857
	int rw = (cmd->data_direction == DMA_TO_DEVICE);
858

859
	BUG_ON(!cmd->data_length);
860

861
	pr_debug("PSCSI: nr_pages: %d\n", nr_pages);
862

863
	for_each_sg(sgl, sg, sgl_nents, i) {
864 865 866 867
		page = sg_page(sg);
		off = sg->offset;
		len = sg->length;

868
		pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
869 870
			page, len, off);

871 872 873 874 875 876 877 878
		/*
		 * We only have one page of data in each sg element,
		 * we can not cross a page boundary.
		 */
		if (off + len > PAGE_SIZE)
			goto fail;

		if (len > 0 && data_len > 0) {
879 880 881
			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
			bytes = min(bytes, data_len);

882
			if (!bio) {
883
new_bio:
884 885 886 887 888
				nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
				nr_pages -= nr_vecs;
				/*
				 * Calls bio_kmalloc() and sets bio->bi_end_io()
				 */
889
				bio = pscsi_get_bio(nr_vecs);
890
				if (!bio)
891 892 893
					goto fail;

				if (rw)
M
Mike Christie 已提交
894
					bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
895

896
				pr_debug("PSCSI: Allocated bio: %p,"
897 898 899 900
					" dir: %s nr_vecs: %d\n", bio,
					(rw) ? "rw" : "r", nr_vecs);
			}

901
			pr_debug("PSCSI: Calling bio_add_pc_page() i: %d"
902 903 904 905 906
				" bio: %p page: %p len: %d off: %d\n", i, bio,
				page, len, off);

			rc = bio_add_pc_page(pdv->pdv_sd->request_queue,
					bio, page, bytes, off);
907
			pr_debug("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
908 909
				bio_segments(bio), nr_vecs);
			if (rc != bytes) {
910
				pr_debug("PSCSI: Reached bio->bi_vcnt max:"
911 912
					" %d i: %d bio: %p, allocating another"
					" bio\n", bio->bi_vcnt, i, bio);
913

J
Jens Axboe 已提交
914
				rc = blk_rq_append_bio(req, &bio);
915 916 917 918 919
				if (rc) {
					pr_err("pSCSI: failed to append bio\n");
					goto fail;
				}

920 921
				/*
				 * Clear the pointer so that another bio will
922
				 * be allocated with pscsi_get_bio() above.
923 924
				 */
				bio = NULL;
925
				goto new_bio;
926 927 928 929 930 931
			}

			data_len -= bytes;
		}
	}

932
	if (bio) {
J
Jens Axboe 已提交
933
		rc = blk_rq_append_bio(req, &bio);
934 935 936 937 938 939
		if (rc) {
			pr_err("pSCSI: failed to append bio\n");
			goto fail;
		}
	}

940
	return 0;
941
fail:
942
	return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
943 944
}

945 946
static sense_reason_t
pscsi_parse_cdb(struct se_cmd *cmd)
947
{
948 949
	if (cmd->se_cmd_flags & SCF_BIDI)
		return TCM_UNSUPPORTED_SCSI_OPCODE;
950

951
	return passthrough_parse_cdb(cmd, pscsi_execute_cmd);
952 953
}

954 955
static sense_reason_t
pscsi_execute_cmd(struct se_cmd *cmd)
956
{
957 958
	struct scatterlist *sgl = cmd->t_data_sg;
	u32 sgl_nents = cmd->t_data_nents;
959
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
960
	struct pscsi_plugin_task *pt;
961
	struct request *req;
962
	sense_reason_t ret;
963

964 965 966 967 968 969
	/*
	 * Dynamically alloc cdb space, since it may be larger than
	 * TCM_MAX_COMMAND_SIZE
	 */
	pt = kzalloc(sizeof(*pt) + scsi_command_size(cmd->t_task_cdb), GFP_KERNEL);
	if (!pt) {
970
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
971 972 973
	}
	cmd->priv = pt;

974 975
	memcpy(pt->pscsi_cdb, cmd->t_task_cdb,
		scsi_command_size(cmd->t_task_cdb));
976

977
	req = blk_get_request(pdv->pdv_sd->request_queue,
978
			cmd->data_direction == DMA_TO_DEVICE ?
979
			REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, 0);
980 981 982 983 984
	if (IS_ERR(req)) {
		pr_err("PSCSI: blk_get_request() failed\n");
		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
		goto fail;
	}
J
Jens Axboe 已提交
985

986 987
	if (sgl) {
		ret = pscsi_map_sg(cmd, sgl, sgl_nents, req);
988
		if (ret)
989
			goto fail_put_request;
990 991
	}

992
	req->end_io = pscsi_req_done;
993
	req->end_io_data = cmd;
994 995
	scsi_req(req)->cmd_len = scsi_command_size(pt->pscsi_cdb);
	scsi_req(req)->cmd = &pt->pscsi_cdb[0];
996 997
	if (pdv->pdv_sd->type == TYPE_DISK ||
	    pdv->pdv_sd->type == TYPE_ZBC)
998 999 1000
		req->timeout = PS_TIMEOUT_DISK;
	else
		req->timeout = PS_TIMEOUT_OTHER;
1001
	scsi_req(req)->retries = PS_RETRY;
1002

1003
	blk_execute_rq_nowait(NULL, req, (cmd->sam_task_attr == TCM_HEAD_TAG),
1004 1005
			pscsi_req_done);

1006
	return 0;
1007

1008 1009
fail_put_request:
	blk_put_request(req);
1010 1011
fail:
	kfree(pt);
1012
	return ret;
1013 1014 1015 1016 1017 1018 1019 1020
}

/*	pscsi_get_device_type():
 *
 *
 */
static u32 pscsi_get_device_type(struct se_device *dev)
{
1021
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1022 1023
	struct scsi_device *sd = pdv->pdv_sd;

1024
	return (sd) ? sd->type : TYPE_NO_LUN;
1025 1026 1027 1028
}

static sector_t pscsi_get_blocks(struct se_device *dev)
{
1029
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1030

1031 1032
	if (pdv->pdv_bd)
		return bdev_nr_sectors(pdv->pdv_bd);
1033 1034 1035
	return 0;
}

1036
static void pscsi_req_done(struct request *req, blk_status_t status)
1037
{
1038 1039
	struct se_cmd *cmd = req->end_io_data;
	struct pscsi_plugin_task *pt = cmd->priv;
1040 1041
	int result = scsi_req(req)->result;
	u8 scsi_status = status_byte(result) << 1;
1042

1043
	if (scsi_status) {
1044 1045
		pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1046
			result);
1047 1048
	}

1049 1050 1051
	pscsi_complete_cmd(cmd, scsi_status, scsi_req(req)->sense);

	switch (host_byte(result)) {
1052
	case DID_OK:
1053 1054
		target_complete_cmd_with_length(cmd, scsi_status,
			cmd->data_length - scsi_req(req)->resid_len);
1055 1056
		break;
	default:
1057 1058
		pr_debug("PSCSI Host Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1059
			result);
1060
		target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION);
1061 1062 1063
		break;
	}

J
Jens Axboe 已提交
1064
	blk_put_request(req);
1065
	kfree(pt);
1066 1067
}

1068
static const struct target_backend_ops pscsi_ops = {
1069 1070
	.name			= "pscsi",
	.owner			= THIS_MODULE,
1071 1072 1073
	.transport_flags_default = TRANSPORT_FLAG_PASSTHROUGH |
				   TRANSPORT_FLAG_PASSTHROUGH_ALUA |
				   TRANSPORT_FLAG_PASSTHROUGH_PGR,
1074 1075 1076
	.attach_hba		= pscsi_attach_hba,
	.detach_hba		= pscsi_detach_hba,
	.pmode_enable_hba	= pscsi_pmode_enable_hba,
1077 1078
	.alloc_device		= pscsi_alloc_device,
	.configure_device	= pscsi_configure_device,
1079
	.destroy_device		= pscsi_destroy_device,
1080
	.free_device		= pscsi_free_device,
1081
	.parse_cdb		= pscsi_parse_cdb,
1082 1083 1084 1085
	.set_configfs_dev_params = pscsi_set_configfs_dev_params,
	.show_configfs_dev_params = pscsi_show_configfs_dev_params,
	.get_device_type	= pscsi_get_device_type,
	.get_blocks		= pscsi_get_blocks,
1086
	.tb_dev_attrib_attrs	= passthrough_attrib_attrs,
1087 1088 1089 1090
};

static int __init pscsi_module_init(void)
{
1091
	return transport_backend_register(&pscsi_ops);
1092 1093
}

1094
static void __exit pscsi_module_exit(void)
1095
{
1096
	target_backend_unregister(&pscsi_ops);
1097 1098 1099 1100 1101 1102 1103 1104
}

MODULE_DESCRIPTION("TCM PSCSI subsystem plugin");
MODULE_AUTHOR("nab@Linux-iSCSI.org");
MODULE_LICENSE("GPL");

module_init(pscsi_module_init);
module_exit(pscsi_module_exit);