bdev/iscsi: add inquiry for unmap support

Check logical block provisioning unmap (lbpu) bit
to check whether unmap is supported when
constructing device.

Change-Id: Id45f1e44b25af6377563cc217460e2d00dd205c0
Signed-off-by: Chunyang Hui <Chunyang.hui@intel.com>
Reviewed-on: https://review.gerrithub.io/419974
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
Chunyang Hui 2018-07-20 16:37:41 +08:00 committed by Jim Harris
parent 13fbedcc03
commit 5d53d43e3b

View File

@ -86,6 +86,7 @@ struct bdev_iscsi_lun {
struct spdk_thread *master_td;
struct spdk_poller *no_master_ch_poller;
struct spdk_thread *no_master_ch_poller_td;
bool unmap_supported;
TAILQ_ENTRY(bdev_iscsi_lun) link;
};
@ -101,6 +102,7 @@ struct bdev_iscsi_conn_req {
struct iscsi_context *context;
spdk_bdev_iscsi_create_cb create_cb;
spdk_bdev_iscsi_create_cb create_cb_arg;
bool unmap_supported;
TAILQ_ENTRY(bdev_iscsi_conn_req) link;
};
@ -501,14 +503,17 @@ static void bdev_iscsi_submit_request(struct spdk_io_channel *_ch, struct spdk_b
static bool
bdev_iscsi_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type)
{
struct bdev_iscsi_lun *lun = ctx;
switch (io_type) {
case SPDK_BDEV_IO_TYPE_READ:
case SPDK_BDEV_IO_TYPE_WRITE:
case SPDK_BDEV_IO_TYPE_FLUSH:
case SPDK_BDEV_IO_TYPE_UNMAP:
case SPDK_BDEV_IO_TYPE_RESET:
return true;
case SPDK_BDEV_IO_TYPE_UNMAP:
return lun->unmap_supported;
default:
return false;
}
@ -619,7 +624,7 @@ complete_conn_req(struct bdev_iscsi_conn_req *req, struct spdk_bdev *bdev,
static int
create_iscsi_lun(struct iscsi_context *context, char *url, char *initiator_iqn, char *name,
uint64_t num_blocks, uint32_t block_size, struct spdk_bdev **bdev)
uint64_t num_blocks, uint32_t block_size, struct spdk_bdev **bdev, bool unmap_supported)
{
struct bdev_iscsi_lun *lun;
int rc;
@ -642,6 +647,7 @@ create_iscsi_lun(struct iscsi_context *context, char *url, char *initiator_iqn,
lun->bdev.blocklen = block_size;
lun->bdev.blockcnt = num_blocks;
lun->bdev.ctxt = lun;
lun->unmap_supported = unmap_supported;
lun->bdev.fn_table = &iscsi_fn_table;
@ -687,7 +693,7 @@ iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status,
}
status = create_iscsi_lun(req->context, req->url, req->initiator_iqn, req->bdev_name,
readcap16->returned_lba + 1, readcap16->block_length, &bdev);
readcap16->returned_lba + 1, readcap16->block_length, &bdev, req->unmap_supported);
if (status) {
SPDK_ERRLOG("Unable to create iscsi bdev: %s (%d)\n", spdk_strerror(-status), status);
}
@ -697,6 +703,29 @@ ret:
complete_conn_req(req, bdev, status);
}
static void
bdev_iscsi_inquiry_cb(struct iscsi_context *context, int status, void *_task, void *private_data)
{
struct scsi_task *task = _task;
struct scsi_inquiry_logical_block_provisioning *lbp_inq = NULL;
struct bdev_iscsi_conn_req *req = private_data;
if (status == SPDK_SCSI_STATUS_GOOD) {
lbp_inq = scsi_datain_unmarshall(task);
if (lbp_inq != NULL && lbp_inq->lbpu) {
req->unmap_supported = true;
}
}
task = iscsi_readcapacity16_task(context, 0, iscsi_readcapacity16_cb, req);
if (task) {
return;
}
SPDK_ERRLOG("iSCSI error: %s\n", iscsi_get_error(req->context));
complete_conn_req(req, NULL, status);
}
static void
iscsi_connect_cb(struct iscsi_context *iscsi, int status,
void *command_data, void *private_data)
@ -708,7 +737,9 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status,
goto ret;
}
task = iscsi_readcapacity16_task(iscsi, 0, iscsi_readcapacity16_cb, req);
task = iscsi_inquiry_task(iscsi, 0, 1,
SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING,
255, bdev_iscsi_inquiry_cb, req);
if (task) {
return;
}