errcode_t ocfs2_bitmap_alloc_region(ocfs2_bitmap *bitmap, uint64_t start_bit, int bitmap_start, int total_bits, struct ocfs2_bitmap_region **ret_br) { errcode_t ret; struct ocfs2_bitmap_region *br; if (total_bits < 0) return OCFS2_ET_INVALID_BIT; ret = ocfs2_malloc0(sizeof(struct ocfs2_bitmap_region), &br); if (ret) return ret; br->br_start_bit = start_bit; br->br_bitmap_start = bitmap_start; br->br_valid_bits = total_bits; br->br_total_bits = total_bits + bitmap_start; br->br_bytes = ocfs2_align_total(br->br_total_bits); ret = ocfs2_malloc0(br->br_bytes, &br->br_bitmap); if (ret) ocfs2_free(&br); else *ret_br = br; return ret; }
errcode_t ocfs2_bitmap_realloc_region(ocfs2_bitmap *bitmap, struct ocfs2_bitmap_region *br, int total_bits) { errcode_t ret; size_t new_bytes; if ((br->br_start_bit + total_bits) > bitmap->b_total_bits) return OCFS2_ET_INVALID_BIT; new_bytes = ocfs2_align_total(total_bits); if (new_bytes > br->br_bytes) { ret = ocfs2_realloc0(new_bytes, &br->br_bitmap, br->br_bytes); if (ret) return ret; br->br_bytes = new_bytes; } br->br_total_bits = total_bits; return 0; }