Changeset 6088193 in mainline


Ignore:
Timestamp:
2011-11-10T19:59:51Z (13 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
27ca3a3
Parents:
b3d7277
Message:

bugfixes in indirect block writing

Location:
uspace
Files:
5 edited

Legend:

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

    rb3d7277 r6088193  
    9595}
    9696
    97 int ext4_bitmap_free_block(ext4_filesystem_t *fs, uint32_t block_index)
     97int ext4_bitmap_free_block(ext4_filesystem_t *fs, ext4_inode_ref_t *inode_ref, uint32_t block_index)
    9898{
    9999        int rc;
     
    102102        uint32_t index_in_group;
    103103        uint32_t bitmap_block;
     104        uint32_t block_size;
    104105        ext4_block_group_ref_t *bg_ref;
    105106        block_t *block;
     107
     108        block_size = ext4_superblock_get_block_size(fs->superblock);
    106109
    107110        blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock);
     
    128131                return rc;
    129132        }
     133
     134        uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
     135        ino_blocks -= block_size / EXT4_INODE_BLOCK_SIZE;
     136        ext4_inode_set_blocks_count(fs->superblock, inode_ref->inode, ino_blocks);
     137        inode_ref->dirty = true;
    130138
    131139        uint32_t free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
     
    138146        rc = ext4_filesystem_put_block_group_ref(bg_ref);
    139147        if (rc != EOK) {
     148                EXT4FS_DBG("error in saving bg_ref \%d", rc);
    140149                // TODO error
    141150                return rc;
    142151        }
    143152
    144         EXT4FS_DBG("block \%u released", block_index);
     153//      EXT4FS_DBG("block \%u released", block_index);
    145154
    146155        return EOK;
     
    177186        rc = ext4_bitmap_find_free_bit_and_set(block->data, &rel_block_idx, block_size);
    178187        if (rc != EOK) {
    179                 EXT4FS_DBG("no block found");
    180                 // TODO if ENOSPC - try next block group - try next block groups
     188                EXT4FS_DBG("no free block found");
     189                // TODO if ENOSPC - try next block groups
    181190        }
    182191
    183192        block->dirty = true;
    184193
    185         // TODO check retval
    186         block_put(block);
     194        rc = block_put(block);
     195        if (rc != EOK) {
     196                // TODO error
     197                EXT4FS_DBG("error in saving bitmap \%d", rc);
     198        }
    187199
    188200        // TODO decrement superblock free blocks count
     
    191203        //ext4_superblock_set_free_blocks_count(sb, sb_free_blocks);
    192204
     205        uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
     206        ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE;
     207        ext4_inode_set_blocks_count(fs->superblock, inode_ref->inode, ino_blocks);
     208        inode_ref->dirty = true;
     209
    193210        uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
    194211        bg_free_blocks--;
     
    200217        blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock);
    201218
    202         EXT4FS_DBG("block \%u allocated", blocks_per_group * block_group + rel_block_idx + 1);
     219//      EXT4FS_DBG("block \%u allocated", blocks_per_group * block_group + rel_block_idx + 1);
    203220
    204221        *fblock = blocks_per_group * block_group + rel_block_idx + 1;
  • uspace/lib/ext4/libext4_bitmap.h

    rb3d7277 r6088193  
    3737#include "libext4_filesystem.h"
    3838
    39 extern int ext4_bitmap_free_block(ext4_filesystem_t *, uint32_t);
     39extern int ext4_bitmap_free_block(ext4_filesystem_t *,
     40                ext4_inode_ref_t *, uint32_t);
    4041extern int ext4_bitmap_alloc_block(ext4_filesystem_t *,
    4142                ext4_inode_ref_t *, uint32_t *);
  • uspace/lib/ext4/libext4_filesystem.c

    rb3d7277 r6088193  
    8282        fs->inode_blocks_per_level[0] = 1;
    8383        for (i = 1; i < 4; i++) {
    84                 fs->inode_blocks_per_level[i]  = fs->inode_blocks_per_level[i-1] *
     84                fs->inode_blocks_per_level[i] = fs->inode_blocks_per_level[i-1] *
    8585                    block_ids_per_block;
    8686                fs->inode_block_limits[i] = fs->inode_block_limits[i-1] +
     
    321321        offset_in_block = block_offset_in_level / fs->inode_blocks_per_level[level-1];
    322322
     323        if (current_block == 0) {
     324                *fblock = 0;
     325                return EOK;
     326        }
     327
    323328        /* Navigate through other levels, until we find the block number
    324329         * or find null reference meaning we are dealing with sparse file
     
    415420                if (rc != EOK) {
    416421                        // TODO error
    417                 }
    418                 EXT4FS_DBG("AAA: new addr \%u, level = \%u", new_block_addr, level);
     422                        EXT4FS_DBG("error in allocation");
     423                }
     424//              EXT4FS_DBG("AAA: new addr \%u, level = \%u", new_block_addr, level);
    419425
    420426                ext4_inode_set_indirect_block(inode_ref->inode, level - 1, new_block_addr);
     
    435441                        EXT4FS_DBG("block put error");
    436442                }
     443
     444//              EXT4FS_DBG("allocated indirect block for level \%u, during setting iblock \%u", level, (uint32_t)iblock);
    437445
    438446                current_block = new_block_addr;
     
    462470                                if (rc != EOK) {
    463471                                        // TODO error
     472
     473                                        EXT4FS_DBG("BBB: error block loading");
     474
    464475                                }
    465476                                memset(new_block->data, 0, block_size);
     
    524535
    525536                ext4_inode_set_direct_block(inode, iblock, 0);
    526                 return ext4_bitmap_free_block(fs, fblock);
     537                return ext4_bitmap_free_block(fs, inode_ref, fblock);
    527538        }
    528539
     
    588599        }
    589600
    590         return ext4_bitmap_free_block(fs, fblock);
     601        return ext4_bitmap_free_block(fs, inode_ref, fblock);
    591602
    592603}
  • uspace/lib/ext4/libext4_inode.h

    rb3d7277 r6088193  
    3939#include "libext4_superblock.h"
    4040
     41#define EXT4_INODE_BLOCK_SIZE                           512
    4142
    4243#define EXT4_INODE_DIRECT_BLOCK_COUNT           12
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    rb3d7277 r6088193  
    935935        rc = ext4fs_node_get(&fn, service_id, index);
    936936        if (rc != EOK) {
     937                EXT4FS_DBG("node get error");
    937938                return rc;
    938939        }
     
    942943                ext4fs_node_put(fn);
    943944                async_answer_0(callid, rc);
     945                EXT4FS_DBG("data write recv");
    944946                return rc;
    945947        }
     
    962964
    963965        rc = ext4_filesystem_get_inode_data_block_index(fs, inode_ref->inode, iblock, &fblock);
     966        if (rc != EOK) {
     967                // TODO error
     968                ext4fs_node_put(fn);
     969                EXT4FS_DBG("error loading block addr");
     970                return rc;
     971        }
    964972
    965973        if (fblock == 0) {
     974
    966975                rc =  ext4_bitmap_alloc_block(fs, inode_ref, &fblock);
    967976                if (rc != EOK) {
     977                        EXT4FS_DBG("allocation failed");
    968978                        ext4fs_node_put(fn);
    969979                        async_answer_0(callid, rc);
     
    980990        rc = block_get(&write_block, service_id, fblock, flags);
    981991        if (rc != EOK) {
     992                EXT4FS_DBG("error in loading block \%d", rc);
    982993                ext4fs_node_put(fn);
    983994                async_answer_0(callid, rc);
     
    9991010        rc = block_put(write_block);
    10001011        if (rc != EOK) {
     1012                EXT4FS_DBG("error in writing block \%d", rc);
    10011013                ext4fs_node_put(fn);
    10021014                return rc;
     
    10191031ext4fs_truncate(service_id_t service_id, fs_index_t index, aoff64_t new_size)
    10201032{
    1021         EXT4FS_DBG("");
    10221033        fs_node_t *fn;
    10231034        ext4fs_node_t *enode;
     
    11121123static int ext4fs_sync(service_id_t service_id, fs_index_t index)
    11131124{
    1114         EXT4FS_DBG("");
    1115 
    11161125        int rc;
    11171126        fs_node_t *fn;
Note: See TracChangeset for help on using the changeset viewer.