- 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 <linux/smp_lock.h>
 #include <linux/buffer_head.h>
 #include <linux/vfs.h>
+#include <linux/random.h>
 #include <asm/uaccess.h>
 #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
 	 */

_