Commit 777ce6d8 authored by Wojciech Malikowski's avatar Wojciech Malikowski Committed by Tomasz Zawadzki
Browse files

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: default avatarWojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471909


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 55342d97
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -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) {
+4 −11
Original line number Diff line number Diff line
@@ -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;
}

+6 −6
Original line number Diff line number Diff line
@@ -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
+4 −6
Original line number Diff line number Diff line
@@ -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);
		}
+4 −5
Original line number Diff line number Diff line
@@ -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)) {
Loading