Changeset d9bbe45 in mainline for uspace/lib/ext4/libext4_filesystem.c


Ignore:
Timestamp:
2012-01-22T13:22:56Z (13 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fcae007
Parents:
b7e0260
Message:

Refafctorization - principle of locality in variables declaration

File:
1 edited

Legend:

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

    rb7e0260 rd9bbe45  
    4444{
    4545        int rc;
    46         ext4_superblock_t *temp_superblock;
    47         size_t block_size;
    48         uint32_t block_ids_per_block;
    49         int i;
    5046
    5147        fs->device = service_id;
     
    5854
    5955        /* Read superblock from device */
     56        ext4_superblock_t *temp_superblock;
    6057        rc = ext4_superblock_read_direct(fs->device, &temp_superblock);
    6158        if (rc != EOK) {
     
    6562
    6663        /* Read block size from superblock and check */
    67         block_size = ext4_superblock_get_block_size(temp_superblock);
     64        uint32_t block_size = ext4_superblock_get_block_size(temp_superblock);
    6865        if (block_size > EXT4_MAX_BLOCK_SIZE) {
    6966                block_fini(fs->device);
     
    7875        }
    7976
    80         block_ids_per_block = block_size / sizeof(uint32_t);
     77        uint32_t block_ids_per_block = block_size / sizeof(uint32_t);
    8178        fs->inode_block_limits[0] = EXT4_INODE_DIRECT_BLOCK_COUNT;
    8279        fs->inode_blocks_per_level[0] = 1;
    83         for (i = 1; i < 4; i++) {
     80        for (int i = 1; i < 4; i++) {
    8481                fs->inode_blocks_per_level[i] = fs->inode_blocks_per_level[i-1] *
    8582                    block_ids_per_block;
     
    9794{
    9895        int rc = EOK;
     96
    9997        if (write_sb) {
    10098                rc = ext4_superblock_write_direct(fs->device, fs->superblock);
     
    149147{
    150148        int rc;
    151         aoff64_t block_id;
    152         uint32_t descriptors_per_block;
    153         size_t offset;
    154         ext4_block_group_ref_t *newref;
    155 
    156         newref = malloc(sizeof(ext4_block_group_ref_t));
     149
     150        ext4_block_group_ref_t *newref = malloc(sizeof(ext4_block_group_ref_t));
    157151        if (newref == NULL) {
    158152                return ENOMEM;
    159153        }
    160154
    161         descriptors_per_block = ext4_superblock_get_block_size(fs->superblock)
     155        uint32_t descriptors_per_block = ext4_superblock_get_block_size(fs->superblock)
    162156            / ext4_superblock_get_desc_size(fs->superblock);
    163157
    164158        /* Block group descriptor table starts at the next block after superblock */
    165         block_id = ext4_superblock_get_first_data_block(fs->superblock) + 1;
     159        aoff64_t block_id = ext4_superblock_get_first_data_block(fs->superblock) + 1;
    166160
    167161        /* Find the block containing the descriptor we are looking for */
    168162        block_id += bgid / descriptors_per_block;
    169         offset = (bgid % descriptors_per_block) * ext4_superblock_get_desc_size(fs->superblock);
     163        uint32_t offset = (bgid % descriptors_per_block) * ext4_superblock_get_desc_size(fs->superblock);
    170164
    171165        rc = block_get(&newref->block, fs->device, block_id, 0);
     
    201195{
    202196        int rc;
    203         aoff64_t block_id;
    204         uint32_t block_group;
    205         uint32_t offset_in_group;
    206         uint32_t byte_offset_in_group;
    207         size_t offset_in_block;
    208         uint32_t inodes_per_group;
    209         uint32_t inode_table_start;
    210         uint16_t inode_size;
    211         uint32_t block_size;
    212         ext4_block_group_ref_t *bg_ref;
    213         ext4_inode_ref_t *newref;
    214 
    215         newref = malloc(sizeof(ext4_inode_ref_t));
     197
     198        ext4_inode_ref_t *newref = malloc(sizeof(ext4_inode_ref_t));
    216199        if (newref == NULL) {
    217200                return ENOMEM;
    218201        }
    219202
    220         inodes_per_group = ext4_superblock_get_inodes_per_group(fs->superblock);
     203        uint32_t inodes_per_group =
     204                        ext4_superblock_get_inodes_per_group(fs->superblock);
    221205
    222206        /* inode numbers are 1-based, but it is simpler to work with 0-based
     
    224208         */
    225209        index -= 1;
    226         block_group = index / inodes_per_group;
    227         offset_in_group = index % inodes_per_group;
    228 
     210        uint32_t block_group = index / inodes_per_group;
     211        uint32_t offset_in_group = index % inodes_per_group;
     212
     213        ext4_block_group_ref_t *bg_ref;
    229214        rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref);
    230215        if (rc != EOK) {
     
    233218        }
    234219
    235         inode_table_start = ext4_block_group_get_inode_table_first_block(
     220        uint32_t inode_table_start = ext4_block_group_get_inode_table_first_block(
    236221            bg_ref->block_group, fs->superblock);
    237222
     
    242227        }
    243228
    244         inode_size = ext4_superblock_get_inode_size(fs->superblock);
    245         block_size = ext4_superblock_get_block_size(fs->superblock);
    246 
    247         byte_offset_in_group = offset_in_group * inode_size;
    248 
    249         block_id = inode_table_start + (byte_offset_in_group / block_size);
    250         offset_in_block = byte_offset_in_group % block_size;
    251 
     229        uint16_t inode_size = ext4_superblock_get_inode_size(fs->superblock);
     230        uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
     231        uint32_t byte_offset_in_group = offset_in_group * inode_size;
     232
     233        aoff64_t block_id = inode_table_start + (byte_offset_in_group / block_size);
    252234        rc = block_get(&newref->block, fs->device, block_id, 0);
    253235        if (rc != EOK) {
     
    256238        }
    257239
     240        uint32_t offset_in_block = byte_offset_in_group % block_size;
    258241        newref->inode = newref->block->data + offset_in_block;
    259242        /* we decremented index above, but need to store the original value
     
    322305{
    323306        int rc;
     307
    324308        // release all indirect blocks
    325309
    326         uint32_t fblock;
    327 
    328310        // 1) Single indirect
    329         fblock = ext4_inode_get_indirect_block(inode_ref->inode, 0);
     311        uint32_t fblock = ext4_inode_get_indirect_block(inode_ref->inode, 0);
    330312        if (fblock != 0) {
    331313                rc = ext4_balloc_free_block(fs, inode_ref, fblock);
     
    437419                ext4_inode_ref_t *inode_ref, aoff64_t new_size)
    438420{
    439         aoff64_t old_size;
    440         aoff64_t size_diff;
    441 
    442421        if (! ext4_inode_can_truncate(fs->superblock, inode_ref->inode)) {
    443422                // Unable to truncate
     
    445424        }
    446425
    447         old_size = ext4_inode_get_size(fs->superblock, inode_ref->inode);
    448 
     426        aoff64_t old_size = ext4_inode_get_size(fs->superblock, inode_ref->inode);
    449427        if (old_size == new_size) {
    450428                // Nothing to do
    451429                return EOK;
    452430        }
    453 
    454         uint32_t block_size;
    455         uint32_t blocks_count, total_blocks;
    456         uint32_t i;
    457 
    458         block_size  = ext4_superblock_get_block_size(fs->superblock);
    459431
    460432        if (old_size < new_size) {
     
    465437        }
    466438
    467         size_diff = old_size - new_size;
    468         blocks_count = size_diff / block_size;
     439        aoff64_t size_diff = old_size - new_size;
     440        uint32_t block_size  = ext4_superblock_get_block_size(fs->superblock);
     441        uint32_t blocks_count = size_diff / block_size;
    469442        if (size_diff % block_size != 0) {
    470443                blocks_count++;
    471444        }
    472445
    473         total_blocks = old_size / block_size;
     446        uint32_t total_blocks = old_size / block_size;
    474447        if (old_size % block_size != 0) {
    475448                total_blocks++;
     
    477450
    478451        // starting from 1 because of logical blocks are numbered from 0
    479         for (i = 1; i <= blocks_count; ++i) {
     452        for (uint32_t i = 1; i <= blocks_count; ++i) {
    480453                // TODO check retval
    481454                ext4_filesystem_release_inode_block(fs, inode_ref, total_blocks - i);
     
    493466{
    494467        int rc;
    495         uint32_t offset_in_block;
     468
     469
    496470        uint32_t current_block;
    497         aoff64_t block_offset_in_level;
    498         int i;
    499         int level;
    500         block_t *block;
    501471
    502472        /* Handle inode using extents */
     
    517487
    518488        /* Determine the indirection level needed to get the desired block */
    519         level = -1;
    520         for (i = 1; i < 4; i++) {
     489        int level = -1;
     490        for (int i = 1; i < 4; i++) {
    521491                if (iblock < fs->inode_block_limits[i]) {
    522492                        level = i;
     
    530500
    531501        /* Compute offsets for the topmost level */
    532         block_offset_in_level = iblock - fs->inode_block_limits[level-1];
     502        aoff64_t block_offset_in_level = iblock - fs->inode_block_limits[level-1];
    533503        current_block = ext4_inode_get_indirect_block(inode, level-1);
    534         offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
     504        uint32_t offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
    535505
    536506        if (current_block == 0) {
     
    538508                return EOK;
    539509        }
     510
     511        block_t *block;
    540512
    541513        /* Navigate through other levels, until we find the block number
     
    584556                ext4_inode_ref_t *inode_ref, aoff64_t iblock, uint32_t fblock)
    585557{
    586 
    587         int rc;
    588         uint32_t offset_in_block;
    589         uint32_t current_block, new_block_addr;
    590         uint32_t block_size;
    591         aoff64_t block_offset_in_level;
    592         int i;
    593         int level;
    594         block_t *block, *new_block;
     558        int rc;
     559
    595560
    596561        /* Handle inode using extents */
     
    609574
    610575        /* Determine the indirection level needed to get the desired block */
    611         level = -1;
    612         for (i = 1; i < 4; i++) {
     576        int level = -1;
     577        for (int i = 1; i < 4; i++) {
    613578                if (iblock < fs->inode_block_limits[i]) {
    614579                        level = i;
     
    621586        }
    622587
    623         block_size = ext4_superblock_get_block_size(fs->superblock);
     588
     589
     590        uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
    624591
    625592        /* Compute offsets for the topmost level */
    626         block_offset_in_level = iblock - fs->inode_block_limits[level-1];
    627         current_block = ext4_inode_get_indirect_block(inode_ref->inode, level-1);
    628         offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
     593        aoff64_t block_offset_in_level = iblock - fs->inode_block_limits[level-1];
     594        uint32_t current_block = ext4_inode_get_indirect_block(inode_ref->inode, level-1);
     595        uint32_t offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
     596
     597        uint32_t new_block_addr;
     598        block_t *block, *new_block;
    629599
    630600        if (current_block == 0) {
     
    634604                        EXT4FS_DBG("error in allocation");
    635605                }
    636 //              EXT4FS_DBG("AAA: new addr \%u, level = \%u", new_block_addr, level);
    637606
    638607                ext4_inode_set_indirect_block(inode_ref->inode, level - 1, new_block_addr);
     
    677646                                EXT4FS_DBG("allocation error");
    678647                        }
    679 //                      EXT4FS_DBG("BBB: new addr \%u, offset = \%u, level = \%u", new_block_addr, offset_in_block, level);
    680648
    681649                        rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
     
    730698{
    731699        int rc;
     700
     701
     702        /* TODO handle extents */
     703
     704
    732705        uint32_t fblock;
    733         int i;
    734         int level;
    735         aoff64_t block_offset_in_level;
    736         uint32_t current_block;
    737         uint32_t offset_in_block;
    738         block_t *block;
    739706        ext4_inode_t *inode = inode_ref->inode;
    740 
    741         /* TODO handle extents */
    742 
    743707
    744708        /* Handle simple case when we are dealing with direct reference */
     
    756720
    757721        /* Determine the indirection level needed to get the desired block */
    758         level = -1;
    759         for (i = 1; i < 4; i++) {
     722        int level = -1;
     723        for (int i = 1; i < 4; i++) {
    760724                if (iblock < fs->inode_block_limits[i]) {
    761725                        level = i;
     
    769733
    770734        /* Compute offsets for the topmost level */
    771         block_offset_in_level = iblock - fs->inode_block_limits[level-1];
    772         current_block = ext4_inode_get_indirect_block(inode, level-1);
    773         offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
     735        aoff64_t block_offset_in_level = iblock - fs->inode_block_limits[level-1];
     736        uint32_t current_block = ext4_inode_get_indirect_block(inode, level-1);
     737        uint32_t offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
    774738
    775739        /* Navigate through other levels, until we find the block number
    776740         * or find null reference meaning we are dealing with sparse file
    777741         */
     742        block_t *block;
    778743        while (level > 0) {
    779744                rc = block_get(&block, fs->device, current_block, 0);
Note: See TracChangeset for help on using the changeset viewer.