Simple re-work. No logic changed. Will be useful for the next patch. Signed-off-by: Maxim Patlasov <mpatla...@virtuozzo.com> --- drivers/block/ploop/map.c | 39 +++++++++++++++++++++++++-------------- include/linux/ploop/ploop.h | 2 ++ 2 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/drivers/block/ploop/map.c b/drivers/block/ploop/map.c index 1883674..5f7fd66 100644 --- a/drivers/block/ploop/map.c +++ b/drivers/block/ploop/map.c @@ -896,6 +896,25 @@ static void copy_index_for_wb(struct page * page, struct map_node * m, int level } } + +void ploop_index_wb_proceed(struct ploop_request * preq) +{ + struct map_node * m = preq->map; + struct ploop_delta * top_delta = map_top_delta(m->parent); + struct page * page = preq->sinfo.wi.tpage; + unsigned long rw = preq->req_index_update_rw; + sector_t sec; + + preq->eng_state = PLOOP_E_INDEX_WB; + + top_delta->ops->map_index(top_delta, m->mn_start, &sec); + + __TRACE("wbi-proceed %p %u %p\n", preq, preq->req_cluster, m); + top_delta->io.ops->write_page(&top_delta->io, preq, page, sec, rw); + + put_page(page); +} + /* Data write is commited. Now we need to update index. */ void ploop_index_update(struct ploop_request * preq) @@ -907,8 +926,6 @@ void ploop_index_update(struct ploop_request * preq) map_index_t blk; int old_level; struct page * page; - sector_t sec; - unsigned long rw; unsigned long state = READ_ONCE(preq->state); /* No way back, we are going to initiate index write. */ @@ -955,15 +972,13 @@ void ploop_index_update(struct ploop_request * preq) ((map_index_t*)page_address(page))[idx] = preq->iblock << ploop_map_log(plo); - preq->eng_state = PLOOP_E_INDEX_WB; get_page(page); preq->sinfo.wi.tpage = page; __TRACE("wbi %p %u %p\n", preq, preq->req_cluster, m); plo->st.map_single_writes++; - top_delta->ops->map_index(top_delta, m->mn_start, &sec); - rw = (preq->req_rw & (REQ_FUA | REQ_FLUSH)); + preq->req_index_update_rw = (preq->req_rw & (REQ_FUA | REQ_FLUSH)); /* We've just set REQ_FLUSH in rw, ->write_page() below will do the FLUSH */ @@ -971,11 +986,9 @@ void ploop_index_update(struct ploop_request * preq) /* Relocate requires consistent index update */ if (state & (PLOOP_REQ_RELOC_A_FL|PLOOP_REQ_RELOC_S_FL)) - rw |= (REQ_FLUSH | REQ_FUA); + preq->req_index_update_rw |= (REQ_FLUSH | REQ_FUA); - top_delta->io.ops->write_page(&top_delta->io, preq, page, sec, rw); - - put_page(page); + ploop_index_wb_proceed(preq); return; enomem: @@ -991,6 +1004,7 @@ out: } EXPORT_SYMBOL(ploop_index_update); + int map_index(struct ploop_delta * delta, struct ploop_request * preq, unsigned long *sec) { return delta->ops->map_index(delta, preq->map->mn_start, sec); @@ -1094,7 +1108,6 @@ static void map_wb_complete(struct map_node * m, int err) struct page * page = NULL; int delayed = 0; unsigned int idx; - sector_t sec; unsigned long rw; /* First, complete processing of written back indices, @@ -1219,11 +1232,9 @@ static void map_wb_complete(struct map_node * m, int err) __TRACE("wbi2 %p %u %p\n", main_preq, main_preq->req_cluster, m); plo->st.map_multi_writes++; - top_delta->ops->map_index(top_delta, m->mn_start, &sec); - top_delta->io.ops->write_page(&top_delta->io, main_preq, page, sec, - rw); - put_page(page); + main_preq->req_index_update_rw = rw; + ploop_index_wb_proceed(main_preq); } void diff --git a/include/linux/ploop/ploop.h b/include/linux/ploop/ploop.h index 7864edf..3d52f28 100644 --- a/include/linux/ploop/ploop.h +++ b/include/linux/ploop/ploop.h @@ -534,6 +534,7 @@ struct ploop_request sector_t req_sector; unsigned int req_size; unsigned int req_rw; + unsigned int req_index_update_rw; unsigned long tstamp; struct io_context *ioc; @@ -803,6 +804,7 @@ void map_init(struct ploop_device *, struct ploop_map * map); void ploop_map_start(struct ploop_map * map, u64 bd_size); void ploop_map_destroy(struct ploop_map * map); void ploop_map_remove_delta(struct ploop_map * map, int level); +void ploop_index_wb_proceed(struct ploop_request * preq); void ploop_index_update(struct ploop_request * preq); void ploop_index_wb_complete(struct ploop_request * preq); int __init ploop_map_init(void); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel