From b9d8382154d8bb893739171c25cb736f2a14fc18 Mon Sep 17 00:00:00 2001 From: Wojciech Malikowski Date: Wed, 29 Jan 2020 11:34:25 -0500 Subject: [PATCH] lib/ftl: Prevent from sending writes on resetting zone When reset operation is ongoing mark zone as busy to avoid write operation on it. This path fixes issue #1171. Change-Id: I30097e1db1bfbbabebd7e6adeab6e8810dc8b2b1 Signed-off-by: Wojciech Malikowski Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/483264 Community-CI: SPDK CI Jenkins Tested-by: SPDK CI Jenkins Reviewed-by: Konrad Sztyber Reviewed-by: Mateusz Kozlowski Reviewed-by: Shuhei Matsumoto Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris --- lib/ftl/ftl_band.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ftl/ftl_band.c b/lib/ftl/ftl_band.c index 625068d9b..3b0b39310 100644 --- a/lib/ftl/ftl_band.c +++ b/lib/ftl/ftl_band.c @@ -1043,11 +1043,14 @@ ftl_band_erase_cb(struct ftl_io *io, void *ctx, int status) { struct ftl_zone *zone; + zone = ftl_band_zone_from_addr(io->band, io->addr); + zone->busy = false; + if (spdk_unlikely(status)) { ftl_erase_fail(io, status); return; } - zone = ftl_band_zone_from_addr(io->band, io->addr); + zone->info.state = SPDK_BDEV_ZONE_STATE_EMPTY; zone->info.write_pointer = zone->info.zone_id; } @@ -1075,9 +1078,11 @@ ftl_band_erase(struct ftl_band *band) break; } + zone->busy = true; io->addr.offset = zone->info.zone_id; rc = ftl_io_erase(io); if (rc) { + zone->busy = false; assert(0); /* TODO: change band's state back to close? */ break;