Lines Matching refs:br
97 sector_t range_top(struct bow_range *br) in range_top() argument
99 return container_of(rb_next(&br->node), struct bow_range, node) in range_top()
103 u64 range_size(struct bow_range *br) in range_size() argument
105 return (range_top(br) - br->sector) * SECTOR_SIZE; in range_size()
121 struct bow_range *br; in find_first_overlapping_range() local
124 br = container_of(node, struct bow_range, node); in find_first_overlapping_range()
126 if (br->sector <= bi_iter->bi_sector in find_first_overlapping_range()
127 && bi_iter->bi_sector < range_top(br)) in find_first_overlapping_range()
130 if (bi_iter->bi_sector < br->sector) in find_first_overlapping_range()
140 if (range_top(br) - bi_iter->bi_sector in find_first_overlapping_range()
142 bi_iter->bi_size = (range_top(br) - bi_iter->bi_sector) in find_first_overlapping_range()
145 return br; in find_first_overlapping_range()
171 static int split_range(struct bow_context *bc, struct bow_range **br, in split_range() argument
176 if (bi_iter->bi_sector < (*br)->sector) { in split_range()
181 if (bi_iter->bi_sector > (*br)->sector) { in split_range()
188 *leading_br = **br; in split_range()
192 add_before(&bc->ranges, leading_br, *br); in split_range()
193 (*br)->sector = bi_iter->bi_sector; in split_range()
196 if (bvec_top(bi_iter) >= range_top(*br)) { in split_range()
197 bi_iter->bi_size = (range_top(*br) - (*br)->sector) in split_range()
207 new_br->sector = (*br)->sector; in split_range()
208 (*br)->sector = bvec_top(bi_iter); in split_range()
209 add_before(&bc->ranges, new_br, *br); in split_range()
210 *br = new_br; in split_range()
220 static void set_type(struct bow_context *bc, struct bow_range **br, int type) in set_type() argument
222 struct bow_range *prev = container_of(rb_prev(&(*br)->node), in set_type()
224 struct bow_range *next = container_of(rb_next(&(*br)->node), in set_type()
227 if ((*br)->type == TRIMMED) { in set_type()
228 bc->trims_total -= range_size(*br); in set_type()
229 list_del(&(*br)->trimmed_list); in set_type()
233 bc->trims_total += range_size(*br); in set_type()
234 list_add(&(*br)->trimmed_list, &bc->trimmed_list); in set_type()
237 (*br)->type = type; in set_type()
248 list_del(&(*br)->trimmed_list); in set_type()
249 rb_erase(&(*br)->node, &bc->ranges); in set_type()
250 kfree(*br); in set_type()
253 *br = NULL; in set_type()
547 struct bow_range *br = find_sector0_current(bc); in state_store() local
552 ret = copy_data(bc, br, sector0_br, 0); in state_store()
604 struct bow_range *br = container_of(rb_first(&bc->ranges), in dm_bow_dtr() local
607 rb_erase(&br->node, &bc->ranges); in dm_bow_dtr()
608 kfree(br); in dm_bow_dtr()
695 struct bow_range *br; in dm_bow_ctr() local
768 br = kzalloc(sizeof(*br), GFP_KERNEL); in dm_bow_ctr()
769 if (!br) { in dm_bow_ctr()
775 br->sector = ti->len; in dm_bow_ctr()
776 br->type = TOP; in dm_bow_ctr()
777 rb_link_node(&br->node, NULL, &bc->ranges.rb_node); in dm_bow_ctr()
778 rb_insert_color(&br->node, &bc->ranges); in dm_bow_ctr()
780 br = kzalloc(sizeof(*br), GFP_KERNEL); in dm_bow_ctr()
781 if (!br) { in dm_bow_ctr()
787 br->sector = 0; in dm_bow_ctr()
788 br->type = UNCHANGED; in dm_bow_ctr()
789 rb_link_node(&br->node, bc->ranges.rb_node, in dm_bow_ctr()
791 rb_insert_color(&br->node, &bc->ranges); in dm_bow_ctr()
804 static int prepare_unchanged_range(struct bow_context *bc, struct bow_range *br, in prepare_unchanged_range() argument
834 ret = split_range(bc, &br, bi_iter); in prepare_unchanged_range()
837 if (range_size(br) != range_size(backup_br)) { in prepare_unchanged_range()
844 ret = copy_data(bc, br, backup_br, record_checksum ? &checksum : NULL); in prepare_unchanged_range()
849 log_source = br->sector; in prepare_unchanged_range()
851 log_size = range_size(br); in prepare_unchanged_range()
858 original_type = br->type; in prepare_unchanged_range()
863 backup_br->type = br->type == SECTOR0_CURRENT ? SECTOR0_CURRENT in prepare_unchanged_range()
865 br->type = CHANGED; in prepare_unchanged_range()
874 br->type = original_type; in prepare_unchanged_range()
882 set_type(bc, &br, br->type); in prepare_unchanged_range()
886 static int prepare_free_range(struct bow_context *bc, struct bow_range *br, in prepare_free_range() argument
891 ret = split_range(bc, &br, bi_iter); in prepare_free_range()
894 set_type(bc, &br, CHANGED); in prepare_free_range()
898 static int prepare_changed_range(struct bow_context *bc, struct bow_range *br, in prepare_changed_range() argument
908 struct bow_range *br = find_first_overlapping_range(&bc->ranges, in prepare_one_range() local
910 switch (br->type) { in prepare_one_range()
912 return prepare_changed_range(bc, br, bi_iter); in prepare_one_range()
915 return prepare_free_range(bc, br, bi_iter); in prepare_one_range()
919 return prepare_unchanged_range(bc, br, bi_iter, true); in prepare_one_range()
926 return prepare_unchanged_range(bc, br, bi_iter, false); in prepare_one_range()
1021 struct bow_range *br; in add_trim() local
1029 br = find_first_overlapping_range(&bc->ranges, &bi_iter); in add_trim()
1031 switch (br->type) { in add_trim()
1033 if (!split_range(bc, &br, &bi_iter)) in add_trim()
1034 set_type(bc, &br, TRIMMED); in add_trim()
1060 struct bow_range *br; in remove_trim() local
1068 br = find_first_overlapping_range(&bc->ranges, &bi_iter); in remove_trim()
1070 switch (br->type) { in remove_trim()
1076 if (!split_range(bc, &br, &bi_iter)) in remove_trim()
1077 set_type(bc, &br, UNCHANGED); in remove_trim()
1160 struct bow_range *br; in dm_bow_tablestatus() local
1166 list_for_each_entry(br, &bc->trimmed_list, trimmed_list) in dm_bow_tablestatus()
1167 if (br->type == TRIMMED) { in dm_bow_tablestatus()
1189 struct bow_range *br = container_of(i, struct bow_range, node); in dm_bow_tablestatus() local
1192 readable_type[br->type], in dm_bow_tablestatus()
1193 (unsigned long long)br->sector); in dm_bow_tablestatus()
1201 if (br->type == TRIMMED) in dm_bow_tablestatus()
1204 if (br->type == TOP) { in dm_bow_tablestatus()
1205 if (br->sector != ti->len) { in dm_bow_tablestatus()
1210 if (&br->node != rb_last(&bc->ranges)) { in dm_bow_tablestatus()
1224 if (br->sector > range_top(br)) { in dm_bow_tablestatus()