bdev/ftl: Do not register ftl bdev as io device
Bdev ftl could use io channel directly from ftl library instead creating its own. This patch removes ftl_bdev_io and ftl_io_channel structures. Change-Id: I5f13b6d2c46da2ccfbf7cc01547525ef0f912703 Signed-off-by: Wojciech Malikowski <wojciech.malikowski@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/623 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
This commit is contained in:
parent
7fc67cd248
commit
a6a040eb86
@ -56,18 +56,6 @@ struct ftl_bdev {
|
|||||||
void *init_arg;
|
void *init_arg;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ftl_io_channel {
|
|
||||||
struct spdk_ftl_dev *dev;
|
|
||||||
|
|
||||||
struct spdk_io_channel *ioch;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ftl_bdev_io {
|
|
||||||
struct ftl_bdev *bdev;
|
|
||||||
|
|
||||||
int status;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ftl_deferred_init {
|
struct ftl_deferred_init {
|
||||||
struct ftl_bdev_init_opts opts;
|
struct ftl_bdev_init_opts opts;
|
||||||
|
|
||||||
@ -80,18 +68,11 @@ static int bdev_ftl_initialize(void);
|
|||||||
static void bdev_ftl_finish(void);
|
static void bdev_ftl_finish(void);
|
||||||
static void bdev_ftl_examine(struct spdk_bdev *bdev);
|
static void bdev_ftl_examine(struct spdk_bdev *bdev);
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_ftl_get_ctx_size(void)
|
|
||||||
{
|
|
||||||
return sizeof(struct ftl_bdev_io);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct spdk_bdev_module g_ftl_if = {
|
static struct spdk_bdev_module g_ftl_if = {
|
||||||
.name = "ftl",
|
.name = "ftl",
|
||||||
.module_init = bdev_ftl_initialize,
|
.module_init = bdev_ftl_initialize,
|
||||||
.module_fini = bdev_ftl_finish,
|
.module_fini = bdev_ftl_finish,
|
||||||
.examine_disk = bdev_ftl_examine,
|
.examine_disk = bdev_ftl_examine,
|
||||||
.get_ctx_size = bdev_ftl_get_ctx_size,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SPDK_BDEV_MODULE_REGISTER(ftl, &g_ftl_if)
|
SPDK_BDEV_MODULE_REGISTER(ftl, &g_ftl_if)
|
||||||
@ -101,8 +82,6 @@ bdev_ftl_free_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
|
|||||||
{
|
{
|
||||||
struct ftl_bdev *ftl_bdev = ctx;
|
struct ftl_bdev *ftl_bdev = ctx;
|
||||||
|
|
||||||
spdk_io_device_unregister(ftl_bdev, NULL);
|
|
||||||
|
|
||||||
spdk_bdev_destruct_done(&ftl_bdev->bdev, status);
|
spdk_bdev_destruct_done(&ftl_bdev->bdev, status);
|
||||||
free(ftl_bdev->bdev.name);
|
free(ftl_bdev->bdev.name);
|
||||||
free(ftl_bdev);
|
free(ftl_bdev);
|
||||||
@ -119,8 +98,9 @@ bdev_ftl_destruct(void *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdev_ftl_complete_io(struct ftl_bdev_io *io, int rc)
|
bdev_ftl_cb(void *arg, int rc)
|
||||||
{
|
{
|
||||||
|
struct spdk_bdev_io *bdev_io = arg;
|
||||||
enum spdk_bdev_io_status status;
|
enum spdk_bdev_io_status status;
|
||||||
|
|
||||||
switch (rc) {
|
switch (rc) {
|
||||||
@ -135,105 +115,34 @@ bdev_ftl_complete_io(struct ftl_bdev_io *io, int rc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_bdev_io_complete(spdk_bdev_io_from_ctx(io), status);
|
spdk_bdev_io_complete(bdev_io, status);
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
bdev_ftl_cb(void *arg, int status)
|
|
||||||
{
|
|
||||||
struct ftl_bdev_io *io = arg;
|
|
||||||
|
|
||||||
bdev_ftl_complete_io(io, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_ftl_fill_bio(struct ftl_bdev *ftl_bdev, struct spdk_io_channel *ch,
|
|
||||||
struct ftl_bdev_io *io)
|
|
||||||
{
|
|
||||||
memset(io, 0, sizeof(*io));
|
|
||||||
|
|
||||||
io->status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
|
||||||
io->bdev = ftl_bdev;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_ftl_readv(struct ftl_bdev *ftl_bdev, struct spdk_io_channel *ch,
|
|
||||||
struct ftl_bdev_io *io)
|
|
||||||
{
|
|
||||||
struct spdk_bdev_io *bio;
|
|
||||||
struct ftl_io_channel *ioch = spdk_io_channel_get_ctx(ch);
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
bio = spdk_bdev_io_from_ctx(io);
|
|
||||||
|
|
||||||
rc = bdev_ftl_fill_bio(ftl_bdev, ch, io);
|
|
||||||
if (rc) {
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spdk_ftl_read(ftl_bdev->dev,
|
|
||||||
ioch->ioch,
|
|
||||||
bio->u.bdev.offset_blocks,
|
|
||||||
bio->u.bdev.num_blocks,
|
|
||||||
bio->u.bdev.iovs, bio->u.bdev.iovcnt, bdev_ftl_cb, io);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_ftl_writev(struct ftl_bdev *ftl_bdev, struct spdk_io_channel *ch,
|
|
||||||
struct ftl_bdev_io *io)
|
|
||||||
{
|
|
||||||
struct spdk_bdev_io *bio;
|
|
||||||
struct ftl_io_channel *ioch;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
bio = spdk_bdev_io_from_ctx(io);
|
|
||||||
ioch = spdk_io_channel_get_ctx(ch);
|
|
||||||
|
|
||||||
rc = bdev_ftl_fill_bio(ftl_bdev, ch, io);
|
|
||||||
if (rc) {
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spdk_ftl_write(ftl_bdev->dev,
|
|
||||||
ioch->ioch,
|
|
||||||
bio->u.bdev.offset_blocks,
|
|
||||||
bio->u.bdev.num_blocks,
|
|
||||||
bio->u.bdev.iovs,
|
|
||||||
bio->u.bdev.iovcnt, bdev_ftl_cb, io);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdev_ftl_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
|
bdev_ftl_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
|
||||||
bool success)
|
bool success)
|
||||||
{
|
{
|
||||||
|
struct ftl_bdev *ftl_bdev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
ftl_bdev = bdev_io->bdev->ctxt;
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
bdev_ftl_complete_io((struct ftl_bdev_io *)bdev_io->driver_ctx,
|
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||||
SPDK_BDEV_IO_STATUS_FAILED);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rc = bdev_ftl_readv((struct ftl_bdev *)bdev_io->bdev->ctxt,
|
rc = spdk_ftl_read(ftl_bdev->dev,
|
||||||
ch, (struct ftl_bdev_io *)bdev_io->driver_ctx);
|
ch,
|
||||||
|
bdev_io->u.bdev.offset_blocks,
|
||||||
|
bdev_io->u.bdev.num_blocks,
|
||||||
|
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt, bdev_ftl_cb, bdev_io);
|
||||||
|
|
||||||
if (spdk_unlikely(rc != 0)) {
|
if (spdk_unlikely(rc != 0)) {
|
||||||
bdev_ftl_complete_io((struct ftl_bdev_io *)bdev_io->driver_ctx, rc);
|
spdk_bdev_io_complete(bdev_io, rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_ftl_flush(struct ftl_bdev *ftl_bdev, struct spdk_io_channel *ch, struct ftl_bdev_io *io)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = bdev_ftl_fill_bio(ftl_bdev, ch, io);
|
|
||||||
if (rc) {
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spdk_ftl_flush(ftl_bdev->dev, bdev_ftl_cb, io);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_bdev_ftl_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
|
_bdev_ftl_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
|
||||||
{
|
{
|
||||||
@ -246,10 +155,12 @@ _bdev_ftl_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case SPDK_BDEV_IO_TYPE_WRITE:
|
case SPDK_BDEV_IO_TYPE_WRITE:
|
||||||
return bdev_ftl_writev(ftl_bdev, ch, (struct ftl_bdev_io *)bdev_io->driver_ctx);
|
return spdk_ftl_write(ftl_bdev->dev, ch, bdev_io->u.bdev.offset_blocks,
|
||||||
|
bdev_io->u.bdev.num_blocks, bdev_io->u.bdev.iovs,
|
||||||
|
bdev_io->u.bdev.iovcnt, bdev_ftl_cb, bdev_io);
|
||||||
|
|
||||||
case SPDK_BDEV_IO_TYPE_FLUSH:
|
case SPDK_BDEV_IO_TYPE_FLUSH:
|
||||||
return bdev_ftl_flush(ftl_bdev, ch, (struct ftl_bdev_io *)bdev_io->driver_ctx);
|
return spdk_ftl_flush(ftl_bdev->dev, bdev_ftl_cb, bdev_io);
|
||||||
|
|
||||||
case SPDK_BDEV_IO_TYPE_WRITE_ZEROES:
|
case SPDK_BDEV_IO_TYPE_WRITE_ZEROES:
|
||||||
case SPDK_BDEV_IO_TYPE_RESET:
|
case SPDK_BDEV_IO_TYPE_RESET:
|
||||||
@ -266,7 +177,7 @@ bdev_ftl_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io
|
|||||||
int rc = _bdev_ftl_submit_request(ch, bdev_io);
|
int rc = _bdev_ftl_submit_request(ch, bdev_io);
|
||||||
|
|
||||||
if (spdk_unlikely(rc != 0)) {
|
if (spdk_unlikely(rc != 0)) {
|
||||||
bdev_ftl_complete_io((struct ftl_bdev_io *)bdev_io->driver_ctx, rc);
|
spdk_bdev_io_complete(bdev_io, rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,7 +202,7 @@ bdev_ftl_get_io_channel(void *ctx)
|
|||||||
{
|
{
|
||||||
struct ftl_bdev *ftl_bdev = ctx;
|
struct ftl_bdev *ftl_bdev = ctx;
|
||||||
|
|
||||||
return spdk_get_io_channel(ftl_bdev);
|
return spdk_get_io_channel(ftl_bdev->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -374,26 +285,6 @@ static const struct spdk_bdev_fn_table ftl_fn_table = {
|
|||||||
.dump_info_json = bdev_ftl_dump_info_json,
|
.dump_info_json = bdev_ftl_dump_info_json,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_ftl_io_channel_create_cb(void *io_device, void *ctx)
|
|
||||||
{
|
|
||||||
struct ftl_io_channel *ch = ctx;
|
|
||||||
struct ftl_bdev *ftl_bdev = (struct ftl_bdev *)io_device;
|
|
||||||
|
|
||||||
ch->dev = ftl_bdev->dev;
|
|
||||||
ch->ioch = spdk_get_io_channel(ftl_bdev->dev);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
bdev_ftl_io_channel_destroy_cb(void *io_device, void *ctx_buf)
|
|
||||||
{
|
|
||||||
struct ftl_io_channel *ch = ctx_buf;
|
|
||||||
|
|
||||||
spdk_put_io_channel(ch->ioch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdev_ftl_create_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
|
bdev_ftl_create_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
|
||||||
{
|
{
|
||||||
@ -407,7 +298,7 @@ bdev_ftl_create_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
|
|||||||
if (status) {
|
if (status) {
|
||||||
SPDK_ERRLOG("Failed to create FTL device (%d)\n", status);
|
SPDK_ERRLOG("Failed to create FTL device (%d)\n", status);
|
||||||
rc = status;
|
rc = status;
|
||||||
goto error_dev;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_ftl_dev_get_attrs(dev, &attrs);
|
spdk_ftl_dev_get_attrs(dev, &attrs);
|
||||||
@ -427,13 +318,8 @@ bdev_ftl_create_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
|
|||||||
ftl_bdev->bdev.fn_table = &ftl_fn_table;
|
ftl_bdev->bdev.fn_table = &ftl_fn_table;
|
||||||
ftl_bdev->bdev.module = &g_ftl_if;
|
ftl_bdev->bdev.module = &g_ftl_if;
|
||||||
|
|
||||||
spdk_io_device_register(ftl_bdev, bdev_ftl_io_channel_create_cb,
|
|
||||||
bdev_ftl_io_channel_destroy_cb,
|
|
||||||
sizeof(struct ftl_io_channel),
|
|
||||||
ftl_bdev->bdev.name);
|
|
||||||
|
|
||||||
if (spdk_bdev_register(&ftl_bdev->bdev)) {
|
if (spdk_bdev_register(&ftl_bdev->bdev)) {
|
||||||
goto error_unregister;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
info.name = ftl_bdev->bdev.name;
|
info.name = ftl_bdev->bdev.name;
|
||||||
@ -442,9 +328,7 @@ bdev_ftl_create_cb(struct spdk_ftl_dev *dev, void *ctx, int status)
|
|||||||
init_cb(&info, init_arg, 0);
|
init_cb(&info, init_arg, 0);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error_unregister:
|
error:
|
||||||
spdk_io_device_unregister(ftl_bdev, NULL);
|
|
||||||
error_dev:
|
|
||||||
free(ftl_bdev->bdev.name);
|
free(ftl_bdev->bdev.name);
|
||||||
free(ftl_bdev);
|
free(ftl_bdev);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user