Changeset b73530a in mainline for uspace/lib/ext4/libext4_balloc.c


Ignore:
Timestamp:
2012-04-08T14:01:49Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
82cb6768
Parents:
936132f
Message:

appending fblock to existing extent

  • actually not solved situation, when extent is full !!!
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ext4/libext4_balloc.c

    r936132f rb73530a  
    569569}
    570570
     571int 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
     638terminate:
     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}
    571648
    572649/**
Note: See TracChangeset for help on using the changeset viewer.