struct spdk_bdev bdev;
struct iscsi_context *context;
char *initiator_iqn;
+ int lun_id;
char *url;
pthread_mutex_t mutex;
uint32_t ch_count;
- struct bdev_iscsi_io_channel *master_ch;
struct spdk_thread *master_td;
struct spdk_poller *no_master_ch_poller;
struct spdk_thread *no_master_ch_poller_td;
bool unmap_supported;
+ struct spdk_poller *poller;
};
struct bdev_iscsi_io_channel {
- struct spdk_poller *poller;
struct bdev_iscsi_lun *lun;
};
spdk_bdev_iscsi_create_cb create_cb;
spdk_bdev_iscsi_create_cb create_cb_arg;
bool unmap_supported;
+ int lun;
TAILQ_ENTRY(bdev_iscsi_conn_req) link;
};
.async_init = true,
};
-SPDK_BDEV_MODULE_REGISTER(&g_iscsi_bdev_module);
+SPDK_BDEV_MODULE_REGISTER(iscsi, &g_iscsi_bdev_module);
static void
_bdev_iscsi_io_complete(void *_iscsi_io)
SPDK_DEBUGLOG(SPDK_LOG_ISCSI_INIT, "read %d iovs size %lu to lba: %#lx\n",
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);
if (task == NULL) {
SPDK_ERRLOG("failed to get read16_task\n");
SPDK_DEBUGLOG(SPDK_LOG_ISCSI_INIT, "write %d iovs size %lu to lba: %#lx\n",
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);
if (task == NULL) {
SPDK_ERRLOG("failed to get write16_task\n");
{
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);
if (task == NULL) {
SPDK_ERRLOG("failed to get sync16_task\n");
struct bdev_iscsi_io *iscsi_io = (struct bdev_iscsi_io *)bdev_io->driver_ctx;
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);
if (rc != 0) {
SPDK_ERRLOG("failed to do iscsi reset\n");
}
static int
-bdev_iscsi_poll_lun(struct bdev_iscsi_lun *lun)
+bdev_iscsi_poll_lun(void *_lun)
{
+ struct bdev_iscsi_lun *lun = _lun;
struct pollfd pfd = {};
pfd.fd = iscsi_get_fd(lun->context);
return rc;
}
-static int
-bdev_iscsi_poll(void *arg)
+static void
+bdev_iscsi_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
+ bool success)
{
- struct bdev_iscsi_io_channel *ch = arg;
-
- return bdev_iscsi_poll_lun(ch->lun);
-}
+ if (!success) {
+ spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
+ return;
+ }
-static void bdev_iscsi_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
-{
bdev_iscsi_readv((struct bdev_iscsi_lun *)bdev_io->bdev->ctxt,
(struct bdev_iscsi_io *)bdev_io->driver_ctx,
bdev_io->u.bdev.iovs,
pthread_mutex_lock(&lun->mutex);
if (lun->ch_count == 0) {
- assert(lun->master_ch == NULL);
assert(lun->master_td == NULL);
- lun->master_ch = ch;
lun->master_td = spdk_get_thread();
- ch->poller = spdk_poller_register(bdev_iscsi_poll, ch, 0);
+ lun->poller = spdk_poller_register(bdev_iscsi_poll_lun, lun, 0);
ch->lun = lun;
}
lun->ch_count++;
static void
bdev_iscsi_destroy_cb(void *io_device, void *ctx_buf)
{
- struct bdev_iscsi_io_channel *io_channel = ctx_buf;
struct bdev_iscsi_lun *lun = io_device;
pthread_mutex_lock(&lun->mutex);
lun->ch_count--;
if (lun->ch_count == 0) {
- assert(lun->master_ch != NULL);
assert(lun->master_td != NULL);
- assert(lun->master_td == spdk_get_thread());
- lun->master_ch = NULL;
lun->master_td = NULL;
- spdk_poller_unregister(&io_channel->poller);
+ spdk_poller_unregister(&lun->poller);
}
pthread_mutex_unlock(&lun->mutex);
}
{
struct bdev_iscsi_lun *lun = ctx;
- spdk_json_write_name(w, "iscsi");
- spdk_json_write_object_begin(w);
- spdk_json_write_name(w, "initiator_name");
- spdk_json_write_string(w, lun->initiator_iqn);
- spdk_json_write_name(w, "url");
- spdk_json_write_string(w, lun->url);
+ spdk_json_write_named_object_begin(w, "iscsi");
+ spdk_json_write_named_string(w, "initiator_name", lun->initiator_iqn);
+ spdk_json_write_named_string(w, "url", lun->url);
spdk_json_write_object_end(w);
return 0;
};
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)
{
struct bdev_iscsi_lun *lun;
}
lun->context = context;
+ lun->lun_id = lun_id;
lun->url = url;
lun->initiator_iqn = initiator_iqn;
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);
if (status) {
SPDK_ERRLOG("Unable to create iscsi bdev: %s (%d)\n", spdk_strerror(-status), status);
}
}
- task = iscsi_readcapacity16_task(context, 0, iscsi_readcapacity16_cb, req);
+ task = iscsi_readcapacity16_task(context, req->lun, iscsi_readcapacity16_cb, req);
if (task) {
return;
}
goto ret;
}
- task = iscsi_inquiry_task(iscsi, 0, 1,
+ task = iscsi_inquiry_task(iscsi, req->lun, 1,
SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING,
255, bdev_iscsi_inquiry_cb, req);
if (task) {
goto err;
}
+ req->lun = iscsi_url->lun;
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_targetname(req->context, iscsi_url->target);