lib/ftl: Replace some fileds in ftl_zone with spdk_bdev_zone_info
ftl_zone had reduntant fields to spdk_bdev_zone_info. Change-Id: I5ec5bbc74912f286d798027afed06d0cd1917cc2 Signed-off-by: Wojciech Malikowski <wojciech.malikowski@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471909 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: 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
55342d972b
commit
777ce6d83c
@ -235,7 +235,7 @@ _ftl_band_set_closed(struct ftl_band *band)
|
||||
if (spdk_likely(band->num_zones)) {
|
||||
LIST_INSERT_HEAD(&dev->shut_bands, band, list_entry);
|
||||
CIRCLEQ_FOREACH(zone, &band->zones, circleq) {
|
||||
zone->state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||
zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||
}
|
||||
} else {
|
||||
LIST_REMOVE(band, list_entry);
|
||||
@ -405,7 +405,7 @@ ftl_band_tail_md_addr(struct ftl_band *band)
|
||||
}
|
||||
|
||||
addr.offset = (num_req / band->num_zones) * xfer_size;
|
||||
addr.offset += zone->start_addr.offset;
|
||||
addr.offset += zone->info.zone_id;
|
||||
|
||||
return addr;
|
||||
}
|
||||
@ -417,7 +417,7 @@ ftl_band_head_md_addr(struct ftl_band *band)
|
||||
return ftl_to_addr(FTL_ADDR_INVALID);
|
||||
}
|
||||
|
||||
return CIRCLEQ_FIRST(&band->zones)->start_addr;
|
||||
return ftl_to_addr(CIRCLEQ_FIRST(&band->zones)->info.zone_id);
|
||||
}
|
||||
|
||||
void
|
||||
@ -549,7 +549,7 @@ ftl_band_next_xfer_addr(struct ftl_band *band, struct ftl_addr addr, size_t num_
|
||||
struct ftl_zone *_zone;
|
||||
size_t _num_zones = 0;
|
||||
CIRCLEQ_FOREACH(_zone, &band->zones, circleq) {
|
||||
if (spdk_likely(_zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE)) {
|
||||
if (spdk_likely(_zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE)) {
|
||||
_num_zones++;
|
||||
}
|
||||
}
|
||||
@ -588,7 +588,7 @@ ftl_band_next_xfer_addr(struct ftl_band *band, struct ftl_addr addr, size_t num_
|
||||
}
|
||||
}
|
||||
|
||||
addr.offset = zone->start_addr.offset + offset;
|
||||
addr.offset = zone->info.zone_id + offset;
|
||||
return addr;
|
||||
}
|
||||
|
||||
@ -1033,7 +1033,7 @@ ftl_erase_fail(struct ftl_io *io, int status)
|
||||
ftl_addr2str(io->addr, buf, sizeof(buf)), status);
|
||||
|
||||
zone = ftl_band_zone_from_addr(band, io->addr);
|
||||
zone->state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||
zone->info.state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||
ftl_band_remove_zone(band, zone);
|
||||
band->tail_md_addr = ftl_band_tail_md_addr(band);
|
||||
}
|
||||
@ -1048,8 +1048,8 @@ ftl_band_erase_cb(struct ftl_io *io, void *ctx, int status)
|
||||
return;
|
||||
}
|
||||
zone = ftl_band_zone_from_addr(io->band, io->addr);
|
||||
zone->state = SPDK_BDEV_ZONE_STATE_EMPTY;
|
||||
zone->write_offset = zone->start_addr.offset;
|
||||
zone->info.state = SPDK_BDEV_ZONE_STATE_EMPTY;
|
||||
zone->info.write_pointer = zone->info.zone_id;
|
||||
}
|
||||
|
||||
int
|
||||
@ -1065,7 +1065,7 @@ ftl_band_erase(struct ftl_band *band)
|
||||
ftl_band_set_state(band, FTL_BAND_STATE_PREP);
|
||||
|
||||
CIRCLEQ_FOREACH(zone, &band->zones, circleq) {
|
||||
if (zone->state == SPDK_BDEV_ZONE_STATE_EMPTY) {
|
||||
if (zone->info.state == SPDK_BDEV_ZONE_STATE_EMPTY) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1075,7 +1075,7 @@ ftl_band_erase(struct ftl_band *band)
|
||||
break;
|
||||
}
|
||||
|
||||
io->addr = zone->start_addr;
|
||||
io->addr.offset = zone->info.zone_id;
|
||||
rc = ftl_io_erase(io);
|
||||
if (rc) {
|
||||
assert(0);
|
||||
@ -1112,11 +1112,11 @@ ftl_band_next_operational_zone(struct ftl_band *band, struct ftl_zone *zone)
|
||||
|
||||
/* Erasing band may fail after it was assigned to wptr. */
|
||||
/* In such a case zone is no longer in band->zones queue. */
|
||||
if (spdk_likely(zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE)) {
|
||||
if (spdk_likely(zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE)) {
|
||||
result = ftl_band_next_zone(band, zone);
|
||||
} else {
|
||||
CIRCLEQ_FOREACH_REVERSE(entry, &band->zones, circleq) {
|
||||
if (entry->start_addr.offset > zone->start_addr.offset) {
|
||||
if (entry->info.zone_id > zone->info.zone_id) {
|
||||
result = entry;
|
||||
} else {
|
||||
if (!result) {
|
||||
|
@ -50,18 +50,11 @@ struct spdk_ftl_dev;
|
||||
struct ftl_lba_map_request;
|
||||
|
||||
struct ftl_zone {
|
||||
/* Zone state */
|
||||
enum spdk_bdev_zone_state state;
|
||||
struct spdk_bdev_zone_info info;
|
||||
|
||||
/* Indicates that there is inflight write */
|
||||
bool busy;
|
||||
|
||||
/* Current logical block's offset */
|
||||
uint64_t write_offset;
|
||||
|
||||
/* First logical block of a zone */
|
||||
struct ftl_addr start_addr;
|
||||
|
||||
CIRCLEQ_ENTRY(ftl_zone) circleq;
|
||||
};
|
||||
|
||||
@ -236,7 +229,7 @@ ftl_band_empty(const struct ftl_band *band)
|
||||
static inline struct ftl_zone *
|
||||
ftl_band_next_zone(struct ftl_band *band, struct ftl_zone *zone)
|
||||
{
|
||||
assert(zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE);
|
||||
assert(zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE);
|
||||
return CIRCLEQ_LOOP_NEXT(&band->zones, zone, circleq);
|
||||
}
|
||||
|
||||
@ -283,8 +276,8 @@ ftl_band_zone_is_first(struct ftl_band *band, struct ftl_zone *zone)
|
||||
static inline int
|
||||
ftl_zone_is_writable(const struct ftl_zone *zone)
|
||||
{
|
||||
return (zone->state == SPDK_BDEV_ZONE_STATE_OPEN ||
|
||||
zone->state == SPDK_BDEV_ZONE_STATE_EMPTY) &&
|
||||
return (zone->info.state == SPDK_BDEV_ZONE_STATE_OPEN ||
|
||||
zone->info.state == SPDK_BDEV_ZONE_STATE_EMPTY) &&
|
||||
!zone->busy;
|
||||
}
|
||||
|
||||
|
@ -358,8 +358,8 @@ ftl_submit_erase(struct ftl_io *io)
|
||||
for (i = 0; i < io->lbk_cnt; ++i) {
|
||||
if (i != 0) {
|
||||
zone = ftl_band_next_zone(band, ftl_band_zone_from_addr(band, addr));
|
||||
assert(zone->state == SPDK_BDEV_ZONE_STATE_CLOSED);
|
||||
addr = zone->start_addr;
|
||||
assert(zone->info.state == SPDK_BDEV_ZONE_STATE_CLOSED);
|
||||
addr.offset = zone->info.zone_id;
|
||||
}
|
||||
|
||||
assert(ftl_addr_get_zone_offset(dev, addr) == 0);
|
||||
@ -484,7 +484,7 @@ ftl_wptr_init(struct ftl_band *band)
|
||||
wptr->dev = dev;
|
||||
wptr->band = band;
|
||||
wptr->zone = CIRCLEQ_FIRST(&band->zones);
|
||||
wptr->addr = wptr->zone->start_addr;
|
||||
wptr->addr.offset = wptr->zone->info.zone_id;
|
||||
TAILQ_INIT(&wptr->pending_queue);
|
||||
|
||||
return wptr;
|
||||
@ -620,7 +620,7 @@ ftl_wptr_ready(struct ftl_wptr *wptr)
|
||||
|
||||
if (spdk_unlikely(!ftl_zone_is_writable(wptr->zone))) {
|
||||
/* Erasing band may fail after it was assigned to wptr. */
|
||||
if (spdk_unlikely(wptr->zone->state == SPDK_BDEV_ZONE_STATE_OFFLINE)) {
|
||||
if (spdk_unlikely(wptr->zone->info.state == SPDK_BDEV_ZONE_STATE_OFFLINE)) {
|
||||
ftl_wptr_advance(wptr, wptr->dev->xfer_size);
|
||||
}
|
||||
return 0;
|
||||
@ -1519,7 +1519,7 @@ ftl_io_child_write_cb(struct ftl_io *io, void *ctx, int status)
|
||||
wptr = ftl_wptr_from_band(io->band);
|
||||
|
||||
zone->busy = false;
|
||||
zone->write_offset += io->lbk_cnt;
|
||||
zone->info.write_pointer += io->lbk_cnt;
|
||||
|
||||
/* If some other write on the same band failed the write pointer would already be freed */
|
||||
if (spdk_likely(wptr)) {
|
||||
@ -2148,7 +2148,7 @@ ftl_addr_is_written(struct ftl_band *band, struct ftl_addr addr)
|
||||
{
|
||||
struct ftl_zone *zone = ftl_band_zone_from_addr(band, addr);
|
||||
|
||||
return addr.offset < zone->write_offset;
|
||||
return addr.offset < zone->info.write_pointer;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -822,18 +822,16 @@ ftl_dev_get_zone_info_cb(struct spdk_bdev_io *bdev_io, bool success, void *cb_ar
|
||||
addr.offset = init_ctx->info[i].zone_id;
|
||||
band = &dev->bands[ftl_addr_get_band(dev, addr)];
|
||||
zone = &band->zone_buf[ftl_addr_get_punit(dev, addr)];
|
||||
zone->state = init_ctx->info[i].state;
|
||||
zone->start_addr = addr;
|
||||
zone->write_offset = init_ctx->info[i].write_pointer;
|
||||
zone->info = init_ctx->info[i];
|
||||
|
||||
/* TODO: add support for zone capacity less than zone size */
|
||||
if (init_ctx->info[i].capacity != ftl_get_num_blocks_in_zone(dev)) {
|
||||
zone->state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||
if (zone->info.capacity != ftl_get_num_blocks_in_zone(dev)) {
|
||||
zone->info.state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||
SPDK_ERRLOG("Zone capacity is not equal zone size for "
|
||||
"zone id: %"PRIu64"\n", init_ctx->zone_id);
|
||||
}
|
||||
|
||||
if (zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE) {
|
||||
if (zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE) {
|
||||
band->num_zones++;
|
||||
CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
|
||||
}
|
||||
|
@ -1087,7 +1087,7 @@ ftl_pad_zone_pad_finish(struct ftl_restore_band *rband, bool direct_access)
|
||||
}
|
||||
|
||||
for (i = 0; i < rband->band->num_zones; ++i) {
|
||||
if (rband->band->zone_buf[i].state != SPDK_BDEV_ZONE_STATE_CLOSED) {
|
||||
if (rband->band->zone_buf[i].info.state != SPDK_BDEV_ZONE_STATE_CLOSED) {
|
||||
num_pad_zones++;
|
||||
}
|
||||
}
|
||||
@ -1168,7 +1168,7 @@ ftl_pad_zone_cb(struct ftl_io *io, void *arg, int status)
|
||||
offset = io->addr.offset % ftl_get_num_blocks_in_zone(restore->dev);
|
||||
if (offset + io->lbk_cnt == ftl_get_num_blocks_in_zone(restore->dev)) {
|
||||
zone = ftl_band_zone_from_addr(band, io->addr);
|
||||
zone->state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||
zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||
} else {
|
||||
struct ftl_addr addr = io->addr;
|
||||
addr.offset += io->lbk_cnt;
|
||||
@ -1216,12 +1216,11 @@ ftl_restore_pad_band(struct ftl_restore_band *rband)
|
||||
}
|
||||
|
||||
for (i = 0; i < band->num_zones; ++i) {
|
||||
if (band->zone_buf[i].state == SPDK_BDEV_ZONE_STATE_CLOSED) {
|
||||
if (band->zone_buf[i].info.state == SPDK_BDEV_ZONE_STATE_CLOSED) {
|
||||
continue;
|
||||
}
|
||||
|
||||
addr = band->zone_buf[i].start_addr;
|
||||
addr.offset = band->zone_buf[i].write_offset;
|
||||
addr.offset = band->zone_buf[i].info.write_pointer;
|
||||
|
||||
buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * dev->xfer_size, 0, NULL);
|
||||
if (spdk_unlikely(!buffer)) {
|
||||
|
@ -121,8 +121,8 @@ test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id, size_t zone_size)
|
||||
|
||||
for (size_t i = 0; i < ftl_get_num_punits(dev); ++i) {
|
||||
zone = &band->zone_buf[i];
|
||||
zone->state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||
zone->start_addr.offset = zone_size * (id * ftl_get_num_punits(dev) + i);
|
||||
zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||
zone->info.zone_id = zone_size * (id * ftl_get_num_punits(dev) + i);
|
||||
CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
|
||||
band->num_zones++;
|
||||
}
|
||||
|
@ -264,7 +264,7 @@ test_next_xfer_addr(void)
|
||||
CU_ASSERT_EQUAL(result.offset, expect.offset);
|
||||
|
||||
/* Remove one zone and verify it's skipped properly */
|
||||
g_band->zone_buf[1].state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||
g_band->zone_buf[1].info.state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||
CIRCLEQ_REMOVE(&g_band->zones, &g_band->zone_buf[1], circleq);
|
||||
g_band->num_zones--;
|
||||
expect = addr_from_punit(2);
|
||||
|
Loading…
Reference in New Issue
Block a user