X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=ldiskfs%2Fkernel_patches%2Fpatches%2Fext4-mballoc-extra-checks-rhel5.patch;h=a11198a4c381deebedec4b56e5f027859ce2eb57;hp=7522be2868c028858c163504162c7abc52e9348e;hb=5a01ceecc3211bcd1e5597e5d9031f2ac368b4c8;hpb=9bcafeec81ab3d4bda4b7855f645e0078771e5d8 diff --git a/ldiskfs/kernel_patches/patches/ext4-mballoc-extra-checks-rhel5.patch b/ldiskfs/kernel_patches/patches/ext4-mballoc-extra-checks-rhel5.patch index 7522be2..a11198a 100644 --- a/ldiskfs/kernel_patches/patches/ext4-mballoc-extra-checks-rhel5.patch +++ b/ldiskfs/kernel_patches/patches/ext4-mballoc-extra-checks-rhel5.patch @@ -1,12 +1,23 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ext4/mballoc.c ---- linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c 2009-09-28 16:38:04.000000000 +0530 -+++ linux-2.6.18-128.1.6_2//fs/ext4/mballoc.c 2009-09-28 16:40:35.000000000 +0530 +--- linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c ++++ linux-2.6.18-128.1.6_2//fs/ext4/mballoc.c +@@ -360,8 +360,8 @@ static void ext4_mb_mark_free_simple(str + static struct kmem_cache *ext4_pspace_cachep; + static struct kmem_cache *ext4_ac_cachep; + static struct kmem_cache *ext4_free_ext_cachep; +-static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, +- ext4_group_t group); ++static int ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, ++ ext4_group_t group); + static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap, + ext4_group_t group); + @@ -660,7 +660,7 @@ static void ext4_mb_mark_free_simple(str - } } --static void ext4_mb_generate_buddy(struct super_block *sb, -+static int ext4_mb_generate_buddy(struct super_block *sb, + static noinline_for_stack +-void ext4_mb_generate_buddy(struct super_block *sb, ++int ext4_mb_generate_buddy(struct super_block *sb, void *buddy, void *bitmap, ext4_group_t group) { struct ext4_group_info *grp = ext4_get_group_info(sb, group); @@ -14,8 +25,8 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ grp->bb_fragments = fragments; if (free != grp->bb_free) { -- ext4_error(sb, __func__, -- "EXT4-fs: group %lu: %u blocks in bitmap, %u in gd\n", +- ext4_grp_locked_error(sb, group, __func__, +- "EXT4-fs: group %u: %u blocks in bitmap, %u in gd", - group, free, grp->bb_free); - /* - * If we intent to continue, we consider group descritor @@ -26,8 +37,8 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ + gdp = ext4_get_group_desc (sb, group, NULL); + ext4_error(sb, __FUNCTION__, + "group %lu: %u blocks in bitmap, %u in bb, " -+ "%u in gd, %lu pa's\n", group, free, grp->bb_free, -+ le16_to_cpu(gdp->bg_free_blocks_count), ++ "%u in gd, %lu pa's\n", (long unsigned int)group, ++ free, grp->bb_free, ext4_free_blks_count(sb, gdp), + grp->bb_prealloc_nr); + return -EIO; } @@ -43,32 +54,32 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ /* The buddy information is attached the buddy cache inode @@ -814,7 +816,7 @@ static int ext4_mb_init_cache(struct pag - - err = 0; first_block = page->index * blocks_per_page; + /* init the page */ + memset(page_address(page), 0xff, PAGE_CACHE_SIZE); - for (i = 0; i < blocks_per_page; i++) { + for (i = 0; i < blocks_per_page && err == 0; i++) { int group; struct ext4_group_info *grinfo; @@ -848,7 +850,7 @@ static int ext4_mb_init_cache(struct pag - /* * incore got set to the group block bitmap below */ + ext4_lock_group(sb, group); - ext4_mb_generate_buddy(sb, data, incore, group); + err = ext4_mb_generate_buddy(sb, data, incore, group); + ext4_unlock_group(sb, group); incore = NULL; } else { - /* this is block of bitmap */ @@ -861,7 +863,7 @@ static int ext4_mb_init_cache(struct pag memcpy(data, bitmap, blocksize); /* mark all preallocated blks used in in-core bitmap */ - ext4_mb_generate_from_pa(sb, data, group); + err = ext4_mb_generate_from_pa(sb, data, group); + ext4_mb_generate_from_freelist(sb, data, group); ext4_unlock_group(sb, group); - /* set incore so that the buddy information can be @@ -870,6 +872,7 @@ static int ext4_mb_init_cache(struct pag incore = data; } @@ -93,7 +104,7 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ { struct super_block *sb = seq->private; + struct ext4_group_desc *gdp; - long group = (long) v; + ext4_group_t group = (ext4_group_t) ((unsigned long) v); int i; int err; + int free = 0; @@ -120,17 +131,17 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ + + gdp = ext4_get_group_desc(sb, group, NULL); + if (gdp != NULL) -+ free = le16_to_cpu(gdp->bg_free_blocks_count); ++ free = ext4_free_blks_count(sb, gdp); + ext4_lock_group(sb, group); memcpy(&sg, ext4_get_group_info(sb, group), i); ext4_unlock_group(sb, group); ext4_mb_release_desc(&e4b); -- seq_printf(seq, "#%-5lu: %-5u %-5u %-5u [", group, sg.info.bb_free, +- seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free, - sg.info.bb_fragments, sg.info.bb_first_free); -+ seq_printf(seq, "#%-5lu: %-5u %-5u %-5u %-5u %-5lu [", group, -+ sg.info.bb_free, free, ++ seq_printf(seq, "#%-5lu: %-5u %-5u %-5u %-5u %-5lu [", ++ (long unsigned int)group, sg.info.bb_free, free, + sg.info.bb_fragments, sg.info.bb_first_free, + sg.info.bb_prealloc_nr); for (i = 0; i <= 13; i++) @@ -144,7 +155,7 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ if (ac->ac_op == EXT4_MB_HISTORY_ALLOC) { if (ac->ac_g_ex.fe_start == ac->ac_b_ex.fe_start && ac->ac_g_ex.fe_group == ac->ac_b_ex.fe_group) -@@ -3539,22 +3555,67 @@ ext4_mb_use_preallocated(struct ext4_all +@@ -3539,23 +3555,68 @@ ext4_mb_use_preallocated(struct ext4_all } /* @@ -171,10 +182,10 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ + i = mb_find_next_zero_bit(bitmap, max, i); + } + -+ if (free != le16_to_cpu(gdp->bg_free_blocks_count)) { ++ if (free != ext4_free_blks_count(sb, gdp)) { + ext4_error(sb, __FUNCTION__, "on-disk bitmap for group %d" + "corrupted: %u blocks free in bitmap, %u - in gd\n", -+ group, free, le16_to_cpu(gdp->bg_free_blocks_count)); ++ group, free, ext4_free_blks_count(sb, gdp)); + return -EIO; + } + return 0; @@ -183,10 +194,11 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ +/* * the function goes through all preallocation in this group and marks them * used in in-core bitmap. buddy must be generated from this bitmap - * Need to be called with ext4 group lock (ext4_lock_group) + * Need to be called with ext4 group lock held */ --static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, -+static int ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, + static noinline_for_stack +-void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, ++int ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, ext4_group_t group) { struct ext4_group_info *grp = ext4_get_group_info(sb, group); @@ -213,7 +225,7 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ /* all form of preallocation discards first load group, * so the only competing code is preallocation use. * we don't need any locking here -@@ -3570,15 +3631,24 @@ static void ext4_mb_generate_from_pa(str +@@ -3570,14 +3631,23 @@ static void ext4_mb_generate_from_pa(str &groupnr, &start); len = pa->pa_len; spin_unlock(&pa->pa_lock); @@ -223,8 +235,7 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ continue; + } BUG_ON(groupnr != group); - mb_set_bits(sb_bgl_lock(EXT4_SB(sb), group), - bitmap, start, len); + mb_set_bits(bitmap, start, len); preallocated += len; count++; } @@ -234,7 +245,7 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ + count, grp->bb_prealloc_nr, skip); + return -EIO; + } - mb_debug("prellocated %u for group %lu\n", preallocated, group); + mb_debug(1, "prellocated %u for group %u\n", preallocated, group); + return 0; } @@ -283,7 +294,7 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ @@ -4107,7 +4183,7 @@ repeat: if (err) { ext4_error(sb, __func__, "Error in loading buddy " - "information for %lu\n", group); + "information for %u", group); - continue; + return; } @@ -306,17 +317,30 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.c linux-2.6.18-128.1.6_2//fs/ ext4_mb_release_group_pa(&e4b, pa, ac); ext4_unlock_group(sb, group); -diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.h linux-2.6.18-128.1.6_2//fs/ext4/mballoc.h ---- linux-2.6.18-128.1.6_1//fs/ext4/mballoc.h 2009-09-28 16:38:04.000000000 +0530 -+++ linux-2.6.18-128.1.6_2//fs/ext4/mballoc.h 2009-09-28 16:38:43.000000000 +0530 +diff -rupN linux-2.6.18-128.1.6/fs/ext4/ext4.h +--- linux-2.6.18-128.1.6.orig/fs/ext4/ext4.h ++++ linux-2.6.18-128.1.6/fs/ext4/ext4.h @@ -119,6 +119,7 @@ struct ext4_group_info { - unsigned short bb_free; - unsigned short bb_fragments; - struct list_head bb_prealloc_list; + unsigned short bb_free; + unsigned short bb_fragments; + struct list_head bb_prealloc_list; + unsigned long bb_prealloc_nr; #ifdef DOUBLE_CHECK void *bb_bitmap; #endif +Index: linux-2.6.18-128.1.6/fs/ext4/mballoc.h +=================================================================== +--- linux-2.6.18-128.1.6.orig/fs/ext4/mballoc.h ++++ linux-2.6.18-128.1.6/fs/ext4/mballoc.h +@@ -92,7 +92,7 @@ + /* + * for which requests use 2^N search using buddies + */ +-#define MB_DEFAULT_ORDER2_REQS 2 ++#define MB_DEFAULT_ORDER2_REQS 8 + + /* + * default group prealloc size 512 blocks @@ -228,7 +229,7 @@ struct ext4_mb_history { __u16 tail; /* what tail broke some buddy */ __u16 buddy; /* buddy the tail ^^^ broke */ @@ -326,12 +350,3 @@ diff -rupN linux-2.6.18-128.1.6_1//fs/ext4/mballoc.h linux-2.6.18-128.1.6_2//fs/ __u8 op:4; __u8 merged:1; }; -@@ -259,7 +260,7 @@ static void ext4_mb_store_history(struct - - struct buffer_head *read_block_bitmap(struct super_block *, ext4_group_t); - --static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, -+static int ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, - ext4_group_t group); - static void ext4_mb_poll_new_transaction(struct super_block *, handle_t *); - static void ext4_mb_free_committed_blocks(struct super_block *);