diff --git a/lib/ftl/ftl_band.c b/lib/ftl/ftl_band.c index 26283af57..426753bdd 100644 --- a/lib/ftl/ftl_band.c +++ b/lib/ftl/ftl_band.c @@ -722,9 +722,9 @@ ftl_band_release_lba_map(struct ftl_band *band) } static void -ftl_read_md_cb(void *arg, int status) +ftl_read_md_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_md_io *md_io = arg; + struct ftl_md_io *md_io = (struct ftl_md_io *)io; if (!status) { status = md_io->pack_fn(md_io->io.band); @@ -732,13 +732,13 @@ ftl_read_md_cb(void *arg, int status) status = FTL_MD_IO_FAILURE; } - md_io->cb.fn(md_io->cb.ctx, status); + md_io->cb_fn(io, md_io->cb_ctx, status); } static struct ftl_md_io * ftl_io_init_md_read(struct spdk_ftl_dev *dev, struct ftl_ppa ppa, - struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn fn, - ftl_md_pack_fn pack_fn, struct ftl_cb cb) + struct ftl_band *band, size_t lbk_cnt, ftl_io_fn fn, + ftl_md_pack_fn pack_fn, ftl_io_fn cb_fn, void *cb_ctx) { struct ftl_md_io *io; struct ftl_io_init_opts opts = { @@ -750,7 +750,7 @@ ftl_io_init_md_read(struct spdk_ftl_dev *dev, struct ftl_ppa ppa, .flags = FTL_IO_MD | FTL_IO_PPA_MODE, .type = FTL_IO_READ, .lbk_cnt = lbk_cnt, - .fn = fn, + .cb_fn = fn, .data = band->lba_map.dma_buf, }; @@ -761,14 +761,15 @@ ftl_io_init_md_read(struct spdk_ftl_dev *dev, struct ftl_ppa ppa, io->io.ppa = ppa; io->pack_fn = pack_fn; - io->cb = cb; + io->cb_fn = cb_fn; + io->cb_ctx = cb_ctx; return io; } static struct ftl_io * ftl_io_init_md_write(struct spdk_ftl_dev *dev, struct ftl_band *band, - void *data, size_t lbk_cnt, spdk_ftl_fn cb) + void *data, size_t lbk_cnt, ftl_io_fn cb) { struct ftl_io_init_opts opts = { .dev = dev, @@ -779,7 +780,7 @@ ftl_io_init_md_write(struct spdk_ftl_dev *dev, struct ftl_band *band, .flags = FTL_IO_MD | FTL_IO_PPA_MODE, .type = FTL_IO_WRITE, .lbk_cnt = lbk_cnt, - .fn = cb, + .cb_fn = cb, .data = data, .md = NULL, }; @@ -789,7 +790,7 @@ ftl_io_init_md_write(struct spdk_ftl_dev *dev, struct ftl_band *band, static int ftl_band_write_md(struct ftl_band *band, size_t lbk_cnt, - ftl_md_pack_fn md_fn, spdk_ftl_fn cb) + ftl_md_pack_fn md_fn, ftl_io_fn cb) { struct spdk_ftl_dev *dev = band->dev; struct ftl_io *io; @@ -815,14 +816,14 @@ ftl_band_md_clear(struct ftl_band *band) } int -ftl_band_write_head_md(struct ftl_band *band, spdk_ftl_fn cb) +ftl_band_write_head_md(struct ftl_band *band, ftl_io_fn cb) { return ftl_band_write_md(band, ftl_head_md_num_lbks(band->dev), ftl_pack_head_md, cb); } int -ftl_band_write_tail_md(struct ftl_band *band, spdk_ftl_fn cb) +ftl_band_write_tail_md(struct ftl_band *band, ftl_io_fn cb) { return ftl_band_write_md(band, ftl_tail_md_num_lbks(band->dev), ftl_pack_tail_md, cb); @@ -839,7 +840,7 @@ ftl_band_lba_map_ppa(struct ftl_band *band, size_t offset) static int ftl_band_read_md(struct ftl_band *band, size_t lbk_cnt, struct ftl_ppa start_ppa, - spdk_ftl_fn fn, ftl_md_pack_fn pack_fn, struct ftl_cb cb) + ftl_io_fn fn, ftl_md_pack_fn pack_fn, ftl_io_fn cb_fn, void *cb_ctx) { struct spdk_ftl_dev *dev = band->dev; struct ftl_md_io *io; @@ -848,7 +849,7 @@ ftl_band_read_md(struct ftl_band *band, size_t lbk_cnt, struct ftl_ppa start_ppa return -ENOENT; } - io = ftl_io_init_md_read(dev, start_ppa, band, lbk_cnt, fn, pack_fn, cb); + io = ftl_io_init_md_read(dev, start_ppa, band, lbk_cnt, fn, pack_fn, cb_fn, cb_ctx); if (!io) { return -ENOMEM; } @@ -858,10 +859,10 @@ ftl_band_read_md(struct ftl_band *band, size_t lbk_cnt, struct ftl_ppa start_ppa } int -ftl_band_read_tail_md(struct ftl_band *band, struct ftl_ppa ppa, struct ftl_cb cb) +ftl_band_read_tail_md(struct ftl_band *band, struct ftl_ppa ppa, ftl_io_fn cb_fn, void *cb_ctx) { return ftl_band_read_md(band, ftl_tail_md_num_lbks(band->dev), ppa, - ftl_read_md_cb, ftl_unpack_tail_md, cb); + ftl_read_md_cb, ftl_unpack_tail_md, cb_fn, cb_ctx); } static size_t @@ -877,10 +878,9 @@ ftl_lba_map_offset_from_ppa(struct ftl_band *band, struct ftl_ppa ppa) } static void -ftl_read_lba_map_cb(void *arg, int status) +ftl_read_lba_map_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_md_io *md_io = arg; - struct ftl_io *io = &md_io->io; + struct ftl_md_io *md_io = (struct ftl_md_io *)io; struct ftl_lba_map *lba_map = &io->band->lba_map; uint64_t offset; @@ -892,12 +892,12 @@ ftl_read_lba_map_cb(void *arg, int status) io->lbk_cnt * FTL_BLOCK_SIZE); } - md_io->cb.fn(md_io->cb.ctx, status); + md_io->cb_fn(io, md_io->cb_ctx, status); } int ftl_band_read_lba_map(struct ftl_band *band, size_t offset, size_t lba_cnt, - struct ftl_cb cb) + ftl_io_fn cb_fn, void *cb_ctx) { size_t lbk_cnt, lbk_off; @@ -907,18 +907,19 @@ ftl_band_read_lba_map(struct ftl_band *band, size_t offset, size_t lba_cnt, assert(lbk_off + lbk_cnt <= ftl_lba_map_num_lbks(band->dev)); return ftl_band_read_md(band, lbk_cnt, ftl_band_lba_map_ppa(band, lbk_off), - ftl_read_lba_map_cb, NULL, cb); + ftl_read_lba_map_cb, NULL, cb_fn, cb_ctx); } int -ftl_band_read_head_md(struct ftl_band *band, struct ftl_cb cb) +ftl_band_read_head_md(struct ftl_band *band, ftl_io_fn cb_fn, void *cb_ctx) { return ftl_band_read_md(band, ftl_head_md_num_lbks(band->dev), ftl_band_head_md_ppa(band), ftl_read_md_cb, ftl_unpack_head_md, - cb); + cb_fn, + cb_ctx); } static void @@ -943,9 +944,8 @@ ftl_erase_fail(struct ftl_io *io, int status) } static void -ftl_band_erase_cb(void *ctx, int status) +ftl_band_erase_cb(struct ftl_io *io, void *ctx, int status) { - struct ftl_io *io = ctx; struct ftl_chunk *chunk; if (spdk_unlikely(status)) { diff --git a/lib/ftl/ftl_band.h b/lib/ftl/ftl_band.h index b3e6589d0..52eb67921 100644 --- a/lib/ftl/ftl_band.h +++ b/lib/ftl/ftl_band.h @@ -38,10 +38,10 @@ #include "spdk/bit_array.h" #include "spdk/queue.h" +#include "ftl_io.h" #include "ftl_ppa.h" struct spdk_ftl_dev; -struct ftl_cb; enum ftl_chunk_state { FTL_CHUNK_STATE_FREE, @@ -170,7 +170,7 @@ void ftl_band_clear_lba_map(struct ftl_band *band); void ftl_band_release_lba_map(struct ftl_band *band); int ftl_band_read_lba_map(struct ftl_band *band, size_t offset, size_t lba_cnt, - struct ftl_cb cb); + ftl_io_fn cb_fn, void *cb_ctx); struct ftl_ppa ftl_band_next_xfer_ppa(struct ftl_band *band, struct ftl_ppa ppa, size_t num_lbks); struct ftl_ppa ftl_band_next_ppa(struct ftl_band *band, struct ftl_ppa ppa, @@ -184,10 +184,10 @@ struct ftl_band *ftl_band_from_ppa(struct spdk_ftl_dev *dev, struct ftl_ppa ppa) struct ftl_chunk *ftl_band_chunk_from_ppa(struct ftl_band *band, struct ftl_ppa); void ftl_band_md_clear(struct ftl_band *band); int ftl_band_read_tail_md(struct ftl_band *band, struct ftl_ppa, - struct ftl_cb cb); -int ftl_band_read_head_md(struct ftl_band *band, struct ftl_cb cb); -int ftl_band_write_tail_md(struct ftl_band *band, spdk_ftl_fn cb); -int ftl_band_write_head_md(struct ftl_band *band, spdk_ftl_fn cb); + ftl_io_fn cb_fn, void *cb_ctx); +int ftl_band_read_head_md(struct ftl_band *band, ftl_io_fn cb_fn, void *cb_ctx); +int ftl_band_write_tail_md(struct ftl_band *band, ftl_io_fn cb); +int ftl_band_write_head_md(struct ftl_band *band, ftl_io_fn cb); struct ftl_ppa ftl_band_tail_md_ppa(struct ftl_band *band); struct ftl_ppa ftl_band_head_md_ppa(struct ftl_band *band); void ftl_band_write_failed(struct ftl_band *band); diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index d38492dcc..c6219860f 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -79,7 +79,10 @@ struct ftl_flush { size_t num_req; /* Callback */ - struct ftl_cb cb; + struct { + spdk_ftl_fn fn; + void *ctx; + } cb; /* Batch bitmap */ struct spdk_bit_array *bmap; @@ -189,9 +192,8 @@ ftl_md_write_fail(struct ftl_io *io, int status) } static void -ftl_md_write_cb(void *arg, int status) +ftl_md_write_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_io *io = arg; struct spdk_ftl_dev *dev = io->dev; struct ftl_nv_cache *nv_cache = &dev->nv_cache; struct ftl_wptr *wptr; @@ -1055,9 +1057,8 @@ ftl_write_fail(struct ftl_io *io, int status) } static void -ftl_write_cb(void *arg, int status) +ftl_write_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_io *io = arg; struct spdk_ftl_dev *dev = io->dev; struct ftl_rwb_batch *batch = io->rwb_batch; struct ftl_rwb_entry *entry; @@ -1157,7 +1158,7 @@ ftl_update_l2p(struct spdk_ftl_dev *dev, const struct ftl_rwb_entry *entry, static struct ftl_io * ftl_io_init_child_write(struct ftl_io *parent, struct ftl_ppa ppa, - void *data, void *md, spdk_ftl_fn cb) + void *data, void *md, ftl_io_fn cb) { struct ftl_io *io; struct spdk_ftl_dev *dev = parent->dev; @@ -1171,7 +1172,7 @@ ftl_io_init_child_write(struct ftl_io *parent, struct ftl_ppa ppa, .flags = 0, .type = FTL_IO_WRITE, .lbk_cnt = dev->xfer_size, - .fn = cb, + .cb_fn = cb, .data = data, .md = md, }; @@ -1187,10 +1188,9 @@ ftl_io_init_child_write(struct ftl_io *parent, struct ftl_ppa ppa, } static void -ftl_io_child_write_cb(void *ctx, int status) +ftl_io_child_write_cb(struct ftl_io *io, void *ctx, int status) { struct ftl_chunk *chunk; - struct ftl_io *io = ctx; chunk = ftl_band_chunk_from_ppa(io->band, io->ppa); chunk->busy = false; diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index 08d39b692..0cc98278d 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -256,15 +256,15 @@ ftl_io_shrink_iovec(struct ftl_io *io, size_t lbk_cnt) static void ftl_io_init(struct ftl_io *io, struct spdk_ftl_dev *dev, - spdk_ftl_fn fn, void *ctx, int flags, int type) + ftl_io_fn fn, void *ctx, int flags, int type) { io->flags |= flags | FTL_IO_INITIALIZED; io->type = type; io->dev = dev; io->lba.single = FTL_LBA_INVALID; io->ppa.ppa = FTL_PPA_INVALID; - io->cb.fn = fn; - io->cb.ctx = ctx; + io->cb_fn = fn; + io->cb_ctx = ctx; io->trace = ftl_trace_alloc_id(dev); } @@ -291,7 +291,7 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) } ftl_io_clear(io); - ftl_io_init(io, dev, opts->fn, io, opts->flags | FTL_IO_INTERNAL, opts->type); + ftl_io_init(io, dev, opts->cb_fn, opts->cb_ctx, opts->flags | FTL_IO_INTERNAL, opts->type); io->rwb_batch = opts->rwb_batch; io->band = opts->band; @@ -309,7 +309,7 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) struct ftl_io * ftl_io_rwb_init(struct spdk_ftl_dev *dev, struct ftl_band *band, - struct ftl_rwb_batch *batch, spdk_ftl_fn cb) + struct ftl_rwb_batch *batch, ftl_io_fn cb) { struct ftl_io_init_opts opts = { .dev = dev, @@ -320,7 +320,7 @@ ftl_io_rwb_init(struct spdk_ftl_dev *dev, struct ftl_band *band, .flags = 0, .type = FTL_IO_WRITE, .lbk_cnt = dev->xfer_size, - .fn = cb, + .cb_fn = cb, .data = ftl_rwb_batch_get_data(batch), .md = ftl_rwb_batch_get_md(batch), }; @@ -329,7 +329,7 @@ ftl_io_rwb_init(struct spdk_ftl_dev *dev, struct ftl_band *band, } struct ftl_io * -ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb) +ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, ftl_io_fn cb) { struct ftl_io *io; struct ftl_io_init_opts opts = { @@ -341,7 +341,7 @@ ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb) .flags = FTL_IO_PPA_MODE, .type = FTL_IO_ERASE, .lbk_cnt = 1, - .fn = cb, + .cb_fn = cb, .data = NULL, .md = NULL, }; @@ -356,9 +356,15 @@ ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb) return io; } +static void +_ftl_user_cb(struct ftl_io *io, void *arg, int status) +{ + io->user_fn(arg, status); +} + struct ftl_io * ftl_io_user_init(struct spdk_io_channel *_ioch, uint64_t lba, size_t lbk_cnt, struct iovec *iov, - size_t iov_cnt, spdk_ftl_fn cb_fn, void *cb_arg, int type) + size_t iov_cnt, spdk_ftl_fn cb_fn, void *cb_ctx, int type) { struct ftl_io_channel *ioch = spdk_io_channel_get_ctx(_ioch); struct spdk_ftl_dev *dev = ioch->dev; @@ -369,8 +375,9 @@ ftl_io_user_init(struct spdk_io_channel *_ioch, uint64_t lba, size_t lbk_cnt, st return NULL; } - ftl_io_init(io, dev, cb_fn, cb_arg, 0, type); + ftl_io_init(io, dev, _ftl_user_cb, cb_ctx, 0, type); io->lba.single = lba; + io->user_fn = cb_fn; if (ftl_io_init_iovec(io, iov, iov_cnt, lbk_cnt)) { ftl_io_free(io); @@ -425,8 +432,8 @@ ftl_io_complete(struct ftl_io *io) pthread_spin_unlock(&io->lock); if (complete) { - if (io->cb.fn) { - io->cb.fn(io->cb.ctx, io->status); + if (io->cb_fn) { + io->cb_fn(io, io->cb_ctx, io->status); } if (parent && ftl_io_remove_child(io)) { @@ -511,10 +518,10 @@ ftl_io_alloc(struct spdk_io_channel *ch) } void -ftl_io_reinit(struct ftl_io *io, spdk_ftl_fn fn, void *ctx, int flags, int type) +ftl_io_reinit(struct ftl_io *io, ftl_io_fn cb, void *ctx, int flags, int type) { ftl_io_clear(io); - ftl_io_init(io, io->dev, fn, ctx, flags, type); + ftl_io_init(io, io->dev, cb, ctx, flags, type); } void diff --git a/lib/ftl/ftl_io.h b/lib/ftl/ftl_io.h index ce041c3c4..ceb14bb38 100644 --- a/lib/ftl/ftl_io.h +++ b/lib/ftl/ftl_io.h @@ -47,6 +47,7 @@ struct ftl_band; struct ftl_io; typedef int (*ftl_md_pack_fn)(struct ftl_band *); +typedef void (*ftl_io_fn)(struct ftl_io *, void *, int); /* IO flags */ enum ftl_io_flags { @@ -112,16 +113,11 @@ struct ftl_io_init_opts { /* Metadata */ void *md; - /* Callback */ - spdk_ftl_fn fn; -}; - -struct ftl_cb { - /* Callback function */ - spdk_ftl_fn fn; + /* Callback's function */ + ftl_io_fn cb_fn; /* Callback's context */ - void *ctx; + void *cb_ctx; }; struct ftl_io_channel { @@ -187,8 +183,14 @@ struct ftl_io { /* Number of split requests */ size_t req_cnt; - /* Completion callback */ - struct ftl_cb cb; + /* Callback's function */ + ftl_io_fn cb_fn; + + /* Callback's context */ + void *cb_ctx; + + /* User callback function */ + spdk_ftl_fn user_fn; /* Flags */ int flags; @@ -222,8 +224,11 @@ struct ftl_md_io { /* Serialization/deserialization callback */ ftl_md_pack_fn pack_fn; - /* User's callback */ - struct ftl_cb cb; + /* Callback's function */ + ftl_io_fn cb_fn; + + /* Callback's context */ + void *cb_ctx; }; static inline bool @@ -251,7 +256,7 @@ struct ftl_io *ftl_io_alloc_child(struct ftl_io *parent); void ftl_io_fail(struct ftl_io *io, int status); void ftl_io_free(struct ftl_io *io); struct ftl_io *ftl_io_init_internal(const struct ftl_io_init_opts *opts); -void ftl_io_reinit(struct ftl_io *io, spdk_ftl_fn cb, +void ftl_io_reinit(struct ftl_io *io, ftl_io_fn cb, void *ctx, int flags, int type); void ftl_io_clear(struct ftl_io *io); void ftl_io_inc_req(struct ftl_io *io); @@ -264,8 +269,8 @@ size_t ftl_iovec_num_lbks(struct iovec *iov, size_t iov_cnt); void *ftl_io_iovec_addr(struct ftl_io *io); size_t ftl_io_iovec_len_left(struct ftl_io *io); struct ftl_io *ftl_io_rwb_init(struct spdk_ftl_dev *dev, struct ftl_band *band, - struct ftl_rwb_batch *entry, spdk_ftl_fn cb); -struct ftl_io *ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb); + struct ftl_rwb_batch *entry, ftl_io_fn cb); +struct ftl_io *ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, ftl_io_fn cb); struct ftl_io *ftl_io_user_init(struct spdk_io_channel *ioch, uint64_t lba, size_t lbk_cnt, struct iovec *iov, size_t iov_cnt, spdk_ftl_fn cb_fn, void *cb_arg, int type); diff --git a/lib/ftl/ftl_reloc.c b/lib/ftl/ftl_reloc.c index d692c9528..ed67b493e 100644 --- a/lib/ftl/ftl_reloc.c +++ b/lib/ftl/ftl_reloc.c @@ -163,13 +163,11 @@ _ftl_reloc_prep(struct ftl_band_reloc *breloc) } static void -ftl_reloc_read_lba_map_cb(void *arg, int status) +ftl_reloc_read_lba_map_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_io *io = arg; - struct ftl_band_reloc *breloc = ftl_io_get_band_reloc(io); + struct ftl_band_reloc *breloc = arg; assert(status == 0); - ftl_io_free(io); _ftl_reloc_prep(breloc); } @@ -178,18 +176,12 @@ ftl_reloc_read_lba_map(struct ftl_band_reloc *breloc) { struct ftl_band *band = breloc->band; struct spdk_ftl_dev *dev = band->dev; - struct ftl_io *io = ftl_io_alloc(dev->ioch); - - io->dev = dev; - io->band = band; - io->cb.ctx = io; - io->cb.fn = ftl_reloc_read_lba_map_cb; if (ftl_band_alloc_lba_map(band)) { assert(false); } - return ftl_band_read_lba_map(band, 0, ftl_num_band_lbks(dev), io->cb); + return ftl_band_read_lba_map(band, 0, ftl_num_band_lbks(dev), ftl_reloc_read_lba_map_cb, breloc); } static void @@ -219,9 +211,8 @@ ftl_reloc_free_io(struct ftl_band_reloc *breloc, struct ftl_io *io) } static void -ftl_reloc_write_cb(void *arg, int status) +ftl_reloc_write_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_io *io = arg; struct ftl_ppa ppa = io->ppa; struct ftl_band_reloc *breloc = ftl_io_get_band_reloc(io); size_t i; @@ -242,9 +233,8 @@ ftl_reloc_write_cb(void *arg, int status) } static void -ftl_reloc_read_cb(void *arg, int status) +ftl_reloc_read_cb(struct ftl_io *io, void *arg, int status) { - struct ftl_io *io = arg; struct ftl_band_reloc *breloc = ftl_io_get_band_reloc(io); /* TODO: We should handle fail on relocation read. We need to inform */ @@ -384,13 +374,13 @@ ftl_reloc_next_lbks(struct ftl_band_reloc *breloc, struct ftl_ppa *ppa) static void ftl_reloc_io_reinit(struct ftl_io *io, struct ftl_band_reloc *breloc, - spdk_ftl_fn fn, enum ftl_io_type io_type, int flags) + ftl_io_fn fn, enum ftl_io_type io_type, int flags) { size_t i; uint64_t lbkoff; struct ftl_ppa ppa = io->ppa; - ftl_io_reinit(io, fn, io, flags | FTL_IO_INTERNAL, io_type); + ftl_io_reinit(io, fn, NULL, flags | FTL_IO_INTERNAL, io_type); io->ppa = ppa; io->band = breloc->band; @@ -437,7 +427,7 @@ ftl_reloc_io_init(struct ftl_band_reloc *breloc, struct ftl_io *io, .flags = FTL_IO_KEEP_ALIVE | FTL_IO_INTERNAL | FTL_IO_PPA_MODE, .type = FTL_IO_READ, .lbk_cnt = num_lbks, - .fn = ftl_reloc_read_cb, + .cb_fn = ftl_reloc_read_cb, }; opts.data = spdk_dma_malloc(PAGE_SIZE * num_lbks, PAGE_SIZE, NULL); diff --git a/lib/ftl/ftl_restore.c b/lib/ftl/ftl_restore.c index 24ce8bd22..1b9970441 100644 --- a/lib/ftl/ftl_restore.c +++ b/lib/ftl/ftl_restore.c @@ -236,7 +236,7 @@ out: } static void -ftl_restore_head_cb(void *ctx, int status) +ftl_restore_head_cb(struct ftl_io *io, void *ctx, int status) { struct ftl_restore_band *rband = ctx; struct ftl_restore *restore = rband->parent; @@ -257,21 +257,18 @@ ftl_restore_head_md(struct ftl_restore *restore) struct spdk_ftl_dev *dev = restore->dev; struct ftl_restore_band *rband; struct ftl_lba_map *lba_map; - struct ftl_cb cb; unsigned int num_failed = 0, num_ios; size_t i; - cb.fn = ftl_restore_head_cb; restore->num_ios = ftl_dev_num_bands(dev); for (i = 0; i < ftl_dev_num_bands(dev); ++i) { rband = &restore->bands[i]; lba_map = &rband->band->lba_map; - cb.ctx = rband; lba_map->dma_buf = restore->md_buf + i * ftl_head_md_num_lbks(dev) * FTL_BLOCK_SIZE; - if (ftl_band_read_head_md(rband->band, cb)) { + if (ftl_band_read_head_md(rband->band, ftl_restore_head_cb, rband)) { if (spdk_likely(rband->band->num_chunks)) { SPDK_ERRLOG("Failed to read metadata on band %zu\n", i); @@ -364,7 +361,7 @@ ftl_restore_next_band(struct ftl_restore *restore) } static void -ftl_restore_tail_md_cb(void *ctx, int status) +ftl_restore_tail_md_cb(struct ftl_io *io, void *ctx, int status) { struct ftl_restore_band *rband = ctx; struct ftl_restore *restore = rband->parent; @@ -393,15 +390,12 @@ ftl_restore_tail_md(struct ftl_restore_band *rband) { struct ftl_restore *restore = rband->parent; struct ftl_band *band = rband->band; - struct ftl_cb cb = { .fn = ftl_restore_tail_md_cb, - .ctx = rband - }; band->tail_md_ppa = ftl_band_tail_md_ppa(band); band->lba_map.map = restore->lba_map; band->lba_map.dma_buf = restore->md_buf; - if (ftl_band_read_tail_md(band, band->tail_md_ppa, cb)) { + if (ftl_band_read_tail_md(band, band->tail_md_ppa, ftl_restore_tail_md_cb, rband)) { SPDK_ERRLOG("Failed to send tail metadata read\n"); ftl_restore_complete(restore, -EIO); return -EIO; diff --git a/test/unit/lib/ftl/ftl_io.c/ftl_io_ut.c b/test/unit/lib/ftl/ftl_io.c/ftl_io_ut.c index 73efefba3..0fbe1e4b9 100644 --- a/test/unit/lib/ftl/ftl_io.c/ftl_io_ut.c +++ b/test/unit/lib/ftl/ftl_io.c/ftl_io_ut.c @@ -76,15 +76,15 @@ free_device(struct spdk_ftl_dev *dev) } static void -setup_io(struct ftl_io *io, struct spdk_ftl_dev *dev, spdk_ftl_fn cb, void *ctx) +setup_io(struct ftl_io *io, struct spdk_ftl_dev *dev, ftl_io_fn cb, void *ctx) { io->dev = dev; - io->cb.fn = cb; - io->cb.ctx = ctx; + io->cb_fn = cb; + io->cb_ctx = ctx; } static struct ftl_io * -alloc_io(struct spdk_ftl_dev *dev, spdk_ftl_fn cb, void *ctx) +alloc_io(struct spdk_ftl_dev *dev, ftl_io_fn cb, void *ctx) { struct ftl_io *io; @@ -96,7 +96,7 @@ alloc_io(struct spdk_ftl_dev *dev, spdk_ftl_fn cb, void *ctx) } static void -io_complete_cb(void *ctx, int status) +io_complete_cb(struct ftl_io *io, void *ctx, int status) { *(int *)ctx = status; } diff --git a/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c b/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c index db67697cb..b822ea028 100644 --- a/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c +++ b/test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c @@ -95,9 +95,9 @@ ftl_lba_map_num_lbks(const struct spdk_ftl_dev *dev) int ftl_band_read_lba_map(struct ftl_band *band, size_t offset, - size_t lbk_cnt, struct ftl_cb cb) + size_t lbk_cnt, ftl_io_fn fn, void *ctx) { - cb.fn(cb.ctx, 0); + fn(ctx, ctx, 0); return 0; } @@ -127,13 +127,13 @@ ftl_band_ppa_from_lbkoff(struct ftl_band *band, uint64_t lbkoff) void ftl_io_read(struct ftl_io *io) { - io->cb.fn(io->cb.ctx, 0); + io->cb_fn(io, io->cb_ctx, 0); } void ftl_io_write(struct ftl_io *io) { - io->cb.fn(io->cb.ctx, 0); + io->cb_fn(io, io->cb_ctx, 0); } struct ftl_io * @@ -150,8 +150,8 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) io->dev = opts->dev; io->band = opts->band; io->flags = opts->flags; - io->cb.fn = opts->fn; - io->cb.ctx = io; + io->cb_fn = opts->cb_fn; + io->cb_ctx = io; io->lbk_cnt = opts->lbk_cnt; io->iov[0].iov_base = opts->data; return io; @@ -172,10 +172,10 @@ ftl_io_free(struct ftl_io *io) } void -ftl_io_reinit(struct ftl_io *io, spdk_ftl_fn fn, void *ctx, int flags, int type) +ftl_io_reinit(struct ftl_io *io, ftl_io_fn fn, void *ctx, int flags, int type) { - io->cb.fn = fn; - io->cb.ctx = ctx; + io->cb_fn = fn; + io->cb_ctx = ctx; io->type = type; } diff --git a/test/unit/lib/ftl/ftl_wptr/ftl_wptr_ut.c b/test/unit/lib/ftl/ftl_wptr/ftl_wptr_ut.c index 226ead8e1..c7363e970 100644 --- a/test/unit/lib/ftl/ftl_wptr/ftl_wptr_ut.c +++ b/test/unit/lib/ftl/ftl_wptr/ftl_wptr_ut.c @@ -80,7 +80,7 @@ DEFINE_STUB(spdk_bdev_desc_get_bdev, struct spdk_bdev *, (struct spdk_bdev_desc DEFINE_STUB(spdk_bdev_get_num_blocks, uint64_t, (const struct spdk_bdev *bdev), 0); struct ftl_io * -ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb) +ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, ftl_io_fn cb) { struct ftl_io *io; @@ -89,7 +89,7 @@ ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb) io->dev = band->dev; io->band = band; - io->cb.fn = cb; + io->cb_fn = cb; io->lbk_cnt = 1; return io; @@ -104,7 +104,7 @@ ftl_io_advance(struct ftl_io *io, size_t lbk_cnt) void ftl_io_complete(struct ftl_io *io) { - io->cb.fn(io, 0); + io->cb_fn(io, NULL, 0); free(io); } @@ -177,7 +177,7 @@ test_wptr(void) /* Call the metadata completion cb to force band state change */ /* and removal of the actual wptr */ - ftl_md_write_cb(&io, 0); + ftl_md_write_cb(&io, NULL, 0); CU_ASSERT_EQUAL(band->state, FTL_BAND_STATE_CLOSED); CU_ASSERT_TRUE(LIST_EMPTY(&dev->wptr_list));