Changeset 1e65444 in mainline for uspace/lib/ext4/libext4_bitmap.c


Ignore:
Timestamp:
2011-11-09T17:52:33Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2b9e142
Parents:
35f48f2
Message:

more functional file writing - indirect blocks too

File:
1 edited

Legend:

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

    r35f48f2 r1e65444  
    4343static void ext4_bitmap_free_bit(uint8_t *bitmap, uint32_t index)
    4444{
     45        // Block numbers are 1-based
    4546        uint32_t byte_index = index / 8;
    4647        uint32_t bit_index = index % 8;
     48
     49//      EXT4FS_DBG("freeing block \%u, byte \%u and bit \%u", index, byte_index, bit_index);
    4750
    4851        uint8_t *target = bitmap + byte_index;
     
    5962        int i;
    6063        uint32_t idx = 0;
     64        uint8_t value, new_value;
    6165
    6266        while (pos < bitmap + size) {
     
    7276        if (pos < bitmap + size) {
    7377
     78//              EXT4FS_DBG("byte found \%u", (uint32_t)(pos - bitmap));
     79
    7480                for(i = 0; i < 8; ++i) {
    75                         if ((*pos & (1 << i)) == 0) {
     81                        value = *pos;
     82
     83                        if ((value & (1 << i)) == 0) {
    7684                                // free bit found
    77                                 *pos |= (1 << i);
    78                                 *index = idx;
     85//                              EXT4FS_DBG("bit found \%u", i);
     86                                new_value = value | (1 << i);
     87                                *pos = new_value;
     88                                *index = idx + i;
    7989                                return EOK;
    8090                        }
    81 
    82                         idx++;
    8391                }
    8492        }
     
    98106
    99107        blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock);
    100         block_group = block_index / blocks_per_group;
    101         index_in_group = block_index % blocks_per_group;
     108        block_group = ((block_index - 1) / blocks_per_group);
     109        index_in_group = (block_index - 1) % blocks_per_group;
    102110
    103111        rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref);
     
    133141                return rc;
    134142        }
     143
     144        EXT4FS_DBG("block \%u released", block_index);
    135145
    136146        return EOK;
     
    148158
    149159        inodes_per_group = ext4_superblock_get_inodes_per_group(fs->superblock);
    150         block_group = inode_ref->index / inodes_per_group;
     160        block_group = (inode_ref->index - 1) / inodes_per_group;
    151161
    152162        block_size = ext4_superblock_get_block_size(fs->superblock);
     
    166176
    167177        rc = ext4_bitmap_find_free_bit_and_set(block->data, &rel_block_idx, block_size);
    168 
    169 
    170178        if (rc != EOK) {
    171179                EXT4FS_DBG("no block found");
    172180                // TODO if ENOSPC - try next block group - try next block groups
    173181        }
     182
     183        block->dirty = true;
     184
     185        // TODO check retval
     186        block_put(block);
    174187
    175188        // TODO decrement superblock free blocks count
     
    179192
    180193        uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
    181         bg_free_blocks++;
     194        bg_free_blocks--;
    182195        ext4_block_group_set_free_blocks_count(bg_ref->block_group, bg_free_blocks);
    183196        bg_ref->dirty = true;
    184197
    185         // return
     198        ext4_filesystem_put_block_group_ref(bg_ref);
     199
    186200        blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock);
    187         *fblock = blocks_per_group * block_group + rel_block_idx;
     201
     202        EXT4FS_DBG("block \%u allocated", blocks_per_group * block_group + rel_block_idx + 1);
     203
     204        *fblock = blocks_per_group * block_group + rel_block_idx + 1;
    188205        return EOK;
    189206
Note: See TracChangeset for help on using the changeset viewer.