Changeset b73530a in mainline for uspace/lib/ext4/libext4_balloc.c
- Timestamp:
- 2012-04-08T14:01:49Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 82cb6768
- Parents:
- 936132f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_balloc.c
r936132f rb73530a 569 569 } 570 570 571 int ext4_balloc_try_alloc_block(ext4_inode_ref_t *inode_ref, uint32_t fblock) 572 { 573 int rc; 574 575 ext4_filesystem_t *fs = inode_ref->fs; 576 ext4_superblock_t *sb = fs->superblock; 577 578 uint32_t block_group = ext4_balloc_get_bgid_of_block(sb, fblock); 579 uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(sb, fblock); 580 581 ext4_block_group_ref_t *bg_ref; 582 rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref); 583 if (rc != EOK) { 584 EXT4FS_DBG("error in loading bg_ref \%d", rc); 585 return rc; 586 } 587 588 uint32_t bitmap_block_addr = ext4_block_group_get_block_bitmap( 589 bg_ref->block_group, sb); 590 block_t *bitmap_block; 591 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 592 if (rc != EOK) { 593 EXT4FS_DBG("error in loading bitmap \%d", rc); 594 return rc; 595 } 596 597 bool free = ext4_bitmap_is_free_bit(bitmap_block->data, index_in_group); 598 599 if (free) { 600 ext4_bitmap_set_bit(bitmap_block->data, index_in_group); 601 bitmap_block->dirty = true; 602 } 603 604 rc = block_put(bitmap_block); 605 if (rc != EOK) { 606 // Error in saving bitmap 607 ext4_filesystem_put_block_group_ref(bg_ref); 608 EXT4FS_DBG("error in saving bitmap \%d", rc); 609 return rc; 610 } 611 612 if (!free) { 613 rc = EINVAL; 614 goto terminate; 615 } 616 617 uint32_t block_size = ext4_superblock_get_block_size(sb); 618 619 // Update superblock free blocks count 620 uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb); 621 sb_free_blocks--; 622 ext4_superblock_set_free_blocks_count(sb, sb_free_blocks); 623 624 // Update inode blocks count 625 uint64_t ino_blocks = ext4_inode_get_blocks_count(sb, inode_ref->inode); 626 ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE; 627 ext4_inode_set_blocks_count(sb, inode_ref->inode, ino_blocks); 628 inode_ref->dirty = true; 629 630 // Update block group free blocks count 631 uint32_t free_blocks = ext4_block_group_get_free_blocks_count( 632 bg_ref->block_group, sb); 633 free_blocks--; 634 ext4_block_group_set_free_blocks_count(bg_ref->block_group, 635 sb, free_blocks); 636 bg_ref->dirty = true; 637 638 terminate: 639 640 rc = ext4_filesystem_put_block_group_ref(bg_ref); 641 if (rc != EOK) { 642 EXT4FS_DBG("error in saving bg_ref \%d", rc); 643 return rc; 644 } 645 646 return rc; 647 } 571 648 572 649 /**
Note:
See TracChangeset
for help on using the changeset viewer.