Changeset d76973c in mainline for uspace/lib/ext4/libext4_filesystem.c
- Timestamp:
- 2015-04-25T21:20:11Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 60c409c
- Parents:
- 7f29575
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_filesystem.c
r7f29575 rd76973c 251 251 } 252 252 253 /** Convert the absolute block number to group number 254 * 255 * @param sb Pointer to the superblock 256 * @param b Absolute block number 257 * 258 * @return Group number 259 */ 260 uint32_t ext4_filesystem_blockaddr2group(ext4_superblock_t *sb, uint64_t b) 261 { 262 uint32_t blocks_per_group = ext4_superblock_get_blocks_per_group(sb); 263 264 return b / blocks_per_group; 265 } 266 253 267 /** Initialize block bitmap in block group. 254 268 * … … 260 274 static int ext4_filesystem_init_block_bitmap(ext4_block_group_ref_t *bg_ref) 261 275 { 276 uint64_t itb; 277 uint32_t sz; 278 uint32_t i; 279 262 280 /* Load bitmap */ 263 uint32_t bitmap_block_addr = ext4_block_group_get_block_bitmap( 281 ext4_superblock_t *sb = bg_ref->fs->superblock; 282 uint64_t bitmap_block_addr = ext4_block_group_get_block_bitmap( 283 bg_ref->block_group, bg_ref->fs->superblock); 284 uint64_t bitmap_inode_addr = ext4_block_group_get_inode_bitmap( 264 285 bg_ref->block_group, bg_ref->fs->superblock); 265 286 … … 273 294 274 295 /* Initialize all bitmap bits to zero */ 275 uint32_t block_size = ext4_superblock_get_block_size( bg_ref->fs->superblock);296 uint32_t block_size = ext4_superblock_get_block_size(sb); 276 297 memset(bitmap, 0, block_size); 277 298 278 /* Determine first block and first data block in group */ 279 uint32_t first_idx = 0; 280 281 uint32_t first_data = ext4_balloc_get_first_data_block_in_group( 282 bg_ref->fs->superblock, bg_ref); 283 uint32_t first_data_idx = ext4_filesystem_blockaddr2_index_in_group( 284 bg_ref->fs->superblock, first_data); 285 299 /* Determine the number of reserved blocks in the group */ 300 uint32_t reserved_cnt = ext4_filesystem_bg_get_backup_blocks(bg_ref); 301 286 302 /* Set bits from to first block to first data block - 1 to one (allocated) */ 287 for (uint32_t block = first_idx; block < first_data_idx; ++block)303 for (uint32_t block = 0; block < reserved_cnt; ++block) 288 304 ext4_bitmap_set_bit(bitmap, block); 289 305 306 uint32_t bitmap_block_gid = ext4_filesystem_blockaddr2group(sb, 307 bitmap_block_addr); 308 if (bitmap_block_gid == bg_ref->index) { 309 ext4_bitmap_set_bit(bitmap, 310 ext4_filesystem_blockaddr2_index_in_group(sb, bitmap_block_addr)); 311 } 312 313 uint32_t bitmap_inode_gid = ext4_filesystem_blockaddr2group(sb, 314 bitmap_inode_addr); 315 if (bitmap_inode_gid == bg_ref->index) { 316 ext4_bitmap_set_bit(bitmap, 317 ext4_filesystem_blockaddr2_index_in_group(sb, bitmap_inode_addr)); 318 } 319 320 itb = ext4_block_group_get_inode_table_first_block(bg_ref->block_group, 321 sb); 322 sz = ext4_filesystem_bg_get_itable_size(sb, bg_ref); 323 324 for (i = 0; i < sz; ++i, ++itb) { 325 uint32_t gid = ext4_filesystem_blockaddr2group(sb, itb); 326 if (gid == bg_ref->index) { 327 ext4_bitmap_set_bit(bitmap, 328 ext4_filesystem_blockaddr2_index_in_group(sb, itb)); 329 } 330 } 331 290 332 bitmap_block->dirty = true; 291 333 … … 524 566 } 525 567 568 /** Get the size of the block group's inode table 569 * 570 * @param sb Pointer to the superblock 571 * @param bg_ref Pointer to the block group reference 572 * 573 * @return Size of the inode table in blocks. 574 */ 575 uint32_t ext4_filesystem_bg_get_itable_size(ext4_superblock_t *sb, 576 ext4_block_group_ref_t *bg_ref) 577 { 578 uint32_t itable_size; 579 uint32_t block_group_count = ext4_superblock_get_block_group_count(sb); 580 uint16_t inode_table_item_size = ext4_superblock_get_inode_size(sb); 581 uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group(sb); 582 uint32_t block_size = ext4_superblock_get_block_size(sb); 583 584 if (bg_ref->index < block_group_count - 1) { 585 itable_size = inodes_per_group * inode_table_item_size; 586 } else { 587 /* Last block group could be smaller */ 588 uint32_t inodes_count_total = ext4_superblock_get_inodes_count(sb); 589 itable_size = 590 (inodes_count_total - ((block_group_count - 1) * inodes_per_group)) * 591 inode_table_item_size; 592 } 593 594 return ROUND_UP(itable_size, block_size) / block_size; 595 } 596 526 597 /* Check if n is a power of p */ 527 598 static bool is_power_of(uint32_t n, unsigned p) … … 548 619 * @return Number of blocks 549 620 */ 550 uint32_t ext4_ block_group_get_backup_blocks(ext4_block_group_ref_t *bg)621 uint32_t ext4_filesystem_bg_get_backup_blocks(ext4_block_group_ref_t *bg) 551 622 { 552 623 uint32_t const idx = bg->index;
Note:
See TracChangeset
for help on using the changeset viewer.