target_core_pscsi.c 27.5 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
#include "target_core_pscsi.h"

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

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

/*	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);
55 56
	if (!phv) {
		pr_err("Unable to allocate struct pscsi_hba_virt\n");
57
		return -ENOMEM;
58 59
	}
	phv->phv_host_id = host_id;
60
	phv->phv_mode = PHV_VIRTUAL_HOST_ID;
61

62
	hba->hba_ptr = phv;
63

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

	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);

81
		pr_debug("CORE_HBA[%d] - Detached SCSI HBA: %s from"
82 83 84 85
			" Generic Target Core\n", hba->hba_id,
			(scsi_host->hostt->name) ? (scsi_host->hostt->name) :
			"Unknown");
	} else
86
		pr_debug("CORE_HBA[%d] - Detached Virtual SCSI HBA"
87 88 89 90 91 92 93 94
			" 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 已提交
95
	struct pscsi_hba_virt *phv = hba->hba_ptr;
96 97 98 99
	struct Scsi_Host *sh = phv->phv_lld_host;
	/*
	 * Release the struct Scsi_Host
	 */
100 101
	if (!mode_flag) {
		if (!sh)
102 103 104
			return 0;

		phv->phv_lld_host = NULL;
105
		phv->phv_mode = PHV_VIRTUAL_HOST_ID;
106

107
		pr_debug("CORE_HBA[%d] - Disabled pSCSI HBA Passthrough"
108 109 110 111 112 113 114 115 116 117
			" %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
	 */
118
	sh = scsi_host_lookup(phv->phv_host_id);
W
Wei Yongjun 已提交
119
	if (!sh) {
120
		pr_err("pSCSI: Unable to locate SCSI Host for"
121
			" phv_host_id: %d\n", phv->phv_host_id);
W
Wei Yongjun 已提交
122
		return -EINVAL;
123 124 125 126 127
	}

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

128
	pr_debug("CORE_HBA[%d] - Enabled pSCSI HBA Passthrough %s\n",
129 130 131 132 133 134 135 136 137 138 139 140 141
		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)
142
		goto out_free;
143 144 145 146 147 148 149 150 151 152 153 154 155

	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.
	 */
156
	sdev->sector_size = get_unaligned_be24(&buf[9]);
157
out_free:
158 159
	if (!sdev->sector_size)
		sdev->sector_size = 1024;
160

161 162 163 164 165 166 167 168 169
	kfree(buf);
}

static void
pscsi_set_inquiry_info(struct scsi_device *sdev, struct t10_wwn *wwn)
{
	if (sdev->inquiry_len < INQUIRY_LEN)
		return;
	/*
170
	 * Use sdev->inquiry data from drivers/scsi/scsi_scan.c:scsi_add_lun()
171
	 */
172 173 174 175 176 177 178 179 180
	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);
181 182 183 184 185 186 187 188 189 190
}

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)
191
		return -ENOMEM;
192 193 194 195 196

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

	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]);

206
	wwn->t10_dev->dev_flags |= DF_FIRMWARE_VPD_UNIT_SERIAL;
207 208 209 210 211 212

	kfree(buf);
	return 0;

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

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 */
232
	put_unaligned_be16(INQUIRY_VPD_DEVICE_IDENTIFIER_LEN, &cdb[3]);
233 234 235 236 237 238 239

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

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

		vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
		if (!vpd) {
254
			pr_err("Unable to allocate memory for"
255 256 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
					" 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);
}

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

291
	pdv->pdv_sd = sd;
292 293 294 295

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

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

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

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

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

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

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

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

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

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

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

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

388 389 390
	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);
391
	return 0;
392 393 394 395 396
}

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

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

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

421
	return 0;
422 423
}

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

434 435 436 437 438 439
	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;
440
	}
441

442 443 444 445
	/*
	 * 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
	 */
446
	if (!sh) {
447
		if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
448
			pr_err("pSCSI: Unable to locate struct"
449
				" Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
450
			return -ENODEV;
451 452
		}
		/*
453
		 * For the newer PHV_VIRTUAL_HOST_ID struct scsi_device
454 455
		 * reference, we enforce that udev_path has been set
		 */
456
		if (!(dev->dev_flags & DF_USING_UDEV_PATH)) {
457
			pr_err("pSCSI: udev_path attribute has not"
458
				" been set before ENABLE=1\n");
459
			return -EINVAL;
460 461
		}
		/*
462
		 * If no scsi_host_id= was passed for PHV_VIRTUAL_HOST_ID,
463 464 465 466
		 * 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)) {
467
			if (hba->dev_count) {
468
				pr_err("pSCSI: Unable to set hba_mode"
469
					" with active devices\n");
470
				return -EEXIST;
471 472 473
			}

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

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

	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:
509
		case TYPE_ZBC:
510
			ret = pscsi_create_type_disk(dev, sd);
511 512
			break;
		default:
513
			ret = pscsi_create_type_nondisk(dev, sd);
514 515 516
			break;
		}

517
		if (ret) {
518
			if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
519 520 521 522 523 524
				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;
525
			return ret;
526
		}
527
		return 0;
528 529 530
	}
	spin_unlock_irq(sh->host_lock);

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

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

541
	return -ENODEV;
542 543
}

544 545 546 547 548 549 550 551
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);
}

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

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

	if (sd) {
		/*
		 * Release exclusive pSCSI internal struct block_device claim for
566 567
		 * struct scsi_device with TYPE_DISK or TYPE_ZBC
		 * from pscsi_create_type_disk()
568
		 */
569 570
		if ((sd->type == TYPE_DISK || sd->type == TYPE_ZBC) &&
		    pdv->pdv_bd) {
571 572 573 574 575 576 577 578 579 580 581
			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);
582 583
		else if (pdv->pdv_lld_host)
			scsi_host_put(pdv->pdv_lld_host);
584

585
		scsi_device_put(sd);
586 587 588 589 590

		pdv->pdv_sd = NULL;
	}
}

591 592
static void pscsi_complete_cmd(struct se_cmd *cmd, u8 scsi_status,
			       unsigned char *req_sense)
593
{
594
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
595
	struct scsi_device *sd = pdv->pdv_sd;
596
	struct pscsi_plugin_task *pt = cmd->priv;
597 598 599 600 601 602
	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)
603
		return;
604

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

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

		if (read_only) {
618 619 620
			unsigned char *buf;

			buf = transport_kmap_data_sg(cmd);
621
			if (!buf) {
622
				; /* XXX: TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE */
623
			}
624 625 626 627 628 629 630 631

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

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

638
	if (sd->type != TYPE_TAPE || !cmd->data_length)
639 640 641 642 643 644 645 646 647 648 649
		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)) &&
650
	     scsi_status == SAM_STAT_GOOD) {
651 652 653 654
		unsigned char *buf;
		u16 bdl;
		u32 blocksize;

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

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

		if (!bdl)
			goto after_mode_select;

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

		sd->sector_size = blocksize;
	}
after_mode_select:

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

		/*
		 * 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;
			}
		}
	}
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
}

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}
};

716 717
static ssize_t pscsi_set_configfs_dev_params(struct se_device *dev,
		const char *page, ssize_t count)
718
{
719 720
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
721 722 723 724 725 726 727 728 729 730
	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;

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

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

801
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
802 803 804 805 806 807 808 809 810 811
		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) {
812 813 814 815 816 817
		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);
818 819 820 821
	}
	return bl;
}

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

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

	return bio;
}

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

858
	BUG_ON(!cmd->data_length);
859

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

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

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

870 871 872 873 874 875 876 877
		/*
		 * 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) {
878 879 880
			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
			bytes = min(bytes, data_len);

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

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

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

899
			pr_debug("PSCSI: Calling bio_add_pc_page() i: %d"
900 901 902 903 904
				" 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);
905
			pr_debug("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
906 907
				bio_segments(bio), nr_vecs);
			if (rc != bytes) {
908
				pr_debug("PSCSI: Reached bio->bi_vcnt max:"
909 910
					" %d i: %d bio: %p, allocating another"
					" bio\n", bio->bi_vcnt, i, bio);
911

912
				rc = blk_rq_append_bio(req, bio);
913 914 915 916 917
				if (rc) {
					pr_err("pSCSI: failed to append bio\n");
					goto fail;
				}

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

			data_len -= bytes;
		}
	}

930
	if (bio) {
931
		rc = blk_rq_append_bio(req, bio);
932 933 934 935 936 937
		if (rc) {
			pr_err("pSCSI: failed to append bio\n");
			goto fail;
		}
	}

938
	return 0;
939
fail:
940 941 942 943 944 945 946 947
	if (bio)
		bio_put(bio);
	while (req->bio) {
		bio = req->bio;
		req->bio = bio->bi_next;
		bio_put(bio);
	}
	req->biotail = NULL;
948
	return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
949 950
}

951 952
static sense_reason_t
pscsi_parse_cdb(struct se_cmd *cmd)
953
{
954 955
	if (cmd->se_cmd_flags & SCF_BIDI)
		return TCM_UNSUPPORTED_SCSI_OPCODE;
956

957
	return passthrough_parse_cdb(cmd, pscsi_execute_cmd);
958 959
}

960 961
static sense_reason_t
pscsi_execute_cmd(struct se_cmd *cmd)
962
{
963 964
	struct scatterlist *sgl = cmd->t_data_sg;
	u32 sgl_nents = cmd->t_data_nents;
965
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
966
	struct pscsi_plugin_task *pt;
967
	struct request *req;
968
	sense_reason_t ret;
969

970 971 972 973 974 975
	/*
	 * 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) {
976
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
977 978 979
	}
	cmd->priv = pt;

980 981
	memcpy(pt->pscsi_cdb, cmd->t_task_cdb,
		scsi_command_size(cmd->t_task_cdb));
982

983
	req = blk_get_request(pdv->pdv_sd->request_queue,
984
			cmd->data_direction == DMA_TO_DEVICE ?
985
			REQ_OP_DRV_OUT : REQ_OP_DRV_IN, 0);
986 987 988 989 990
	if (IS_ERR(req)) {
		pr_err("PSCSI: blk_get_request() failed\n");
		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
		goto fail;
	}
J
Jens Axboe 已提交
991

992 993
	if (sgl) {
		ret = pscsi_map_sg(cmd, sgl, sgl_nents, req);
994
		if (ret)
995
			goto fail_put_request;
996 997
	}

998
	req->end_io = pscsi_req_done;
999
	req->end_io_data = cmd;
1000 1001
	scsi_req(req)->cmd_len = scsi_command_size(pt->pscsi_cdb);
	scsi_req(req)->cmd = &pt->pscsi_cdb[0];
1002 1003
	if (pdv->pdv_sd->type == TYPE_DISK ||
	    pdv->pdv_sd->type == TYPE_ZBC)
1004 1005 1006
		req->timeout = PS_TIMEOUT_DISK;
	else
		req->timeout = PS_TIMEOUT_OTHER;
1007
	scsi_req(req)->retries = PS_RETRY;
1008

1009
	blk_execute_rq_nowait(NULL, req, (cmd->sam_task_attr == TCM_HEAD_TAG),
1010 1011
			pscsi_req_done);

1012
	return 0;
1013

1014 1015
fail_put_request:
	blk_put_request(req);
1016 1017
fail:
	kfree(pt);
1018
	return ret;
1019 1020 1021 1022 1023 1024 1025 1026
}

/*	pscsi_get_device_type():
 *
 *
 */
static u32 pscsi_get_device_type(struct se_device *dev)
{
1027
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1028 1029
	struct scsi_device *sd = pdv->pdv_sd;

1030
	return (sd) ? sd->type : TYPE_NO_LUN;
1031 1032 1033 1034
}

static sector_t pscsi_get_blocks(struct se_device *dev)
{
1035
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1036

1037 1038
	if (pdv->pdv_bd)
		return bdev_nr_sectors(pdv->pdv_bd);
1039 1040 1041
	return 0;
}

1042
static void pscsi_req_done(struct request *req, blk_status_t status)
1043
{
1044 1045
	struct se_cmd *cmd = req->end_io_data;
	struct pscsi_plugin_task *pt = cmd->priv;
1046 1047
	int result = scsi_req(req)->result;
	u8 scsi_status = status_byte(result) << 1;
1048

1049
	if (scsi_status != SAM_STAT_GOOD) {
1050 1051
		pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1052
			result);
1053 1054
	}

1055 1056 1057
	pscsi_complete_cmd(cmd, scsi_status, scsi_req(req)->sense);

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

J
Jens Axboe 已提交
1070
	blk_put_request(req);
1071
	kfree(pt);
1072 1073
}

1074
static const struct target_backend_ops pscsi_ops = {
1075 1076
	.name			= "pscsi",
	.owner			= THIS_MODULE,
1077 1078 1079
	.transport_flags_default = TRANSPORT_FLAG_PASSTHROUGH |
				   TRANSPORT_FLAG_PASSTHROUGH_ALUA |
				   TRANSPORT_FLAG_PASSTHROUGH_PGR,
1080 1081 1082
	.attach_hba		= pscsi_attach_hba,
	.detach_hba		= pscsi_detach_hba,
	.pmode_enable_hba	= pscsi_pmode_enable_hba,
1083 1084
	.alloc_device		= pscsi_alloc_device,
	.configure_device	= pscsi_configure_device,
1085
	.destroy_device		= pscsi_destroy_device,
1086
	.free_device		= pscsi_free_device,
1087
	.parse_cdb		= pscsi_parse_cdb,
1088 1089 1090 1091
	.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,
1092
	.tb_dev_attrib_attrs	= passthrough_attrib_attrs,
1093 1094 1095 1096
};

static int __init pscsi_module_init(void)
{
1097
	return transport_backend_register(&pscsi_ops);
1098 1099
}

1100
static void __exit pscsi_module_exit(void)
1101
{
1102
	target_backend_unregister(&pscsi_ops);
1103 1104 1105 1106 1107 1108 1109 1110
}

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);