Lines Matching refs:ll

194 static int sm_ll_init(struct ll_disk *ll, struct dm_transaction_manager *tm)
196 memset(ll, 0, sizeof(struct ll_disk));
198 ll->tm = tm;
200 ll->bitmap_info.tm = tm;
201 ll->bitmap_info.levels = 1;
208 ll->bitmap_info.value_type.size = sizeof(struct disk_index_entry);
209 ll->bitmap_info.value_type.inc = NULL;
210 ll->bitmap_info.value_type.dec = NULL;
211 ll->bitmap_info.value_type.equal = NULL;
213 ll->ref_count_info.tm = tm;
214 ll->ref_count_info.levels = 1;
215 ll->ref_count_info.value_type.size = sizeof(uint32_t);
216 ll->ref_count_info.value_type.inc = NULL;
217 ll->ref_count_info.value_type.dec = NULL;
218 ll->ref_count_info.value_type.equal = NULL;
220 ll->block_size = dm_bm_block_size(dm_tm_get_bm(tm));
222 if (ll->block_size > (1 << 30)) {
227 ll->entries_per_block = (ll->block_size - sizeof(struct disk_bitmap_header)) *
229 ll->nr_blocks = 0;
230 ll->bitmap_root = 0;
231 ll->ref_count_root = 0;
232 ll->bitmap_index_changed = false;
237 int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks)
243 nr_blocks = ll->nr_blocks + extra_blocks;
244 old_blocks = dm_sector_div_up(ll->nr_blocks, ll->entries_per_block);
245 blocks = dm_sector_div_up(nr_blocks, ll->entries_per_block);
247 nr_indexes = dm_sector_div_up(nr_blocks, ll->entries_per_block);
248 if (nr_indexes > ll->max_entries(ll)) {
256 ll->nr_blocks = nr_blocks;
261 r = dm_tm_new_block(ll->tm, &dm_sm_bitmap_validator, &b);
267 dm_tm_unlock(ll->tm, b);
269 idx.nr_free = cpu_to_le32(ll->entries_per_block);
272 r = ll->save_ie(ll, i, &idx);
280 int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result)
287 if (b >= ll->nr_blocks) {
292 b = do_div(index, ll->entries_per_block);
293 r = ll->load_ie(ll, index, &ie_disk);
297 r = dm_tm_read_lock(ll->tm, le64_to_cpu(ie_disk.blocknr),
304 dm_tm_unlock(ll->tm, blk);
309 static int sm_ll_lookup_big_ref_count(struct ll_disk *ll, dm_block_t b,
315 r = dm_btree_lookup(&ll->ref_count_info, ll->ref_count_root, &b, &le_rc);
324 int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result)
326 int r = sm_ll_lookup_bitmap(ll, b, result);
334 return sm_ll_lookup_big_ref_count(ll, b, result);
337 int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin,
343 dm_block_t index_end = dm_sector_div_up(end, ll->entries_per_block);
348 begin = do_div(index_begin, ll->entries_per_block);
349 end = do_div(end, ll->entries_per_block);
351 end = ll->entries_per_block;
358 r = ll->load_ie(ll, i, &ie_disk);
365 r = dm_tm_read_lock(ll->tm, le64_to_cpu(ie_disk.blocknr),
370 bit_end = (i == index_end - 1) ? end : ll->entries_per_block;
380 dm_tm_unlock(ll->tm, blk);
384 dm_tm_unlock(ll->tm, blk);
386 *result = i * ll->entries_per_block + (dm_block_t) position;
422 int sm_ll_insert(struct ll_disk *ll, dm_block_t b,
433 bit = do_div(index, ll->entries_per_block);
434 r = ll->load_ie(ll, index, &ie_disk);
438 r = dm_tm_shadow_block(ll->tm, le64_to_cpu(ie_disk.blocknr),
449 r = sm_ll_lookup_big_ref_count(ll, b, &old);
451 dm_tm_unlock(ll->tm, nb);
457 dm_tm_unlock(ll->tm, nb);
463 dm_tm_unlock(ll->tm, nb);
466 r = dm_btree_remove(&ll->ref_count_info,
467 ll->ref_count_root,
468 &b, &ll->ref_count_root);
477 dm_tm_unlock(ll->tm, nb);
480 r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root,
481 &b, &le_rc, &ll->ref_count_root);
490 ll->nr_allocated++;
497 ll->nr_allocated--;
503 return ll->save_ie(ll, index, &ie_disk);
527 static inline void exit_inc_context(struct ll_disk *ll, struct inc_context *ic)
530 dm_tm_unlock(ll->tm, ic->bitmap_block);
532 dm_tm_unlock(ll->tm, ic->overflow_leaf);
535 static inline void reset_inc_context(struct ll_disk *ll, struct inc_context *ic)
537 exit_inc_context(ll, ic);
551 static int __sm_ll_inc_overflow(struct ll_disk *ll, dm_block_t b, struct inc_context *ic)
563 reset_inc_context(ll, ic);
565 r = btree_get_overwrite_leaf(&ll->ref_count_info, ll->ref_count_root,
566 b, &index, &ll->ref_count_root, &ic->overflow_leaf);
584 static int sm_ll_inc_overflow(struct ll_disk *ll, dm_block_t b, struct inc_context *ic)
606 return __sm_ll_inc_overflow(ll, b, ic);
609 static inline int shadow_bitmap(struct ll_disk *ll, struct inc_context *ic)
613 r = dm_tm_shadow_block(ll->tm, le64_to_cpu(ic->ie_disk.blocknr),
629 static inline int ensure_bitmap(struct ll_disk *ll, struct inc_context *ic)
632 int r = dm_bm_write_lock(dm_tm_get_bm(ll->tm), le64_to_cpu(ic->ie_disk.blocknr),
647 static inline int sm_ll_inc_bitmap(struct ll_disk *ll, dm_block_t b,
662 r = ensure_bitmap(ll, ic);
672 ll->nr_allocated++;
686 reset_inc_context(ll, ic);
690 r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root,
691 &b, &le_rc, &ll->ref_count_root);
702 r = sm_ll_inc_overflow(ll, b, ic);
716 static int __sm_ll_inc(struct ll_disk *ll, dm_block_t b, dm_block_t e,
726 bit = do_div(index, ll->entries_per_block);
727 r = ll->load_ie(ll, index, &ic.ie_disk);
731 r = shadow_bitmap(ll, &ic);
735 bit_end = min(bit + (e - b), (dm_block_t) ll->entries_per_block);
736 r = sm_ll_inc_bitmap(ll, b, bit, bit_end, nr_allocations, new_b, &ic);
738 exit_inc_context(ll, &ic);
743 return ll->save_ie(ll, index, &ic.ie_disk);
746 int sm_ll_inc(struct ll_disk *ll, dm_block_t b, dm_block_t e,
751 int r = __sm_ll_inc(ll, b, e, nr_allocations, &b);
762 static int __sm_ll_del_overflow(struct ll_disk *ll, dm_block_t b,
765 reset_inc_context(ll, ic);
766 return dm_btree_remove(&ll->ref_count_info, ll->ref_count_root,
767 &b, &ll->ref_count_root);
770 static int __sm_ll_dec_overflow(struct ll_disk *ll, dm_block_t b,
779 reset_inc_context(ll, ic);
780 r = btree_get_overwrite_leaf(&ll->ref_count_info, ll->ref_count_root,
781 b, &index, &ll->ref_count_root, &ic->overflow_leaf);
797 return __sm_ll_del_overflow(ll, b, ic);
804 static int sm_ll_dec_overflow(struct ll_disk *ll, dm_block_t b,
828 return __sm_ll_del_overflow(ll, b, ic);
834 return __sm_ll_dec_overflow(ll, b, ic, old_rc);
840 static inline int sm_ll_dec_bitmap(struct ll_disk *ll, dm_block_t b,
854 r = ensure_bitmap(ll, ic);
868 ll->nr_allocated--;
880 r = sm_ll_dec_overflow(ll, b, ic, &old);
885 r = ensure_bitmap(ll, ic);
899 static int __sm_ll_dec(struct ll_disk *ll, dm_block_t b, dm_block_t e,
909 bit = do_div(index, ll->entries_per_block);
910 r = ll->load_ie(ll, index, &ic.ie_disk);
914 r = shadow_bitmap(ll, &ic);
918 bit_end = min(bit + (e - b), (dm_block_t) ll->entries_per_block);
919 r = sm_ll_dec_bitmap(ll, b, bit, bit_end, &ic, nr_allocations, new_b);
920 exit_inc_context(ll, &ic);
925 return ll->save_ie(ll, index, &ic.ie_disk);
928 int sm_ll_dec(struct ll_disk *ll, dm_block_t b, dm_block_t e,
933 int r = __sm_ll_dec(ll, b, e, nr_allocations, &b);
944 int sm_ll_commit(struct ll_disk *ll)
948 if (ll->bitmap_index_changed) {
949 r = ll->commit(ll);
951 ll->bitmap_index_changed = false;
959 static int metadata_ll_load_ie(struct ll_disk *ll, dm_block_t index,
962 memcpy(ie, ll->mi_le.index + index, sizeof(*ie));
966 static int metadata_ll_save_ie(struct ll_disk *ll, dm_block_t index,
969 ll->bitmap_index_changed = true;
970 memcpy(ll->mi_le.index + index, ie, sizeof(*ie));
974 static int metadata_ll_init_index(struct ll_disk *ll)
979 r = dm_tm_new_block(ll->tm, &index_validator, &b);
983 ll->bitmap_root = dm_block_location(b);
985 dm_tm_unlock(ll->tm, b);
990 static int metadata_ll_open(struct ll_disk *ll)
995 r = dm_tm_read_lock(ll->tm, ll->bitmap_root,
1000 memcpy(&ll->mi_le, dm_block_data(block), sizeof(ll->mi_le));
1001 dm_tm_unlock(ll->tm, block);
1006 static dm_block_t metadata_ll_max_entries(struct ll_disk *ll)
1011 static int metadata_ll_commit(struct ll_disk *ll)
1016 r = dm_tm_shadow_block(ll->tm, ll->bitmap_root, &index_validator, &b, &inc);
1020 memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le));
1021 ll->bitmap_root = dm_block_location(b);
1023 dm_tm_unlock(ll->tm, b);
1028 int sm_ll_new_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm)
1032 r = sm_ll_init(ll, tm);
1036 ll->load_ie = metadata_ll_load_ie;
1037 ll->save_ie = metadata_ll_save_ie;
1038 ll->init_index = metadata_ll_init_index;
1039 ll->open_index = metadata_ll_open;
1040 ll->max_entries = metadata_ll_max_entries;
1041 ll->commit = metadata_ll_commit;
1043 ll->nr_blocks = 0;
1044 ll->nr_allocated = 0;
1046 r = ll->init_index(ll);
1050 r = dm_btree_empty(&ll->ref_count_info, &ll->ref_count_root);
1057 int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm,
1074 r = sm_ll_init(ll, tm);
1078 ll->load_ie = metadata_ll_load_ie;
1079 ll->save_ie = metadata_ll_save_ie;
1080 ll->init_index = metadata_ll_init_index;
1081 ll->open_index = metadata_ll_open;
1082 ll->max_entries = metadata_ll_max_entries;
1083 ll->commit = metadata_ll_commit;
1085 ll->nr_blocks = le64_to_cpu(smr.nr_blocks);
1086 ll->nr_allocated = le64_to_cpu(smr.nr_allocated);
1087 ll->bitmap_root = le64_to_cpu(smr.bitmap_root);
1088 ll->ref_count_root = le64_to_cpu(smr.ref_count_root);
1090 return ll->open_index(ll);
1095 static inline int ie_cache_writeback(struct ll_disk *ll, struct ie_cache *iec)
1099 return dm_btree_insert(&ll->bitmap_info, ll->bitmap_root,
1100 &iec->index, &iec->ie, &ll->bitmap_root);
1108 static int disk_ll_load_ie(struct ll_disk *ll, dm_block_t index,
1113 struct ie_cache *iec = ll->ie_cache + h;
1122 r = ie_cache_writeback(ll, iec);
1128 r = dm_btree_lookup(&ll->bitmap_info, ll->bitmap_root, &index, ie);
1139 static int disk_ll_save_ie(struct ll_disk *ll, dm_block_t index,
1144 struct ie_cache *iec = ll->ie_cache + h;
1146 ll->bitmap_index_changed = true;
1155 r = ie_cache_writeback(ll, iec);
1168 static int disk_ll_init_index(struct ll_disk *ll)
1173 struct ie_cache *iec = ll->ie_cache + i;
1178 return dm_btree_empty(&ll->bitmap_info, &ll->bitmap_root);
1181 static int disk_ll_open(struct ll_disk *ll)
1186 static dm_block_t disk_ll_max_entries(struct ll_disk *ll)
1191 static int disk_ll_commit(struct ll_disk *ll)
1197 struct ie_cache *iec = ll->ie_cache + i;
1200 r = ie_cache_writeback(ll, iec);
1206 int sm_ll_new_disk(struct ll_disk *ll, struct dm_transaction_manager *tm)
1210 r = sm_ll_init(ll, tm);
1214 ll->load_ie = disk_ll_load_ie;
1215 ll->save_ie = disk_ll_save_ie;
1216 ll->init_index = disk_ll_init_index;
1217 ll->open_index = disk_ll_open;
1218 ll->max_entries = disk_ll_max_entries;
1219 ll->commit = disk_ll_commit;
1221 ll->nr_blocks = 0;
1222 ll->nr_allocated = 0;
1224 r = ll->init_index(ll);
1228 r = dm_btree_empty(&ll->ref_count_info, &ll->ref_count_root);
1235 int sm_ll_open_disk(struct ll_disk *ll, struct dm_transaction_manager *tm,
1246 r = sm_ll_init(ll, tm);
1250 ll->load_ie = disk_ll_load_ie;
1251 ll->save_ie = disk_ll_save_ie;
1252 ll->init_index = disk_ll_init_index;
1253 ll->open_index = disk_ll_open;
1254 ll->max_entries = disk_ll_max_entries;
1255 ll->commit = disk_ll_commit;
1257 ll->nr_blocks = le64_to_cpu(smr->nr_blocks);
1258 ll->nr_allocated = le64_to_cpu(smr->nr_allocated);
1259 ll->bitmap_root = le64_to_cpu(smr->bitmap_root);
1260 ll->ref_count_root = le64_to_cpu(smr->ref_count_root);
1262 return ll->open_index(ll);