The patch wraps pending/reported tree in a structure called pb_set. Currently, it consists of "struct rb_root" only, but further patches will extend it.
The idea is to avoid passing too many additional arguments to functions working with pending/reported tree (again, this will be clear in further patches). https://jira.sw.ru/browse/PSBM-48082 Signed-off-by: Maxim Patlasov <[email protected]> --- drivers/block/ploop/push_backup.c | 51 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/drivers/block/ploop/push_backup.c b/drivers/block/ploop/push_backup.c index e8fa88d..413c357 100644 --- a/drivers/block/ploop/push_backup.c +++ b/drivers/block/ploop/push_backup.c @@ -16,6 +16,10 @@ #define NR_PAGES(bits) (((bits) + PAGE_SIZE*8 - 1) / (PAGE_SIZE*8)) #define BITS_PER_PAGE (1UL << (PAGE_SHIFT + 3)) +struct pb_set { + struct rb_root tree; +}; + struct ploop_pushbackup_desc { struct ploop_device *plo; struct page **cbt_map; /* a 'snapshot' copy of CBT mask */ @@ -31,9 +35,8 @@ struct ploop_pushbackup_desc { struct completion ppb_comp; bool ppb_waiting; - - struct rb_root pending_tree; - struct rb_root reported_tree; + struct pb_set pending_set; + struct pb_set reported_set; }; int ploop_pb_check_uuid(struct ploop_pushbackup_desc *pbd, __u8 *uuid) @@ -137,8 +140,8 @@ struct ploop_pushbackup_desc *ploop_pb_alloc(struct ploop_device *plo) spin_lock_init(&pbd->ppb_lock); init_completion(&pbd->ppb_comp); - pbd->pending_tree = RB_ROOT; - pbd->reported_tree = RB_ROOT; + pbd->pending_set.tree = RB_ROOT; + pbd->reported_set.tree = RB_ROOT; pbd->plo = plo; return pbd; @@ -333,9 +336,9 @@ void ploop_pb_fini(struct ploop_pushbackup_desc *pbd) if (pbd == NULL) return; - if (!RB_EMPTY_ROOT(&pbd->pending_tree)) + if (!RB_EMPTY_ROOT(&pbd->pending_set.tree)) printk("ploop_pb_fini: pending_tree is not empty!\n"); - if (!RB_EMPTY_ROOT(&pbd->reported_tree)) + if (!RB_EMPTY_ROOT(&pbd->reported_set.tree)) printk("ploop_pb_fini: reported_tree is not empty!\n"); if (pbd->plo) { @@ -369,8 +372,9 @@ int ploop_pb_copy_cbt_to_user(struct ploop_pushbackup_desc *pbd, char *user_addr } static void ploop_pb_add_req_to_tree(struct ploop_request *preq, - struct rb_root *tree) + struct pb_set *pbs) { + struct rb_root *tree = &pbs->tree; struct rb_node ** p = &tree->rb_node; struct rb_node *parent = NULL; struct ploop_request * pr; @@ -393,13 +397,13 @@ static void ploop_pb_add_req_to_tree(struct ploop_request *preq, static void ploop_pb_add_req_to_pending(struct ploop_pushbackup_desc *pbd, struct ploop_request *preq) { - ploop_pb_add_req_to_tree(preq, &pbd->pending_tree); + ploop_pb_add_req_to_tree(preq, &pbd->pending_set); } static void ploop_pb_add_req_to_reported(struct ploop_pushbackup_desc *pbd, struct ploop_request *preq) { - ploop_pb_add_req_to_tree(preq, &pbd->reported_tree); + ploop_pb_add_req_to_tree(preq, &pbd->reported_set); } static inline bool preq_match(struct ploop_request *preq, cluster_t clu, @@ -411,10 +415,11 @@ static inline bool preq_match(struct ploop_request *preq, cluster_t clu, } /* returns leftmost preq which req_cluster >= clu */ -static struct ploop_request *ploop_pb_get_req_from_tree(struct rb_root *tree, +static struct ploop_request *ploop_pb_get_req_from_tree(struct pb_set *pbs, cluster_t clu, cluster_t len, struct ploop_request **npreq) { + struct rb_root *tree = &pbs->tree; struct rb_node *n = tree->rb_node; struct ploop_request *p = NULL; @@ -456,9 +461,10 @@ static struct ploop_request *ploop_pb_get_req_from_tree(struct rb_root *tree, } static struct ploop_request * -ploop_pb_get_first_req_from_tree(struct rb_root *tree, +ploop_pb_get_first_req_from_tree(struct pb_set *pbs, struct ploop_request **npreq) { + struct rb_root *tree = &pbs->tree; static struct ploop_request *p; struct rb_node *n = rb_first(tree); @@ -482,20 +488,20 @@ ploop_pb_get_first_req_from_tree(struct rb_root *tree, static struct ploop_request * ploop_pb_get_first_req_from_pending(struct ploop_pushbackup_desc *pbd) { - return ploop_pb_get_first_req_from_tree(&pbd->pending_tree, NULL); + return ploop_pb_get_first_req_from_tree(&pbd->pending_set, NULL); } static struct ploop_request * ploop_pb_get_first_reqs_from_pending(struct ploop_pushbackup_desc *pbd, struct ploop_request **npreq) { - return ploop_pb_get_first_req_from_tree(&pbd->pending_tree, npreq); + return ploop_pb_get_first_req_from_tree(&pbd->pending_set, npreq); } static struct ploop_request * ploop_pb_get_first_req_from_reported(struct ploop_pushbackup_desc *pbd) { - return ploop_pb_get_first_req_from_tree(&pbd->reported_tree, NULL); + return ploop_pb_get_first_req_from_tree(&pbd->reported_set, NULL); } int ploop_pb_preq_add_pending(struct ploop_pushbackup_desc *pbd, @@ -538,14 +544,14 @@ unsigned long ploop_pb_stop(struct ploop_pushbackup_desc *pbd, bool do_merge) spin_lock(&pbd->ppb_lock); - while (!RB_EMPTY_ROOT(&pbd->pending_tree)) { + while (!RB_EMPTY_ROOT(&pbd->pending_set.tree)) { struct ploop_request *preq = ploop_pb_get_first_req_from_pending(pbd); list_add(&preq->list, &drop_list); ret++; } - while (!RB_EMPTY_ROOT(&pbd->reported_tree)) { + while (!RB_EMPTY_ROOT(&pbd->reported_set.tree)) { struct ploop_request *preq = ploop_pb_get_first_req_from_reported(pbd); list_add(&preq->list, &drop_list); @@ -635,7 +641,7 @@ int ploop_pb_get_pending(struct ploop_pushbackup_desc *pbd, else npreq = NULL; - rb_erase(&preq->reloc_link, &pbd->pending_tree); + rb_erase(&preq->reloc_link, &pbd->pending_set.tree); ploop_pb_add_req_to_reported(pbd, preq); (*len_p)++; @@ -720,13 +726,14 @@ int ploop_pb_peek(struct ploop_pushbackup_desc *pbd, return 0; } -static void ploop_pb_process_extent(struct rb_root *tree, cluster_t clu, +static void ploop_pb_process_extent(struct pb_set *pbs, cluster_t clu, cluster_t len, struct list_head *ready_list, int *n_found) { + struct rb_root *tree = &pbs->tree; struct ploop_request *preq, *npreq; - preq = ploop_pb_get_req_from_tree(tree, clu, len, &npreq); + preq = ploop_pb_get_req_from_tree(pbs, clu, len, &npreq); while (preq) { struct rb_node *n; @@ -758,8 +765,8 @@ void ploop_pb_put_reported(struct ploop_pushbackup_desc *pbd, spin_lock(&pbd->ppb_lock); - ploop_pb_process_extent(&pbd->reported_tree, clu, len, &ready_list, &n_found); - ploop_pb_process_extent(&pbd->pending_tree, clu, len, &ready_list, NULL); + ploop_pb_process_extent(&pbd->reported_set, clu, len, &ready_list, &n_found); + ploop_pb_process_extent(&pbd->pending_set, clu, len, &ready_list, NULL); /* * If preq not found above, it's unsolicited report. Then it's _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
