Ignore:
File:
1 edited

Legend:

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

    r38542dc r8a45707d  
    195195                uint32_t used_dirs = ext4_block_group_get_used_dirs_count(bg, sb);
    196196               
    197                 /* Check if this block group is good candidate for allocation */
    198                 if ((free_inodes >= avg_free_inodes) && (free_blocks > 0)) {
     197                /*
     198                 * Check if this block group is a good candidate
     199                 * for allocation.
     200                 *
     201                 * The criterion is based on the average number
     202                 * of free inodes, unless we examine the last block
     203                 * group. In that case the last block group might
     204                 * have less than the average number of free inodes,
     205                 * but it still needs to be taken as a candidate
     206                 * because the previous block groups have zero free
     207                 * blocks.
     208                 */
     209                if (((free_inodes >= avg_free_inodes) || (bgid == bg_count - 1)) &&
     210                    (free_blocks > 0)) {
    199211                        /* Load block with bitmap */
    200212                        uint32_t bitmap_block_addr = ext4_block_group_get_inode_bitmap(
     
    204216                        rc = block_get(&bitmap_block, fs->device, bitmap_block_addr,
    205217                            BLOCK_FLAGS_NONE);
    206                         if (rc != EOK)
     218                        if (rc != EOK) {
     219                                ext4_filesystem_put_block_group_ref(bg_ref);
    207220                                return rc;
     221                        }
    208222                       
    209223                        /* Try to allocate i-node in the bitmap */
     
    215229                        /* Block group has not any free i-node */
    216230                        if (rc == ENOSPC) {
    217                                 block_put(bitmap_block);
    218                                 ext4_filesystem_put_block_group_ref(bg_ref);
     231                                rc = block_put(bitmap_block);
     232                                if (rc != EOK) {
     233                                        ext4_filesystem_put_block_group_ref(bg_ref);
     234                                        return rc;
     235                                }
     236
     237                                rc = ext4_filesystem_put_block_group_ref(bg_ref);
     238                                if (rc != EOK)
     239                                        return rc;
     240
     241                                bgid++;
    219242                                continue;
    220243                        }
     
    224247                       
    225248                        rc = block_put(bitmap_block);
    226                         if (rc != EOK)
     249                        if (rc != EOK) {
     250                                ext4_filesystem_put_block_group_ref(bg_ref);
    227251                                return rc;
     252                        }
    228253                       
    229254                        /* Modify filesystem counters */
     
    272297               
    273298                /* Block group not modified, put it and jump to the next block group */
    274                 ext4_filesystem_put_block_group_ref(bg_ref);
     299                rc = ext4_filesystem_put_block_group_ref(bg_ref);
     300                if (rc != EOK)
     301                        return rc;
     302
    275303                ++bgid;
    276304        }
Note: See TracChangeset for help on using the changeset viewer.