lkml.org 
[lkml]   [2013]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 51/75] ext4: make sure group number is bumped after a inode allocation race
    Date
    3.5.7.19 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Theodore Ts'o <tytso@mit.edu>

    commit a34eb503742fd25155fd6cff6163daacead9fbc3 upstream.

    When we try to allocate an inode, and there is a race between two
    CPU's trying to grab the same inode, _and_ this inode is the last free
    inode in the block group, make sure the group number is bumped before
    we continue searching the rest of the block groups. Otherwise, we end
    up searching the current block group twice, and we end up skipping
    searching the last block group. So in the unlikely situation where
    almost all of the inodes are allocated, it's possible that we will
    return ENOSPC even though there might be free inodes in that last
    block group.

    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    fs/ext4/ialloc.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
    index b1919af..fa068c0 100644
    --- a/fs/ext4/ialloc.c
    +++ b/fs/ext4/ialloc.c
    @@ -707,11 +707,8 @@ repeat_in_this_group:
    ino = ext4_find_next_zero_bit((unsigned long *)
    inode_bitmap_bh->b_data,
    EXT4_INODES_PER_GROUP(sb), ino);
    - if (ino >= EXT4_INODES_PER_GROUP(sb)) {
    - if (++group == ngroups)
    - group = 0;
    - continue;
    - }
    + if (ino >= EXT4_INODES_PER_GROUP(sb))
    + goto next_group;
    if (group == 0 && (ino+1) < EXT4_FIRST_INO(sb)) {
    ext4_error(sb, "reserved inode found cleared - "
    "inode=%lu", ino + 1);
    @@ -729,6 +726,9 @@ repeat_in_this_group:
    goto got; /* we grabbed the inode! */
    if (ino < EXT4_INODES_PER_GROUP(sb))
    goto repeat_in_this_group;
    +next_group:
    + if (++group == ngroups)
    + group = 0;
    }
    err = -ENOSPC;
    goto out;
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2013-08-15 22:01    [W:4.531 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site