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:
Wojciech Malikowski 2019-10-21 10:48:57 -04:00 committed by Tomasz Zawadzki
parent 55342d972b
commit 777ce6d83c
7 changed files with 33 additions and 43 deletions

View File

@ -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) {

View File

@ -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;
}

View File

@ -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

View File

@ -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);
}

View File

@ -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)) {

View File

@ -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++;
}

View File

@ -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);