From bf4973087f9df7376dc1b6ce2d4fded62e756517 Mon Sep 17 00:00:00 2001 From: Wojciech Malikowski Date: Tue, 11 Jun 2019 10:04:23 -0400 Subject: [PATCH] lib/ftl: Allow for relocating open band In case ANM event occurs on open band reloc need to be able to process such event. If band is not in closed sate do not alloc lba map for it and do not set it to free state after relocation. Change-Id: I2f4a5770fef08271d222936ca19f3cc98e5e5be1 Signed-off-by: Wojciech Malikowski Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457612 Tested-by: SPDK CI Jenkins Reviewed-by: Darek Stojaczyk Reviewed-by: Shuhei Matsumoto Reviewed-by: Konrad Sztyber --- lib/ftl/ftl_reloc.c | 11 ++++++++--- test/unit/lib/ftl/ftl_reloc.c/ftl_reloc_ut.c | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/ftl/ftl_reloc.c b/lib/ftl/ftl_reloc.c index 4383978f8..3ebd8cc34 100644 --- a/lib/ftl/ftl_reloc.c +++ b/lib/ftl/ftl_reloc.c @@ -204,8 +204,12 @@ ftl_reloc_prep(struct ftl_band_reloc *breloc) reloc->num_active++; if (!band->high_prio) { - if (ftl_band_alloc_lba_map(band)) { - assert(false); + if (band->lba_map.ref_cnt == 0) { + if (ftl_band_alloc_lba_map(band)) { + assert(false); + } + } else { + ftl_band_acquire_lba_map(band); } } @@ -551,7 +555,7 @@ ftl_reloc_release(struct ftl_band_reloc *breloc) return; } - if (ftl_band_empty(band)) { + if (ftl_band_empty(band) && band->state == FTL_BAND_STATE_CLOSED) { ftl_band_set_state(breloc->band, FTL_BAND_STATE_FREE); } } @@ -749,6 +753,7 @@ ftl_reloc(struct ftl_reloc *reloc) if (reloc->num_active == reloc->max_active) { break; } + ftl_reloc_add_active_queue(breloc); } 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 d969ac453..39372d968 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 @@ -415,6 +415,9 @@ test_reloc_chunk(void) breloc = &reloc->brelocs[0]; band = breloc->band; + /* High priority band have allocated lba map */ + band->high_prio = 1; + ftl_band_alloc_lba_map(band); num_io = MAX_RELOC_QDEPTH * reloc->xfer_size; num_iters = ftl_dev_lbks_in_chunk(dev) / num_io;