target_core_pscsi.c 29.8 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 41 42
#include <scsi/scsi.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_host.h>
43
#include <scsi/scsi_tcq.h>
44 45

#include <target/target_core_base.h>
46
#include <target/target_core_backend.h>
47

48
#include "target_core_alua.h"
49 50 51 52
#include "target_core_pscsi.h"

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

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

58 59
static struct se_subsystem_api pscsi_template;

60
static sense_reason_t pscsi_execute_cmd(struct se_cmd *cmd);
61 62 63 64 65 66 67 68 69 70 71 72
static void pscsi_req_done(struct request *, int);

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

80
	hba->hba_ptr = phv;
81

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

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

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

		phv->phv_lld_host = NULL;
123
		phv->phv_mode = PHV_VIRTUAL_HOST_ID;
124

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

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

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

	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.
	 */
	sdev->sector_size = (buf[9] << 16) | (buf[10] << 8) | (buf[11]);
	if (!sdev->sector_size)
		sdev->sector_size = 1024;
out_free:
	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)
208
		return -ENOMEM;
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223

	memset(cdb, 0, MAX_COMMAND_SIZE);
	cdb[0] = INQUIRY;
	cdb[1] = 0x01; /* Query VPD */
	cdb[2] = 0x80; /* Unit Serial Number */
	cdb[3] = (INQUIRY_VPD_SERIAL_LEN >> 8) & 0xff;
	cdb[4] = (INQUIRY_VPD_SERIAL_LEN & 0xff);

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

224
	wwn->t10_dev->dev_flags |= DF_FIRMWARE_VPD_UNIT_SERIAL;
225 226 227 228 229 230

	kfree(buf);
	return 0;

out_free:
	kfree(buf);
231
	return -EPERM;
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
}

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 */
	cdb[3] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN >> 8) & 0xff;
	cdb[4] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN & 0xff);

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

	page_len = (buf[2] << 8) | buf[3];
	while (page_len > 0) {
		/* Grab a pointer to the Identification descriptor */
		page_83 = &buf[off];
		ident_len = page_83[3];
		if (!ident_len) {
265
			pr_err("page_83[3]: identifier"
266 267 268
					" length zero!\n");
			break;
		}
269
		pr_debug("T10 VPD Identifier Length: %d\n", ident_len);
270 271 272

		vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
		if (!vpd) {
273
			pr_err("Unable to allocate memory for"
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 300 301 302 303
					" 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);
}

304 305
static int pscsi_add_device_to_list(struct se_device *dev,
		struct scsi_device *sd)
306
{
307 308
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct request_queue *q = sd->request_queue;
309

310
	pdv->pdv_sd = sd;
311 312 313 314

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

H
Hannes Reinecke 已提交
315
		pr_err("Set broken SCSI Device %d:%d:%llu"
316 317 318
			" queue_depth to %d\n", sd->channel, sd->id,
				sd->lun, sd->queue_depth);
	}
319 320 321 322 323 324

	dev->dev_attrib.hw_block_size = sd->sector_size;
	dev->dev_attrib.hw_max_sectors =
		min_t(int, sd->host->max_sectors, queue_max_hw_sectors(q));
	dev->dev_attrib.hw_queue_depth = sd->queue_depth;

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

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

	/*
	 * For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
	 */
	if (sd->type == TYPE_TAPE)
		pscsi_tape_read_blocksize(dev, sd);
347
	return 0;
348 349
}

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

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

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

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

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

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

H
Hannes Reinecke 已提交
404
	pr_debug("CORE_PSCSI[%d] - Added TYPE_DISK for %d:%d:%d:%llu\n",
405
		phv->phv_host_id, 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_rom(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
}

/*
440
 * Called with struct Scsi_Host->host_lock called.
441
 */
442 443
static int pscsi_create_type_other(struct se_device *dev,
		struct scsi_device *sd)
444
	__releases(sh->host_lock)
445
{
446
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
447
	struct Scsi_Host *sh = sd->host;
448
	int ret;
449 450

	spin_unlock_irq(sh->host_lock);
451 452 453
	ret = pscsi_add_device_to_list(dev, sd);
	if (ret)
		return ret;
454

H
Hannes Reinecke 已提交
455
	pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%llu\n",
456 457
		phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
		sd->channel, sd->id, sd->lun);
458
	return 0;
459 460
}

461
static int pscsi_configure_device(struct se_device *dev)
462
{
463 464
	struct se_hba *hba = dev->se_hba;
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
465
	struct scsi_device *sd;
466
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
467 468
	struct Scsi_Host *sh = phv->phv_lld_host;
	int legacy_mode_enable = 0;
469
	int ret;
470

471 472 473 474 475 476
	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;
477
	}
478

479 480 481 482
	/*
	 * 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
	 */
483
	if (!sh) {
484
		if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
485
			pr_err("pSCSI: Unable to locate struct"
486
				" Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
487
			return -ENODEV;
488 489
		}
		/*
490
		 * For the newer PHV_VIRTUAL_HOST_ID struct scsi_device
491 492
		 * reference, we enforce that udev_path has been set
		 */
493
		if (!(dev->dev_flags & DF_USING_UDEV_PATH)) {
494
			pr_err("pSCSI: udev_path attribute has not"
495
				" been set before ENABLE=1\n");
496
			return -EINVAL;
497 498
		}
		/*
499
		 * If no scsi_host_id= was passed for PHV_VIRTUAL_HOST_ID,
500 501 502 503
		 * 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)) {
504
			if (hba->dev_count) {
505
				pr_err("pSCSI: Unable to set hba_mode"
506
					" with active devices\n");
507
				return -EEXIST;
508 509 510
			}

			if (pscsi_pmode_enable_hba(hba, 1) != 1)
511
				return -ENODEV;
512 513 514 515 516

			legacy_mode_enable = 1;
			hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
			sh = phv->phv_lld_host;
		} else {
517
			sh = scsi_host_lookup(pdv->pdv_host_id);
W
Wei Yongjun 已提交
518
			if (!sh) {
519
				pr_err("pSCSI: Unable to locate"
520
					" pdv_host_id: %d\n", pdv->pdv_host_id);
W
Wei Yongjun 已提交
521
				return -EINVAL;
522 523 524
			}
		}
	} else {
525 526
		if (phv->phv_mode == PHV_VIRTUAL_HOST_ID) {
			pr_err("pSCSI: PHV_VIRTUAL_HOST_ID set while"
527
				" struct Scsi_Host exists\n");
528
			return -EEXIST;
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
		}
	}

	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:
545
			ret = pscsi_create_type_disk(dev, sd);
546 547
			break;
		case TYPE_ROM:
548
			ret = pscsi_create_type_rom(dev, sd);
549 550
			break;
		default:
551
			ret = pscsi_create_type_other(dev, sd);
552 553 554
			break;
		}

555
		if (ret) {
556
			if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
557 558 559 560 561 562
				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;
563
			return ret;
564
		}
565
		return 0;
566 567 568
	}
	spin_unlock_irq(sh->host_lock);

569
	pr_err("pSCSI: Unable to locate %d:%d:%d:%d\n", sh->host_no,
570 571
		pdv->pdv_channel_id,  pdv->pdv_target_id, pdv->pdv_lun_id);

572
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
573 574 575 576 577 578
		scsi_host_put(sh);
	else if (legacy_mode_enable) {
		pscsi_pmode_enable_hba(hba, 0);
		hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
	}

579
	return -ENODEV;
580 581
}

582
static void pscsi_free_device(struct se_device *dev)
583
{
584 585
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614
	struct scsi_device *sd = pdv->pdv_sd;

	if (sd) {
		/*
		 * Release exclusive pSCSI internal struct block_device claim for
		 * struct scsi_device with TYPE_DISK from pscsi_create_type_disk()
		 */
		if ((sd->type == TYPE_DISK) && pdv->pdv_bd) {
			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);

		if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM))
			scsi_device_put(sd);

		pdv->pdv_sd = NULL;
	}

	kfree(pdv);
}

615 616
static void pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg,
				     unsigned char *sense_buffer)
617
{
618
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
619 620
	struct scsi_device *sd = pdv->pdv_sd;
	int result;
621
	struct pscsi_plugin_task *pt = cmd->priv;
622 623 624 625 626 627
	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)
628
		return;
629

630
	cdb = &pt->pscsi_cdb[0];
631 632 633 634 635
	result = pt->pscsi_result;
	/*
	 * Hack to make sure that Write-Protect modepage is set if R/O mode is
	 * forced.
	 */
636 637 638
	if (!cmd->se_deve || !cmd->data_length)
		goto after_mode_sense;

639 640
	if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
	     (status_byte(result) << 1) == SAM_STAT_GOOD) {
641
		if (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY) {
642 643 644 645 646
			unsigned char *buf;

			buf = transport_kmap_data_sg(cmd);
			if (!buf)
				; /* XXX: TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE */
647 648 649 650 651 652 653 654

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

656
			transport_kunmap_data_sg(cmd);
657 658 659 660
		}
	}
after_mode_sense:

661
	if (sd->type != TYPE_TAPE || !cmd->data_length)
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678
		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)) &&
	      (status_byte(result) << 1) == SAM_STAT_GOOD) {
		unsigned char *buf;
		u16 bdl;
		u32 blocksize;

		buf = sg_virt(&sg[0]);
679 680
		if (!buf) {
			pr_err("Unable to get buf for scatterlist\n");
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
			goto after_mode_select;
		}

		if (cdb[0] == MODE_SELECT)
			bdl = (buf[3]);
		else
			bdl = (buf[6] << 8) | (buf[7]);

		if (!bdl)
			goto after_mode_select;

		if (cdb[0] == MODE_SELECT)
			blocksize = (buf[9] << 16) | (buf[10] << 8) |
					(buf[11]);
		else
			blocksize = (buf[13] << 16) | (buf[14] << 8) |
					(buf[15]);

		sd->sector_size = blocksize;
	}
after_mode_select:

703 704 705 706
	if (sense_buffer && (status_byte(result) & CHECK_CONDITION)) {
		memcpy(sense_buffer, pt->pscsi_sense, TRANSPORT_SENSE_BUFFER);
		cmd->se_cmd_flags |= SCF_TRANSPORT_TASK_SENSE;
	}
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721
}

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

722 723
static ssize_t pscsi_set_configfs_dev_params(struct se_device *dev,
		const char *page, ssize_t count)
724
{
725 726
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
	struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
727 728 729 730 731 732 733 734 735 736
	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;

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

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

800
	if (phv->phv_mode == PHV_VIRTUAL_HOST_ID)
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 833 834 835 836 837 838 839 840 841 842
		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;
}

static void pscsi_bi_endio(struct bio *bio, int error)
{
	bio_put(bio);
}

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

	return bio;
}

860 861 862
static sense_reason_t
pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
		enum dma_data_direction data_direction, struct bio **hbio)
863
{
864
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
865
	struct bio *bio = NULL, *tbio = NULL;
866 867
	struct page *page;
	struct scatterlist *sg;
868
	u32 data_len = cmd->data_length, i, len, bytes, off;
869
	int nr_pages = (cmd->data_length + sgl[0].offset +
870
			PAGE_SIZE - 1) >> PAGE_SHIFT;
871
	int nr_vecs = 0, rc;
872
	int rw = (data_direction == DMA_TO_DEVICE);
873

874 875
	*hbio = NULL;

876
	pr_debug("PSCSI: nr_pages: %d\n", nr_pages);
877

878
	for_each_sg(sgl, sg, sgl_nents, i) {
879 880 881 882
		page = sg_page(sg);
		off = sg->offset;
		len = sg->length;

883
		pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
884 885
			page, len, off);

886 887 888 889 890 891 892 893
		/*
		 * 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) {
894 895 896
			bytes = min_t(unsigned int, len, PAGE_SIZE - off);
			bytes = min(bytes, data_len);

897
			if (!bio) {
898 899 900 901 902
				nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
				nr_pages -= nr_vecs;
				/*
				 * Calls bio_kmalloc() and sets bio->bi_end_io()
				 */
903
				bio = pscsi_get_bio(nr_vecs);
904
				if (!bio)
905 906 907 908 909
					goto fail;

				if (rw)
					bio->bi_rw |= REQ_WRITE;

910
				pr_debug("PSCSI: Allocated bio: %p,"
911 912 913 914 915 916
					" dir: %s nr_vecs: %d\n", bio,
					(rw) ? "rw" : "r", nr_vecs);
				/*
				 * Set *hbio pointer to handle the case:
				 * nr_pages > BIO_MAX_PAGES, where additional
				 * bios need to be added to complete a given
917
				 * command.
918
				 */
919 920
				if (!*hbio)
					*hbio = tbio = bio;
921 922 923 924
				else
					tbio = tbio->bi_next = bio;
			}

925
			pr_debug("PSCSI: Calling bio_add_pc_page() i: %d"
926 927 928 929 930 931 932 933
				" 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);
			if (rc != bytes)
				goto fail;

934
			pr_debug("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
935 936 937
				bio->bi_vcnt, nr_vecs);

			if (bio->bi_vcnt > nr_vecs) {
938
				pr_debug("PSCSI: Reached bio->bi_vcnt max:"
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
					" %d i: %d bio: %p, allocating another"
					" bio\n", bio->bi_vcnt, i, bio);
				/*
				 * Clear the pointer so that another bio will
				 * be allocated with pscsi_get_bio() above, the
				 * current bio has already been set *tbio and
				 * bio->bi_next.
				 */
				bio = NULL;
			}

			data_len -= bytes;
		}
	}

954
	return 0;
955
fail:
956 957 958 959
	while (*hbio) {
		bio = *hbio;
		*hbio = (*hbio)->bi_next;
		bio_endio(bio, 0);	/* XXX: should be error */
960
	}
961
	return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
962 963
}

964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987
/*
 * Clear a lun set in the cdb if the initiator talking to use spoke
 * and old standards version, as we can't assume the underlying device
 * won't choke up on it.
 */
static inline void pscsi_clear_cdb_lun(unsigned char *cdb)
{
	switch (cdb[0]) {
	case READ_10: /* SBC - RDProtect */
	case READ_12: /* SBC - RDProtect */
	case READ_16: /* SBC - RDProtect */
	case SEND_DIAGNOSTIC: /* SPC - SELF-TEST Code */
	case VERIFY: /* SBC - VRProtect */
	case VERIFY_16: /* SBC - VRProtect */
	case WRITE_VERIFY: /* SBC - VRProtect */
	case WRITE_VERIFY_12: /* SBC - VRProtect */
	case MAINTENANCE_IN: /* SPC - Parameter Data Format for SA RTPG */
		break;
	default:
		cdb[1] &= 0x1f; /* clear logical unit number */
		break;
	}
}

988 989
static sense_reason_t
pscsi_parse_cdb(struct se_cmd *cmd)
990
{
991
	unsigned char *cdb = cmd->t_task_cdb;
992

993 994
	if (cmd->se_cmd_flags & SCF_BIDI)
		return TCM_UNSUPPORTED_SCSI_OPCODE;
995

996 997
	pscsi_clear_cdb_lun(cdb);

998
	/*
999 1000 1001
	 * For REPORT LUNS we always need to emulate the response, for everything
	 * else the default for pSCSI is to pass the command to the underlying
	 * LLD / physical hardware.
1002 1003
	 */
	switch (cdb[0]) {
1004
	case REPORT_LUNS:
1005 1006
		cmd->execute_cmd = spc_emulate_report_luns;
		return 0;
1007
	case READ_6:
1008 1009 1010 1011 1012 1013 1014
	case READ_10:
	case READ_12:
	case READ_16:
	case WRITE_6:
	case WRITE_10:
	case WRITE_12:
	case WRITE_16:
1015
	case WRITE_VERIFY:
1016
		cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB;
1017
		/* FALLTHROUGH*/
1018
	default:
1019
		cmd->execute_cmd = pscsi_execute_cmd;
1020
		return 0;
1021 1022 1023
	}
}

1024 1025
static sense_reason_t
pscsi_execute_cmd(struct se_cmd *cmd)
1026
{
1027 1028 1029
	struct scatterlist *sgl = cmd->t_data_sg;
	u32 sgl_nents = cmd->t_data_nents;
	enum dma_data_direction data_direction = cmd->data_direction;
1030
	struct pscsi_dev_virt *pdv = PSCSI_DEV(cmd->se_dev);
1031
	struct pscsi_plugin_task *pt;
1032 1033
	struct request *req;
	struct bio *hbio;
1034
	sense_reason_t ret;
1035

1036 1037 1038 1039 1040 1041
	/*
	 * 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) {
1042
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1043 1044 1045
	}
	cmd->priv = pt;

1046 1047
	memcpy(pt->pscsi_cdb, cmd->t_task_cdb,
		scsi_command_size(cmd->t_task_cdb));
1048

1049
	if (!sgl) {
1050
		req = blk_get_request(pdv->pdv_sd->request_queue,
1051
				(data_direction == DMA_TO_DEVICE),
1052
				GFP_KERNEL);
1053 1054
		if (!req) {
			pr_err("PSCSI: blk_get_request() failed\n");
1055
			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1056
			goto fail;
1057
		}
J
Jens Axboe 已提交
1058 1059

		blk_rq_set_block_pc(req);
1060
	} else {
1061
		BUG_ON(!cmd->data_length);
1062

1063
		ret = pscsi_map_sg(cmd, sgl, sgl_nents, data_direction, &hbio);
1064
		if (ret)
1065
			goto fail;
1066 1067 1068

		req = blk_make_request(pdv->pdv_sd->request_queue, hbio,
				       GFP_KERNEL);
1069
		if (IS_ERR(req)) {
1070
			pr_err("pSCSI: blk_make_request() failed\n");
1071
			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1072
			goto fail_free_bio;
1073
		}
1074 1075
	}

1076
	req->end_io = pscsi_req_done;
1077
	req->end_io_data = cmd;
1078 1079 1080 1081 1082 1083 1084 1085 1086
	req->cmd_len = scsi_command_size(pt->pscsi_cdb);
	req->cmd = &pt->pscsi_cdb[0];
	req->sense = &pt->pscsi_sense[0];
	req->sense_len = 0;
	if (pdv->pdv_sd->type == TYPE_DISK)
		req->timeout = PS_TIMEOUT_DISK;
	else
		req->timeout = PS_TIMEOUT_OTHER;
	req->retries = PS_RETRY;
1087

1088
	blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, req,
1089
			(cmd->sam_task_attr == MSG_HEAD_TAG),
1090 1091
			pscsi_req_done);

1092
	return 0;
1093

1094
fail_free_bio:
1095 1096 1097 1098 1099
	while (hbio) {
		struct bio *bio = hbio;
		hbio = hbio->bi_next;
		bio_endio(bio, 0);	/* XXX: should be error */
	}
1100
	ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1101 1102
fail:
	kfree(pt);
1103
	return ret;
1104 1105 1106 1107 1108 1109 1110 1111
}

/*	pscsi_get_device_type():
 *
 *
 */
static u32 pscsi_get_device_type(struct se_device *dev)
{
1112
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1113 1114 1115 1116 1117 1118 1119
	struct scsi_device *sd = pdv->pdv_sd;

	return sd->type;
}

static sector_t pscsi_get_blocks(struct se_device *dev)
{
1120
	struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
1121 1122 1123 1124 1125 1126 1127 1128

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

	dump_stack();
	return 0;
}

1129
static void pscsi_req_done(struct request *req, int uptodate)
1130
{
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
	struct se_cmd *cmd = req->end_io_data;
	struct pscsi_plugin_task *pt = cmd->priv;

	pt->pscsi_result = req->errors;
	pt->pscsi_resid = req->resid_len;

	cmd->scsi_status = status_byte(pt->pscsi_result) << 1;
	if (cmd->scsi_status) {
		pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1141 1142 1143 1144 1145
			pt->pscsi_result);
	}

	switch (host_byte(pt->pscsi_result)) {
	case DID_OK:
1146
		target_complete_cmd(cmd, cmd->scsi_status);
1147 1148
		break;
	default:
1149 1150
		pr_debug("PSCSI Host Byte exception at cmd: %p CDB:"
			" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
1151
			pt->pscsi_result);
1152
		target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION);
1153 1154 1155 1156
		break;
	}

	__blk_put_request(req->q, req);
1157
	kfree(pt);
1158 1159 1160 1161 1162 1163 1164 1165 1166
}

static struct se_subsystem_api pscsi_template = {
	.name			= "pscsi",
	.owner			= THIS_MODULE,
	.transport_type		= TRANSPORT_PLUGIN_PHBA_PDEV,
	.attach_hba		= pscsi_attach_hba,
	.detach_hba		= pscsi_detach_hba,
	.pmode_enable_hba	= pscsi_pmode_enable_hba,
1167 1168
	.alloc_device		= pscsi_alloc_device,
	.configure_device	= pscsi_configure_device,
1169 1170
	.free_device		= pscsi_free_device,
	.transport_complete	= pscsi_transport_complete,
1171
	.parse_cdb		= pscsi_parse_cdb,
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
	.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,
};

static int __init pscsi_module_init(void)
{
	return transport_subsystem_register(&pscsi_template);
}

1183
static void __exit pscsi_module_exit(void)
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193
{
	transport_subsystem_release(&pscsi_template);
}

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