target_core_pscsi.c 27.6 KB
Newer Older
1 2 3 4 5
/*******************************************************************************
 * Filename:  target_core_pscsi.c
 *
 * This file contains the generic target mode <-> Linux SCSI subsystem plugin.
 *
6
 * (c) Copyright 2003-2013 Datera, Inc.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 *
 * Nicholas A. Bellinger <nab@kernel.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 ******************************************************************************/

#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>
35
#include <linux/ratelimit.h>
36
#include <linux/module.h>
37 38
#include <asm/unaligned.h>

39 40
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
41
#include <scsi/scsi_tcq.h>
42 43

#include <target/target_core_base.h>
44
#include <target/target_core_backend.h>
45

46
#include "target_core_alua.h"
47
#include "target_core_internal.h"
48 49 50 51
#include "target_core_pscsi.h"

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

52 53 54 55 56
static inline struct pscsi_dev_virt *PSCSI_DEV(struct se_device *dev)
{
	return container_of(dev, struct pscsi_dev_virt, dev);
}

57
static sense_reason_t pscsi_execute_cmd(struct se_cmd *cmd);
58
static void pscsi_req_done(struct request *, blk_status_t);
59 60 61 62 63 64 65 66 67 68 69

/*	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);
70 71
	if (!phv) {
		pr_err("Unable to allocate struct pscsi_hba_virt\n");
72
		return -ENOMEM;
73 74
	}
	phv->phv_host_id = host_id;
75
	phv->phv_mode = PHV_VIRTUAL_HOST_ID;
76

77
	hba->hba_ptr = phv;
78

79
	pr_debug("CORE_HBA[%d] - TCM SCSI HBA Driver %s on"
80
		" Generic Target Core Stack %s\n", hba->hba_id,
81
		PSCSI_VERSION, TARGET_CORE_VERSION);
82
	pr_debug("CORE_HBA[%d] - Attached SCSI HBA to Generic\n",
83
	       hba->hba_id);
84 85 86 87 88 89 90 91 92 93 94 95

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

96
		pr_debug("CORE_HBA[%d] - Detached SCSI HBA: %s from"
97 98 99 100
			" Generic Target Core\n", hba->hba_id,
			(scsi_host->hostt->name) ? (scsi_host->hostt->name) :
			"Unknown");
	} else
101
		pr_debug("CORE_HBA[%d] - Detached Virtual SCSI HBA"
102 103 104 105 106 107 108 109
			" 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 已提交
110
	struct pscsi_hba_virt *phv = hba->hba_ptr;
111 112 113 114
	struct Scsi_Host *sh = phv->phv_lld_host;
	/*
	 * Release the struct Scsi_Host
	 */
115 116
	if (!mode_flag) {
		if (!sh)
117 118 119
			return 0;

		phv->phv_lld_host = NULL;
120
		phv->phv_mode = PHV_VIRTUAL_HOST_ID;
121

122
		pr_debug("CORE_HBA[%d] - Disabled pSCSI HBA Passthrough"
123 124 125 126 127 128 129 130 131 132
			" %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
	 */
133
	sh = scsi_host_lookup(phv->phv_host_id);
W
Wei Yongjun 已提交
134
	if (!sh) {
135
		pr_err("pSCSI: Unable to locate SCSI Host for"
136
			" phv_host_id: %d\n", phv->phv_host_id);
W
Wei Yongjun 已提交
137
		return -EINVAL;
138 139 140 141 142
	}

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

143
	pr_debug("CORE_HBA[%d] - Enabled pSCSI HBA Passthrough %s\n",
144 145 146 147 148 149 150 151 152 153 154 155 156
		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)
157
		goto out_free;
158 159 160 161 162 163 164 165 166 167 168 169 170

	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.
	 */
171
	sdev->sector_size = get_unaligned_be24(&buf[9]);
172
out_free:
173 174
	if (!sdev->sector_size)
		sdev->sector_size = 1024;
175

176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
	kfree(buf);
}

static void
pscsi_set_inquiry_info(struct scsi_device *sdev, struct t10_wwn *wwn)
{
	unsigned char *buf;

	if (sdev->inquiry_len < INQUIRY_LEN)
		return;

	buf = sdev->inquiry;
	if (!buf)
		return;
	/*
	 * Use sdev->inquiry from drivers/scsi/scsi_scan.c:scsi_alloc_sdev()
	 */
	memcpy(&wwn->vendor[0], &buf[8], sizeof(wwn->vendor));
	memcpy(&wwn->model[0], &buf[16], sizeof(wwn->model));
	memcpy(&wwn->revision[0], &buf[32], sizeof(wwn->revision));
}

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)
206
		return -ENOMEM;
207 208 209 210 211

	memset(cdb, 0, MAX_COMMAND_SIZE);
	cdb[0] = INQUIRY;
	cdb[1] = 0x01; /* Query VPD */
	cdb[2] = 0x80; /* Unit Serial Number */
212
	put_unaligned_be16(INQUIRY_VPD_SERIAL_LEN, &cdb[3]);
213 214 215 216 217 218 219 220

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

221
	wwn->t10_dev->dev_flags |= DF_FIRMWARE_VPD_UNIT_SERIAL;
222 223 224 225 226 227

	kfree(buf);
	return 0;

out_free:
	kfree(buf);
228
	return -EPERM;
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
}

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 */
247
	put_unaligned_be16(INQUIRY_VPD_DEVICE_IDENTIFIER_LEN, &cdb[3]);
248 249 250 251 252 253 254

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

255
	page_len = get_unaligned_be16(&buf[2]);
256 257 258 259 260
	while (page_len > 0) {
		/* Grab a pointer to the Identification descriptor */
		page_83 = &buf[off];
		ident_len = page_83[3];
		if (!ident_len) {
261
			pr_err("page_83[3]: identifier"
262 263 264
					" length zero!\n");
			break;
		}
265
		pr_debug("T10 VPD Identifier Length: %d\n", ident_len);
266 267 268

		vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
		if (!vpd) {
269
			pr_err("Unable to allocate memory for"
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
					" 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);
}

300 301
static int pscsi_add_device_to_list(struct se_device *dev,
		struct scsi_device *sd)
302
{
303 304
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct request_queue *q = sd->request_queue;
305

306
	pdv->pdv_sd = sd;
307 308 309 310

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

H
Hannes Reinecke 已提交
311
		pr_err("Set broken SCSI Device %d:%d:%llu"
312 313 314
			" queue_depth to %d\n", sd->channel, sd->id,
				sd->lun, sd->queue_depth);
	}
315

316 317
	dev->dev_attrib.hw_block_size =
		min_not_zero((int)sd->sector_size, 512);
318
	dev->dev_attrib.hw_max_sectors =
319
		min_not_zero(sd->host->max_sectors, queue_max_hw_sectors(q));
320 321
	dev->dev_attrib.hw_queue_depth = sd->queue_depth;

322 323 324
	/*
	 * Setup our standard INQUIRY info into se_dev->t10_wwn
	 */
325
	pscsi_set_inquiry_info(sd, &dev->t10_wwn);
326 327 328 329 330

	/*
	 * Locate VPD WWN Information used for various purposes within
	 * the Storage Engine.
	 */
331
	if (!pscsi_get_inquiry_vpd_serial(sd, &dev->t10_wwn)) {
332 333 334 335
		/*
		 * If VPD Unit Serial returned GOOD status, try
		 * VPD Device Identification page (0x83).
		 */
336
		pscsi_get_inquiry_vpd_device_ident(sd, &dev->t10_wwn);
337 338 339 340 341
	}

	/*
	 * For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
	 */
342
	if (sd->type == TYPE_TAPE) {
343
		pscsi_tape_read_blocksize(dev, sd);
344 345
		dev->dev_attrib.hw_block_size = sd->sector_size;
	}
346
	return 0;
347 348
}

349 350
static struct se_device *pscsi_alloc_device(struct se_hba *hba,
		const char *name)
351 352 353 354
{
	struct pscsi_dev_virt *pdv;

	pdv = kzalloc(sizeof(struct pscsi_dev_virt), GFP_KERNEL);
355 356
	if (!pdv) {
		pr_err("Unable to allocate memory for struct pscsi_dev_virt\n");
357 358 359
		return NULL;
	}

360
	pr_debug("PSCSI: Allocated pdv: %p for %s\n", pdv, name);
361
	return &pdv->dev;
362 363 364 365 366
}

/*
 * Called with struct Scsi_Host->host_lock called.
 */
367
static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd)
368
	__releases(sh->host_lock)
369
{
370 371
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
372 373
	struct Scsi_Host *sh = sd->host;
	struct block_device *bd;
374
	int ret;
375 376

	if (scsi_device_get(sd)) {
H
Hannes Reinecke 已提交
377
		pr_err("scsi_device_get() failed for %d:%d:%d:%llu\n",
378 379
			sh->host_no, sd->channel, sd->id, sd->lun);
		spin_unlock_irq(sh->host_lock);
380
		return -EIO;
381 382 383 384
	}
	spin_unlock_irq(sh->host_lock);
	/*
	 * Claim exclusive struct block_device access to struct scsi_device
385
	 * for TYPE_DISK and TYPE_ZBC using supplied udev_path
386
	 */
387
	bd = blkdev_get_by_path(dev->udev_path,
388
				FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv);
389
	if (IS_ERR(bd)) {
390
		pr_err("pSCSI: blkdev_get_by_path() failed\n");
391
		scsi_device_put(sd);
392
		return PTR_ERR(bd);
393 394 395
	}
	pdv->pdv_bd = bd;

396 397
	ret = pscsi_add_device_to_list(dev, sd);
	if (ret) {
398 399
		blkdev_put(pdv->pdv_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
		scsi_device_put(sd);
400
		return ret;
401
	}
402

403 404 405
	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);
406
	return 0;
407 408 409 410 411
}

/*
 * Called with struct Scsi_Host->host_lock called.
 */
412
static int pscsi_create_type_nondisk(struct se_device *dev, struct scsi_device *sd)
413
	__releases(sh->host_lock)
414
{
415
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
416
	struct Scsi_Host *sh = sd->host;
417
	int ret;
418 419

	if (scsi_device_get(sd)) {
H
Hannes Reinecke 已提交
420
		pr_err("scsi_device_get() failed for %d:%d:%d:%llu\n",
421 422
			sh->host_no, sd->channel, sd->id, sd->lun);
		spin_unlock_irq(sh->host_lock);
423
		return -EIO;
424 425 426
	}
	spin_unlock_irq(sh->host_lock);

427 428
	ret = pscsi_add_device_to_list(dev, sd);
	if (ret) {
429
		scsi_device_put(sd);
430
		return ret;
431
	}
H
Hannes Reinecke 已提交
432
	pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%llu\n",
433 434 435
		phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
		sd->channel, sd->id, sd->lun);

436
	return 0;
437 438
}

439
static int pscsi_configure_device(struct se_device *dev)
440
{
441 442
	struct se_hba *hba = dev->se_hba;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
443
	struct scsi_device *sd;
444
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
445 446
	struct Scsi_Host *sh = phv->phv_lld_host;
	int legacy_mode_enable = 0;
447
	int ret;
448

449 450 451 452 453 454
	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;
455
	}
456

457 458 459 460
	/*
	 * 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
	 */
461
	if (!sh) {
462
		if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
463
			pr_err("pSCSI: Unable to locate struct"
464
				" Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
465
			return -ENODEV;
466 467
		}
		/*
468
		 * For the newer PHV_VIRTUAL_HOST_ID struct scsi_device
469 470
		 * reference, we enforce that udev_path has been set
		 */
471
		if (!(dev->dev_flags & DF_USING_UDEV_PATH)) {
472
			pr_err("pSCSI: udev_path attribute has not"
473
				" been set before ENABLE=1\n");
474
			return -EINVAL;
475 476
		}
		/*
477
		 * If no scsi_host_id= was passed for PHV_VIRTUAL_HOST_ID,
478 479 480 481
		 * 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)) {
482
			if (hba->dev_count) {
483
				pr_err("pSCSI: Unable to set hba_mode"
484
					" with active devices\n");
485
				return -EEXIST;
486 487 488
			}

			if (pscsi_pmode_enable_hba(hba, 1) != 1)
489
				return -ENODEV;
490 491 492 493 494

			legacy_mode_enable = 1;
			hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
			sh = phv->phv_lld_host;
		} else {
495
			sh = scsi_host_lookup(pdv->pdv_host_id);
W
Wei Yongjun 已提交
496
			if (!sh) {
497
				pr_err("pSCSI: Unable to locate"
498
					" pdv_host_id: %d\n", pdv->pdv_host_id);
W
Wei Yongjun 已提交
499
				return -EINVAL;
500
			}
501
			pdv->pdv_lld_host = sh;
502 503
		}
	} else {
504 505
		if (phv->phv_mode == PHV_VIRTUAL_HOST_ID) {
			pr_err("pSCSI: PHV_VIRTUAL_HOST_ID set while"
506
				" struct Scsi_Host exists\n");
507
			return -EEXIST;
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
		}
	}

	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:
524
		case TYPE_ZBC:
525
			ret = pscsi_create_type_disk(dev, sd);
526 527
			break;
		default:
528
			ret = pscsi_create_type_nondisk(dev, sd);
529 530 531
			break;
		}

532
		if (ret) {
533
			if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
534 535 536 537 538 539
				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;
540
			return ret;
541
		}
542
		return 0;
543 544 545
	}
	spin_unlock_irq(sh->host_lock);

546
	pr_err("pSCSI: Unable to locate %d:%d:%d:%d\n", sh->host_no,
547 548
		pdv->pdv_channel_id,  pdv->pdv_target_id, pdv->pdv_lun_id);

549
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
550 551 552 553 554 555
		scsi_host_put(sh);
	else if (legacy_mode_enable) {
		pscsi_pmode_enable_hba(hba, 0);
		hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
	}

556
	return -ENODEV;
557 558
}

559 560 561 562 563 564 565 566
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);
}

567
static void pscsi_free_device(struct se_device *dev)
568 569 570 571 572
{
	call_rcu(&dev->rcu_head, pscsi_dev_call_rcu);
}

static void pscsi_destroy_device(struct se_device *dev)
573
{
574 575
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
576 577 578 579 580
	struct scsi_device *sd = pdv->pdv_sd;

	if (sd) {
		/*
		 * Release exclusive pSCSI internal struct block_device claim for
581 582
		 * struct scsi_device with TYPE_DISK or TYPE_ZBC
		 * from pscsi_create_type_disk()
583
		 */
584 585
		if ((sd->type == TYPE_DISK || sd->type == TYPE_ZBC) &&
		    pdv->pdv_bd) {
586 587 588 589 590 591 592 593 594 595 596
			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);
597 598
		else if (pdv->pdv_lld_host)
			scsi_host_put(pdv->pdv_lld_host);
599

600
		scsi_device_put(sd);
601 602 603 604 605

		pdv->pdv_sd = NULL;
	}
}

606 607
static void pscsi_complete_cmd(struct se_cmd *cmd, u8 scsi_status,
			       unsigned char *req_sense)
608
{
609
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
610
	struct scsi_device *sd = pdv->pdv_sd;
611
	struct pscsi_plugin_task *pt = cmd->priv;
612 613 614 615 616 617
	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)
618
		return;
619

620
	cdb = &pt->pscsi_cdb[0];
621 622 623 624
	/*
	 * Hack to make sure that Write-Protect modepage is set if R/O mode is
	 * forced.
	 */
625
	if (!cmd->data_length)
626 627
		goto after_mode_sense;

628
	if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
629
	    scsi_status == SAM_STAT_GOOD) {
630 631 632
		bool read_only = target_lun_is_rdonly(cmd);

		if (read_only) {
633 634 635 636 637
			unsigned char *buf;

			buf = transport_kmap_data_sg(cmd);
			if (!buf)
				; /* XXX: TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE */
638 639 640 641 642 643 644 645

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

647
			transport_kunmap_data_sg(cmd);
648 649 650 651
		}
	}
after_mode_sense:

652
	if (sd->type != TYPE_TAPE || !cmd->data_length)
653 654 655 656 657 658 659 660 661 662 663
		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)) &&
664
	     scsi_status == SAM_STAT_GOOD) {
665 666 667 668
		unsigned char *buf;
		u16 bdl;
		u32 blocksize;

669
		buf = sg_virt(&cmd->t_data_sg[0]);
670 671
		if (!buf) {
			pr_err("Unable to get buf for scatterlist\n");
672 673 674 675
			goto after_mode_select;
		}

		if (cdb[0] == MODE_SELECT)
676
			bdl = buf[3];
677
		else
678
			bdl = get_unaligned_be16(&buf[6]);
679 680 681 682 683

		if (!bdl)
			goto after_mode_select;

		if (cdb[0] == MODE_SELECT)
684
			blocksize = get_unaligned_be24(&buf[9]);
685
		else
686
			blocksize = get_unaligned_be24(&buf[13]);
687 688 689 690 691

		sd->sector_size = blocksize;
	}
after_mode_select:

692 693
	if (scsi_status == SAM_STAT_CHECK_CONDITION)
		transport_copy_sense_to_cmd(cmd, req_sense);
694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
}

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

709 710
static ssize_t pscsi_set_configfs_dev_params(struct se_device *dev,
		const char *page, ssize_t count)
711
{
712 713
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
714 715 716 717 718 719 720 721 722 723
	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;

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

786
static ssize_t pscsi_show_configfs_dev_params(struct se_device *dev, char *b)
787
{
788 789
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
790 791 792 793 794
	struct scsi_device *sd = pdv->pdv_sd;
	unsigned char host_id[16];
	ssize_t bl;
	int i;

795
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
		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) {
		bl += sprintf(b + bl, "        ");
		bl += sprintf(b + bl, "Vendor: ");
		for (i = 0; i < 8; i++) {
			if (ISPRINT(sd->vendor[i]))   /* printable character? */
				bl += sprintf(b + bl, "%c", sd->vendor[i]);
			else
				bl += sprintf(b + bl, " ");
		}
		bl += sprintf(b + bl, " Model: ");
		for (i = 0; i < 16; i++) {
			if (ISPRINT(sd->model[i]))   /* printable character ? */
				bl += sprintf(b + bl, "%c", sd->model[i]);
			else
				bl += sprintf(b + bl, " ");
		}
		bl += sprintf(b + bl, " Rev: ");
		for (i = 0; i < 4; i++) {
			if (ISPRINT(sd->rev[i]))   /* printable character ? */
				bl += sprintf(b + bl, "%c", sd->rev[i]);
			else
				bl += sprintf(b + bl, " ");
		}
		bl += sprintf(b + bl, "\n");
	}
	return bl;
}

833
static void pscsi_bi_endio(struct bio *bio)
834 835 836 837
{
	bio_put(bio);
}

838
static inline struct bio *pscsi_get_bio(int nr_vecs)
839 840 841 842 843 844
{
	struct bio *bio;
	/*
	 * Use bio_malloc() following the comment in for bio -> struct request
	 * in block/blk-core.c:blk_make_request()
	 */
845
	bio = bio_kmalloc(GFP_KERNEL, nr_vecs);
846 847
	if (!bio) {
		pr_err("PSCSI: bio_kmalloc() failed\n");
848 849 850 851 852 853 854
		return NULL;
	}
	bio->bi_end_io = pscsi_bi_endio;

	return bio;
}

855 856
static sense_reason_t
pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
857
		struct request *req)
858
{
859
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
860
	struct bio *bio = NULL;
861 862
	struct page *page;
	struct scatterlist *sg;
863
	u32 data_len = cmd->data_length, i, len, bytes, off;
864
	int nr_pages = (cmd->data_length + sgl[0].offset +
865
			PAGE_SIZE - 1) >> PAGE_SHIFT;
866
	int nr_vecs = 0, rc;
867
	int rw = (cmd->data_direction == DMA_TO_DEVICE);
868

869
	BUG_ON(!cmd->data_length);
870

871
	pr_debug("PSCSI: nr_pages: %d\n", nr_pages);
872

873
	for_each_sg(sgl, sg, sgl_nents, i) {
874 875 876 877
		page = sg_page(sg);
		off = sg->offset;
		len = sg->length;

878
		pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
879 880
			page, len, off);

881 882 883 884 885 886 887 888
		/*
		 * 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) {
889 890 891
			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
			bytes = min(bytes, data_len);

892
			if (!bio) {
893 894 895 896 897
				nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
				nr_pages -= nr_vecs;
				/*
				 * Calls bio_kmalloc() and sets bio->bi_end_io()
				 */
898
				bio = pscsi_get_bio(nr_vecs);
899
				if (!bio)
900 901 902
					goto fail;

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

905
				pr_debug("PSCSI: Allocated bio: %p,"
906 907 908 909
					" dir: %s nr_vecs: %d\n", bio,
					(rw) ? "rw" : "r", nr_vecs);
			}

910
			pr_debug("PSCSI: Calling bio_add_pc_page() i: %d"
911 912 913 914 915
				" 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);
916
			pr_debug("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
917 918
				bio_segments(bio), nr_vecs);
			if (rc != bytes) {
919
				pr_debug("PSCSI: Reached bio->bi_vcnt max:"
920 921
					" %d i: %d bio: %p, allocating another"
					" bio\n", bio->bi_vcnt, i, bio);
922

J
Jens Axboe 已提交
923
				rc = blk_rq_append_bio(req, &bio);
924 925 926 927 928
				if (rc) {
					pr_err("pSCSI: failed to append bio\n");
					goto fail;
				}

929 930
				/*
				 * Clear the pointer so that another bio will
931
				 * be allocated with pscsi_get_bio() above.
932 933 934 935 936 937 938 939
				 */
				bio = NULL;
			}

			data_len -= bytes;
		}
	}

940
	if (bio) {
J
Jens Axboe 已提交
941
		rc = blk_rq_append_bio(req, &bio);
942 943 944 945 946 947
		if (rc) {
			pr_err("pSCSI: failed to append bio\n");
			goto fail;
		}
	}

948
	return 0;
949
fail:
950
	return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
951 952
}

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

959
	return passthrough_parse_cdb(cmd, pscsi_execute_cmd);
960 961
}

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

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

982 983
	memcpy(pt->pscsi_cdb, cmd->t_task_cdb,
		scsi_command_size(cmd->t_task_cdb));
984

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

995 996
	if (sgl) {
		ret = pscsi_map_sg(cmd, sgl, sgl_nents, req);
997
		if (ret)
998
			goto fail_put_request;
999 1000
	}

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

1012
	blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, req,
C
Christoph Hellwig 已提交
1013
			(cmd->sam_task_attr == TCM_HEAD_TAG),
1014 1015
			pscsi_req_done);

1016
	return 0;
1017

1018 1019
fail_put_request:
	blk_put_request(req);
1020 1021
fail:
	kfree(pt);
1022
	return ret;
1023 1024 1025 1026 1027 1028 1029 1030
}

/*	pscsi_get_device_type():
 *
 *
 */
static u32 pscsi_get_device_type(struct se_device *dev)
{
1031
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1032 1033
	struct scsi_device *sd = pdv->pdv_sd;

1034
	return (sd) ? sd->type : TYPE_NO_LUN;
1035 1036 1037 1038
}

static sector_t pscsi_get_blocks(struct se_device *dev)
{
1039
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1040 1041 1042 1043 1044 1045 1046

	if (pdv->pdv_bd && pdv->pdv_bd->bd_part)
		return pdv->pdv_bd->bd_part->nr_sects;

	return 0;
}

1047
static void pscsi_req_done(struct request *req, blk_status_t status)
1048
{
1049 1050
	struct se_cmd *cmd = req->end_io_data;
	struct pscsi_plugin_task *pt = cmd->priv;
1051 1052
	int result = scsi_req(req)->result;
	u8 scsi_status = status_byte(result) << 1;
1053

1054
	if (scsi_status) {
1055 1056
		pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1057
			result);
1058 1059
	}

1060 1061 1062
	pscsi_complete_cmd(cmd, scsi_status, scsi_req(req)->sense);

	switch (host_byte(result)) {
1063
	case DID_OK:
1064
		target_complete_cmd(cmd, scsi_status);
1065 1066
		break;
	default:
1067 1068
		pr_debug("PSCSI Host Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1069
			result);
1070
		target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION);
1071 1072 1073 1074
		break;
	}

	__blk_put_request(req->q, req);
1075
	kfree(pt);
1076 1077
}

1078
static const struct target_backend_ops pscsi_ops = {
1079 1080
	.name			= "pscsi",
	.owner			= THIS_MODULE,
1081
	.transport_flags	= TRANSPORT_FLAG_PASSTHROUGH |
B
Bryant G. Ly 已提交
1082 1083
				  TRANSPORT_FLAG_PASSTHROUGH_ALUA |
				  TRANSPORT_FLAG_PASSTHROUGH_PGR,
1084 1085 1086
	.attach_hba		= pscsi_attach_hba,
	.detach_hba		= pscsi_detach_hba,
	.pmode_enable_hba	= pscsi_pmode_enable_hba,
1087 1088
	.alloc_device		= pscsi_alloc_device,
	.configure_device	= pscsi_configure_device,
1089
	.destroy_device		= pscsi_destroy_device,
1090
	.free_device		= pscsi_free_device,
1091
	.parse_cdb		= pscsi_parse_cdb,
1092 1093 1094 1095
	.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,
1096
	.tb_dev_attrib_attrs	= passthrough_attrib_attrs,
1097 1098 1099 1100
};

static int __init pscsi_module_init(void)
{
1101
	return transport_backend_register(&pscsi_ops);
1102 1103
}

1104
static void __exit pscsi_module_exit(void)
1105
{
1106
	target_backend_unregister(&pscsi_ops);
1107 1108 1109 1110 1111 1112 1113 1114
}

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