target: pscsi: Introduce TYPE_ZBC support

TYPE_ZBC host managed zoned block devices are also block devices
despite the non-standard device type (14h). Handle them similarly to
regular TYPE_DISK devices.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Damien Le Moal 2017-06-28 14:58:57 +09:00 коммит произвёл Nicholas Bellinger
Родитель e5dc9a7055
Коммит 016a5fec19
1 изменённых файлов: 11 добавлений и 6 удалений

Просмотреть файл

@ -382,7 +382,7 @@ static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd)
spin_unlock_irq(sh->host_lock); spin_unlock_irq(sh->host_lock);
/* /*
* Claim exclusive struct block_device access to struct scsi_device * Claim exclusive struct block_device access to struct scsi_device
* for TYPE_DISK using supplied udev_path * for TYPE_DISK and TYPE_ZBC using supplied udev_path
*/ */
bd = blkdev_get_by_path(dev->udev_path, bd = blkdev_get_by_path(dev->udev_path,
FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv); FMODE_WRITE|FMODE_READ|FMODE_EXCL, pdv);
@ -400,8 +400,9 @@ static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd)
return ret; return ret;
} }
pr_debug("CORE_PSCSI[%d] - Added TYPE_DISK for %d:%d:%d:%llu\n", pr_debug("CORE_PSCSI[%d] - Added TYPE_%s for %d:%d:%d:%llu\n",
phv->phv_host_id, sh->host_no, sd->channel, sd->id, sd->lun); phv->phv_host_id, sd->type == TYPE_DISK ? "DISK" : "ZBC",
sh->host_no, sd->channel, sd->id, sd->lun);
return 0; return 0;
} }
@ -520,6 +521,7 @@ static int pscsi_configure_device(struct se_device *dev)
*/ */
switch (sd->type) { switch (sd->type) {
case TYPE_DISK: case TYPE_DISK:
case TYPE_ZBC:
ret = pscsi_create_type_disk(dev, sd); ret = pscsi_create_type_disk(dev, sd);
break; break;
default: default:
@ -576,9 +578,11 @@ static void pscsi_destroy_device(struct se_device *dev)
if (sd) { if (sd) {
/* /*
* Release exclusive pSCSI internal struct block_device claim for * Release exclusive pSCSI internal struct block_device claim for
* struct scsi_device with TYPE_DISK from pscsi_create_type_disk() * struct scsi_device with TYPE_DISK or TYPE_ZBC
* from pscsi_create_type_disk()
*/ */
if ((sd->type == TYPE_DISK) && pdv->pdv_bd) { if ((sd->type == TYPE_DISK || sd->type == TYPE_ZBC) &&
pdv->pdv_bd) {
blkdev_put(pdv->pdv_bd, blkdev_put(pdv->pdv_bd,
FMODE_WRITE|FMODE_READ|FMODE_EXCL); FMODE_WRITE|FMODE_READ|FMODE_EXCL);
pdv->pdv_bd = NULL; pdv->pdv_bd = NULL;
@ -1000,7 +1004,8 @@ pscsi_execute_cmd(struct se_cmd *cmd)
req->end_io_data = cmd; req->end_io_data = cmd;
scsi_req(req)->cmd_len = scsi_command_size(pt->pscsi_cdb); scsi_req(req)->cmd_len = scsi_command_size(pt->pscsi_cdb);
scsi_req(req)->cmd = &pt->pscsi_cdb[0]; scsi_req(req)->cmd = &pt->pscsi_cdb[0];
if (pdv->pdv_sd->type == TYPE_DISK) if (pdv->pdv_sd->type == TYPE_DISK ||
pdv->pdv_sd->type == TYPE_ZBC)
req->timeout = PS_TIMEOUT_DISK; req->timeout = PS_TIMEOUT_DISK;
else else
req->timeout = PS_TIMEOUT_OTHER; req->timeout = PS_TIMEOUT_OTHER;