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


Ignore:
Timestamp:
2011-11-18T15:30:24Z (14 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d5ba17f
Parents:
e18de3c
Message:

improved block allocator - but has some bugs

File:
1 edited

Legend:

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

    re18de3c rb12ca16  
    7272
    7373        /* Initialize block caching */
    74         // TODO set cache MODE to write through (now writeback for faster testing)
    75         rc = block_cache_init(service_id, block_size, 0, CACHE_MODE_WB);
     74        rc = block_cache_init(service_id, block_size, 0, CACHE_MODE_WT);
    7675        if (rc != EOK) {
    7776                block_fini(fs->device);
     
    387386                // TODO
    388387                return ENOTSUP;
    389 
    390388        }
    391389
     
    418416
    419417        if (current_block == 0) {
    420                 rc = ext4_bitmap_alloc_block(fs, inode_ref, &new_block_addr);
     418                rc = ext4_balloc_alloc_block(fs, inode_ref, &new_block_addr);
    421419                if (rc != EOK) {
    422420                        // TODO error
     
    460458                current_block = uint32_t_le2host(((uint32_t*)block->data)[offset_in_block]);
    461459
    462                 if (current_block == 0) {
    463                         if (level > 1) {
    464 
    465                                 rc = ext4_bitmap_alloc_block(fs, inode_ref, &new_block_addr);
    466                                 if (rc != EOK) {
    467                                         // TODO error
    468                                         EXT4FS_DBG("allocation error");
    469                                 }
    470 
    471                                 rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
    472                                 if (rc != EOK) {
    473                                         // TODO error
    474 
    475                                         EXT4FS_DBG("BBB: error block loading");
    476 
    477                                 }
    478                                 memset(new_block->data, 0, block_size);
    479                                 new_block->dirty = true;
    480 
    481                                 block_put(new_block);
    482 
    483                                 ((uint32_t*)block->data)[offset_in_block] = host2uint32_t_le(new_block_addr);
    484                                 block->dirty = true;
    485                                 current_block = new_block_addr;
    486                         } else {
    487                                 ((uint32_t*)block->data)[offset_in_block] = host2uint32_t_le(fblock);
    488                                 block->dirty = true;
     460                if ((level > 1) && (current_block == 0)) {
     461                        rc = ext4_balloc_alloc_block(fs, inode_ref, &new_block_addr);
     462                        if (rc != EOK) {
     463                                // TODO error
     464                                EXT4FS_DBG("allocation error");
    489465                        }
     466                        EXT4FS_DBG("BBB: new addr \%u, offset = \%u, level = \%u", new_block_addr, offset_in_block, level);
     467
     468                        rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
     469                        if (rc != EOK) {
     470                                // TODO error
     471
     472                                EXT4FS_DBG("BBB: error block loading");
     473
     474                        }
     475                        memset(new_block->data, 0, block_size);
     476                        new_block->dirty = true;
     477
     478                        rc = block_put(new_block);
     479                        if (rc != EOK) {
     480                                EXT4FS_DBG("BBB: error indirect block saving");
     481                        }
     482
     483                        ((uint32_t*)block->data)[offset_in_block] = host2uint32_t_le(new_block_addr);
     484                        block->dirty = true;
     485                        current_block = new_block_addr;
     486                }
     487
     488                if (level == 1) {
     489                        ((uint32_t*)block->data)[offset_in_block] = host2uint32_t_le(fblock);
     490                        block->dirty = true;
    490491                }
    491492
     
    537538
    538539                ext4_inode_set_direct_block(inode, iblock, 0);
    539                 return ext4_bitmap_free_block(fs, inode_ref, fblock);
     540                return ext4_balloc_free_block(fs, inode_ref, fblock);
    540541        }
    541542
     
    601602        }
    602603
    603         return ext4_bitmap_free_block(fs, inode_ref, fblock);
    604 
    605 }
    606 
     604        return ext4_balloc_free_block(fs, inode_ref, fblock);
     605
     606}
    607607
    608608/**
Note: See TracChangeset for help on using the changeset viewer.