[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090216190001.GB11788@mini-me.lan>
Date: Mon, 16 Feb 2009 14:00:01 -0500
From: Theodore Tso <tytso@....edu>
To: Andres Freund <andres@...razel.de>,
Alex Buell <alex.buell@...ted.org.uk>
Cc: adilger@....com, LKML <linux-kernel@...r.kernel.org>,
linux-ext4@...r.kernel.org,
Jonathan Bastien-Filiatrault <joe@....org>,
"Aneesh Kumar K.V" <aneesh.kumar@...ux.vnet.ibm.com>
Subject: Re: 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@....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@....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;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists