SOURCES (LINUX_2_6): kernel-ext4.patch - updated from the for-stable branch

adamg adamg at pld-linux.org
Mon Feb 23 23:19:27 CET 2009


Author: adamg                        Date: Mon Feb 23 22:19:27 2009 GMT
Module: SOURCES                       Tag: LINUX_2_6
---- Log message:
- updated from the for-stable branch

---- Files affected:
SOURCES:
   kernel-ext4.patch (1.1.2.2 -> 1.1.2.3) 

---- Diffs:

================================================================
Index: SOURCES/kernel-ext4.patch
diff -u SOURCES/kernel-ext4.patch:1.1.2.2 SOURCES/kernel-ext4.patch:1.1.2.3
--- SOURCES/kernel-ext4.patch:1.1.2.2	Mon Feb  2 21:49:38 2009
+++ SOURCES/kernel-ext4.patch	Mon Feb 23 23:19:21 2009
@@ -1,2166 +1,370 @@
-http://git.kernel.org/?p=linux/kernel/git/tytso/ext4.git;a=commitdiff;h=e041093f35eee3bc7093788c3753bc4493e62d75
+Aneesh Kumar K.V (3):
+      ext4: Fix lockdep warning
+      ext4: Initialize preallocation list_head's properly
+      ext4: Implement range_cyclic in ext4_da_writepages instead of write_cache_pages
 
-Aneesh Kumar K.V (14):
-      ext4: Fix the delalloc writepages to allocate blocks at the right offset.
-      ext4: avoid ext4_error when mounting a fs with a single bg
-      ext4: Don't overwrite allocation_context ac_status
-      ext4: Add blocks added during resize to bitmap
-      ext4: Use EXT4_GROUP_INFO_NEED_INIT_BIT during resize
-      ext4: cleanup mballoc header files
-      ext4: don't use blocks freed but not yet committed in buddy cache init
-      ext4: Fix race between read_block_bitmap() and mark_diskspace_used()
-      ext4: Fix the race between read_inode_bitmap() and ext4_new_inode()
-      ext4: Use new buffer_head flag to check uninit group bitmaps initialization
-      ext4: mark the blocks/inode bitmap beyond end of group as used
-      ext4: Don't allow new groups to be added during block allocation
-      ext4: Init the complete page while building buddy cache
-      ext4: Fix s_dirty_blocks_counter if block allocation failed with nodelalloc
+Dan Carpenter (1):
+      ext4: Fix NULL dereference in ext4_ext_migrate()'s error handling
 
-Mark Fasheh (1):
-      jbd2: Add BH_JBDPrivateStart
+Jan Kara (3):
+      jbd2: Fix return value of jbd2_journal_start_commit()
+      Revert "ext4: wait on all pending commits in ext4_sync_fs()"
+      jbd2: Avoid possible NULL dereference in jbd2_journal_begin_ordered_truncate()
 
-Theodore Ts'o (9):
-      ext4: Add support for non-native signed/unsigned htree hash algorithms
-      ext4: tone down ext4_da_writepages warnings
-      jbd2: Add barrier not supported test to journal_wait_on_commit_record
-      ext4: Add sanity checks for the superblock before mounting the filesystem
-      ext4: only use i_size_high for regular files
-      ext4: Add sanity check to make_indexed_dir
-      ext3: Add sanity check to make_indexed_dir
-      jbd2: On a __journal_expect() assertion failure printk "JBD2", not "EXT3-fs"
-      ext4: Initialize the new group descriptor when resizing the filesystem
+Wei Yongjun (1):
+      ext4: Fix to read empty directory blocks correctly in 64k
 
-Yasunori Goto (1):
-      ext4: Widen type of ext4_sb_info.s_mb_maxs[]
-
-diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
-index db35cfd..49ae5e4 100644
---- a/fs/ext4/balloc.c
-+++ b/fs/ext4/balloc.c
-@@ -20,6 +20,7 @@
- #include "ext4.h"
- #include "ext4_jbd2.h"
- #include "group.h"
-+#include "mballoc.h"
- 
- /*
-  * balloc.c contains the blocks allocation and deallocation routines
-@@ -319,20 +320,41 @@ ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
- 			    block_group, bitmap_blk);
- 		return NULL;
- 	}
--	if (buffer_uptodate(bh) &&
--	    !(desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)))
-+
-+	if (bitmap_uptodate(bh))
- 		return bh;
- 
- 	lock_buffer(bh);
-+	if (bitmap_uptodate(bh)) {
-+		unlock_buffer(bh);
-+		return bh;
-+	}
- 	spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
- 	if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
- 		ext4_init_block_bitmap(sb, bh, block_group, desc);
-+		set_bitmap_uptodate(bh);
- 		set_buffer_uptodate(bh);
- 		unlock_buffer(bh);
- 		spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
- 		return bh;
- 	}
- 	spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
-+	if (buffer_uptodate(bh)) {
-+		/*
-+		 * if not uninit if bh is uptodate,
-+		 * bitmap is also uptodate
-+		 */
-+		set_bitmap_uptodate(bh);
-+		unlock_buffer(bh);
-+		return bh;
-+	}
-+	/*
-+	 * submit the buffer_head for read. We can
-+	 * safely mark the bitmap as uptodate now.
-+	 * We do it here so the bitmap uptodate bit
-+	 * get set with buffer lock held.
-+	 */
-+	set_bitmap_uptodate(bh);
- 	if (bh_submit_read(bh) < 0) {
- 		put_bh(bh);
- 		ext4_error(sb, __func__,
-@@ -350,62 +372,44 @@ ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
- }
- 
- /**
-- * ext4_free_blocks_sb() -- Free given blocks and update quota
-+ * ext4_add_groupblocks() -- Add given blocks to an existing group
-  * @handle:			handle to this transaction
-  * @sb:				super block
-- * @block:			start physcial block to free
-+ * @block:			start physcial block to add to the block group
-  * @count:			number of blocks to free
-- * @pdquot_freed_blocks:	pointer to quota
-  *
-- * XXX This function is only used by the on-line resizing code, which
-- * should probably be fixed up to call the mballoc variant.  There
-- * this needs to be cleaned up later; in fact, I'm not convinced this
-- * is 100% correct in the face of the mballoc code.  The online resizing
-- * code needs to be fixed up to more tightly (and correctly) interlock
-- * with the mballoc code.
-+ * This marks the blocks as free in the bitmap. We ask the
-+ * mballoc to reload the buddy after this by setting group
-+ * EXT4_GROUP_INFO_NEED_INIT_BIT flag
-  */
--void ext4_free_blocks_sb(handle_t *handle, struct super_block *sb,
--			 ext4_fsblk_t block, unsigned long count,
--			 unsigned long *pdquot_freed_blocks)
-+void ext4_add_groupblocks(handle_t *handle, struct super_block *sb,
-+			 ext4_fsblk_t block, unsigned long count)
- {
- 	struct buffer_head *bitmap_bh = NULL;
- 	struct buffer_head *gd_bh;
- 	ext4_group_t block_group;
- 	ext4_grpblk_t bit;
- 	unsigned long i;
--	unsigned long overflow;
- 	struct ext4_group_desc *desc;
- 	struct ext4_super_block *es;
- 	struct ext4_sb_info *sbi;
- 	int err = 0, ret;
--	ext4_grpblk_t group_freed;
-+	ext4_grpblk_t blocks_freed;
-+	struct ext4_group_info *grp;
- 
--	*pdquot_freed_blocks = 0;
- 	sbi = EXT4_SB(sb);
- 	es = sbi->s_es;
--	if (block < le32_to_cpu(es->s_first_data_block) ||
--	    block + count < block ||
--	    block + count > ext4_blocks_count(es)) {
--		ext4_error(sb, "ext4_free_blocks",
--			   "Freeing blocks not in datazone - "
--			   "block = %llu, count = %lu", block, count);
--		goto error_return;
--	}
--
--	ext4_debug("freeing block(s) %llu-%llu\n", block, block + count - 1);
-+	ext4_debug("Adding block(s) %llu-%llu\n", block, block + count - 1);
- 
--do_more:
--	overflow = 0;
- 	ext4_get_group_no_and_offset(sb, block, &block_group, &bit);
-+	grp = ext4_get_group_info(sb, block_group);
- 	/*
- 	 * Check to see if we are freeing blocks across a group
- 	 * boundary.
- 	 */
- 	if (bit + count > EXT4_BLOCKS_PER_GROUP(sb)) {
--		overflow = bit + count - EXT4_BLOCKS_PER_GROUP(sb);
--		count -= overflow;
-+		goto error_return;
- 	}
--	brelse(bitmap_bh);
- 	bitmap_bh = ext4_read_block_bitmap(sb, block_group);
- 	if (!bitmap_bh)
- 		goto error_return;
-@@ -418,18 +422,17 @@ do_more:
- 	    in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) ||
- 	    in_range(block + count - 1, ext4_inode_table(sb, desc),
- 		     sbi->s_itb_per_group)) {
--		ext4_error(sb, "ext4_free_blocks",
--			   "Freeing blocks in system zones - "
-+		ext4_error(sb, __func__,
-+			   "Adding blocks in system zones - "
- 			   "Block = %llu, count = %lu",
- 			   block, count);
- 		goto error_return;
- 	}
- 
- 	/*
--	 * We are about to start releasing blocks in the bitmap,
-+	 * We are about to add blocks to the bitmap,
- 	 * so we need undo access.
- 	 */
--	/* @@@ check errors */
- 	BUFFER_TRACE(bitmap_bh, "getting undo access");
- 	err = ext4_journal_get_undo_access(handle, bitmap_bh);
- 	if (err)
-@@ -444,90 +447,42 @@ do_more:
- 	err = ext4_journal_get_write_access(handle, gd_bh);
- 	if (err)
- 		goto error_return;
--
--	jbd_lock_bh_state(bitmap_bh);
--
--	for (i = 0, group_freed = 0; i < count; i++) {
--		/*
--		 * An HJ special.  This is expensive...
--		 */
--#ifdef CONFIG_JBD2_DEBUG
--		jbd_unlock_bh_state(bitmap_bh);
--		{
--			struct buffer_head *debug_bh;
--			debug_bh = sb_find_get_block(sb, block + i);
--			if (debug_bh) {
--				BUFFER_TRACE(debug_bh, "Deleted!");
--				if (!bh2jh(bitmap_bh)->b_committed_data)
--					BUFFER_TRACE(debug_bh,
--						"No commited data in bitmap");
--				BUFFER_TRACE2(debug_bh, bitmap_bh, "bitmap");
--				__brelse(debug_bh);
--			}
--		}
--		jbd_lock_bh_state(bitmap_bh);
--#endif
--		if (need_resched()) {
--			jbd_unlock_bh_state(bitmap_bh);
--			cond_resched();
--			jbd_lock_bh_state(bitmap_bh);
--		}
--		/* @@@ This prevents newly-allocated data from being
--		 * freed and then reallocated within the same
--		 * transaction.
--		 *
--		 * Ideally we would want to allow that to happen, but to
--		 * do so requires making jbd2_journal_forget() capable of
--		 * revoking the queued write of a data block, which
--		 * implies blocking on the journal lock.  *forget()
--		 * cannot block due to truncate races.
--		 *
--		 * Eventually we can fix this by making jbd2_journal_forget()
--		 * return a status indicating whether or not it was able
--		 * to revoke the buffer.  On successful revoke, it is
--		 * safe not to set the allocation bit in the committed
--		 * bitmap, because we know that there is no outstanding
--		 * activity on the buffer any more and so it is safe to
--		 * reallocate it.
--		 */
--		BUFFER_TRACE(bitmap_bh, "set in b_committed_data");
--		J_ASSERT_BH(bitmap_bh,
--				bh2jh(bitmap_bh)->b_committed_data != NULL);
--		ext4_set_bit_atomic(sb_bgl_lock(sbi, block_group), bit + i,
--				bh2jh(bitmap_bh)->b_committed_data);
--
--		/*
--		 * We clear the bit in the bitmap after setting the committed
--		 * data bit, because this is the reverse order to that which
--		 * the allocator uses.
--		 */
-+	/*
-+	 * make sure we don't allow a parallel init on other groups in the
-+	 * same buddy cache
-+	 */
-+	down_write(&grp->alloc_sem);
-+	for (i = 0, blocks_freed = 0; i < count; i++) {
- 		BUFFER_TRACE(bitmap_bh, "clear bit");
- 		if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
- 						bit + i, bitmap_bh->b_data)) {
--			jbd_unlock_bh_state(bitmap_bh);
- 			ext4_error(sb, __func__,
- 				   "bit already cleared for block %llu",
- 				   (ext4_fsblk_t)(block + i));
--			jbd_lock_bh_state(bitmap_bh);
- 			BUFFER_TRACE(bitmap_bh, "bit already cleared");
- 		} else {
--			group_freed++;
-+			blocks_freed++;
- 		}
- 	}
--	jbd_unlock_bh_state(bitmap_bh);
--
- 	spin_lock(sb_bgl_lock(sbi, block_group));
--	le16_add_cpu(&desc->bg_free_blocks_count, group_freed);
-+	le16_add_cpu(&desc->bg_free_blocks_count, blocks_freed);
- 	desc->bg_checksum = ext4_group_desc_csum(sbi, block_group, desc);
- 	spin_unlock(sb_bgl_lock(sbi, block_group));
--	percpu_counter_add(&sbi->s_freeblocks_counter, count);
-+	percpu_counter_add(&sbi->s_freeblocks_counter, blocks_freed);
- 
- 	if (sbi->s_log_groups_per_flex) {
- 		ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
- 		spin_lock(sb_bgl_lock(sbi, flex_group));
--		sbi->s_flex_groups[flex_group].free_blocks += count;
-+		sbi->s_flex_groups[flex_group].free_blocks += blocks_freed;
- 		spin_unlock(sb_bgl_lock(sbi, flex_group));
- 	}
-+	/*
-+	 * request to reload the buddy with the
-+	 * new bitmap information
-+	 */
-+	set_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &(grp->bb_state));
-+	ext4_mb_update_group_info(grp, blocks_freed);
-+	up_write(&grp->alloc_sem);
- 
- 	/* We dirtied the bitmap block */
- 	BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");
-@@ -536,15 +491,10 @@ do_more:
- 	/* And the group descriptor block */
- 	BUFFER_TRACE(gd_bh, "dirtied group descriptor block");
- 	ret = ext4_journal_dirty_metadata(handle, gd_bh);
--	if (!err) err = ret;
--	*pdquot_freed_blocks += group_freed;
--
--	if (overflow && !err) {
--		block += count;
--		count = overflow;
--		goto do_more;
--	}
-+	if (!err)
-+		err = ret;
- 	sb->s_dirt = 1;
-+
- error_return:
- 	brelse(bitmap_bh);
- 	ext4_std_error(sb, err);
 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
-index b0537c8..dfccef5 100644
+index dfccef5..0b0c0fa 100644
 --- a/fs/ext4/ext4.h
 +++ b/fs/ext4/ext4.h
-@@ -19,6 +19,7 @@
- #include <linux/types.h>
- #include <linux/blkdev.h>
- #include <linux/magic.h>
-+#include <linux/jbd2.h>
- #include "ext4_i.h"
- 
- /*
-@@ -891,6 +892,9 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len)
- #define DX_HASH_LEGACY		0
- #define DX_HASH_HALF_MD4	1
- #define DX_HASH_TEA		2
-+#define DX_HASH_LEGACY_UNSIGNED	3
-+#define DX_HASH_HALF_MD4_UNSIGNED	4
-+#define DX_HASH_TEA_UNSIGNED		5
- 
- #ifdef __KERNEL__
- 
-@@ -1006,9 +1010,8 @@ extern int ext4_claim_free_blocks(struct ext4_sb_info *sbi, s64 nblocks);
- extern int ext4_has_free_blocks(struct ext4_sb_info *sbi, s64 nblocks);
- extern void ext4_free_blocks(handle_t *handle, struct inode *inode,
- 			ext4_fsblk_t block, unsigned long count, int metadata);
--extern void ext4_free_blocks_sb(handle_t *handle, struct super_block *sb,
--				ext4_fsblk_t block, unsigned long count,
--				unsigned long *pdquot_freed_blocks);
-+extern void ext4_add_groupblocks(handle_t *handle, struct super_block *sb,
-+				ext4_fsblk_t block, unsigned long count);
- extern ext4_fsblk_t ext4_count_free_blocks(struct super_block *);
- extern void ext4_check_blocks_bitmap(struct super_block *);
- extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
-@@ -1054,12 +1057,13 @@ extern int __init init_ext4_mballoc(void);
- extern void exit_ext4_mballoc(void);
- extern void ext4_mb_free_blocks(handle_t *, struct inode *,
- 		unsigned long, unsigned long, int, unsigned long *);
--extern int ext4_mb_add_more_groupinfo(struct super_block *sb,
-+extern int ext4_mb_add_groupinfo(struct super_block *sb,
- 		ext4_group_t i, struct ext4_group_desc *desc);
- extern void ext4_mb_update_group_info(struct ext4_group_info *grp,
- 		ext4_grpblk_t add);
--
--
-+extern int ext4_mb_get_buddy_cache_lock(struct super_block *, ext4_group_t);
-+extern void ext4_mb_put_buddy_cache_lock(struct super_block *,
-+						ext4_group_t, int);
- /* inode.c */
- int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode,
- 		struct buffer_head *bh, ext4_fsblk_t blocknr);
-@@ -1184,8 +1188,11 @@ static inline void ext4_r_blocks_count_set(struct ext4_super_block *es,
- 
- static inline loff_t ext4_isize(struct ext4_inode *raw_inode)
+@@ -862,7 +862,7 @@ static inline unsigned ext4_rec_len_from_disk(__le16 dlen)
  {
--	return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
--		le32_to_cpu(raw_inode->i_size_lo);
-+	if (S_ISREG(le16_to_cpu(raw_inode->i_mode)))
-+		return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
-+			le32_to_cpu(raw_inode->i_size_lo);
-+	else
-+		return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
- }
+ 	unsigned len = le16_to_cpu(dlen);
  
- static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
-@@ -1283,6 +1290,24 @@ extern int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode,
- 			sector_t block, unsigned long max_blocks,
- 			struct buffer_head *bh, int create,
- 			int extend_disksize, int flag);
-+
-+/*
-+ * Add new method to test wether block and inode bitmaps are properly
-+ * initialized. With uninit_bg reading the block from disk is not enough
-+ * to mark the bitmap uptodate. We need to also zero-out the bitmap
-+ */
-+#define BH_BITMAP_UPTODATE BH_JBDPrivateStart
-+
-+static inline int bitmap_uptodate(struct buffer_head *bh)
-+{
-+	return (buffer_uptodate(bh) &&
-+			test_bit(BH_BITMAP_UPTODATE, &(bh)->b_state));
-+}
-+static inline void set_bitmap_uptodate(struct buffer_head *bh)
-+{
-+	set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
-+}
-+
- #endif	/* __KERNEL__ */
- 
- #endif	/* _EXT4_H */
-diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
-index 445fde6..f00f112 100644
---- a/fs/ext4/ext4_sb.h
-+++ b/fs/ext4/ext4_sb.h
-@@ -57,6 +57,7 @@ struct ext4_sb_info {
- 	u32 s_next_generation;
- 	u32 s_hash_seed[4];
- 	int s_def_hash_version;
-+	int s_hash_unsigned;	/* 3 if hash should be signed, 0 if not */
- 	struct percpu_counter s_freeblocks_counter;
- 	struct percpu_counter s_freeinodes_counter;
- 	struct percpu_counter s_dirs_counter;
-@@ -101,7 +102,8 @@ struct ext4_sb_info {
- 	spinlock_t s_reserve_lock;
- 	spinlock_t s_md_lock;
- 	tid_t s_last_transaction;
--	unsigned short *s_mb_offsets, *s_mb_maxs;
-+	unsigned short *s_mb_offsets;
-+	unsigned int *s_mb_maxs;
- 
- 	/* tunables */
- 	unsigned long s_stripe;
-diff --git a/fs/ext4/hash.c b/fs/ext4/hash.c
-index 556ca8e..ac8f168 100644
---- a/fs/ext4/hash.c
-+++ b/fs/ext4/hash.c
-@@ -35,23 +35,71 @@ static void TEA_transform(__u32 buf[4], __u32 const in[])
- 
- 
- /* The old legacy hash */
--static __u32 dx_hack_hash(const char *name, int len)
-+static __u32 dx_hack_hash_unsigned(const char *name, int len)
- {
--	__u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
-+	__u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
-+	const unsigned char *ucp = (const unsigned char *) name;
-+
-+	while (len--) {
-+		hash = hash1 + (hash0 ^ (((int) *ucp++) * 7152373));
-+
-+		if (hash & 0x80000000)
-+			hash -= 0x7fffffff;
-+		hash1 = hash0;
-+		hash0 = hash;
-+	}
-+	return hash0 << 1;
-+}
-+
-+static __u32 dx_hack_hash_signed(const char *name, int len)
-+{
-+	__u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
-+	const signed char *scp = (const signed char *) name;
-+
- 	while (len--) {
--		__u32 hash = hash1 + (hash0 ^ (*name++ * 7152373));
-+		hash = hash1 + (hash0 ^ (((int) *scp++) * 7152373));
- 
--		if (hash & 0x80000000) hash -= 0x7fffffff;
-+		if (hash & 0x80000000)
-+			hash -= 0x7fffffff;
- 		hash1 = hash0;
- 		hash0 = hash;
- 	}
--	return (hash0 << 1);
-+	return hash0 << 1;
-+}
-+
-+static void str2hashbuf_signed(const char *msg, int len, __u32 *buf, int num)
-+{
-+	__u32	pad, val;
-+	int	i;
-+	const signed char *scp = (const signed char *) msg;
-+
-+	pad = (__u32)len | ((__u32)len << 8);
-+	pad |= pad << 16;
-+
-+	val = pad;
-+	if (len > num*4)
-+		len = num * 4;
-+	for (i = 0; i < len; i++) {
-+		if ((i % 4) == 0)
-+			val = pad;
-+		val = ((int) scp[i]) + (val << 8);
-+		if ((i % 4) == 3) {
-+			*buf++ = val;
-+			val = pad;
-+			num--;
-+		}
-+	}
-+	if (--num >= 0)
-+		*buf++ = val;
-+	while (--num >= 0)
-+		*buf++ = pad;
+-	if (len == EXT4_MAX_REC_LEN)
++	if (len == EXT4_MAX_REC_LEN || len == 0)
+ 		return 1 << 16;
+ 	return len;
  }
- 
--static void str2hashbuf(const char *msg, int len, __u32 *buf, int num)
-+static void str2hashbuf_unsigned(const char *msg, int len, __u32 *buf, int num)
- {
- 	__u32	pad, val;
- 	int	i;
-+	const unsigned char *ucp = (const unsigned char *) msg;
- 
- 	pad = (__u32)len | ((__u32)len << 8);
- 	pad |= pad << 16;
-@@ -62,7 +110,7 @@ static void str2hashbuf(const char *msg, int len, __u32 *buf, int num)
- 	for (i = 0; i < len; i++) {
- 		if ((i % 4) == 0)
- 			val = pad;
--		val = msg[i] + (val << 8);
-+		val = ((int) ucp[i]) + (val << 8);
- 		if ((i % 4) == 3) {
- 			*buf++ = val;
- 			val = pad;
-@@ -95,6 +143,8 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
- 	const char	*p;
- 	int		i;
- 	__u32		in[8], buf[4];
-+	void		(*str2hashbuf)(const char *, int, __u32 *, int) =
-+				str2hashbuf_signed;
- 
- 	/* Initialize the default seed for the hash checksum functions */
- 	buf[0] = 0x67452301;
-@@ -113,13 +163,18 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
- 	}
- 
- 	switch (hinfo->hash_version) {
-+	case DX_HASH_LEGACY_UNSIGNED:
-+		hash = dx_hack_hash_unsigned(name, len);
-+		break;
- 	case DX_HASH_LEGACY:
--		hash = dx_hack_hash(name, len);
-+		hash = dx_hack_hash_signed(name, len);
- 		break;
-+	case DX_HASH_HALF_MD4_UNSIGNED:
-+		str2hashbuf = str2hashbuf_unsigned;
- 	case DX_HASH_HALF_MD4:
- 		p = name;
- 		while (len > 0) {
--			str2hashbuf(p, len, in, 8);
-+			(*str2hashbuf)(p, len, in, 8);
- 			half_md4_transform(buf, in);
- 			len -= 32;
- 			p += 32;
-@@ -127,10 +182,12 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
- 		minor_hash = buf[2];
- 		hash = buf[1];
- 		break;
-+	case DX_HASH_TEA_UNSIGNED:
-+		str2hashbuf = str2hashbuf_unsigned;
- 	case DX_HASH_TEA:
- 		p = name;
- 		while (len > 0) {
--			str2hashbuf(p, len, in, 4);
-+			(*str2hashbuf)(p, len, in, 4);
- 			TEA_transform(buf, in);
- 			len -= 16;
- 			p += 16;
-diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
-index 2a117e2..b363c49 100644
---- a/fs/ext4/ialloc.c
-+++ b/fs/ext4/ialloc.c
-@@ -84,7 +84,7 @@ unsigned ext4_init_inode_bitmap(struct super_block *sb, struct buffer_head *bh,
- 	}
- 
- 	memset(bh->b_data, 0, (EXT4_INODES_PER_GROUP(sb) + 7) / 8);
--	mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), EXT4_BLOCKS_PER_GROUP(sb),
-+	mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), sb->s_blocksize * 8,
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/kernel-ext4.patch?r1=1.1.2.2&r2=1.1.2.3&f=u



More information about the pld-cvs-commit mailing list