Index: linux-2.6.27.21-0.1/fs/ext4/ialloc.c
===================================================================
---- linux-2.6.27.21-0.1.orig/fs/ext4/ialloc.c
-+++ linux-2.6.27.21-0.1/fs/ext4/ialloc.c
-@@ -1005,6 +1005,36 @@ fail_drop:
+--- linux-2.6.27.21-0.1.orig/fs/ext4/ialloc.c 2009-07-07 14:47:04.000000000 +0530
++++ linux-2.6.27.21-0.1/fs/ext4/ialloc.c 2009-07-07 15:04:02.000000000 +0530
+@@ -953,6 +953,36 @@
return ERR_PTR(err);
}
{
Index: linux-2.6.27.21-0.1/fs/ext4/namei.c
===================================================================
---- linux-2.6.27.21-0.1.orig/fs/ext4/namei.c
-+++ linux-2.6.27.21-0.1/fs/ext4/namei.c
-@@ -151,14 +151,24 @@ struct dx_map_entry
- u16 size;
- };
-
-+/*
-+ * dentry_param used by ext4_new_inode_wantedi()
-+ */
- #define LVFS_DENTRY_PARAM_MAGIC 20070216UL
- struct lvfs_dentry_params
- {
-- unsigned long p_inum;
-- void *p_ptr;
-- u32 magic;
-+ unsigned long ldp_inum;
-+ long ldp_flags;
-+ u32 ldp_magic;
+--- linux-2.6.27.21-0.1.orig/fs/ext4/namei.c 2009-07-07 14:47:05.000000000 +0530
++++ linux-2.6.27.21-0.1/fs/ext4/namei.c 2009-07-07 15:04:21.000000000 +0530
+@@ -161,6 +161,12 @@
+ u32 ldp_magic;
};
+/* Only use the least 3 bits of ldp_flags for goal policy */
+ DP_LASTGROUP_REVERSE = 1,
+} dp_policy_t;
+
-+
static inline ext4_lblk_t dx_get_block(struct dx_entry *entry);
static void dx_set_block(struct dx_entry *entry, ext4_lblk_t value);
static inline unsigned dx_get_hash(struct dx_entry *entry);
-@@ -1770,8 +1780,13 @@ static struct inode * ext4_new_inode_wan
+@@ -1771,8 +1777,14 @@
if (dentry->d_fsdata != NULL) {
struct lvfs_dentry_params *param = dentry->d_fsdata;
-- if (param->magic == LVFS_DENTRY_PARAM_MAGIC)
-- inum = param->p_inum;
+- if (param->ldp_magic == LVFS_DENTRY_PARAM_MAGIC)
+- inum = param->ldp_inum;
+ if (param->ldp_magic == LVFS_DENTRY_PARAM_MAGIC) {
+ if ((dp_policy_t)(param->ldp_flags & 0x7) ==
+ DP_LASTGROUP_REVERSE)
-+ inum = ext4_find_reverse(dir->i_sb);
-+ else /* DP_GOAL_POLICY */
++ inum = ext4_find_reverse(sb);
++ else /* DP_GOAL_POLICY */
+ inum = param->ldp_inum;
-+ }
++ }
++
}
- return ext4_new_inode(handle, dir, mode, inum);
+ return inum;
}
Index: linux-2.6.27.21-0.1/fs/ext4/ext4.h
===================================================================
---- linux-2.6.27.21-0.1.orig/fs/ext4/ext4.h
-+++ linux-2.6.27.21-0.1/fs/ext4/ext4.h
-@@ -1089,6 +1089,7 @@ extern int ext4fs_dirhash(const char *na
- /* ialloc.c */
- extern struct inode * ext4_new_inode(handle_t *, struct inode *, int,
- unsigned long);
-+extern unsigned long ext4_find_reverse(struct super_block *);
+--- linux-2.6.27.21-0.1.orig/fs/ext4/ext4.h 2009-07-07 14:47:22.000000000 +0530
++++ linux-2.6.27.21-0.1/fs/ext4/ext4.h 2009-07-07 15:04:02.000000000 +0530
+@@ -1101,6 +1101,7 @@
+ EXT4_SB(dir->i_sb)->s_inode_goal);
+ }
extern void ext4_free_inode(handle_t *, struct inode *);
++extern unsigned long ext4_find_reverse(struct super_block *);
extern struct inode * ext4_orphan_get(struct super_block *, unsigned long);
extern unsigned long ext4_count_free_inodes(struct super_block *);
+ extern unsigned long ext4_count_dirs(struct super_block *);