Changeset d510ac01 in mainline


Ignore:
Timestamp:
2012-06-23T19:53:49Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
02020dc
Parents:
380553c
Message:

Fixed bug with different sizes in writing file on extents

Location:
uspace
Files:
4 edited

Legend:

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

    r380553c rd510ac01  
    742742                uint32_t iblock)
    743743{
    744         EXT4FS_DBG("iblock = \%u", iblock);
    745744
    746745        int rc;
     
    968967 */
    969968int ext4_extent_append_block(ext4_inode_ref_t *inode_ref,
    970                 uint32_t *iblock, uint32_t *fblock)
     969                uint32_t *iblock, uint32_t *fblock, bool update_size)
    971970{
    972971        int rc = EOK;
     
    10261025
    10271026                        /* Update i-node */
    1028                         ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
    1029                         inode_ref->dirty = true;
     1027                        if (update_size) {
     1028                                ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
     1029                                inode_ref->dirty = true;
     1030                        }
    10301031
    10311032                        path_ptr->block->dirty = true;
     
    10561057
    10571058                        /* Update i-node */
    1058                         ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
    1059                         inode_ref->dirty = true;
     1059                        if (update_size) {
     1060                                ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
     1061                                inode_ref->dirty = true;
     1062                        }
    10601063
    10611064                        path_ptr->block->dirty = true;
     
    10671070/* Append new extent to the tree */
    10681071append_extent:
    1069 
    1070         /* Append extent for new block (includes tree splitting if needed) */
    1071         rc = ext4_extent_append_extent(inode_ref, path, &path_ptr, new_block_idx);
    1072         if (rc != EOK) {
    1073                 goto finish;
    1074         }
    10751072
    10761073        phys_block = 0;
     
    10831080        }
    10841081
     1082        /* Append extent for new block (includes tree splitting if needed) */
     1083        rc = ext4_extent_append_extent(inode_ref, path, &path_ptr, new_block_idx);
     1084        if (rc != EOK) {
     1085                ext4_balloc_free_block(inode_ref, phys_block);
     1086                goto finish;
     1087        }
     1088
    10851089        /* Initialize newly created extent */
    10861090        ext4_extent_set_block_count(path_ptr->extent, 1);
     
    10891093
    10901094        /* Update i-node */
    1091         ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
    1092         inode_ref->dirty = true;
     1095        if (update_size) {
     1096                ext4_inode_set_size(inode_ref->inode, inode_size + block_size);
     1097                inode_ref->dirty = true;
     1098        }
    10931099
    10941100        path_ptr->block->dirty = true;
  • uspace/lib/ext4/libext4_extent.h

    r380553c rd510ac01  
    6464extern int ext4_extent_release_blocks_from(ext4_inode_ref_t *, uint32_t);
    6565
    66 extern int ext4_extent_append_block(ext4_inode_ref_t *, uint32_t *, uint32_t *);
     66extern int ext4_extent_append_block(ext4_inode_ref_t *, uint32_t *, uint32_t *, bool);
    6767
    6868#endif
  • uspace/lib/ext4/libext4_filesystem.c

    r380553c rd510ac01  
    11191119                        ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS)) {
    11201120
    1121                 return ext4_extent_append_block(inode_ref, iblock, fblock);
     1121                return ext4_extent_append_block(inode_ref, iblock, fblock, true);
    11221122
    11231123        }
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    r380553c rd510ac01  
    13441344                                (ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS))) {
    13451345
    1346                         uint32_t tmp_iblock = 0;
    1347                         do {
    1348                                 rc = ext4_filesystem_append_inode_block(inode_ref, &fblock, &tmp_iblock);
     1346                        uint32_t last_iblock = ext4_inode_get_size(fs->superblock, inode_ref->inode) / block_size;
     1347                        while (last_iblock < iblock) {
     1348                                rc = ext4_extent_append_block(inode_ref, &last_iblock, &fblock, true);
    13491349                                if (rc != EOK) {
    13501350                                        ext4fs_node_put(fn);
     
    13521352                                        return rc;
    13531353                                }
    1354                         } while (tmp_iblock < iblock);
     1354                        }
     1355
     1356                        rc = ext4_extent_append_block(inode_ref, &last_iblock, &fblock, false);
     1357                        if (rc != EOK) {
     1358                                ext4fs_node_put(fn);
     1359                                async_answer_0(callid, rc);
     1360                                return rc;
     1361                        }
    13551362
    13561363                } else {
Note: See TracChangeset for help on using the changeset viewer.