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@xxxxxxx> 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@xxxxxxx> 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-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html