Home | History | Annotate | Download | only in ext4_utils
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "ext4_utils.h"
     18 #include "allocate.h"
     19 #include "ext4.h"
     20 
     21 #include <sparse/sparse.h>
     22 
     23 #include <stdio.h>
     24 #include <stdlib.h>
     25 
     26 struct region_list {
     27 	struct region *first;
     28 	struct region *last;
     29 	struct region *iter;
     30 	u32 partial_iter;
     31 };
     32 
     33 struct block_allocation {
     34 	struct region_list list;
     35 	struct region_list oob_list;
     36 };
     37 
     38 struct region {
     39 	u32 block;
     40 	u32 len;
     41 	int bg;
     42 	struct region *next;
     43 	struct region *prev;
     44 };
     45 
     46 struct block_group_info {
     47 	u32 first_block;
     48 	int header_blocks;
     49 	int data_blocks_used;
     50 	int has_superblock;
     51 	u8 *bitmaps;
     52 	u8 *block_bitmap;
     53 	u8 *inode_bitmap;
     54 	u8 *inode_table;
     55 	u32 free_blocks;
     56 	u32 first_free_block;
     57 	u32 free_inodes;
     58 	u32 first_free_inode;
     59 	u16 flags;
     60 	u16 used_dirs;
     61 };
     62 
     63 struct xattr_list_element {
     64 	struct ext4_inode *inode;
     65 	struct ext4_xattr_header *header;
     66 	struct xattr_list_element *next;
     67 };
     68 
     69 struct block_allocation *create_allocation()
     70 {
     71 	struct block_allocation *alloc = malloc(sizeof(struct block_allocation));
     72 	alloc->list.first = NULL;
     73 	alloc->list.last = NULL;
     74 	alloc->oob_list.first = NULL;
     75 	alloc->oob_list.last = NULL;
     76 	alloc->list.iter = NULL;
     77 	alloc->list.partial_iter = 0;
     78 	alloc->oob_list.iter = NULL;
     79 	alloc->oob_list.partial_iter = 0;
     80 	return alloc;
     81 }
     82 
     83 static struct ext4_xattr_header *xattr_list_find(struct ext4_inode *inode)
     84 {
     85 	struct xattr_list_element *element;
     86 	for (element = aux_info.xattrs; element != NULL; element = element->next) {
     87 		if (element->inode == inode)
     88 			return element->header;
     89 	}
     90 	return NULL;
     91 }
     92 
     93 static void xattr_list_insert(struct ext4_inode *inode, struct ext4_xattr_header *header)
     94 {
     95 	struct xattr_list_element *element = malloc(sizeof(struct xattr_list_element));
     96 	element->inode = inode;
     97 	element->header = header;
     98 	element->next = aux_info.xattrs;
     99 	aux_info.xattrs = element;
    100 }
    101 
    102 static void region_list_remove(struct region_list *list, struct region *reg)
    103 {
    104 	if (reg->prev)
    105 		reg->prev->next = reg->next;
    106 
    107 	if (reg->next)
    108 		reg->next->prev = reg->prev;
    109 
    110 	if (list->first == reg)
    111 		list->first = reg->next;
    112 
    113 	if (list->last == reg)
    114 		list->last = reg->prev;
    115 
    116 	reg->next = NULL;
    117 	reg->prev = NULL;
    118 }
    119 
    120 static void region_list_append(struct region_list *list, struct region *reg)
    121 {
    122 	if (list->first == NULL) {
    123 		list->first = reg;
    124 		list->last = reg;
    125 		list->iter = reg;
    126 		list->partial_iter = 0;
    127 		reg->prev = NULL;
    128 	} else {
    129 		list->last->next = reg;
    130 		reg->prev = list->last;
    131 		list->last = reg;
    132 	}
    133 	reg->next = NULL;
    134 }
    135 
    136 #if 0
    137 static void dump_starting_from(struct region *reg)
    138 {
    139 	for (; reg; reg = reg->next) {
    140 		printf("%p: Blocks %d-%d (%d)\n", reg,
    141 				reg->bg * info.blocks_per_group + reg->block,
    142 				reg->bg * info.blocks_per_group + reg->block + reg->len - 1,
    143 				reg->len);
    144 	}
    145 }
    146 
    147 static void dump_region_lists(struct block_allocation *alloc) {
    148 
    149 	printf("Main list:\n");
    150 	dump_starting_from(alloc->list.first);
    151 
    152 	printf("OOB list:\n");
    153 	dump_starting_from(alloc->oob_list.first);
    154 }
    155 #endif
    156 
    157 void append_region(struct block_allocation *alloc,
    158 		u32 block, u32 len, int bg_num)
    159 {
    160 	struct region *reg;
    161 	reg = malloc(sizeof(struct region));
    162 	reg->block = block;
    163 	reg->len = len;
    164 	reg->bg = bg_num;
    165 	reg->next = NULL;
    166 
    167 	region_list_append(&alloc->list, reg);
    168 }
    169 
    170 static void allocate_bg_inode_table(struct block_group_info *bg)
    171 {
    172 	if (bg->inode_table != NULL)
    173 		return;
    174 
    175 	u32 block = bg->first_block + 2;
    176 
    177 	if (bg->has_superblock)
    178 		block += aux_info.bg_desc_blocks + info.bg_desc_reserve_blocks + 1;
    179 
    180 	bg->inode_table = calloc(aux_info.inode_table_blocks, info.block_size);
    181 	if (bg->inode_table == NULL)
    182 		critical_error_errno("calloc");
    183 
    184 	sparse_file_add_data(info.sparse_file, bg->inode_table,
    185 			aux_info.inode_table_blocks	* info.block_size, block);
    186 
    187 	bg->flags &= ~EXT4_BG_INODE_UNINIT;
    188 }
    189 
    190 static int bitmap_set_bit(u8 *bitmap, u32 bit)
    191 {
    192 	if (bitmap[bit / 8] & 1 << (bit % 8))
    193 		return 1;
    194 
    195 	bitmap[bit / 8] |= 1 << (bit % 8);
    196 	return 0;
    197 }
    198 
    199 static int bitmap_set_8_bits(u8 *bitmap, u32 bit)
    200 {
    201 	int ret = bitmap[bit / 8];
    202 	bitmap[bit / 8] = 0xFF;
    203 	return ret;
    204 }
    205 
    206 /* Marks a the first num_blocks blocks in a block group as used, and accounts
    207  for them in the block group free block info. */
    208 static int reserve_blocks(struct block_group_info *bg, u32 start, u32 num)
    209 {
    210 	unsigned int i = 0;
    211 
    212 	u32 block = start;
    213 	if (num > bg->free_blocks)
    214 		return -1;
    215 
    216 	for (i = 0; i < num && block % 8 != 0; i++, block++) {
    217 		if (bitmap_set_bit(bg->block_bitmap, block)) {
    218 			error("attempted to reserve already reserved block");
    219 			return -1;
    220 		}
    221 	}
    222 
    223 	for (; i + 8 <= (num & ~7); i += 8, block += 8) {
    224 		if (bitmap_set_8_bits(bg->block_bitmap, block)) {
    225 			error("attempted to reserve already reserved block");
    226 			return -1;
    227 		}
    228 	}
    229 
    230 	for (; i < num; i++, block++) {
    231 		if (bitmap_set_bit(bg->block_bitmap, block)) {
    232 			error("attempted to reserve already reserved block");
    233 			return -1;
    234 		}
    235 	}
    236 
    237 	bg->free_blocks -= num;
    238 	if (start == bg->first_free_block)
    239 		bg->first_free_block = start + num;
    240 
    241 	return 0;
    242 }
    243 
    244 static void free_blocks(struct block_group_info *bg, u32 num_blocks)
    245 {
    246 	unsigned int i;
    247 	u32 block = bg->first_free_block - 1;
    248 	for (i = 0; i < num_blocks; i++, block--)
    249 		bg->block_bitmap[block / 8] &= ~(1 << (block % 8));
    250 	bg->free_blocks += num_blocks;
    251 	bg->first_free_block -= num_blocks;
    252 }
    253 
    254 /* Reduces an existing allocation by len blocks by return the last blocks
    255    to the free pool in their block group. Assumes that the blocks being
    256    returned were the last ones allocated out of the block group */
    257 void reduce_allocation(struct block_allocation *alloc, u32 len)
    258 {
    259 	while (len) {
    260 		struct region *last_reg = alloc->list.last;
    261 
    262 		if (last_reg->len > len) {
    263 			free_blocks(&aux_info.bgs[last_reg->bg], len);
    264 			last_reg->len -= len;
    265 			len = 0;
    266 		} else {
    267 			struct region *reg = alloc->list.last->prev;
    268 			free_blocks(&aux_info.bgs[last_reg->bg], last_reg->len);
    269 			len -= last_reg->len;
    270 			if (reg) {
    271 				reg->next = NULL;
    272 			} else {
    273 				alloc->list.first = NULL;
    274 				alloc->list.last = NULL;
    275 				alloc->list.iter = NULL;
    276 				alloc->list.partial_iter = 0;
    277 			}
    278 			free(last_reg);
    279 		}
    280 	}
    281 }
    282 
    283 static void init_bg(struct block_group_info *bg, unsigned int i)
    284 {
    285 	int header_blocks = 2 + aux_info.inode_table_blocks;
    286 
    287 	bg->has_superblock = ext4_bg_has_super_block(i);
    288 
    289 	if (bg->has_superblock)
    290 		header_blocks += 1 + aux_info.bg_desc_blocks + info.bg_desc_reserve_blocks;
    291 
    292 	bg->bitmaps = calloc(info.block_size, 2);
    293 	bg->block_bitmap = bg->bitmaps;
    294 	bg->inode_bitmap = bg->bitmaps + info.block_size;
    295 
    296 	bg->header_blocks = header_blocks;
    297 	bg->first_block = aux_info.first_data_block + i * info.blocks_per_group;
    298 
    299 	u32 block = bg->first_block;
    300 	if (bg->has_superblock)
    301 		block += 1 + aux_info.bg_desc_blocks +  info.bg_desc_reserve_blocks;
    302 	sparse_file_add_data(info.sparse_file, bg->bitmaps, 2 * info.block_size,
    303 			block);
    304 
    305 	bg->data_blocks_used = 0;
    306 	bg->free_blocks = info.blocks_per_group;
    307 	bg->first_free_block = 0;
    308 	bg->free_inodes = info.inodes_per_group;
    309 	bg->first_free_inode = 1;
    310 	bg->flags = EXT4_BG_INODE_UNINIT;
    311 
    312 	if (reserve_blocks(bg, bg->first_free_block, bg->header_blocks) < 0)
    313 		error("failed to reserve %u blocks in block group %u\n", bg->header_blocks, i);
    314 
    315 	u32 overrun = bg->first_block + info.blocks_per_group - aux_info.len_blocks;
    316 	if (overrun > 0)
    317 		reserve_blocks(bg, info.blocks_per_group - overrun, overrun);
    318 }
    319 
    320 void block_allocator_init()
    321 {
    322 	unsigned int i;
    323 
    324 	aux_info.bgs = calloc(sizeof(struct block_group_info), aux_info.groups);
    325 	if (aux_info.bgs == NULL)
    326 		critical_error_errno("calloc");
    327 
    328 	for (i = 0; i < aux_info.groups; i++)
    329 		init_bg(&aux_info.bgs[i], i);
    330 }
    331 
    332 void block_allocator_free()
    333 {
    334 	unsigned int i;
    335 
    336 	for (i = 0; i < aux_info.groups; i++) {
    337 		free(aux_info.bgs[i].bitmaps);
    338 		free(aux_info.bgs[i].inode_table);
    339 	}
    340 	free(aux_info.bgs);
    341 }
    342 
    343 static u32 ext4_allocate_blocks_from_block_group(u32 len, int bg_num)
    344 {
    345 	if (get_free_blocks(bg_num) < len)
    346 		return EXT4_ALLOCATE_FAILED;
    347 
    348 	u32 block = aux_info.bgs[bg_num].first_free_block;
    349 	struct block_group_info *bg = &aux_info.bgs[bg_num];
    350 	if (reserve_blocks(bg, bg->first_free_block, len) < 0) {
    351 		error("failed to reserve %u blocks in block group %u\n", len, bg_num);
    352 		return EXT4_ALLOCATE_FAILED;
    353 	}
    354 
    355 	aux_info.bgs[bg_num].data_blocks_used += len;
    356 
    357 	return bg->first_block + block;
    358 }
    359 
    360 static struct region *ext4_allocate_contiguous_blocks(u32 len)
    361 {
    362 	unsigned int i;
    363 	struct region *reg;
    364 
    365 	for (i = 0; i < aux_info.groups; i++) {
    366 		u32 block = ext4_allocate_blocks_from_block_group(len, i);
    367 
    368 		if (block != EXT4_ALLOCATE_FAILED) {
    369 			reg = malloc(sizeof(struct region));
    370 			reg->block = block;
    371 			reg->len = len;
    372 			reg->next = NULL;
    373 			reg->prev = NULL;
    374 			reg->bg = i;
    375 			return reg;
    376 		}
    377 	}
    378 
    379 	return NULL;
    380 }
    381 
    382 /* Allocate a single block and return its block number */
    383 u32 allocate_block()
    384 {
    385 	unsigned int i;
    386 	for (i = 0; i < aux_info.groups; i++) {
    387 		u32 block = ext4_allocate_blocks_from_block_group(1, i);
    388 
    389 		if (block != EXT4_ALLOCATE_FAILED)
    390 			return block;
    391 	}
    392 
    393 	return EXT4_ALLOCATE_FAILED;
    394 }
    395 
    396 static struct region *ext4_allocate_partial(u32 len)
    397 {
    398 	unsigned int i;
    399 	struct region *reg;
    400 
    401 	for (i = 0; i < aux_info.groups; i++) {
    402 		if (aux_info.bgs[i].data_blocks_used == 0) {
    403 			u32 bg_len = aux_info.bgs[i].free_blocks;
    404 			u32 block;
    405 
    406 			if (len <= bg_len) {
    407 				/* If the requested length would fit in a block group,
    408 				 use the regular allocator to try to fit it in a partially
    409 				 used block group */
    410 				bg_len = len;
    411 				reg = ext4_allocate_contiguous_blocks(len);
    412 			} else {
    413 				block = ext4_allocate_blocks_from_block_group(bg_len, i);
    414 
    415 				if (block == EXT4_ALLOCATE_FAILED) {
    416 					error("failed to allocate %d blocks in block group %d", bg_len, i);
    417 					return NULL;
    418 				}
    419 
    420 				reg = malloc(sizeof(struct region));
    421 				reg->block = block;
    422 				reg->len = bg_len;
    423 				reg->next = NULL;
    424 				reg->prev = NULL;
    425 				reg->bg = i;
    426 			}
    427 
    428 			return reg;
    429 		}
    430 	}
    431 	return NULL;
    432 }
    433 
    434 static struct region *ext4_allocate_multiple_contiguous_blocks(u32 len)
    435 {
    436 	struct region *first_reg = NULL;
    437 	struct region *prev_reg = NULL;
    438 	struct region *reg;
    439 
    440 	while (len > 0) {
    441 		reg = ext4_allocate_partial(len);
    442 		if (reg == NULL)
    443 			return NULL;
    444 
    445 		if (first_reg == NULL)
    446 			first_reg = reg;
    447 
    448 		if (prev_reg) {
    449 			prev_reg->next = reg;
    450 			reg->prev = prev_reg;
    451 		}
    452 
    453 		prev_reg = reg;
    454 		len -= reg->len;
    455 	}
    456 
    457 	return first_reg;
    458 }
    459 
    460 struct region *do_allocate(u32 len)
    461 {
    462 	struct region *reg = ext4_allocate_contiguous_blocks(len);
    463 
    464 	if (reg == NULL)
    465 		reg = ext4_allocate_multiple_contiguous_blocks(len);
    466 
    467 	return reg;
    468 }
    469 
    470 /* Allocate len blocks.  The blocks may be spread across multiple block groups,
    471    and are returned in a linked list of the blocks in each block group.  The
    472    allocation algorithm is:
    473       1.  Try to allocate the entire block len in each block group
    474       2.  If the request doesn't fit in any block group, allocate as many
    475           blocks as possible into each block group that is completely empty
    476       3.  Put the last set of blocks in the first block group they fit in
    477 */
    478 struct block_allocation *allocate_blocks(u32 len)
    479 {
    480 	struct region *reg = do_allocate(len);
    481 
    482 	if (reg == NULL)
    483 		return NULL;
    484 
    485 	struct block_allocation *alloc = create_allocation();
    486 	alloc->list.first = reg;
    487 	alloc->list.last = reg;
    488 	alloc->list.iter = alloc->list.first;
    489 	alloc->list.partial_iter = 0;
    490 	return alloc;
    491 }
    492 
    493 /* Returns the number of discontiguous regions used by an allocation */
    494 int block_allocation_num_regions(struct block_allocation *alloc)
    495 {
    496 	unsigned int i;
    497 	struct region *reg = alloc->list.first;
    498 
    499 	for (i = 0; reg != NULL; reg = reg->next)
    500 		i++;
    501 
    502 	return i;
    503 }
    504 
    505 int block_allocation_len(struct block_allocation *alloc)
    506 {
    507 	unsigned int i;
    508 	struct region *reg = alloc->list.first;
    509 
    510 	for (i = 0; reg != NULL; reg = reg->next)
    511 		i += reg->len;
    512 
    513 	return i;
    514 }
    515 
    516 /* Returns the block number of the block'th block in an allocation */
    517 u32 get_block(struct block_allocation *alloc, u32 block)
    518 {
    519 	struct region *reg = alloc->list.iter;
    520 	block += alloc->list.partial_iter;
    521 
    522 	for (; reg; reg = reg->next) {
    523 		if (block < reg->len)
    524 			return reg->block + block;
    525 		block -= reg->len;
    526 	}
    527 	return EXT4_ALLOCATE_FAILED;
    528 }
    529 
    530 u32 get_oob_block(struct block_allocation *alloc, u32 block)
    531 {
    532 	struct region *reg = alloc->oob_list.iter;
    533 	block += alloc->oob_list.partial_iter;
    534 
    535 	for (; reg; reg = reg->next) {
    536 		if (block < reg->len)
    537 			return reg->block + block;
    538 		block -= reg->len;
    539 	}
    540 	return EXT4_ALLOCATE_FAILED;
    541 }
    542 
    543 /* Gets the starting block and length in blocks of the first region
    544    of an allocation */
    545 void get_region(struct block_allocation *alloc, u32 *block, u32 *len)
    546 {
    547 	*block = alloc->list.iter->block;
    548 	*len = alloc->list.iter->len - alloc->list.partial_iter;
    549 }
    550 
    551 /* Move to the next region in an allocation */
    552 void get_next_region(struct block_allocation *alloc)
    553 {
    554 	alloc->list.iter = alloc->list.iter->next;
    555 	alloc->list.partial_iter = 0;
    556 }
    557 
    558 /* Returns the number of free blocks in a block group */
    559 u32 get_free_blocks(u32 bg)
    560 {
    561 	return aux_info.bgs[bg].free_blocks;
    562 }
    563 
    564 int last_region(struct block_allocation *alloc)
    565 {
    566 	return (alloc->list.iter == NULL);
    567 }
    568 
    569 void rewind_alloc(struct block_allocation *alloc)
    570 {
    571 	alloc->list.iter = alloc->list.first;
    572 	alloc->list.partial_iter = 0;
    573 }
    574 
    575 static struct region *do_split_allocation(struct block_allocation *alloc, u32 len)
    576 {
    577 	struct region *reg = alloc->list.iter;
    578 	struct region *new;
    579 	struct region *tmp;
    580 
    581 	while (reg && len >= reg->len) {
    582 		len -= reg->len;
    583 		reg = reg->next;
    584 	}
    585 
    586 	if (reg == NULL && len > 0)
    587 		return NULL;
    588 
    589 	if (len > 0) {
    590 		new = malloc(sizeof(struct region));
    591 
    592 		new->bg = reg->bg;
    593 		new->block = reg->block + len;
    594 		new->len = reg->len - len;
    595 		new->next = reg->next;
    596 		new->prev = reg;
    597 
    598 		reg->next = new;
    599 		reg->len = len;
    600 
    601 		tmp = alloc->list.iter;
    602 		alloc->list.iter = new;
    603 		return tmp;
    604 	} else {
    605 		return reg;
    606 	}
    607 }
    608 
    609 /* Splits an allocation into two allocations.  The returned allocation will
    610    point to the first half, and the original allocation ptr will point to the
    611    second half. */
    612 static struct region *split_allocation(struct block_allocation *alloc, u32 len)
    613 {
    614 	/* First make sure there is a split at the current ptr */
    615 	do_split_allocation(alloc, alloc->list.partial_iter);
    616 
    617 	/* Then split off len blocks */
    618 	struct region *middle = do_split_allocation(alloc, len);
    619 	alloc->list.partial_iter = 0;
    620 	return middle;
    621 }
    622 
    623 /* Reserve the next blocks for oob data (indirect or extent blocks) */
    624 int reserve_oob_blocks(struct block_allocation *alloc, int blocks)
    625 {
    626 	struct region *oob = split_allocation(alloc, blocks);
    627 	struct region *next;
    628 
    629 	if (oob == NULL)
    630 		return -1;
    631 
    632 	while (oob && oob != alloc->list.iter) {
    633 		next = oob->next;
    634 		region_list_remove(&alloc->list, oob);
    635 		region_list_append(&alloc->oob_list, oob);
    636 		oob = next;
    637 	}
    638 
    639 	return 0;
    640 }
    641 
    642 static int advance_list_ptr(struct region_list *list, int blocks)
    643 {
    644 	struct region *reg = list->iter;
    645 
    646 	while (reg != NULL && blocks > 0) {
    647 		if (reg->len > list->partial_iter + blocks) {
    648 			list->partial_iter += blocks;
    649 			return 0;
    650 		}
    651 
    652 		blocks -= (reg->len - list->partial_iter);
    653 		list->partial_iter = 0;
    654 		reg = reg->next;
    655 	}
    656 
    657 	if (blocks > 0)
    658 		return -1;
    659 
    660 	return 0;
    661 }
    662 
    663 /* Move the allocation pointer forward */
    664 int advance_blocks(struct block_allocation *alloc, int blocks)
    665 {
    666 	return advance_list_ptr(&alloc->list, blocks);
    667 }
    668 
    669 int advance_oob_blocks(struct block_allocation *alloc, int blocks)
    670 {
    671 	return advance_list_ptr(&alloc->oob_list, blocks);
    672 }
    673 
    674 int append_oob_allocation(struct block_allocation *alloc, u32 len)
    675 {
    676 	struct region *reg = do_allocate(len);
    677 
    678 	if (reg == NULL) {
    679 		error("failed to allocate %d blocks", len);
    680 		return -1;
    681 	}
    682 
    683 	for (; reg; reg = reg->next)
    684 		region_list_append(&alloc->oob_list, reg);
    685 
    686 	return 0;
    687 }
    688 
    689 /* Returns an ext4_inode structure for an inode number */
    690 struct ext4_inode *get_inode(u32 inode)
    691 {
    692 	inode -= 1;
    693 	int bg = inode / info.inodes_per_group;
    694 	inode %= info.inodes_per_group;
    695 
    696 	allocate_bg_inode_table(&aux_info.bgs[bg]);
    697 	return (struct ext4_inode *)(aux_info.bgs[bg].inode_table + inode *
    698 		info.inode_size);
    699 }
    700 
    701 struct ext4_xattr_header *get_xattr_block_for_inode(struct ext4_inode *inode)
    702 {
    703 	struct ext4_xattr_header *block = xattr_list_find(inode);
    704 	if (block != NULL)
    705 		return block;
    706 
    707 	u32 block_num = allocate_block();
    708 	block = calloc(info.block_size, 1);
    709 	if (block == NULL) {
    710 		error("get_xattr: failed to allocate %d", info.block_size);
    711 		return NULL;
    712 	}
    713 
    714 	block->h_magic = cpu_to_le32(EXT4_XATTR_MAGIC);
    715 	block->h_refcount = cpu_to_le32(1);
    716 	block->h_blocks = cpu_to_le32(1);
    717 	inode->i_blocks_lo = cpu_to_le32(le32_to_cpu(inode->i_blocks_lo) + (info.block_size / 512));
    718 	inode->i_file_acl_lo = cpu_to_le32(block_num);
    719 
    720 	int result = sparse_file_add_data(info.sparse_file, block, info.block_size, block_num);
    721 	if (result != 0) {
    722 		error("get_xattr: sparse_file_add_data failure %d", result);
    723 		free(block);
    724 		return NULL;
    725 	}
    726 	xattr_list_insert(inode, block);
    727 	return block;
    728 }
    729 
    730 /* Mark the first len inodes in a block group as used */
    731 u32 reserve_inodes(int bg, u32 num)
    732 {
    733 	unsigned int i;
    734 	u32 inode;
    735 
    736 	if (get_free_inodes(bg) < num)
    737 		return EXT4_ALLOCATE_FAILED;
    738 
    739 	for (i = 0; i < num; i++) {
    740 		inode = aux_info.bgs[bg].first_free_inode + i - 1;
    741 		aux_info.bgs[bg].inode_bitmap[inode / 8] |= 1 << (inode % 8);
    742 	}
    743 
    744 	inode = aux_info.bgs[bg].first_free_inode;
    745 
    746 	aux_info.bgs[bg].first_free_inode += num;
    747 	aux_info.bgs[bg].free_inodes -= num;
    748 
    749 	return inode;
    750 }
    751 
    752 /* Returns the first free inode number
    753    TODO: Inodes should be allocated in the block group of the data? */
    754 u32 allocate_inode()
    755 {
    756 	unsigned int bg;
    757 	u32 inode;
    758 
    759 	for (bg = 0; bg < aux_info.groups; bg++) {
    760 		inode = reserve_inodes(bg, 1);
    761 		if (inode != EXT4_ALLOCATE_FAILED)
    762 			return bg * info.inodes_per_group + inode;
    763 	}
    764 
    765 	return EXT4_ALLOCATE_FAILED;
    766 }
    767 
    768 /* Returns the number of free inodes in a block group */
    769 u32 get_free_inodes(u32 bg)
    770 {
    771 	return aux_info.bgs[bg].free_inodes;
    772 }
    773 
    774 /* Increments the directory count of the block group that contains inode */
    775 void add_directory(u32 inode)
    776 {
    777 	int bg = (inode - 1) / info.inodes_per_group;
    778 	aux_info.bgs[bg].used_dirs += 1;
    779 }
    780 
    781 /* Returns the number of inodes in a block group that are directories */
    782 u16 get_directories(int bg)
    783 {
    784 	return aux_info.bgs[bg].used_dirs;
    785 }
    786 
    787 /* Returns the flags for a block group */
    788 u16 get_bg_flags(int bg)
    789 {
    790 	return aux_info.bgs[bg].flags;
    791 }
    792 
    793 /* Frees the memory used by a linked list of allocation regions */
    794 void free_alloc(struct block_allocation *alloc)
    795 {
    796 	struct region *reg;
    797 
    798 	reg = alloc->list.first;
    799 	while (reg) {
    800 		struct region *next = reg->next;
    801 		free(reg);
    802 		reg = next;
    803 	}
    804 
    805 	reg = alloc->oob_list.first;
    806 	while (reg) {
    807 		struct region *next = reg->next;
    808 		free(reg);
    809 		reg = next;
    810 	}
    811 
    812 	free(alloc);
    813 }
    814