linux/drivers/target/target_core_pscsi.c
<<
>>
Prefs
   1/*******************************************************************************
   2 * Filename:  target_core_pscsi.c
   3 *
   4 * This file contains the generic target mode <-> Linux SCSI subsystem plugin.
   5 *
   6 * Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
   7 * Copyright (c) 2005, 2006, 2007 SBE, Inc.
   8 * Copyright (c) 2007-2010 Rising Tide Systems
   9 * Copyright (c) 2008-2010 Linux-iSCSI.org
  10 *
  11 * Nicholas A. Bellinger <nab@kernel.org>
  12 *
  13 * This program is free software; you can redistribute it and/or modify
  14 * it under the terms of the GNU General Public License as published by
  15 * the Free Software Foundation; either version 2 of the License, or
  16 * (at your option) any later version.
  17 *
  18 * This program is distributed in the hope that it will be useful,
  19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21 * GNU General Public License for more details.
  22 *
  23 * You should have received a copy of the GNU General Public License
  24 * along with this program; if not, write to the Free Software
  25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  26 *
  27 ******************************************************************************/
  28
  29#include <linux/string.h>
  30#include <linux/parser.h>
  31#include <linux/timer.h>
  32#include <linux/blkdev.h>
  33#include <linux/blk_types.h>
  34#include <linux/slab.h>
  35#include <linux/spinlock.h>
  36#include <linux/genhd.h>
  37#include <linux/cdrom.h>
  38#include <linux/file.h>
  39#include <linux/module.h>
  40#include <scsi/scsi.h>
  41#include <scsi/scsi_device.h>
  42#include <scsi/scsi_cmnd.h>
  43#include <scsi/scsi_host.h>
  44#include <scsi/scsi_tcq.h>
  45
  46#include <target/target_core_base.h>
  47#include <target/target_core_backend.h>
  48
  49#include "target_core_pscsi.h"
  50
  51#define ISPRINT(a)  ((a >= ' ') && (a <= '~'))
  52
  53static struct se_subsystem_api pscsi_template;
  54
  55static void pscsi_req_done(struct request *, int);
  56
  57/*      pscsi_attach_hba():
  58 *
  59 *      pscsi_get_sh() used scsi_host_lookup() to locate struct Scsi_Host.
  60 *      from the passed SCSI Host ID.
  61 */
  62static int pscsi_attach_hba(struct se_hba *hba, u32 host_id)
  63{
  64        struct pscsi_hba_virt *phv;
  65
  66        phv = kzalloc(sizeof(struct pscsi_hba_virt), GFP_KERNEL);
  67        if (!phv) {
  68                pr_err("Unable to allocate struct pscsi_hba_virt\n");
  69                return -ENOMEM;
  70        }
  71        phv->phv_host_id = host_id;
  72        phv->phv_mode = PHV_VIRUTAL_HOST_ID;
  73
  74        hba->hba_ptr = phv;
  75
  76        pr_debug("CORE_HBA[%d] - TCM SCSI HBA Driver %s on"
  77                " Generic Target Core Stack %s\n", hba->hba_id,
  78                PSCSI_VERSION, TARGET_CORE_MOD_VERSION);
  79        pr_debug("CORE_HBA[%d] - Attached SCSI HBA to Generic\n",
  80               hba->hba_id);
  81
  82        return 0;
  83}
  84
  85static void pscsi_detach_hba(struct se_hba *hba)
  86{
  87        struct pscsi_hba_virt *phv = hba->hba_ptr;
  88        struct Scsi_Host *scsi_host = phv->phv_lld_host;
  89
  90        if (scsi_host) {
  91                scsi_host_put(scsi_host);
  92
  93                pr_debug("CORE_HBA[%d] - Detached SCSI HBA: %s from"
  94                        " Generic Target Core\n", hba->hba_id,
  95                        (scsi_host->hostt->name) ? (scsi_host->hostt->name) :
  96                        "Unknown");
  97        } else
  98                pr_debug("CORE_HBA[%d] - Detached Virtual SCSI HBA"
  99                        " from Generic Target Core\n", hba->hba_id);
 100
 101        kfree(phv);
 102        hba->hba_ptr = NULL;
 103}
 104
 105static int pscsi_pmode_enable_hba(struct se_hba *hba, unsigned long mode_flag)
 106{
 107        struct pscsi_hba_virt *phv = hba->hba_ptr;
 108        struct Scsi_Host *sh = phv->phv_lld_host;
 109        /*
 110         * Release the struct Scsi_Host
 111         */
 112        if (!mode_flag) {
 113                if (!sh)
 114                        return 0;
 115
 116                phv->phv_lld_host = NULL;
 117                phv->phv_mode = PHV_VIRUTAL_HOST_ID;
 118
 119                pr_debug("CORE_HBA[%d] - Disabled pSCSI HBA Passthrough"
 120                        " %s\n", hba->hba_id, (sh->hostt->name) ?
 121                        (sh->hostt->name) : "Unknown");
 122
 123                scsi_host_put(sh);
 124                return 0;
 125        }
 126        /*
 127         * Otherwise, locate struct Scsi_Host from the original passed
 128         * pSCSI Host ID and enable for phba mode
 129         */
 130        sh = scsi_host_lookup(phv->phv_host_id);
 131        if (IS_ERR(sh)) {
 132                pr_err("pSCSI: Unable to locate SCSI Host for"
 133                        " phv_host_id: %d\n", phv->phv_host_id);
 134                return PTR_ERR(sh);
 135        }
 136
 137        phv->phv_lld_host = sh;
 138        phv->phv_mode = PHV_LLD_SCSI_HOST_NO;
 139
 140        pr_debug("CORE_HBA[%d] - Enabled pSCSI HBA Passthrough %s\n",
 141                hba->hba_id, (sh->hostt->name) ? (sh->hostt->name) : "Unknown");
 142
 143        return 1;
 144}
 145
 146static void pscsi_tape_read_blocksize(struct se_device *dev,
 147                struct scsi_device *sdev)
 148{
 149        unsigned char cdb[MAX_COMMAND_SIZE], *buf;
 150        int ret;
 151
 152        buf = kzalloc(12, GFP_KERNEL);
 153        if (!buf)
 154                return;
 155
 156        memset(cdb, 0, MAX_COMMAND_SIZE);
 157        cdb[0] = MODE_SENSE;
 158        cdb[4] = 0x0c; /* 12 bytes */
 159
 160        ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf, 12, NULL,
 161                        HZ, 1, NULL);
 162        if (ret)
 163                goto out_free;
 164
 165        /*
 166         * If MODE_SENSE still returns zero, set the default value to 1024.
 167         */
 168        sdev->sector_size = (buf[9] << 16) | (buf[10] << 8) | (buf[11]);
 169        if (!sdev->sector_size)
 170                sdev->sector_size = 1024;
 171out_free:
 172        kfree(buf);
 173}
 174
 175static void
 176pscsi_set_inquiry_info(struct scsi_device *sdev, struct t10_wwn *wwn)
 177{
 178        unsigned char *buf;
 179
 180        if (sdev->inquiry_len < INQUIRY_LEN)
 181                return;
 182
 183        buf = sdev->inquiry;
 184        if (!buf)
 185                return;
 186        /*
 187         * Use sdev->inquiry from drivers/scsi/scsi_scan.c:scsi_alloc_sdev()
 188         */
 189        memcpy(&wwn->vendor[0], &buf[8], sizeof(wwn->vendor));
 190        memcpy(&wwn->model[0], &buf[16], sizeof(wwn->model));
 191        memcpy(&wwn->revision[0], &buf[32], sizeof(wwn->revision));
 192}
 193
 194static int
 195pscsi_get_inquiry_vpd_serial(struct scsi_device *sdev, struct t10_wwn *wwn)
 196{
 197        unsigned char cdb[MAX_COMMAND_SIZE], *buf;
 198        int ret;
 199
 200        buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
 201        if (!buf)
 202                return -ENOMEM;
 203
 204        memset(cdb, 0, MAX_COMMAND_SIZE);
 205        cdb[0] = INQUIRY;
 206        cdb[1] = 0x01; /* Query VPD */
 207        cdb[2] = 0x80; /* Unit Serial Number */
 208        cdb[3] = (INQUIRY_VPD_SERIAL_LEN >> 8) & 0xff;
 209        cdb[4] = (INQUIRY_VPD_SERIAL_LEN & 0xff);
 210
 211        ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
 212                              INQUIRY_VPD_SERIAL_LEN, NULL, HZ, 1, NULL);
 213        if (ret)
 214                goto out_free;
 215
 216        snprintf(&wwn->unit_serial[0], INQUIRY_VPD_SERIAL_LEN, "%s", &buf[4]);
 217
 218        wwn->t10_sub_dev->su_dev_flags |= SDF_FIRMWARE_VPD_UNIT_SERIAL;
 219
 220        kfree(buf);
 221        return 0;
 222
 223out_free:
 224        kfree(buf);
 225        return -EPERM;
 226}
 227
 228static void
 229pscsi_get_inquiry_vpd_device_ident(struct scsi_device *sdev,
 230                struct t10_wwn *wwn)
 231{
 232        unsigned char cdb[MAX_COMMAND_SIZE], *buf, *page_83;
 233        int ident_len, page_len, off = 4, ret;
 234        struct t10_vpd *vpd;
 235
 236        buf = kzalloc(INQUIRY_VPD_SERIAL_LEN, GFP_KERNEL);
 237        if (!buf)
 238                return;
 239
 240        memset(cdb, 0, MAX_COMMAND_SIZE);
 241        cdb[0] = INQUIRY;
 242        cdb[1] = 0x01; /* Query VPD */
 243        cdb[2] = 0x83; /* Device Identifier */
 244        cdb[3] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN >> 8) & 0xff;
 245        cdb[4] = (INQUIRY_VPD_DEVICE_IDENTIFIER_LEN & 0xff);
 246
 247        ret = scsi_execute_req(sdev, cdb, DMA_FROM_DEVICE, buf,
 248                              INQUIRY_VPD_DEVICE_IDENTIFIER_LEN,
 249                              NULL, HZ, 1, NULL);
 250        if (ret)
 251                goto out;
 252
 253        page_len = (buf[2] << 8) | buf[3];
 254        while (page_len > 0) {
 255                /* Grab a pointer to the Identification descriptor */
 256                page_83 = &buf[off];
 257                ident_len = page_83[3];
 258                if (!ident_len) {
 259                        pr_err("page_83[3]: identifier"
 260                                        " length zero!\n");
 261                        break;
 262                }
 263                pr_debug("T10 VPD Identifer Length: %d\n", ident_len);
 264
 265                vpd = kzalloc(sizeof(struct t10_vpd), GFP_KERNEL);
 266                if (!vpd) {
 267                        pr_err("Unable to allocate memory for"
 268                                        " struct t10_vpd\n");
 269                        goto out;
 270                }
 271                INIT_LIST_HEAD(&vpd->vpd_list);
 272
 273                transport_set_vpd_proto_id(vpd, page_83);
 274                transport_set_vpd_assoc(vpd, page_83);
 275
 276                if (transport_set_vpd_ident_type(vpd, page_83) < 0) {
 277                        off += (ident_len + 4);
 278                        page_len -= (ident_len + 4);
 279                        kfree(vpd);
 280                        continue;
 281                }
 282                if (transport_set_vpd_ident(vpd, page_83) < 0) {
 283                        off += (ident_len + 4);
 284                        page_len -= (ident_len + 4);
 285                        kfree(vpd);
 286                        continue;
 287                }
 288
 289                list_add_tail(&vpd->vpd_list, &wwn->t10_vpd_list);
 290                off += (ident_len + 4);
 291                page_len -= (ident_len + 4);
 292        }
 293
 294out:
 295        kfree(buf);
 296}
 297
 298/*      pscsi_add_device_to_list():
 299 *
 300 *
 301 */
 302static struct se_device *pscsi_add_device_to_list(
 303        struct se_hba *hba,
 304        struct se_subsystem_dev *se_dev,
 305        struct pscsi_dev_virt *pdv,
 306        struct scsi_device *sd,
 307        int dev_flags)
 308{
 309        struct se_device *dev;
 310        struct se_dev_limits dev_limits;
 311        struct request_queue *q;
 312        struct queue_limits *limits;
 313
 314        memset(&dev_limits, 0, sizeof(struct se_dev_limits));
 315
 316        if (!sd->queue_depth) {
 317                sd->queue_depth = PSCSI_DEFAULT_QUEUEDEPTH;
 318
 319                pr_err("Set broken SCSI Device %d:%d:%d"
 320                        " queue_depth to %d\n", sd->channel, sd->id,
 321                                sd->lun, sd->queue_depth);
 322        }
 323        /*
 324         * Setup the local scope queue_limits from struct request_queue->limits
 325         * to pass into transport_add_device_to_core_hba() as struct se_dev_limits.
 326         */
 327        q = sd->request_queue;
 328        limits = &dev_limits.limits;
 329        limits->logical_block_size = sd->sector_size;
 330        limits->max_hw_sectors = min_t(int, sd->host->max_sectors, queue_max_hw_sectors(q));
 331        limits->max_sectors = min_t(int, sd->host->max_sectors, queue_max_sectors(q));
 332        dev_limits.hw_queue_depth = sd->queue_depth;
 333        dev_limits.queue_depth = sd->queue_depth;
 334        /*
 335         * Setup our standard INQUIRY info into se_dev->t10_wwn
 336         */
 337        pscsi_set_inquiry_info(sd, &se_dev->t10_wwn);
 338
 339        /*
 340         * Set the pointer pdv->pdv_sd to from passed struct scsi_device,
 341         * which has already been referenced with Linux SCSI code with
 342         * scsi_device_get() in this file's pscsi_create_virtdevice().
 343         *
 344         * The passthrough operations called by the transport_add_device_*
 345         * function below will require this pointer to be set for passthroug
 346         *  ops.
 347         *
 348         * For the shutdown case in pscsi_free_device(), this struct
 349         * scsi_device  reference is released with Linux SCSI code
 350         * scsi_device_put() and the pdv->pdv_sd cleared.
 351         */
 352        pdv->pdv_sd = sd;
 353        dev = transport_add_device_to_core_hba(hba, &pscsi_template,
 354                                se_dev, dev_flags, pdv,
 355                                &dev_limits, NULL, NULL);
 356        if (!dev) {
 357                pdv->pdv_sd = NULL;
 358                return NULL;
 359        }
 360
 361        /*
 362         * Locate VPD WWN Information used for various purposes within
 363         * the Storage Engine.
 364         */
 365        if (!pscsi_get_inquiry_vpd_serial(sd, &se_dev->t10_wwn)) {
 366                /*
 367                 * If VPD Unit Serial returned GOOD status, try
 368                 * VPD Device Identification page (0x83).
 369                 */
 370                pscsi_get_inquiry_vpd_device_ident(sd, &se_dev->t10_wwn);
 371        }
 372
 373        /*
 374         * For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
 375         */
 376        if (sd->type == TYPE_TAPE)
 377                pscsi_tape_read_blocksize(dev, sd);
 378        return dev;
 379}
 380
 381static void *pscsi_allocate_virtdevice(struct se_hba *hba, const char *name)
 382{
 383        struct pscsi_dev_virt *pdv;
 384
 385        pdv = kzalloc(sizeof(struct pscsi_dev_virt), GFP_KERNEL);
 386        if (!pdv) {
 387                pr_err("Unable to allocate memory for struct pscsi_dev_virt\n");
 388                return NULL;
 389        }
 390        pdv->pdv_se_hba = hba;
 391
 392        pr_debug("PSCSI: Allocated pdv: %p for %s\n", pdv, name);
 393        return pdv;
 394}
 395
 396/*
 397 * Called with struct Scsi_Host->host_lock called.
 398 */
 399static struct se_device *pscsi_create_type_disk(
 400        struct scsi_device *sd,
 401        struct pscsi_dev_virt *pdv,
 402        struct se_subsystem_dev *se_dev,
 403        struct se_hba *hba)
 404        __releases(sh->host_lock)
 405{
 406        struct se_device *dev;
 407        struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
 408        struct Scsi_Host *sh = sd->host;
 409        struct block_device *bd;
 410        u32 dev_flags = 0;
 411
 412        if (scsi_device_get(sd)) {
 413                pr_err("scsi_device_get() failed for %d:%d:%d:%d\n",
 414                        sh->host_no, sd->channel, sd->id, sd->lun);
 415                spin_unlock_irq(sh->host_lock);
 416                return NULL;
 417        }
 418        spin_unlock_irq(sh->host_lock);
 419        /*
 420         * Claim exclusive struct block_device access to struct scsi_device
 421         * for TYPE_DISK using supplied udev_path
 422         */
 423        bd = blkdev_get_by_path(se_dev->se_dev_udev_path,
 424                                FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv);
 425        if (IS_ERR(bd)) {
 426                pr_err("pSCSI: blkdev_get_by_path() failed\n");
 427                scsi_device_put(sd);
 428                return NULL;
 429        }
 430        pdv->pdv_bd = bd;
 431
 432        dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
 433        if (!dev) {
 434                blkdev_put(pdv->pdv_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
 435                scsi_device_put(sd);
 436                return NULL;
 437        }
 438        pr_debug("CORE_PSCSI[%d] - Added TYPE_DISK for %d:%d:%d:%d\n",
 439                phv->phv_host_id, sh->host_no, sd->channel, sd->id, sd->lun);
 440
 441        return dev;
 442}
 443
 444/*
 445 * Called with struct Scsi_Host->host_lock called.
 446 */
 447static struct se_device *pscsi_create_type_rom(
 448        struct scsi_device *sd,
 449        struct pscsi_dev_virt *pdv,
 450        struct se_subsystem_dev *se_dev,
 451        struct se_hba *hba)
 452        __releases(sh->host_lock)
 453{
 454        struct se_device *dev;
 455        struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
 456        struct Scsi_Host *sh = sd->host;
 457        u32 dev_flags = 0;
 458
 459        if (scsi_device_get(sd)) {
 460                pr_err("scsi_device_get() failed for %d:%d:%d:%d\n",
 461                        sh->host_no, sd->channel, sd->id, sd->lun);
 462                spin_unlock_irq(sh->host_lock);
 463                return NULL;
 464        }
 465        spin_unlock_irq(sh->host_lock);
 466
 467        dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
 468        if (!dev) {
 469                scsi_device_put(sd);
 470                return NULL;
 471        }
 472        pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%d\n",
 473                phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
 474                sd->channel, sd->id, sd->lun);
 475
 476        return dev;
 477}
 478
 479/*
 480 *Called with struct Scsi_Host->host_lock called.
 481 */
 482static struct se_device *pscsi_create_type_other(
 483        struct scsi_device *sd,
 484        struct pscsi_dev_virt *pdv,
 485        struct se_subsystem_dev *se_dev,
 486        struct se_hba *hba)
 487        __releases(sh->host_lock)
 488{
 489        struct se_device *dev;
 490        struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
 491        struct Scsi_Host *sh = sd->host;
 492        u32 dev_flags = 0;
 493
 494        spin_unlock_irq(sh->host_lock);
 495        dev = pscsi_add_device_to_list(hba, se_dev, pdv, sd, dev_flags);
 496        if (!dev)
 497                return NULL;
 498
 499        pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%d\n",
 500                phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
 501                sd->channel, sd->id, sd->lun);
 502
 503        return dev;
 504}
 505
 506static struct se_device *pscsi_create_virtdevice(
 507        struct se_hba *hba,
 508        struct se_subsystem_dev *se_dev,
 509        void *p)
 510{
 511        struct pscsi_dev_virt *pdv = p;
 512        struct se_device *dev;
 513        struct scsi_device *sd;
 514        struct pscsi_hba_virt *phv = hba->hba_ptr;
 515        struct Scsi_Host *sh = phv->phv_lld_host;
 516        int legacy_mode_enable = 0;
 517
 518        if (!pdv) {
 519                pr_err("Unable to locate struct pscsi_dev_virt"
 520                                " parameter\n");
 521                return ERR_PTR(-EINVAL);
 522        }
 523        /*
 524         * If not running in PHV_LLD_SCSI_HOST_NO mode, locate the
 525         * struct Scsi_Host we will need to bring the TCM/pSCSI object online
 526         */
 527        if (!sh) {
 528                if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
 529                        pr_err("pSCSI: Unable to locate struct"
 530                                " Scsi_Host for PHV_LLD_SCSI_HOST_NO\n");
 531                        return ERR_PTR(-ENODEV);
 532                }
 533                /*
 534                 * For the newer PHV_VIRUTAL_HOST_ID struct scsi_device
 535                 * reference, we enforce that udev_path has been set
 536                 */
 537                if (!(se_dev->su_dev_flags & SDF_USING_UDEV_PATH)) {
 538                        pr_err("pSCSI: udev_path attribute has not"
 539                                " been set before ENABLE=1\n");
 540                        return ERR_PTR(-EINVAL);
 541                }
 542                /*
 543                 * If no scsi_host_id= was passed for PHV_VIRUTAL_HOST_ID,
 544                 * use the original TCM hba ID to reference Linux/SCSI Host No
 545                 * and enable for PHV_LLD_SCSI_HOST_NO mode.
 546                 */
 547                if (!(pdv->pdv_flags & PDF_HAS_VIRT_HOST_ID)) {
 548                        spin_lock(&hba->device_lock);
 549                        if (!list_empty(&hba->hba_dev_list)) {
 550                                pr_err("pSCSI: Unable to set hba_mode"
 551                                        " with active devices\n");
 552                                spin_unlock(&hba->device_lock);
 553                                return ERR_PTR(-EEXIST);
 554                        }
 555                        spin_unlock(&hba->device_lock);
 556
 557                        if (pscsi_pmode_enable_hba(hba, 1) != 1)
 558                                return ERR_PTR(-ENODEV);
 559
 560                        legacy_mode_enable = 1;
 561                        hba->hba_flags |= HBA_FLAGS_PSCSI_MODE;
 562                        sh = phv->phv_lld_host;
 563                } else {
 564                        sh = scsi_host_lookup(pdv->pdv_host_id);
 565                        if (IS_ERR(sh)) {
 566                                pr_err("pSCSI: Unable to locate"
 567                                        " pdv_host_id: %d\n", pdv->pdv_host_id);
 568                                return ERR_CAST(sh);
 569                        }
 570                }
 571        } else {
 572                if (phv->phv_mode == PHV_VIRUTAL_HOST_ID) {
 573                        pr_err("pSCSI: PHV_VIRUTAL_HOST_ID set while"
 574                                " struct Scsi_Host exists\n");
 575                        return ERR_PTR(-EEXIST);
 576                }
 577        }
 578
 579        spin_lock_irq(sh->host_lock);
 580        list_for_each_entry(sd, &sh->__devices, siblings) {
 581                if ((pdv->pdv_channel_id != sd->channel) ||
 582                    (pdv->pdv_target_id != sd->id) ||
 583                    (pdv->pdv_lun_id != sd->lun))
 584                        continue;
 585                /*
 586                 * Functions will release the held struct scsi_host->host_lock
 587                 * before calling calling pscsi_add_device_to_list() to register
 588                 * struct scsi_device with target_core_mod.
 589                 */
 590                switch (sd->type) {
 591                case TYPE_DISK:
 592                        dev = pscsi_create_type_disk(sd, pdv, se_dev, hba);
 593                        break;
 594                case TYPE_ROM:
 595                        dev = pscsi_create_type_rom(sd, pdv, se_dev, hba);
 596                        break;
 597                default:
 598                        dev = pscsi_create_type_other(sd, pdv, se_dev, hba);
 599                        break;
 600                }
 601
 602                if (!dev) {
 603                        if (phv->phv_mode == PHV_VIRUTAL_HOST_ID)
 604                                scsi_host_put(sh);
 605                        else if (legacy_mode_enable) {
 606                                pscsi_pmode_enable_hba(hba, 0);
 607                                hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
 608                        }
 609                        pdv->pdv_sd = NULL;
 610                        return ERR_PTR(-ENODEV);
 611                }
 612                return dev;
 613        }
 614        spin_unlock_irq(sh->host_lock);
 615
 616        pr_err("pSCSI: Unable to locate %d:%d:%d:%d\n", sh->host_no,
 617                pdv->pdv_channel_id,  pdv->pdv_target_id, pdv->pdv_lun_id);
 618
 619        if (phv->phv_mode == PHV_VIRUTAL_HOST_ID)
 620                scsi_host_put(sh);
 621        else if (legacy_mode_enable) {
 622                pscsi_pmode_enable_hba(hba, 0);
 623                hba->hba_flags &= ~HBA_FLAGS_PSCSI_MODE;
 624        }
 625
 626        return ERR_PTR(-ENODEV);
 627}
 628
 629/*      pscsi_free_device(): (Part of se_subsystem_api_t template)
 630 *
 631 *
 632 */
 633static void pscsi_free_device(void *p)
 634{
 635        struct pscsi_dev_virt *pdv = p;
 636        struct pscsi_hba_virt *phv = pdv->pdv_se_hba->hba_ptr;
 637        struct scsi_device *sd = pdv->pdv_sd;
 638
 639        if (sd) {
 640                /*
 641                 * Release exclusive pSCSI internal struct block_device claim for
 642                 * struct scsi_device with TYPE_DISK from pscsi_create_type_disk()
 643                 */
 644                if ((sd->type == TYPE_DISK) && pdv->pdv_bd) {
 645                        blkdev_put(pdv->pdv_bd,
 646                                   FMODE_WRITE|FMODE_READ|FMODE_EXCL);
 647                        pdv->pdv_bd = NULL;
 648                }
 649                /*
 650                 * For HBA mode PHV_LLD_SCSI_HOST_NO, release the reference
 651                 * to struct Scsi_Host now.
 652                 */
 653                if ((phv->phv_mode == PHV_LLD_SCSI_HOST_NO) &&
 654                    (phv->phv_lld_host != NULL))
 655                        scsi_host_put(phv->phv_lld_host);
 656
 657                if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM))
 658                        scsi_device_put(sd);
 659
 660                pdv->pdv_sd = NULL;
 661        }
 662
 663        kfree(pdv);
 664}
 665
 666static inline struct pscsi_plugin_task *PSCSI_TASK(struct se_task *task)
 667{
 668        return container_of(task, struct pscsi_plugin_task, pscsi_task);
 669}
 670
 671
 672/*      pscsi_transport_complete():
 673 *
 674 *
 675 */
 676static int pscsi_transport_complete(struct se_task *task)
 677{
 678        struct pscsi_dev_virt *pdv = task->task_se_cmd->se_dev->dev_ptr;
 679        struct scsi_device *sd = pdv->pdv_sd;
 680        int result;
 681        struct pscsi_plugin_task *pt = PSCSI_TASK(task);
 682        unsigned char *cdb = &pt->pscsi_cdb[0];
 683
 684        result = pt->pscsi_result;
 685        /*
 686         * Hack to make sure that Write-Protect modepage is set if R/O mode is
 687         * forced.
 688         */
 689        if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
 690             (status_byte(result) << 1) == SAM_STAT_GOOD) {
 691                if (!task->task_se_cmd->se_deve)
 692                        goto after_mode_sense;
 693
 694                if (task->task_se_cmd->se_deve->lun_flags &
 695                                TRANSPORT_LUNFLAGS_READ_ONLY) {
 696                        unsigned char *buf = transport_kmap_data_sg(task->task_se_cmd);
 697
 698                        if (cdb[0] == MODE_SENSE_10) {
 699                                if (!(buf[3] & 0x80))
 700                                        buf[3] |= 0x80;
 701                        } else {
 702                                if (!(buf[2] & 0x80))
 703                                        buf[2] |= 0x80;
 704                        }
 705
 706                        transport_kunmap_data_sg(task->task_se_cmd);
 707                }
 708        }
 709after_mode_sense:
 710
 711        if (sd->type != TYPE_TAPE)
 712                goto after_mode_select;
 713
 714        /*
 715         * Hack to correctly obtain the initiator requested blocksize for
 716         * TYPE_TAPE.  Since this value is dependent upon each tape media,
 717         * struct scsi_device->sector_size will not contain the correct value
 718         * by default, so we go ahead and set it so
 719         * TRANSPORT(dev)->get_blockdev() returns the correct value to the
 720         * storage engine.
 721         */
 722        if (((cdb[0] == MODE_SELECT) || (cdb[0] == MODE_SELECT_10)) &&
 723              (status_byte(result) << 1) == SAM_STAT_GOOD) {
 724                unsigned char *buf;
 725                struct scatterlist *sg = task->task_sg;
 726                u16 bdl;
 727                u32 blocksize;
 728
 729                buf = sg_virt(&sg[0]);
 730                if (!buf) {
 731                        pr_err("Unable to get buf for scatterlist\n");
 732                        goto after_mode_select;
 733                }
 734
 735                if (cdb[0] == MODE_SELECT)
 736                        bdl = (buf[3]);
 737                else
 738                        bdl = (buf[6] << 8) | (buf[7]);
 739
 740                if (!bdl)
 741                        goto after_mode_select;
 742
 743                if (cdb[0] == MODE_SELECT)
 744                        blocksize = (buf[9] << 16) | (buf[10] << 8) |
 745                                        (buf[11]);
 746                else
 747                        blocksize = (buf[13] << 16) | (buf[14] << 8) |
 748                                        (buf[15]);
 749
 750                sd->sector_size = blocksize;
 751        }
 752after_mode_select:
 753
 754        if (status_byte(result) & CHECK_CONDITION)
 755                return 1;
 756
 757        return 0;
 758}
 759
 760static struct se_task *
 761pscsi_alloc_task(unsigned char *cdb)
 762{
 763        struct pscsi_plugin_task *pt;
 764
 765        /*
 766         * Dynamically alloc cdb space, since it may be larger than
 767         * TCM_MAX_COMMAND_SIZE
 768         */
 769        pt = kzalloc(sizeof(*pt) + scsi_command_size(cdb), GFP_KERNEL);
 770        if (!pt) {
 771                pr_err("Unable to allocate struct pscsi_plugin_task\n");
 772                return NULL;
 773        }
 774
 775        return &pt->pscsi_task;
 776}
 777
 778static void pscsi_free_task(struct se_task *task)
 779{
 780        struct pscsi_plugin_task *pt = PSCSI_TASK(task);
 781
 782        /*
 783         * We do not release the bio(s) here associated with this task, as
 784         * this is handled by bio_put() and pscsi_bi_endio().
 785         */
 786        kfree(pt);
 787}
 788
 789enum {
 790        Opt_scsi_host_id, Opt_scsi_channel_id, Opt_scsi_target_id,
 791        Opt_scsi_lun_id, Opt_err
 792};
 793
 794static match_table_t tokens = {
 795        {Opt_scsi_host_id, "scsi_host_id=%d"},
 796        {Opt_scsi_channel_id, "scsi_channel_id=%d"},
 797        {Opt_scsi_target_id, "scsi_target_id=%d"},
 798        {Opt_scsi_lun_id, "scsi_lun_id=%d"},
 799        {Opt_err, NULL}
 800};
 801
 802static ssize_t pscsi_set_configfs_dev_params(struct se_hba *hba,
 803        struct se_subsystem_dev *se_dev,
 804        const char *page,
 805        ssize_t count)
 806{
 807        struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
 808        struct pscsi_hba_virt *phv = hba->hba_ptr;
 809        char *orig, *ptr, *opts;
 810        substring_t args[MAX_OPT_ARGS];
 811        int ret = 0, arg, token;
 812
 813        opts = kstrdup(page, GFP_KERNEL);
 814        if (!opts)
 815                return -ENOMEM;
 816
 817        orig = opts;
 818
 819        while ((ptr = strsep(&opts, ",\n")) != NULL) {
 820                if (!*ptr)
 821                        continue;
 822
 823                token = match_token(ptr, tokens, args);
 824                switch (token) {
 825                case Opt_scsi_host_id:
 826                        if (phv->phv_mode == PHV_LLD_SCSI_HOST_NO) {
 827                                pr_err("PSCSI[%d]: Unable to accept"
 828                                        " scsi_host_id while phv_mode =="
 829                                        " PHV_LLD_SCSI_HOST_NO\n",
 830                                        phv->phv_host_id);
 831                                ret = -EINVAL;
 832                                goto out;
 833                        }
 834                        match_int(args, &arg);
 835                        pdv->pdv_host_id = arg;
 836                        pr_debug("PSCSI[%d]: Referencing SCSI Host ID:"
 837                                " %d\n", phv->phv_host_id, pdv->pdv_host_id);
 838                        pdv->pdv_flags |= PDF_HAS_VIRT_HOST_ID;
 839                        break;
 840                case Opt_scsi_channel_id:
 841                        match_int(args, &arg);
 842                        pdv->pdv_channel_id = arg;
 843                        pr_debug("PSCSI[%d]: Referencing SCSI Channel"
 844                                " ID: %d\n",  phv->phv_host_id,
 845                                pdv->pdv_channel_id);
 846                        pdv->pdv_flags |= PDF_HAS_CHANNEL_ID;
 847                        break;
 848                case Opt_scsi_target_id:
 849                        match_int(args, &arg);
 850                        pdv->pdv_target_id = arg;
 851                        pr_debug("PSCSI[%d]: Referencing SCSI Target"
 852                                " ID: %d\n", phv->phv_host_id,
 853                                pdv->pdv_target_id);
 854                        pdv->pdv_flags |= PDF_HAS_TARGET_ID;
 855                        break;
 856                case Opt_scsi_lun_id:
 857                        match_int(args, &arg);
 858                        pdv->pdv_lun_id = arg;
 859                        pr_debug("PSCSI[%d]: Referencing SCSI LUN ID:"
 860                                " %d\n", phv->phv_host_id, pdv->pdv_lun_id);
 861                        pdv->pdv_flags |= PDF_HAS_LUN_ID;
 862                        break;
 863                default:
 864                        break;
 865                }
 866        }
 867
 868out:
 869        kfree(orig);
 870        return (!ret) ? count : ret;
 871}
 872
 873static ssize_t pscsi_check_configfs_dev_params(
 874        struct se_hba *hba,
 875        struct se_subsystem_dev *se_dev)
 876{
 877        struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
 878
 879        if (!(pdv->pdv_flags & PDF_HAS_CHANNEL_ID) ||
 880            !(pdv->pdv_flags & PDF_HAS_TARGET_ID) ||
 881            !(pdv->pdv_flags & PDF_HAS_LUN_ID)) {
 882                pr_err("Missing scsi_channel_id=, scsi_target_id= and"
 883                        " scsi_lun_id= parameters\n");
 884                return -EINVAL;
 885        }
 886
 887        return 0;
 888}
 889
 890static ssize_t pscsi_show_configfs_dev_params(struct se_hba *hba,
 891                                              struct se_subsystem_dev *se_dev,
 892                                              char *b)
 893{
 894        struct pscsi_hba_virt *phv = hba->hba_ptr;
 895        struct pscsi_dev_virt *pdv = se_dev->se_dev_su_ptr;
 896        struct scsi_device *sd = pdv->pdv_sd;
 897        unsigned char host_id[16];
 898        ssize_t bl;
 899        int i;
 900
 901        if (phv->phv_mode == PHV_VIRUTAL_HOST_ID)
 902                snprintf(host_id, 16, "%d", pdv->pdv_host_id);
 903        else
 904                snprintf(host_id, 16, "PHBA Mode");
 905
 906        bl = sprintf(b, "SCSI Device Bus Location:"
 907                " Channel ID: %d Target ID: %d LUN: %d Host ID: %s\n",
 908                pdv->pdv_channel_id, pdv->pdv_target_id, pdv->pdv_lun_id,
 909                host_id);
 910
 911        if (sd) {
 912                bl += sprintf(b + bl, "        ");
 913                bl += sprintf(b + bl, "Vendor: ");
 914                for (i = 0; i < 8; i++) {
 915                        if (ISPRINT(sd->vendor[i]))   /* printable character? */
 916                                bl += sprintf(b + bl, "%c", sd->vendor[i]);
 917                        else
 918                                bl += sprintf(b + bl, " ");
 919                }
 920                bl += sprintf(b + bl, " Model: ");
 921                for (i = 0; i < 16; i++) {
 922                        if (ISPRINT(sd->model[i]))   /* printable character ? */
 923                                bl += sprintf(b + bl, "%c", sd->model[i]);
 924                        else
 925                                bl += sprintf(b + bl, " ");
 926                }
 927                bl += sprintf(b + bl, " Rev: ");
 928                for (i = 0; i < 4; i++) {
 929                        if (ISPRINT(sd->rev[i]))   /* printable character ? */
 930                                bl += sprintf(b + bl, "%c", sd->rev[i]);
 931                        else
 932                                bl += sprintf(b + bl, " ");
 933                }
 934                bl += sprintf(b + bl, "\n");
 935        }
 936        return bl;
 937}
 938
 939static void pscsi_bi_endio(struct bio *bio, int error)
 940{
 941        bio_put(bio);
 942}
 943
 944static inline struct bio *pscsi_get_bio(int sg_num)
 945{
 946        struct bio *bio;
 947        /*
 948         * Use bio_malloc() following the comment in for bio -> struct request
 949         * in block/blk-core.c:blk_make_request()
 950         */
 951        bio = bio_kmalloc(GFP_KERNEL, sg_num);
 952        if (!bio) {
 953                pr_err("PSCSI: bio_kmalloc() failed\n");
 954                return NULL;
 955        }
 956        bio->bi_end_io = pscsi_bi_endio;
 957
 958        return bio;
 959}
 960
 961static int pscsi_map_sg(struct se_task *task, struct scatterlist *task_sg,
 962                struct bio **hbio)
 963{
 964        struct se_cmd *cmd = task->task_se_cmd;
 965        struct pscsi_dev_virt *pdv = task->task_se_cmd->se_dev->dev_ptr;
 966        u32 task_sg_num = task->task_sg_nents;
 967        struct bio *bio = NULL, *tbio = NULL;
 968        struct page *page;
 969        struct scatterlist *sg;
 970        u32 data_len = task->task_size, i, len, bytes, off;
 971        int nr_pages = (task->task_size + task_sg[0].offset +
 972                        PAGE_SIZE - 1) >> PAGE_SHIFT;
 973        int nr_vecs = 0, rc;
 974        int rw = (task->task_data_direction == DMA_TO_DEVICE);
 975
 976        *hbio = NULL;
 977
 978        pr_debug("PSCSI: nr_pages: %d\n", nr_pages);
 979
 980        for_each_sg(task_sg, sg, task_sg_num, i) {
 981                page = sg_page(sg);
 982                off = sg->offset;
 983                len = sg->length;
 984
 985                pr_debug("PSCSI: i: %d page: %p len: %d off: %d\n", i,
 986                        page, len, off);
 987
 988                while (len > 0 && data_len > 0) {
 989                        bytes = min_t(unsigned int, len, PAGE_SIZE - off);
 990                        bytes = min(bytes, data_len);
 991
 992                        if (!bio) {
 993                                nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
 994                                nr_pages -= nr_vecs;
 995                                /*
 996                                 * Calls bio_kmalloc() and sets bio->bi_end_io()
 997                                 */
 998                                bio = pscsi_get_bio(nr_vecs);
 999                                if (!bio)
1000                                        goto fail;
1001
1002                                if (rw)
1003                                        bio->bi_rw |= REQ_WRITE;
1004
1005                                pr_debug("PSCSI: Allocated bio: %p,"
1006                                        " dir: %s nr_vecs: %d\n", bio,
1007                                        (rw) ? "rw" : "r", nr_vecs);
1008                                /*
1009                                 * Set *hbio pointer to handle the case:
1010                                 * nr_pages > BIO_MAX_PAGES, where additional
1011                                 * bios need to be added to complete a given
1012                                 * struct se_task
1013                                 */
1014                                if (!*hbio)
1015                                        *hbio = tbio = bio;
1016                                else
1017                                        tbio = tbio->bi_next = bio;
1018                        }
1019
1020                        pr_debug("PSCSI: Calling bio_add_pc_page() i: %d"
1021                                " bio: %p page: %p len: %d off: %d\n", i, bio,
1022                                page, len, off);
1023
1024                        rc = bio_add_pc_page(pdv->pdv_sd->request_queue,
1025                                        bio, page, bytes, off);
1026                        if (rc != bytes)
1027                                goto fail;
1028
1029                        pr_debug("PSCSI: bio->bi_vcnt: %d nr_vecs: %d\n",
1030                                bio->bi_vcnt, nr_vecs);
1031
1032                        if (bio->bi_vcnt > nr_vecs) {
1033                                pr_debug("PSCSI: Reached bio->bi_vcnt max:"
1034                                        " %d i: %d bio: %p, allocating another"
1035                                        " bio\n", bio->bi_vcnt, i, bio);
1036                                /*
1037                                 * Clear the pointer so that another bio will
1038                                 * be allocated with pscsi_get_bio() above, the
1039                                 * current bio has already been set *tbio and
1040                                 * bio->bi_next.
1041                                 */
1042                                bio = NULL;
1043                        }
1044
1045                        page++;
1046                        len -= bytes;
1047                        data_len -= bytes;
1048                        off = 0;
1049                }
1050        }
1051
1052        return task->task_sg_nents;
1053fail:
1054        while (*hbio) {
1055                bio = *hbio;
1056                *hbio = (*hbio)->bi_next;
1057                bio->bi_next = NULL;
1058                bio_endio(bio, 0);      /* XXX: should be error */
1059        }
1060        cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1061        return -ENOMEM;
1062}
1063
1064static int pscsi_do_task(struct se_task *task)
1065{
1066        struct se_cmd *cmd = task->task_se_cmd;
1067        struct pscsi_dev_virt *pdv = task->task_se_cmd->se_dev->dev_ptr;
1068        struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1069        struct request *req;
1070        struct bio *hbio;
1071        int ret;
1072
1073        target_get_task_cdb(task, pt->pscsi_cdb);
1074
1075        if (task->task_se_cmd->se_cmd_flags & SCF_SCSI_NON_DATA_CDB) {
1076                req = blk_get_request(pdv->pdv_sd->request_queue,
1077                                (task->task_data_direction == DMA_TO_DEVICE),
1078                                GFP_KERNEL);
1079                if (!req || IS_ERR(req)) {
1080                        pr_err("PSCSI: blk_get_request() failed: %ld\n",
1081                                        req ? IS_ERR(req) : -ENOMEM);
1082                        cmd->scsi_sense_reason =
1083                                TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1084                        return -ENODEV;
1085                }
1086        } else {
1087                BUG_ON(!task->task_size);
1088
1089                /*
1090                 * Setup the main struct request for the task->task_sg[] payload
1091                 */
1092                ret = pscsi_map_sg(task, task->task_sg, &hbio);
1093                if (ret < 0) {
1094                        cmd->scsi_sense_reason =
1095                                TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1096                        return ret;
1097                }
1098
1099                req = blk_make_request(pdv->pdv_sd->request_queue, hbio,
1100                                       GFP_KERNEL);
1101                if (IS_ERR(req)) {
1102                        pr_err("pSCSI: blk_make_request() failed\n");
1103                        goto fail;
1104                }
1105        }
1106
1107        req->cmd_type = REQ_TYPE_BLOCK_PC;
1108        req->end_io = pscsi_req_done;
1109        req->end_io_data = task;
1110        req->cmd_len = scsi_command_size(pt->pscsi_cdb);
1111        req->cmd = &pt->pscsi_cdb[0];
1112        req->sense = &pt->pscsi_sense[0];
1113        req->sense_len = 0;
1114        if (pdv->pdv_sd->type == TYPE_DISK)
1115                req->timeout = PS_TIMEOUT_DISK;
1116        else
1117                req->timeout = PS_TIMEOUT_OTHER;
1118        req->retries = PS_RETRY;
1119
1120        blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, req,
1121                        (task->task_se_cmd->sam_task_attr == MSG_HEAD_TAG),
1122                        pscsi_req_done);
1123
1124        return 0;
1125
1126fail:
1127        while (hbio) {
1128                struct bio *bio = hbio;
1129                hbio = hbio->bi_next;
1130                bio->bi_next = NULL;
1131                bio_endio(bio, 0);      /* XXX: should be error */
1132        }
1133        cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1134        return -ENOMEM;
1135}
1136
1137/*      pscsi_get_sense_buffer():
1138 *
1139 *
1140 */
1141static unsigned char *pscsi_get_sense_buffer(struct se_task *task)
1142{
1143        struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1144
1145        return pt->pscsi_sense;
1146}
1147
1148/*      pscsi_get_device_rev():
1149 *
1150 *
1151 */
1152static u32 pscsi_get_device_rev(struct se_device *dev)
1153{
1154        struct pscsi_dev_virt *pdv = dev->dev_ptr;
1155        struct scsi_device *sd = pdv->pdv_sd;
1156
1157        return (sd->scsi_level - 1) ? sd->scsi_level - 1 : 1;
1158}
1159
1160/*      pscsi_get_device_type():
1161 *
1162 *
1163 */
1164static u32 pscsi_get_device_type(struct se_device *dev)
1165{
1166        struct pscsi_dev_virt *pdv = dev->dev_ptr;
1167        struct scsi_device *sd = pdv->pdv_sd;
1168
1169        return sd->type;
1170}
1171
1172static sector_t pscsi_get_blocks(struct se_device *dev)
1173{
1174        struct pscsi_dev_virt *pdv = dev->dev_ptr;
1175
1176        if (pdv->pdv_bd && pdv->pdv_bd->bd_part)
1177                return pdv->pdv_bd->bd_part->nr_sects;
1178
1179        dump_stack();
1180        return 0;
1181}
1182
1183/*      pscsi_handle_SAM_STATUS_failures():
1184 *
1185 *
1186 */
1187static inline void pscsi_process_SAM_status(
1188        struct se_task *task,
1189        struct pscsi_plugin_task *pt)
1190{
1191        task->task_scsi_status = status_byte(pt->pscsi_result);
1192        if (task->task_scsi_status) {
1193                task->task_scsi_status <<= 1;
1194                pr_debug("PSCSI Status Byte exception at task: %p CDB:"
1195                        " 0x%02x Result: 0x%08x\n", task, pt->pscsi_cdb[0],
1196                        pt->pscsi_result);
1197        }
1198
1199        switch (host_byte(pt->pscsi_result)) {
1200        case DID_OK:
1201                transport_complete_task(task, (!task->task_scsi_status));
1202                break;
1203        default:
1204                pr_debug("PSCSI Host Byte exception at task: %p CDB:"
1205                        " 0x%02x Result: 0x%08x\n", task, pt->pscsi_cdb[0],
1206                        pt->pscsi_result);
1207                task->task_scsi_status = SAM_STAT_CHECK_CONDITION;
1208                task->task_se_cmd->scsi_sense_reason =
1209                                        TCM_UNSUPPORTED_SCSI_OPCODE;
1210                transport_complete_task(task, 0);
1211                break;
1212        }
1213}
1214
1215static void pscsi_req_done(struct request *req, int uptodate)
1216{
1217        struct se_task *task = req->end_io_data;
1218        struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1219
1220        pt->pscsi_result = req->errors;
1221        pt->pscsi_resid = req->resid_len;
1222
1223        pscsi_process_SAM_status(task, pt);
1224        __blk_put_request(req->q, req);
1225}
1226
1227static struct se_subsystem_api pscsi_template = {
1228        .name                   = "pscsi",
1229        .owner                  = THIS_MODULE,
1230        .transport_type         = TRANSPORT_PLUGIN_PHBA_PDEV,
1231        .attach_hba             = pscsi_attach_hba,
1232        .detach_hba             = pscsi_detach_hba,
1233        .pmode_enable_hba       = pscsi_pmode_enable_hba,
1234        .allocate_virtdevice    = pscsi_allocate_virtdevice,
1235        .create_virtdevice      = pscsi_create_virtdevice,
1236        .free_device            = pscsi_free_device,
1237        .transport_complete     = pscsi_transport_complete,
1238        .alloc_task             = pscsi_alloc_task,
1239        .do_task                = pscsi_do_task,
1240        .free_task              = pscsi_free_task,
1241        .check_configfs_dev_params = pscsi_check_configfs_dev_params,
1242        .set_configfs_dev_params = pscsi_set_configfs_dev_params,
1243        .show_configfs_dev_params = pscsi_show_configfs_dev_params,
1244        .get_sense_buffer       = pscsi_get_sense_buffer,
1245        .get_device_rev         = pscsi_get_device_rev,
1246        .get_device_type        = pscsi_get_device_type,
1247        .get_blocks             = pscsi_get_blocks,
1248};
1249
1250static int __init pscsi_module_init(void)
1251{
1252        return transport_subsystem_register(&pscsi_template);
1253}
1254
1255static void pscsi_module_exit(void)
1256{
1257        transport_subsystem_release(&pscsi_template);
1258}
1259
1260MODULE_DESCRIPTION("TCM PSCSI subsystem plugin");
1261MODULE_AUTHOR("nab@Linux-iSCSI.org");
1262MODULE_LICENSE("GPL");
1263
1264module_init(pscsi_module_init);
1265module_exit(pscsi_module_exit);
1266