lkml.org 
[lkml]   [2009]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: EXT4 ENOSPC Bug
    On Mon, Feb 16, 2009 at 04:27:03PM +0100, Andres Freund wrote:
    >
    > So, yes, seems to be an inode allocation problem.
    >

    Andres, Alex, others,

    I'm pretty sure the ENOSPC problem which you both found is an inode
    allocation problem. Some of you seem to have an easier time
    reproducing it than others; could you try this patch, and periodically
    scan your system logs for the message "ext4: find_group_flex failed,
    fallback succeeded"? If the problem goes away for you, and you find
    the occasional aforemention message in your system log, that will
    confirm what I suspect, which is the bug is in fs/ext4/inode.c's
    find_group_flex() function. (If I'm wrong, the fallback code will
    activate only when the filesystem is genuinely out of inodes, which
    should be very rare.)

    More comments are in the patch header. My current long-term plan for
    dealing with this is to enhance find_group_orlov() to and
    find_group_other() to understand about flex_bg's.

    - Ted

    commit 1012e25b371b203164e4766a98f1e696df68b56d
    Author: Theodore Ts'o <tytso@mit.edu>
    Date: Mon Feb 16 13:51:16 2009 -0500

    ext4: Add fallback for find_group_flex

    This is a workaround for find_group_flex() which badly needs to be
    replaced. One of its problems (besides ignoring the Orlov algorithm)
    is that it is a bit hyperactive about returning failure under
    suspicious circumstances. This can lead to spurious ENOSPC failures.
    Work around this for now by retrying the search using
    find_group_other() if find_group_flex() returns -1. If
    find_group_other() succeeds when find_group_flex(), log a warning
    message. I can't quite find the motivation to spend effort working on
    fixing find_group_flex() given that I want to replace it all anyway
    (and in fact work on the replacement code is underway), so we may
    leave the workaround for as long as find_group_flex() stays in the
    kernel...

    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

    diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
    index a200059..21080ab 100644
    --- a/fs/ext4/ialloc.c
    +++ b/fs/ext4/ialloc.c
    @@ -715,6 +715,13 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode)

    if (sbi->s_log_groups_per_flex) {
    ret2 = find_group_flex(sb, dir, &group);
    + if (ret2 == -1) {
    + ret2 = find_group_other(sb, dir, &group);
    + if (ret2 == 0)
    + printk(KERN_NOTICE "ext4: find_group_flex "
    + "failed, fallback succeeded dir %lu\n",
    + dir->i_ino);
    + }
    goto got_group;
    }


    \
     
     \ /
      Last update: 2009-02-18 12:23    [W:3.568 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site