Changeset cf982ff in mainline for uspace/lib/ext4/libext4_balloc.c


Ignore:
Timestamp:
2014-01-28T21:08:38Z (10 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0dd022ec
Parents:
476f62c (diff), 5828554 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge libext4 fixes

File:
1 edited

Legend:

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

    r476f62c rcf982ff  
    9191        block_t *bitmap_block;
    9292        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    93         if (rc != EOK)
    94                 return rc;
     93        if (rc != EOK) {
     94                ext4_filesystem_put_block_group_ref(bg_ref);
     95                return rc;
     96        }
    9597       
    9698        /* Modify bitmap */
     
    130132       
    131133        /* Release block group reference */
    132         rc = ext4_filesystem_put_block_group_ref(bg_ref);
    133         if (rc != EOK)
    134                 return rc;
    135        
    136         return EOK;
     134        return ext4_filesystem_put_block_group_ref(bg_ref);
    137135}
    138136
     
    173171        block_t *bitmap_block;
    174172        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    175         if (rc != EOK)
    176                 return rc;
     173        if (rc != EOK) {
     174                ext4_filesystem_put_block_group_ref(bg_ref);
     175                return rc;
     176        }
    177177       
    178178        /* Modify bitmap */
     
    212212       
    213213        /* Release block group reference */
    214         rc = ext4_filesystem_put_block_group_ref(bg_ref);
    215         if (rc != EOK)
    216                 return rc;
    217        
    218         return EOK;
     214        return ext4_filesystem_put_block_group_ref(bg_ref);
    219215}
    220216
     
    264260 *
    265261 */
    266 static uint32_t ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref)
     262static int ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref, uint32_t *goal)
    267263{
    268         uint32_t goal = 0;
    269        
     264        *goal = 0;
    270265        ext4_superblock_t *sb = inode_ref->fs->superblock;
    271266       
     
    280275        if (inode_block_count > 0) {
    281276                int rc = ext4_filesystem_get_inode_data_block_index(inode_ref,
    282                     inode_block_count - 1, &goal);
     277                    inode_block_count - 1, goal);
    283278                if (rc != EOK)
    284                         return 0;
     279                        return rc;
    285280               
    286281                if (goal != 0) {
    287                         goal++;
    288                         return goal;
     282                        (*goal)++;
     283                        return EOK;
    289284                }
    290285               
     
    302297            block_group, &bg_ref);
    303298        if (rc != EOK)
    304                 return 0;
     299                return rc;
    305300       
    306301        /* Compute indexes */
     
    327322                inode_table_blocks++;
    328323       
    329         goal = inode_table_first_block + inode_table_blocks;
    330        
    331         ext4_filesystem_put_block_group_ref(bg_ref);
    332        
    333         return goal;
     324        *goal = inode_table_first_block + inode_table_blocks;
     325       
     326        return ext4_filesystem_put_block_group_ref(bg_ref);
    334327}
    335328
     
    349342        block_t *bitmap_block;
    350343        uint32_t rel_block_idx = 0;
     344        uint32_t goal;
    351345       
    352346        /* Find GOAL */
    353         uint32_t goal = ext4_balloc_find_goal(inode_ref);
    354         if (goal == 0) {
     347        int rc = ext4_balloc_find_goal(inode_ref, &goal);
     348        if (rc != EOK)
     349                return rc;
     350        else if (goal == 0) {
    355351                /* no goal found => partition is full */
    356                 return ENOSPC;
     352                return ENOMEM;
    357353        }
    358354       
     
    366362        /* Load block group reference */
    367363        ext4_block_group_ref_t *bg_ref;
    368         int rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,
     364        rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,
    369365            block_group, &bg_ref);
    370366        if (rc != EOK)
     
    467463       
    468464        /* No free block found yet */
    469         block_put(bitmap_block);
    470         ext4_filesystem_put_block_group_ref(bg_ref);
     465        rc = block_put(bitmap_block);
     466        if (rc != EOK) {
     467                ext4_filesystem_put_block_group_ref(bg_ref);
     468                return rc;
     469        }
     470
     471        rc = ext4_filesystem_put_block_group_ref(bg_ref);
     472        if (rc != EOK)
     473                return rc;
    471474       
    472475        /* Try other block groups */
     
    512515                        bitmap_block->dirty = true;
    513516                        rc = block_put(bitmap_block);
    514                         if (rc != EOK)
     517                        if (rc != EOK) {
     518                                ext4_filesystem_put_block_group_ref(bg_ref);
    515519                                return rc;
     520                        }
    516521                       
    517522                        allocated_block =
     
    528533                        bitmap_block->dirty = true;
    529534                        rc = block_put(bitmap_block);
    530                         if (rc != EOK)
     535                        if (rc != EOK) {
     536                                ext4_filesystem_put_block_group_ref(bg_ref);
    531537                                return rc;
     538                        }
    532539                       
    533540                        allocated_block =
     
    538545                }
    539546               
    540                 block_put(bitmap_block);
    541                 ext4_filesystem_put_block_group_ref(bg_ref);
     547                rc = block_put(bitmap_block);
     548                if (rc != EOK) {
     549                        ext4_filesystem_put_block_group_ref(bg_ref);
     550                        return rc;
     551                }
     552
     553                rc = ext4_filesystem_put_block_group_ref(bg_ref);
     554                if (rc != EOK)
     555                        return rc;
    542556               
    543557                /* Goto next group */
     
    574588        bg_ref->dirty = true;
    575589       
    576         ext4_filesystem_put_block_group_ref(bg_ref);
     590        rc = ext4_filesystem_put_block_group_ref(bg_ref);
    577591       
    578592        *fblock = allocated_block;
    579         return EOK;
     593        return rc;
    580594}
    581595
     
    592606    bool *free)
    593607{
    594         int rc = EOK;
     608        int rc;
    595609       
    596610        ext4_filesystem_t *fs = inode_ref->fs;
     
    613627        block_t *bitmap_block;
    614628        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    615         if (rc != EOK)
    616                 return rc;
     629        if (rc != EOK) {
     630                ext4_filesystem_put_block_group_ref(bg_ref);
     631                return rc;
     632        }
    617633       
    618634        /* Check if block is free */
Note: See TracChangeset for help on using the changeset viewer.