Changeset 4d7bf35 in mainline for uspace/lib/ext4/src/ialloc.c


Ignore:
Timestamp:
2018-12-13T09:06:52Z (5 years ago)
Author:
Maurizio Lombardi <mlombard@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
91fcbabc
Parents:
91fc2dae
git-author:
Maurizio Lombardi <mlombard@…> (2018-12-12 17:31:56)
git-committer:
Maurizio Lombardi <mlombard@…> (2018-12-13 09:06:52)
Message:

libext4: fix ext4_ialloc_alloc_inode() to be less picky

If can't find an ideal candidate, restart the search and pick the first
block group with free_block > 0 before giving up with ENOSPC.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ext4/src/ialloc.c

    r91fc2dae r4d7bf35  
    176176errno_t ext4_ialloc_alloc_inode(ext4_filesystem_t *fs, uint32_t *index, bool is_dir)
    177177{
     178        int pick_first_free = 0;
    178179        ext4_superblock_t *sb = fs->superblock;
    179 
    180         uint32_t bgid = 0;
    181         uint32_t bg_count = ext4_superblock_get_block_group_count(sb);
    182         uint32_t sb_free_inodes = ext4_superblock_get_free_inodes_count(sb);
    183         uint32_t avg_free_inodes = sb_free_inodes / bg_count;
     180        uint32_t bgid;
     181        uint32_t sb_free_inodes;
     182        uint32_t avg_free_inodes;
     183        uint32_t const bg_count = ext4_superblock_get_block_group_count(sb);
     184
     185retry:
     186
     187        bgid = 0;
     188        sb_free_inodes = ext4_superblock_get_free_inodes_count(sb);
     189        avg_free_inodes = sb_free_inodes / bg_count;
    184190
    185191        /* Try to find free i-node in all block groups */
     
    210216                 * blocks.
    211217                 */
    212                 if (((free_inodes >= avg_free_inodes) || (bgid == bg_count - 1)) &&
    213                     (free_blocks > 0)) {
     218                if (((free_inodes >= avg_free_inodes) || (bgid == bg_count - 1)
     219                    || pick_first_free) && (free_blocks > 0)) {
    214220                        /* Load block with bitmap */
    215221                        uint32_t bitmap_block_addr = ext4_block_group_get_inode_bitmap(
     
    307313        }
    308314
     315        /* Try again with less strict conditions */
     316        if (pick_first_free == 0) {
     317                pick_first_free = 1;
     318                goto retry;
     319        }
     320
    309321        return ENOSPC;
    310322}
Note: See TracChangeset for help on using the changeset viewer.