Ignore:
File:
1 edited

Legend:

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

    rd579acc r38542dc  
    9191        block_t *bitmap_block;
    9292        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    93         if (rc != EOK) {
    94                 ext4_filesystem_put_block_group_ref(bg_ref);
    95                 return rc;
    96         }
     93        if (rc != EOK)
     94                return rc;
    9795       
    9896        /* Modify bitmap */
     
    132130       
    133131        /* Release block group reference */
    134         return ext4_filesystem_put_block_group_ref(bg_ref);
     132        rc = ext4_filesystem_put_block_group_ref(bg_ref);
     133        if (rc != EOK)
     134                return rc;
     135       
     136        return EOK;
    135137}
    136138
     
    171173        block_t *bitmap_block;
    172174        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    173         if (rc != EOK) {
    174                 ext4_filesystem_put_block_group_ref(bg_ref);
    175                 return rc;
    176         }
     175        if (rc != EOK)
     176                return rc;
    177177       
    178178        /* Modify bitmap */
     
    212212       
    213213        /* Release block group reference */
    214         return ext4_filesystem_put_block_group_ref(bg_ref);
     214        rc = ext4_filesystem_put_block_group_ref(bg_ref);
     215        if (rc != EOK)
     216                return rc;
     217       
     218        return EOK;
    215219}
    216220
     
    260264 *
    261265 */
    262 static int ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref, uint32_t *goal)
     266static uint32_t ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref)
    263267{
    264         *goal = 0;
     268        uint32_t goal = 0;
     269       
    265270        ext4_superblock_t *sb = inode_ref->fs->superblock;
    266271       
     
    275280        if (inode_block_count > 0) {
    276281                int rc = ext4_filesystem_get_inode_data_block_index(inode_ref,
    277                     inode_block_count - 1, goal);
     282                    inode_block_count - 1, &goal);
    278283                if (rc != EOK)
    279                         return rc;
     284                        return 0;
    280285               
    281286                if (goal != 0) {
    282                         (*goal)++;
    283                         return EOK;
     287                        goal++;
     288                        return goal;
    284289                }
    285290               
     
    297302            block_group, &bg_ref);
    298303        if (rc != EOK)
    299                 return rc;
     304                return 0;
    300305       
    301306        /* Compute indexes */
     
    322327                inode_table_blocks++;
    323328       
    324         *goal = inode_table_first_block + inode_table_blocks;
    325        
    326         return ext4_filesystem_put_block_group_ref(bg_ref);
     329        goal = inode_table_first_block + inode_table_blocks;
     330       
     331        ext4_filesystem_put_block_group_ref(bg_ref);
     332       
     333        return goal;
    327334}
    328335
     
    342349        block_t *bitmap_block;
    343350        uint32_t rel_block_idx = 0;
    344         uint32_t free_blocks;
    345         uint32_t goal;
    346351       
    347352        /* Find GOAL */
    348         int rc = ext4_balloc_find_goal(inode_ref, &goal);
    349         if (rc != EOK)
    350                 return rc;
    351 
     353        uint32_t goal = ext4_balloc_find_goal(inode_ref);
     354        if (goal == 0) {
     355                /* no goal found => partition is full */
     356                return ENOSPC;
     357        }
     358       
    352359        ext4_superblock_t *sb = inode_ref->fs->superblock;
    353360       
     
    359366        /* Load block group reference */
    360367        ext4_block_group_ref_t *bg_ref;
    361         rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,
     368        int rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,
    362369            block_group, &bg_ref);
    363370        if (rc != EOK)
    364371                return rc;
    365 
    366         free_blocks =
    367             ext4_block_group_get_free_blocks_count(bg_ref->block_group, sb);
    368         if (free_blocks == 0) {
    369                 /* This group has no free blocks */
    370                 goto goal_failed;
    371         }
    372372       
    373373        /* Compute indexes */
     
    467467       
    468468        /* No free block found yet */
    469         rc = block_put(bitmap_block);
    470         if (rc != EOK) {
    471                 ext4_filesystem_put_block_group_ref(bg_ref);
    472                 return rc;
    473         }
    474 
    475 goal_failed:
    476 
    477         rc = ext4_filesystem_put_block_group_ref(bg_ref);
    478         if (rc != EOK)
    479                 return rc;
     469        block_put(bitmap_block);
     470        ext4_filesystem_put_block_group_ref(bg_ref);
    480471       
    481472        /* Try other block groups */
     
    490481                if (rc != EOK)
    491482                        return rc;
    492 
    493                 free_blocks =
    494                      ext4_block_group_get_free_blocks_count(bg_ref->block_group, sb);
    495                 if (free_blocks == 0) {
    496                         /* This group has no free blocks */
    497                         goto next_group;
    498                 }
    499 
     483               
    500484                /* Load block with bitmap */
    501485                bitmap_block_addr =
     
    528512                        bitmap_block->dirty = true;
    529513                        rc = block_put(bitmap_block);
    530                         if (rc != EOK) {
    531                                 ext4_filesystem_put_block_group_ref(bg_ref);
     514                        if (rc != EOK)
    532515                                return rc;
    533                         }
    534516                       
    535517                        allocated_block =
     
    546528                        bitmap_block->dirty = true;
    547529                        rc = block_put(bitmap_block);
    548                         if (rc != EOK) {
    549                                 ext4_filesystem_put_block_group_ref(bg_ref);
     530                        if (rc != EOK)
    550531                                return rc;
    551                         }
    552532                       
    553533                        allocated_block =
     
    558538                }
    559539               
    560                 rc = block_put(bitmap_block);
    561                 if (rc != EOK) {
    562                         ext4_filesystem_put_block_group_ref(bg_ref);
    563                         return rc;
    564                 }
    565 
    566 next_group:
    567                 rc = ext4_filesystem_put_block_group_ref(bg_ref);
    568                 if (rc != EOK)
    569                         return rc;
     540                block_put(bitmap_block);
     541                ext4_filesystem_put_block_group_ref(bg_ref);
    570542               
    571543                /* Goto next group */
     
    602574        bg_ref->dirty = true;
    603575       
    604         rc = ext4_filesystem_put_block_group_ref(bg_ref);
     576        ext4_filesystem_put_block_group_ref(bg_ref);
    605577       
    606578        *fblock = allocated_block;
    607         return rc;
     579        return EOK;
    608580}
    609581
     
    620592    bool *free)
    621593{
    622         int rc;
     594        int rc = EOK;
    623595       
    624596        ext4_filesystem_t *fs = inode_ref->fs;
     
    641613        block_t *bitmap_block;
    642614        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    643         if (rc != EOK) {
    644                 ext4_filesystem_put_block_group_ref(bg_ref);
    645                 return rc;
    646         }
     615        if (rc != EOK)
     616                return rc;
    647617       
    648618        /* Check if block is free */
Note: See TracChangeset for help on using the changeset viewer.