Ignore:
File:
1 edited

Legend:

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

    r38542dc rd579acc  
    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 free_blocks;
     345        uint32_t goal;
    351346       
    352347        /* Find GOAL */
    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        
     348        int rc = ext4_balloc_find_goal(inode_ref, &goal);
     349        if (rc != EOK)
     350                return rc;
     351
    359352        ext4_superblock_t *sb = inode_ref->fs->superblock;
    360353       
     
    366359        /* Load block group reference */
    367360        ext4_block_group_ref_t *bg_ref;
    368         int rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,
     361        rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,
    369362            block_group, &bg_ref);
    370363        if (rc != EOK)
    371364                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         block_put(bitmap_block);
    470         ext4_filesystem_put_block_group_ref(bg_ref);
     469        rc = block_put(bitmap_block);
     470        if (rc != EOK) {
     471                ext4_filesystem_put_block_group_ref(bg_ref);
     472                return rc;
     473        }
     474
     475goal_failed:
     476
     477        rc = ext4_filesystem_put_block_group_ref(bg_ref);
     478        if (rc != EOK)
     479                return rc;
    471480       
    472481        /* Try other block groups */
     
    481490                if (rc != EOK)
    482491                        return rc;
    483                
     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
    484500                /* Load block with bitmap */
    485501                bitmap_block_addr =
     
    512528                        bitmap_block->dirty = true;
    513529                        rc = block_put(bitmap_block);
    514                         if (rc != EOK)
     530                        if (rc != EOK) {
     531                                ext4_filesystem_put_block_group_ref(bg_ref);
    515532                                return rc;
     533                        }
    516534                       
    517535                        allocated_block =
     
    528546                        bitmap_block->dirty = true;
    529547                        rc = block_put(bitmap_block);
    530                         if (rc != EOK)
     548                        if (rc != EOK) {
     549                                ext4_filesystem_put_block_group_ref(bg_ref);
    531550                                return rc;
     551                        }
    532552                       
    533553                        allocated_block =
     
    538558                }
    539559               
    540                 block_put(bitmap_block);
    541                 ext4_filesystem_put_block_group_ref(bg_ref);
     560                rc = block_put(bitmap_block);
     561                if (rc != EOK) {
     562                        ext4_filesystem_put_block_group_ref(bg_ref);
     563                        return rc;
     564                }
     565
     566next_group:
     567                rc = ext4_filesystem_put_block_group_ref(bg_ref);
     568                if (rc != EOK)
     569                        return rc;
    542570               
    543571                /* Goto next group */
     
    574602        bg_ref->dirty = true;
    575603       
    576         ext4_filesystem_put_block_group_ref(bg_ref);
     604        rc = ext4_filesystem_put_block_group_ref(bg_ref);
    577605       
    578606        *fblock = allocated_block;
    579         return EOK;
     607        return rc;
    580608}
    581609
     
    592620    bool *free)
    593621{
    594         int rc = EOK;
     622        int rc;
    595623       
    596624        ext4_filesystem_t *fs = inode_ref->fs;
     
    613641        block_t *bitmap_block;
    614642        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);
    615         if (rc != EOK)
    616                 return rc;
     643        if (rc != EOK) {
     644                ext4_filesystem_put_block_group_ref(bg_ref);
     645                return rc;
     646        }
    617647       
    618648        /* Check if block is free */
Note: See TracChangeset for help on using the changeset viewer.