Changeset ae3d4f8 in mainline


Ignore:
Timestamp:
2011-11-20T08:35:56Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fe27eb4
Parents:
528e5b3
Message:

superblock update after block (de)allocation

Location:
uspace
Files:
6 edited

Legend:

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

    r528e5b3 rae3d4f8  
    117117        uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
    118118
     119        // Update superblock free blocks count
     120        uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(fs->superblock);
     121        sb_free_blocks--;
     122        ext4_superblock_set_free_blocks_count(fs->superblock, sb_free_blocks);
     123
     124        // Update inode blocks count
    119125        uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
    120126        ino_blocks -= block_size / EXT4_INODE_BLOCK_SIZE;
     
    122128        inode_ref->dirty = true;
    123129
     130        // Update block group free blocks count
    124131        uint32_t free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
    125132        free_blocks++;
    126133        ext4_block_group_set_free_blocks_count(bg_ref->block_group, free_blocks);
    127134        bg_ref->dirty = true;
    128 
    129         // TODO change free blocks count in superblock
    130135
    131136        rc = ext4_filesystem_put_block_group_ref(bg_ref);
     
    444449        uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
    445450
    446         // TODO decrement superblock free blocks count
    447         //uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb);
    448         //sb_free_blocks--;
    449         //ext4_superblock_set_free_blocks_count(sb, sb_free_blocks);
    450 
     451        // Update superblock free blocks count
     452        uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(fs->superblock);
     453        sb_free_blocks--;
     454        ext4_superblock_set_free_blocks_count(fs->superblock, sb_free_blocks);
     455
     456        // Update inode blocks (different block size!) count
    451457        uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
    452458        ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE;
     
    454460        inode_ref->dirty = true;
    455461
     462        // Update block group free blocks count
    456463        uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
    457464        bg_free_blocks--;
  • uspace/lib/ext4/libext4_filesystem.c

    r528e5b3 rae3d4f8  
    9494}
    9595
    96 void ext4_filesystem_fini(ext4_filesystem_t *fs)
    97 {
     96int ext4_filesystem_fini(ext4_filesystem_t *fs, bool write_sb)
     97{
     98        int rc = EOK;
     99        if (write_sb) {
     100                rc = ext4_superblock_write_direct(fs->device, fs->superblock);
     101        }
     102
    98103        free(fs->superblock);
    99104        block_fini(fs->device);
     105
     106        return rc;
    100107}
    101108
     
    464471                                EXT4FS_DBG("allocation error");
    465472                        }
    466                         EXT4FS_DBG("BBB: new addr \%u, offset = \%u, level = \%u", new_block_addr, offset_in_block, level);
     473//                      EXT4FS_DBG("BBB: new addr \%u, offset = \%u, level = \%u", new_block_addr, offset_in_block, level);
    467474
    468475                        rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
  • uspace/lib/ext4/libext4_filesystem.h

    r528e5b3 rae3d4f8  
    5151
    5252extern int ext4_filesystem_init(ext4_filesystem_t *, service_id_t);
    53 extern void ext4_filesystem_fini(ext4_filesystem_t *fs);
     53extern int ext4_filesystem_fini(ext4_filesystem_t *fs, bool);
    5454extern int ext4_filesystem_check_sanity(ext4_filesystem_t *fs);
    5555extern int ext4_filesystem_check_features(ext4_filesystem_t *, bool *);
  • uspace/lib/ext4/libext4_superblock.c

    r528e5b3 rae3d4f8  
    6565}
    6666
     67void ext4_superblock_set_free_blocks_count(ext4_superblock_t *sb, uint64_t count)
     68{
     69        sb->free_blocks_count_lo = host2uint32_t_le((count << 32) >> 32);
     70        sb->free_blocks_count_hi = host2uint32_t_le(count >> 32);
     71}
     72
    6773uint32_t ext4_superblock_get_free_inodes_count(ext4_superblock_t *sb)
    6874{
     
    268274        return EOK;
    269275}
     276
     277int ext4_superblock_write_direct(service_id_t service_id,
     278                ext4_superblock_t *sb)
     279{
     280        int rc;
     281        uint32_t phys_block_size;
     282        uint64_t first_block;
     283        uint32_t block_count;
     284
     285        rc = block_get_bsize(service_id, &phys_block_size);
     286        if (rc != EOK) {
     287                // TODO error
     288                return rc;
     289        }
     290
     291        first_block = EXT4_SUPERBLOCK_OFFSET / phys_block_size;
     292        block_count = EXT4_SUPERBLOCK_SIZE / phys_block_size;
     293
     294        if (EXT4_SUPERBLOCK_SIZE % phys_block_size) {
     295                block_count++;
     296        }
     297
     298        return block_write_direct(service_id, first_block, block_count, sb);
     299
     300}
     301
    270302
    271303int ext4_superblock_check_sanity(ext4_superblock_t *sb)
  • uspace/lib/ext4/libext4_superblock.h

    r528e5b3 rae3d4f8  
    205205extern uint64_t ext4_superblock_get_reserved_blocks_count(ext4_superblock_t *);
    206206extern uint64_t ext4_superblock_get_free_blocks_count(ext4_superblock_t *);
     207extern void ext4_superblock_set_free_blocks_count(ext4_superblock_t *, uint64_t);
    207208extern uint32_t ext4_superblock_get_free_inodes_count(ext4_superblock_t *);
    208209extern uint32_t ext4_superblock_get_first_data_block(ext4_superblock_t *);
     
    300301extern bool ext4_superblock_has_feature_read_only(ext4_superblock_t *, uint32_t);
    301302extern int ext4_superblock_read_direct(service_id_t, ext4_superblock_t **);
     303extern int ext4_superblock_write_direct(service_id_t, ext4_superblock_t *);
    302304extern int ext4_superblock_check_sanity(ext4_superblock_t *);
    303305
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    r528e5b3 rae3d4f8  
    611611        rc = ext4_filesystem_check_sanity(fs);
    612612        if (rc != EOK) {
    613                 ext4_filesystem_fini(fs);
     613                ext4_filesystem_fini(fs, false);
    614614                free(fs);
    615615                free(inst);
     
    620620        rc = ext4_filesystem_check_features(fs, &read_only);
    621621        if (rc != EOK) {
    622                 ext4_filesystem_fini(fs);
     622                ext4_filesystem_fini(fs, false);
    623623                free(fs);
    624624                free(inst);
     
    636636        rc = ext4fs_node_get_core(&root_node, inst, EXT4_INODE_ROOT_INDEX);
    637637        if (rc != EOK) {
    638                 ext4_filesystem_fini(fs);
     638                ext4_filesystem_fini(fs, false);
    639639                free(fs);
    640640                free(inst);
     
    683683        fibril_mutex_unlock(&open_nodes_lock);
    684684
    685         ext4_filesystem_fini(inst->filesystem);
    686 
    687         return EOK;
     685        return ext4_filesystem_fini(inst->filesystem, true);
    688686}
    689687
Note: See TracChangeset for help on using the changeset viewer.