From: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> We are planning to delay metadata writeback, so we want to immediately apply metadata changes to BAT page. Make all request that trigger PIWB_TYPE_ALLOC apply metadata changes immediately.
https://virtuozzo.atlassian.net/browse/VSTOR-91817 Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> --- drivers/md/dm-ploop-map.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 953eecb9555c..5d2bcc8446d5 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -777,6 +777,10 @@ static void ploop_advance_local_after_bat_wb(struct ploop *ploop, i = PLOOP_MAP_OFFSET; dst_clu = kmap_local_page(piwb->bat_page); + + if (piwb->type == PIWB_TYPE_ALLOC) + goto skip_apply; + for (; i < last; i++) { if (piwb->type == PIWB_TYPE_DISCARD) { ploop_piwb_discard_completed(ploop, success, i + off, dst_clu[i]); @@ -786,12 +790,6 @@ static void ploop_advance_local_after_bat_wb(struct ploop *ploop, if (!dst_clu[i]) continue; - if (ploop_cluster_is_in_top_delta(ploop, i + off) - && piwb->type == PIWB_TYPE_ALLOC) { - WARN_ON(bat_entries[i] != dst_clu[i]); - continue; - } - if (success) { WRITE_ONCE(bat_entries[i], READ_ONCE(dst_clu[i])); WRITE_ONCE(md->bat_levels[i], ploop_top_level(ploop)); @@ -799,11 +797,12 @@ static void ploop_advance_local_after_bat_wb(struct ploop *ploop, ploop_hole_set_bit(i + off, ploop); } } +skip_apply: WARN_ON_ONCE(!test_bit(MD_WRITEBACK, &md->status)); + /* protect piwb */ spin_lock_irqsave(&md->md_lock, flags); /* write */ clear_bit(MD_WRITEBACK, &md->status); - /* protect piwb */ md->piwb = NULL; spin_unlock_irqrestore(&md->md_lock, flags); kunmap_local(dst_clu); @@ -930,7 +929,7 @@ static int ploop_prepare_bat_update(struct ploop *ploop, struct md_page *md, piwb->page_id = page_id; to = kmap_local_page(page); - read_lock_irq(&md->lock); + spin_lock_irq(&md->md_lock); memcpy((void *)to, bat_entries, PAGE_SIZE); /* Absolute number of first index in page (negative for page#0) */ @@ -955,7 +954,7 @@ static int ploop_prepare_bat_update(struct ploop *ploop, struct md_page *md, if (clu == BAT_ENTRY_NONE || level < ploop_top_level(ploop)) to[i] = 0; } - read_unlock_irq(&md->lock); + spin_unlock_irq(&md->md_lock); if (is_last_page) { /* Fill tail of page with 0 */ @@ -1103,6 +1102,7 @@ static int ploop_alloc_cluster(struct ploop *ploop, struct ploop_index_wb *piwb, map_index_t *to; int ret = 0; u32 tmp_clu; + unsigned long flags; /* Cluster index related to the page[page_id] start */ clu -= piwb->page_id * PAGE_SIZE / sizeof(map_index_t) - PLOOP_MAP_OFFSET; @@ -1124,8 +1124,13 @@ static int ploop_alloc_cluster(struct ploop *ploop, struct ploop_index_wb *piwb, goto out; to = kmap_local_page(piwb->bat_page); + spin_lock_irqsave(&piwb->md->md_lock, flags); WRITE_ONCE(to[clu], *dst_clu); + WRITE_ONCE(piwb->md->bat_levels[clu], ploop_top_level(ploop)); + spin_unlock_irqrestore(&piwb->md->md_lock, flags); kunmap_local(to); + to = piwb->md->kmpage; + WRITE_ONCE(to[clu], *dst_clu); out: return ret; } @@ -1384,6 +1389,7 @@ static void ploop_submit_cow_index_wb(struct ploop_cow *cow) u32 page_id, clu = cow_pio->clu; struct ploop_index_wb *piwb; struct md_page *md; + unsigned long flags; map_index_t *to; WARN_ON_ONCE(cow->aux_pio->queue_list_id != PLOOP_LIST_COW); @@ -1409,6 +1415,12 @@ static void ploop_submit_cow_index_wb(struct ploop_cow *cow) WRITE_ONCE(to[clu], cow->dst_clu); kunmap_local(to); + spin_lock_irqsave(&md->md_lock, flags); + to = md->kmpage; + WRITE_ONCE(to[clu], cow->dst_clu); + WRITE_ONCE(md->bat_levels[clu], ploop_top_level(ploop)); + spin_unlock_irqrestore(&md->md_lock, flags); + /* Prevent double clearing of holes_bitmap bit on complete_cow() */ cow->dst_clu = BAT_ENTRY_NONE; spin_lock_irq(&ploop->deferred_lock); -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel