bdev/iscsi: fix iscsi bdev wrong lun id

When you connect a iscsi lun as a bdev, and the lun id is not 0,
all IOs will fail.
We should use the correct lun id in libiscsi.

Reproduces like this:
./scripts/rpc.py construct_iscsi_bdev -b iSCSI0 -i
iqn.2016-06.io.spdk:init --url
iscsi://127.0.0.1:3261/iqn.2016-02.com.smartx:system:fl-iscsi/1

Signed-off-by: Li Feng <fengli@smartx.com>
Change-Id: I2480e866fdda17426362aca3cb30b7e90c927547
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/449318
Reviewed-by: Kyle Zhang <kyle@smartx.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Li Feng 2019-03-27 19:46:20 +08:00 committed by Changpeng Liu
parent 0ed66e7ef6
commit 80c87083ce

View File

@ -77,6 +77,7 @@ struct bdev_iscsi_lun {
struct spdk_bdev bdev; struct spdk_bdev bdev;
struct iscsi_context *context; struct iscsi_context *context;
char *initiator_iqn; char *initiator_iqn;
int lun_id;
char *url; char *url;
pthread_mutex_t mutex; pthread_mutex_t mutex;
uint32_t ch_count; uint32_t ch_count;
@ -99,6 +100,7 @@ struct bdev_iscsi_conn_req {
spdk_bdev_iscsi_create_cb create_cb; spdk_bdev_iscsi_create_cb create_cb;
spdk_bdev_iscsi_create_cb create_cb_arg; spdk_bdev_iscsi_create_cb create_cb_arg;
bool unmap_supported; bool unmap_supported;
int lun;
TAILQ_ENTRY(bdev_iscsi_conn_req) link; TAILQ_ENTRY(bdev_iscsi_conn_req) link;
}; };
@ -217,7 +219,7 @@ bdev_iscsi_readv(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io,
SPDK_DEBUGLOG(SPDK_LOG_ISCSI_INIT, "read %d iovs size %lu to lba: %#lx\n", SPDK_DEBUGLOG(SPDK_LOG_ISCSI_INIT, "read %d iovs size %lu to lba: %#lx\n",
iovcnt, nbytes, lba); iovcnt, nbytes, lba);
task = iscsi_read16_task(lun->context, 0, lba, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0, task = iscsi_read16_task(lun->context, lun->lun_id, lba, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0,
bdev_iscsi_command_cb, iscsi_io); bdev_iscsi_command_cb, iscsi_io);
if (task == NULL) { if (task == NULL) {
SPDK_ERRLOG("failed to get read16_task\n"); SPDK_ERRLOG("failed to get read16_task\n");
@ -244,7 +246,8 @@ bdev_iscsi_writev(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io,
SPDK_DEBUGLOG(SPDK_LOG_ISCSI_INIT, "write %d iovs size %lu to lba: %#lx\n", SPDK_DEBUGLOG(SPDK_LOG_ISCSI_INIT, "write %d iovs size %lu to lba: %#lx\n",
iovcnt, nbytes, lba); iovcnt, nbytes, lba);
task = iscsi_write16_task(lun->context, 0, lba, NULL, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0, task = iscsi_write16_task(lun->context, lun->lun_id, lba, NULL, nbytes, lun->bdev.blocklen, 0, 0, 0,
0, 0,
bdev_iscsi_command_cb, iscsi_io); bdev_iscsi_command_cb, iscsi_io);
if (task == NULL) { if (task == NULL) {
SPDK_ERRLOG("failed to get write16_task\n"); SPDK_ERRLOG("failed to get write16_task\n");
@ -287,7 +290,7 @@ bdev_iscsi_flush(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io, uin
{ {
struct scsi_task *task; struct scsi_task *task;
task = iscsi_synchronizecache16_task(lun->context, 0, lba, task = iscsi_synchronizecache16_task(lun->context, lun->lun_id, lba,
num_blocks, 0, immed, bdev_iscsi_command_cb, iscsi_io); num_blocks, 0, immed, bdev_iscsi_command_cb, iscsi_io);
if (task == NULL) { if (task == NULL) {
SPDK_ERRLOG("failed to get sync16_task\n"); SPDK_ERRLOG("failed to get sync16_task\n");
@ -338,7 +341,7 @@ _bdev_iscsi_reset(void *_bdev_io)
struct bdev_iscsi_io *iscsi_io = (struct bdev_iscsi_io *)bdev_io->driver_ctx; struct bdev_iscsi_io *iscsi_io = (struct bdev_iscsi_io *)bdev_io->driver_ctx;
struct iscsi_context *context = lun->context; struct iscsi_context *context = lun->context;
rc = iscsi_task_mgmt_lun_reset_async(context, 0, rc = iscsi_task_mgmt_lun_reset_async(context, lun->lun_id,
bdev_iscsi_reset_cb, iscsi_io); bdev_iscsi_reset_cb, iscsi_io);
if (rc != 0) { if (rc != 0) {
SPDK_ERRLOG("failed to do iscsi reset\n"); SPDK_ERRLOG("failed to do iscsi reset\n");
@ -574,7 +577,8 @@ static const struct spdk_bdev_fn_table iscsi_fn_table = {
}; };
static int static int
create_iscsi_lun(struct iscsi_context *context, char *url, char *initiator_iqn, char *name, create_iscsi_lun(struct iscsi_context *context, int lun_id, char *url, char *initiator_iqn,
char *name,
uint64_t num_blocks, uint32_t block_size, struct spdk_bdev **bdev, bool unmap_supported) uint64_t num_blocks, uint32_t block_size, struct spdk_bdev **bdev, bool unmap_supported)
{ {
struct bdev_iscsi_lun *lun; struct bdev_iscsi_lun *lun;
@ -587,6 +591,7 @@ create_iscsi_lun(struct iscsi_context *context, char *url, char *initiator_iqn,
} }
lun->context = context; lun->context = context;
lun->lun_id = lun_id;
lun->url = url; lun->url = url;
lun->initiator_iqn = initiator_iqn; lun->initiator_iqn = initiator_iqn;
@ -641,7 +646,7 @@ iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status,
goto ret; goto ret;
} }
status = create_iscsi_lun(req->context, req->url, req->initiator_iqn, req->bdev_name, status = create_iscsi_lun(req->context, req->lun, req->url, req->initiator_iqn, req->bdev_name,
readcap16->returned_lba + 1, readcap16->block_length, &bdev, req->unmap_supported); readcap16->returned_lba + 1, readcap16->block_length, &bdev, req->unmap_supported);
if (status) { if (status) {
SPDK_ERRLOG("Unable to create iscsi bdev: %s (%d)\n", spdk_strerror(-status), status); SPDK_ERRLOG("Unable to create iscsi bdev: %s (%d)\n", spdk_strerror(-status), status);
@ -666,7 +671,7 @@ bdev_iscsi_inquiry_cb(struct iscsi_context *context, int status, void *_task, vo
} }
} }
task = iscsi_readcapacity16_task(context, 0, iscsi_readcapacity16_cb, req); task = iscsi_readcapacity16_task(context, req->lun, iscsi_readcapacity16_cb, req);
if (task) { if (task) {
return; return;
} }
@ -686,7 +691,7 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status,
goto ret; goto ret;
} }
task = iscsi_inquiry_task(iscsi, 0, 1, task = iscsi_inquiry_task(iscsi, req->lun, 1,
SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING, SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING,
255, bdev_iscsi_inquiry_cb, req); 255, bdev_iscsi_inquiry_cb, req);
if (task) { if (task) {
@ -763,6 +768,7 @@ create_iscsi_disk(const char *bdev_name, const char *url, const char *initiator_
goto err; goto err;
} }
req->lun = iscsi_url->lun;
rc = iscsi_set_session_type(req->context, ISCSI_SESSION_NORMAL); rc = iscsi_set_session_type(req->context, ISCSI_SESSION_NORMAL);
rc = rc ? rc : iscsi_set_header_digest(req->context, ISCSI_HEADER_DIGEST_NONE); rc = rc ? rc : iscsi_set_header_digest(req->context, ISCSI_HEADER_DIGEST_NONE);
rc = rc ? rc : iscsi_set_targetname(req->context, iscsi_url->target); rc = rc ? rc : iscsi_set_targetname(req->context, iscsi_url->target);