[Devel] [PATCH rh7 1/3] ploop: factor ->write_page() out
Maxim Patlasov
mpatlasov at virtuozzo.com
Wed Jul 20 19:01:08 PDT 2016
Simple re-work. No logic changed. Will be useful for the next patch.
Signed-off-by: Maxim Patlasov <mpatlasov at 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);
More information about the Devel
mailing list