- Add missing locking around s_next_generation increment - Correctly set the initial value of s_next_generation. fs/ext3/ialloc.c | 6 ++++-- fs/ext3/super.c | 3 +++ include/linux/ext3_fs_sb.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff -puN fs/ext3/ialloc.c~ext3-s_next_generation-fix fs/ext3/ialloc.c --- 25/fs/ext3/ialloc.c~ext3-s_next_generation-fix 2004-01-03 15:16:31.000000000 -0800 +++ 25-akpm/fs/ext3/ialloc.c 2004-01-03 15:16:31.000000000 -0800 @@ -446,8 +446,8 @@ struct inode *ext3_new_inode(handle_t *h return ERR_PTR(-ENOMEM); ei = EXT3_I(inode); - es = EXT3_SB(sb)->s_es; sbi = EXT3_SB(sb); + es = sbi->s_es; if (S_ISDIR(mode)) { if (test_opt (sb, OLDALLOC)) group = find_group_dir(sb, dir); @@ -591,7 +591,9 @@ got: if (IS_DIRSYNC(inode)) handle->h_sync = 1; insert_inode_hash(inode); - inode->i_generation = EXT3_SB(sb)->s_next_generation++; + spin_lock(&sbi->s_next_gen_lock); + inode->i_generation = sbi->s_next_generation++; + spin_unlock(&sbi->s_next_gen_lock); ei->i_state = EXT3_STATE_NEW; diff -puN include/linux/ext3_fs_sb.h~ext3-s_next_generation-fix include/linux/ext3_fs_sb.h --- 25/include/linux/ext3_fs_sb.h~ext3-s_next_generation-fix 2004-01-03 15:16:31.000000000 -0800 +++ 25-akpm/include/linux/ext3_fs_sb.h 2004-01-03 15:16:31.000000000 -0800 @@ -49,6 +49,7 @@ struct ext3_sb_info { int s_desc_per_block_bits; int s_inode_size; int s_first_ino; + spinlock_t s_next_gen_lock; u32 s_next_generation; u32 s_hash_seed[4]; int s_def_hash_version; diff -puN fs/ext3/super.c~ext3-s_next_generation-fix fs/ext3/super.c --- 25/fs/ext3/super.c~ext3-s_next_generation-fix 2004-01-03 15:16:31.000000000 -0800 +++ 25-akpm/fs/ext3/super.c 2004-01-03 15:41:02.000000000 -0800 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "xattr.h" #include "acl.h" @@ -1287,6 +1288,8 @@ static int ext3_fill_super (struct super goto failed_mount2; } sbi->s_gdb_count = db_count; + get_random_bytes(&sbi->s_next_generation, sizeof(u32)); + spin_lock_init(&sbi->s_next_gen_lock); /* * set up enough so that it can read an inode */ _