Changeset 1ac1ab4 in mainline for uspace/lib/ext4/libext4_balloc.c


Ignore:
Timestamp:
2012-03-31T20:00:15Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a2fa350
Parents:
38384ae
Message:

simplied headers of more functions, improved bg_ref and inode_ref structures, added block group checksumming and fixed bug in block_group values updating

File:
1 edited

Legend:

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

    r38384ae r1ac1ab4  
    8282
    8383
    84 int ext4_balloc_free_block(ext4_filesystem_t *fs, ext4_inode_ref_t *inode_ref, uint32_t block_addr)
     84int ext4_balloc_free_block(ext4_inode_ref_t *inode_ref, uint32_t block_addr)
    8585{
    8686        int rc;
    8787
    88         uint32_t block_group = ext4_balloc_get_bgid_of_block(fs->superblock, block_addr);
    89         uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(fs->superblock, block_addr);
     88        ext4_filesystem_t *fs = inode_ref->fs;
     89        ext4_superblock_t *sb = fs->superblock;
     90
     91        uint32_t block_group = ext4_balloc_get_bgid_of_block(sb, block_addr);
     92        uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(sb, block_addr);
    9093
    9194        ext4_block_group_ref_t *bg_ref;
     
    97100
    98101        uint32_t bitmap_block_addr = ext4_block_group_get_block_bitmap(
    99                         bg_ref->block_group, fs->superblock);
     102                        bg_ref->block_group, sb);
    100103        block_t *bitmap_block;
    101104        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
     
    116119        }
    117120
    118         uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
     121        uint32_t block_size = ext4_superblock_get_block_size(sb);
    119122
    120123        // Update superblock free blocks count
    121         uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(fs->superblock);
     124        uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb);
    122125        sb_free_blocks--;
    123         ext4_superblock_set_free_blocks_count(fs->superblock, sb_free_blocks);
     126        ext4_superblock_set_free_blocks_count(sb, sb_free_blocks);
    124127
    125128        // Update inode blocks count
    126         uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
     129        uint64_t ino_blocks = ext4_inode_get_blocks_count(sb, inode_ref->inode);
    127130        ino_blocks -= block_size / EXT4_INODE_BLOCK_SIZE;
    128         ext4_inode_set_blocks_count(fs->superblock, inode_ref->inode, ino_blocks);
     131        ext4_inode_set_blocks_count(sb, inode_ref->inode, ino_blocks);
    129132        inode_ref->dirty = true;
    130133
    131134        // Update block group free blocks count
    132135        uint32_t free_blocks = ext4_block_group_get_free_blocks_count(
    133                         bg_ref->block_group, fs->superblock);
     136                        bg_ref->block_group, sb);
    134137        free_blocks++;
    135138        ext4_block_group_set_free_blocks_count(bg_ref->block_group,
    136                         fs->superblock, free_blocks);
     139                        sb, free_blocks);
    137140        bg_ref->dirty = true;
    138141
     
    178181
    179182
    180 static uint32_t ext4_balloc_find_goal(ext4_filesystem_t *fs, ext4_inode_ref_t *inode_ref)
     183static uint32_t ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref)
    181184{
    182185        int rc;
    183186        uint32_t goal = 0;
    184187
    185         uint64_t inode_size = ext4_inode_get_size(fs->superblock, inode_ref->inode);
    186         uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
     188        ext4_superblock_t *sb = inode_ref->fs->superblock;
     189
     190        uint64_t inode_size = ext4_inode_get_size(sb, inode_ref->inode);
     191        uint32_t block_size = ext4_superblock_get_block_size(sb);
    187192        uint32_t inode_block_count = inode_size / block_size;
    188193
     
    193198        if (inode_block_count > 0) {
    194199                // TODO check retval
    195                 ext4_filesystem_get_inode_data_block_index(fs, inode_ref, inode_block_count - 1, &goal);
     200                ext4_filesystem_get_inode_data_block_index(inode_ref, inode_block_count - 1, &goal);
    196201
    197202                // TODO
     
    203208
    204209        // Identify block group of inode
    205         uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group(fs->superblock);
     210        uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group(sb);
    206211        uint32_t block_group = (inode_ref->index - 1) / inodes_per_group;
    207         block_size = ext4_superblock_get_block_size(fs->superblock);
     212        block_size = ext4_superblock_get_block_size(sb);
    208213
    209214        ext4_block_group_ref_t *bg_ref;
    210         rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref);
     215        rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, block_group, &bg_ref);
    211216        if (rc != EOK) {
    212217                return 0;
    213218        }
    214219
    215         uint32_t block_group_count = ext4_superblock_get_block_group_count(fs->superblock);
     220        uint32_t block_group_count = ext4_superblock_get_block_group_count(sb);
    216221        uint32_t inode_table_first_block = ext4_block_group_get_inode_table_first_block(
    217                         bg_ref->block_group, fs->superblock);
    218         uint16_t inode_table_item_size = ext4_superblock_get_inode_size(fs->superblock);
     222                        bg_ref->block_group, sb);
     223        uint16_t inode_table_item_size = ext4_superblock_get_inode_size(sb);
    219224        uint32_t inode_table_bytes;
    220225
     
    223228        } else {
    224229                // last block group could be smaller
    225                 uint32_t inodes_count_total = ext4_superblock_get_inodes_count(fs->superblock);
     230                uint32_t inodes_count_total = ext4_superblock_get_inodes_count(sb);
    226231                inode_table_bytes =
    227232                                (inodes_count_total - ((block_group_count - 1) * inodes_per_group))
     
    242247}
    243248
    244 int ext4_balloc_alloc_block(ext4_filesystem_t *fs,
     249int ext4_balloc_alloc_block(
    245250                ext4_inode_ref_t *inode_ref, uint32_t *fblock)
    246251{
     
    253258
    254259        // Find GOAL
    255         uint32_t goal = ext4_balloc_find_goal(fs, inode_ref);
     260        uint32_t goal = ext4_balloc_find_goal(inode_ref);
    256261        if (goal == 0) {
    257262                // TODO
     
    260265        }
    261266
     267        ext4_superblock_t *sb = inode_ref->fs->superblock;
     268
    262269        // Load block group number for goal and relative index
    263         uint32_t block_group = ext4_balloc_get_bgid_of_block(fs->superblock, goal);
    264         uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(fs->superblock, goal);
     270        uint32_t block_group = ext4_balloc_get_bgid_of_block(sb, goal);
     271        uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(sb, goal);
    265272
    266273
    267274        ext4_block_group_ref_t *bg_ref;
    268         rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref);
     275        rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, block_group, &bg_ref);
    269276        if (rc != EOK) {
    270277                EXT4FS_DBG("initial BG ref not loaded");
     
    273280
    274281        uint32_t first_in_group =
    275                         ext4_balloc_get_first_data_block_in_group(fs->superblock,
     282                        ext4_balloc_get_first_data_block_in_group(sb,
    276283                                        bg_ref->block_group, block_group);
    277284
    278285        uint32_t first_in_group_index = ext4_balloc_blockaddr2_index_in_group(
    279                         fs->superblock, first_in_group);
     286                        sb, first_in_group);
    280287
    281288        if (index_in_group < first_in_group_index) {
     
    285292        // Load bitmap
    286293        bitmap_block_addr = ext4_block_group_get_block_bitmap(bg_ref->block_group,
    287                         fs->superblock);
    288 
    289         rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
     294                        sb);
     295
     296        rc = block_get(&bitmap_block, inode_ref->fs->device, bitmap_block_addr, 0);
    290297        if (rc != EOK) {
    291298                ext4_filesystem_put_block_group_ref(bg_ref);
     
    311318        }
    312319
    313         uint32_t blocks_in_group = ext4_superblock_get_blocks_in_group(fs->superblock, block_group);
     320        uint32_t blocks_in_group = ext4_superblock_get_blocks_in_group(sb, block_group);
    314321
    315322        uint32_t end_idx = (index_in_group + 63) & ~63;
     
    331338
    332339                        allocated_block = ext4_balloc_index_in_group2blockaddr(
    333                                         fs->superblock, tmp_idx, block_group);
     340                                        sb, tmp_idx, block_group);
    334341
    335342                        goto success;
     
    349356
    350357                allocated_block = ext4_balloc_index_in_group2blockaddr(
    351                                 fs->superblock, rel_block_idx, block_group);
     358                                sb, rel_block_idx, block_group);
    352359
    353360                goto success;
     
    365372
    366373                allocated_block = ext4_balloc_index_in_group2blockaddr(
    367                                 fs->superblock, rel_block_idx, block_group);
     374                                sb, rel_block_idx, block_group);
    368375
    369376                goto success;
     
    375382
    376383        // Try other block groups
    377         uint32_t block_group_count = ext4_superblock_get_block_group_count(fs->superblock);
     384        uint32_t block_group_count = ext4_superblock_get_block_group_count(sb);
    378385
    379386        uint32_t bgid = (block_group + 1) % block_group_count;
     
    381388
    382389        while (count > 0) {
    383                 rc = ext4_filesystem_get_block_group_ref(fs, bgid, &bg_ref);
     390                rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, bgid, &bg_ref);
    384391                if (rc != EOK) {
    385392                        EXT4FS_DBG("errrrrrrrrrrr");
     
    389396                // Load bitmap
    390397                bitmap_block_addr = ext4_block_group_get_block_bitmap(
    391                                 bg_ref->block_group, fs->superblock);
    392 
    393                 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
     398                                bg_ref->block_group, sb);
     399
     400                rc = block_get(&bitmap_block, inode_ref->fs->device, bitmap_block_addr, 0);
    394401                if (rc != EOK) {
    395402                        ext4_filesystem_put_block_group_ref(bg_ref);
     
    399406
    400407                first_in_group = ext4_balloc_get_first_data_block_in_group(
    401                                 fs->superblock, bg_ref->block_group, bgid);
    402                 index_in_group = ext4_balloc_blockaddr2_index_in_group(fs->superblock,
     408                                sb, bg_ref->block_group, bgid);
     409                index_in_group = ext4_balloc_blockaddr2_index_in_group(sb,
    403410                                                first_in_group);
    404                 blocks_in_group = ext4_superblock_get_blocks_in_group(fs->superblock, bgid);
     411                blocks_in_group = ext4_superblock_get_blocks_in_group(sb, bgid);
    405412
    406413                first_in_group_index = ext4_balloc_blockaddr2_index_in_group(
    407                         fs->superblock, first_in_group);
     414                        sb, first_in_group);
    408415
    409416                if (index_in_group < first_in_group_index) {
     
    422429
    423430                        allocated_block = ext4_balloc_index_in_group2blockaddr(
    424                                         fs->superblock, rel_block_idx, bgid);
     431                                        sb, rel_block_idx, bgid);
    425432
    426433                        goto success;
     
    438445
    439446                        allocated_block = ext4_balloc_index_in_group2blockaddr(
    440                                         fs->superblock, rel_block_idx, bgid);
     447                                        sb, rel_block_idx, bgid);
    441448
    442449                        goto success;
     
    456463        ;       // Empty command - because of syntax
    457464       
    458         uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
     465        uint32_t block_size = ext4_superblock_get_block_size(sb);
    459466
    460467        // Update superblock free blocks count
    461         uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(fs->superblock);
     468        uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb);
    462469        sb_free_blocks--;
    463         ext4_superblock_set_free_blocks_count(fs->superblock, sb_free_blocks);
     470        ext4_superblock_set_free_blocks_count(sb, sb_free_blocks);
    464471
    465472        // Update inode blocks (different block size!) count
    466473
    467         uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
     474        uint64_t ino_blocks = ext4_inode_get_blocks_count(sb, inode_ref->inode);
    468475        ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE;
    469         ext4_inode_set_blocks_count(fs->superblock, inode_ref->inode, ino_blocks);
     476        ext4_inode_set_blocks_count(sb, inode_ref->inode, ino_blocks);
    470477        inode_ref->dirty = true;
    471478
    472479        // Update block group free blocks count
    473480        uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(
    474                         bg_ref->block_group, fs->superblock);
     481                        bg_ref->block_group, sb);
    475482        bg_free_blocks--;
    476         ext4_block_group_set_free_blocks_count(bg_ref->block_group,
    477                         fs->superblock, bg_free_blocks);
     483        ext4_block_group_set_free_blocks_count(bg_ref->block_group, sb, bg_free_blocks);
    478484        bg_ref->dirty = true;
    479485
Note: See TracChangeset for help on using the changeset viewer.