mke2fs.c (main): Enable directory indexing by default.

tune2fs.c (update_feature_set): Allow directory indexing flag to
	be set.  If so, set the default hash to be TEA, and
	initialize the hash seed to a random value.

diff --git a/misc/ChangeLog b/misc/ChangeLog
index c467f37..ed5e105 100644
--- a/misc/ChangeLog
+++ b/misc/ChangeLog
@@ -1,3 +1,11 @@
+2002-09-22  root  <tytso@mit.edu>
+
+	* mke2fs.c (main): Enable directory indexing by default.
+
+	* tune2fs.c (update_feature_set): Allow directory indexing flag to
+		be set.  If so, set the default hash to be TEA, and
+		initialize the hash seed to a random value.
+
 2002-09-21  Theodore Ts'o  <tytso@mit.edu>
 
 	* get_device_by_label.c (init_lvm): Fix bug which caused
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index 0f5f1e0..c37eecc 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -777,7 +777,8 @@
 }	
 
 static __u32 ok_features[3] = {
-	EXT3_FEATURE_COMPAT_HAS_JOURNAL,	/* Compat */
+	EXT3_FEATURE_COMPAT_HAS_JOURNAL |
+		EXT2_FEATURE_COMPAT_DIR_INDEX,	/* Compat */
 	EXT2_FEATURE_INCOMPAT_FILETYPE|		/* Incompat */
 		EXT3_FEATURE_INCOMPAT_JOURNAL_DEV,
 	EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER	/* R/O compat */
@@ -841,7 +842,8 @@
 	param.s_rev_level = 1;  /* Create revision 1 filesystems now */
 	param.s_feature_incompat |= EXT2_FEATURE_INCOMPAT_FILETYPE;
 	param.s_feature_ro_compat |= EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER;
-		
+	param.s_feature_compat |= EXT2_FEATURE_COMPAT_DIR_INDEX;
+
 #ifdef __linux__
 	if (uname(&ut)) {
 		perror("uname");
@@ -1242,6 +1244,12 @@
 	uuid_generate(fs->super->s_uuid);
 
 	/*
+	 * Initialize the directory index variables
+	 */
+	fs->super->s_def_hash_version = EXT2_HASH_TEA;
+	uuid_generate((unsigned char *) fs->super->s_hash_seed);
+
+	/*
 	 * Add "jitter" to the superblock's check interval so that we
 	 * don't check all the filesystems at the same time.  We use a
 	 * kludgy hack of using the UUID to derive a random jitter value.
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index a644bb4..9a8801b 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -87,7 +87,8 @@
 }
 
 static __u32 ok_features[3] = {
-	EXT3_FEATURE_COMPAT_HAS_JOURNAL,	/* Compat */
+	EXT3_FEATURE_COMPAT_HAS_JOURNAL |
+		EXT2_FEATURE_COMPAT_DIR_INDEX,	/* Compat */
 	EXT2_FEATURE_INCOMPAT_FILETYPE,		/* Incompat */
 	EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER	/* R/O compat */
 };
@@ -251,7 +252,7 @@
 static void update_feature_set(ext2_filsys fs, char *features)
 {
 	int sparse, old_sparse, filetype, old_filetype;
-	int journal, old_journal;
+	int journal, old_journal, dxdir, old_dxdir;
 	struct ext2_super_block *sb= fs->super;
 
 	old_sparse = sb->s_feature_ro_compat &
@@ -260,6 +261,8 @@
 		EXT2_FEATURE_INCOMPAT_FILETYPE;
 	old_journal = sb->s_feature_compat &
 		EXT3_FEATURE_COMPAT_HAS_JOURNAL;
+	old_dxdir = sb->s_feature_compat &
+		EXT2_FEATURE_COMPAT_DIR_INDEX;
 	if (e2p_edit_feature(features, &sb->s_feature_compat,
 			     ok_features)) {
 		fprintf(stderr, _("Invalid filesystem option set: %s\n"),
@@ -272,6 +275,8 @@
 		EXT2_FEATURE_INCOMPAT_FILETYPE;
 	journal = sb->s_feature_compat &
 		EXT3_FEATURE_COMPAT_HAS_JOURNAL;
+	dxdir = sb->s_feature_compat &
+		EXT2_FEATURE_COMPAT_DIR_INDEX;
 	if (old_journal && !journal) {
 		if ((mount_flags & EXT2_MF_MOUNTED) &&
 		    !(mount_flags & EXT2_MF_READONLY)) {
@@ -308,6 +313,12 @@
 			journal_size = -1;
 		sb->s_feature_compat &= ~EXT3_FEATURE_COMPAT_HAS_JOURNAL;
 	}
+	if (dxdir && !old_dxdir) {
+		if (!sb->s_def_hash_version)
+			sb->s_def_hash_version = EXT2_HASH_TEA;
+		if (uuid_is_null((unsigned char *) sb->s_hash_seed))
+			uuid_generate((unsigned char *) sb->s_hash_seed);
+	}
 
 	if (sb->s_rev_level == EXT2_GOOD_OLD_REV &&
 	    (sb->s_feature_compat || sb->s_feature_ro_compat ||