Whamcloud - gitweb
b=15932
authorkalpak <kalpak>
Fri, 13 Jun 2008 10:09:37 +0000 (10:09 +0000)
committerkalpak <kalpak>
Fri, 13 Jun 2008 10:09:37 +0000 (10:09 +0000)
i=adilger,alex

- if blocks per group is less than blocksize*8, set rest of the bitmap to 1.
- check return of ext2_find_next_le_bit for overflow.

ldiskfs/kernel_patches/patches/ext3-mballoc3-core.patch
ldiskfs/kernel_patches/patches/ext3-uninit-2.6-sles10.patch
ldiskfs/kernel_patches/patches/ext3-uninit-2.6-suse.patch
ldiskfs/kernel_patches/patches/ext3-uninit-2.6.18.patch
ldiskfs/kernel_patches/patches/ext3-uninit-2.6.22-vanilla.patch
ldiskfs/kernel_patches/patches/ext3-uninit-2.6.9.patch

index ac840d0..6de92b0 100644 (file)
@@ -1,8 +1,8 @@
-Index: linux-2.6.9-full/include/linux/ext3_fs.h
+Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.9-full.orig/include/linux/ext3_fs.h      2007-06-08 23:44:08.000000000 +0400
-+++ linux-2.6.9-full/include/linux/ext3_fs.h   2007-10-17 22:25:01.000000000 +0400
-@@ -57,6 +57,30 @@ struct statfs;
+--- linux-2.6.18-53.1.14.orig/include/linux/ext3_fs.h
++++ linux-2.6.18-53.1.14/include/linux/ext3_fs.h
+@@ -53,6 +53,30 @@
  #define ext3_debug(f, a...)   do {} while (0)
  #endif
  
@@ -33,7 +33,7 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
  /*
   * Special inodes numbers
   */
-@@ -387,6 +411,14 @@ struct ext3_inode {
+@@ -398,6 +422,14 @@ struct ext3_inode {
  #define ext3_find_first_zero_bit      ext2_find_first_zero_bit
  #define ext3_find_next_zero_bit               ext2_find_next_zero_bit
  
@@ -48,7 +48,7 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
  /*
   * Maximal mount counts between two filesystem checks
   */
-@@ -763,6 +795,20 @@ extern unsigned long ext3_count_dirs (st
+@@ -799,6 +831,20 @@ extern unsigned long ext3_count_dirs (st
  extern void ext3_check_inodes_bitmap (struct super_block *);
  extern unsigned long ext3_count_free (struct buffer_head *, unsigned);
  
@@ -68,9 +68,9 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
 +
  
  /* inode.c */
extern int ext3_block_truncate_page(handle_t *, struct page *,
-@@ -804,6 +850,10 @@ extern int ext3_group_extend(struct supe
-                               unsigned long n_blocks_count);
int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
+@@ -843,6 +889,10 @@ extern int ext3_group_extend(struct supe
+                               ext3_fsblk_t n_blocks_count);
  
  /* super.c */
 +extern struct proc_dir_entry *proc_root_ext3;
@@ -80,13 +80,13 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
  extern void ext3_error (struct super_block *, const char *, const char *, ...)
        __attribute__ ((format (printf, 3, 4)));
  extern void __ext3_std_error (struct super_block *, const char *, int);
-Index: linux-2.6.9-full/include/linux/ext3_fs_sb.h
+Index: linux-2.6.18-53.1.14/include/linux/ext3_fs_sb.h
 ===================================================================
---- linux-2.6.9-full.orig/include/linux/ext3_fs_sb.h   2007-06-08 23:44:07.000000000 +0400
-+++ linux-2.6.9-full/include/linux/ext3_fs_sb.h        2007-10-17 22:25:01.000000000 +0400
-@@ -81,6 +81,61 @@ struct ext3_sb_info {
-       char *s_qf_names[MAXQUOTAS];            /* Names of quota files with journalled quota */
-       int s_jquota_fmt;                       /* Format of quota to use */
+--- linux-2.6.18-53.1.14.orig/include/linux/ext3_fs_sb.h
++++ linux-2.6.18-53.1.14/include/linux/ext3_fs_sb.h
+@@ -88,6 +88,61 @@ struct ext3_sb_info {
+       unsigned long s_ext_blocks;
+       unsigned long s_ext_extents;
  #endif
 +
 +      /* for buddy allocator */
@@ -146,11 +146,11 @@ Index: linux-2.6.9-full/include/linux/ext3_fs_sb.h
 +                               [(group) & (EXT3_DESC_PER_BLOCK(sb) - 1)]
 +
  #endif        /* _LINUX_EXT3_FS_SB */
-Index: linux-2.6.9-full/fs/ext3/super.c
+Index: linux-2.6.18-53.1.14/fs/ext3/super.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/super.c      2007-06-08 23:44:08.000000000 +0400
-+++ linux-2.6.9-full/fs/ext3/super.c   2007-10-17 22:26:27.000000000 +0400
-@@ -394,6 +394,7 @@ void ext3_put_super (struct super_block 
+--- linux-2.6.18-53.1.14.orig/fs/ext3/super.c
++++ linux-2.6.18-53.1.14/fs/ext3/super.c
+@@ -391,6 +391,7 @@ static void ext3_put_super (struct super
        struct ext3_super_block *es = sbi->s_es;
        int i;
  
@@ -158,7 +158,7 @@ Index: linux-2.6.9-full/fs/ext3/super.c
        ext3_ext_release(sb);
        ext3_xattr_put_super(sb);
        journal_destroy(sbi->s_journal);
-@@ -438,6 +439,8 @@ void ext3_put_super (struct super_block 
+@@ -433,6 +434,8 @@ static void ext3_put_super (struct super
                invalidate_bdev(sbi->journal_bdev, 0);
                ext3_blkdev_remove(sbi);
        }
@@ -167,16 +167,16 @@ Index: linux-2.6.9-full/fs/ext3/super.c
        sb->s_fs_info = NULL;
        kfree(sbi);
        return;
-@@ -463,6 +466,8 @@ static struct inode *ext3_alloc_inode(st
+@@ -458,6 +461,8 @@ static struct inode *ext3_alloc_inode(st
        ei->vfs_inode.i_version = 1;
-       
        memset(&ei->i_cached_extent, 0, sizeof(ei->i_cached_extent));
 +      INIT_LIST_HEAD(&ei->i_prealloc_list);
 +      spin_lock_init(&ei->i_prealloc_lock);
        return &ei->vfs_inode;
  }
  
-@@ -1353,6 +1358,13 @@ static int ext3_fill_super (struct super
+@@ -1454,6 +1459,13 @@ static int ext3_fill_super (struct super
        sbi->s_mount_opt = 0;
        sbi->s_resuid = EXT3_DEF_RESUID;
        sbi->s_resgid = EXT3_DEF_RESGID;
@@ -188,9 +188,9 @@ Index: linux-2.6.9-full/fs/ext3/super.c
 +              return -ENOMEM;
 +      }
  
-       blocksize = sb_min_blocksize(sb, EXT3_MIN_BLOCK_SIZE);
-       if (!blocksize) {
-@@ -1729,6 +1741,8 @@ failed_mount:
+       unlock_kernel();
+@@ -1857,6 +1869,8 @@ failed_mount:
        ext3_blkdev_remove(sbi);
        brelse(bh);
  out_fail:
@@ -198,8 +198,8 @@ Index: linux-2.6.9-full/fs/ext3/super.c
 +      sbi->s_dev_proc = NULL;
        sb->s_fs_info = NULL;
        kfree(sbi);
-       return -EINVAL;
-@@ -2593,9 +2607,47 @@ static struct file_system_type ext3_fs_t
+       lock_kernel();
+@@ -2782,9 +2796,47 @@ static struct file_system_type ext3_fs_t
        .fs_flags       = FS_REQUIRES_DEV,
  };
  
@@ -248,7 +248,7 @@ Index: linux-2.6.9-full/fs/ext3/super.c
        if (err)
                return err;
        err = init_inodecache();
-@@ -2617,6 +2669,7 @@ static void __exit exit_ext3_fs(void)
+@@ -2806,6 +2858,7 @@ static void __exit exit_ext3_fs(void)
        unregister_filesystem(&ext3_fs_type);
        destroy_inodecache();
        exit_ext3_xattr();
@@ -256,11 +256,11 @@ Index: linux-2.6.9-full/fs/ext3/super.c
  }
  
  int ext3_map_inode_page(struct inode *inode, struct page *page,
-Index: linux-2.6.9-full/fs/ext3/mballoc.c
+Index: linux-2.6.18-53.1.14/fs/ext3/mballoc.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/mballoc.c    2007-10-17 21:59:51.072534980 +0400
-+++ linux-2.6.9-full/fs/ext3/mballoc.c 2007-10-17 23:09:22.000000000 +0400
-@@ -0,0 +1,4380 @@
+--- /dev/null
++++ linux-2.6.18-53.1.14/fs/ext3/mballoc.c
+@@ -0,0 +1,4382 @@
 +/*
 + * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
@@ -1137,6 +1137,8 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
 +              fragments++;
 +              first = i;
 +              i = ext2_find_next_le_bit(bitmap, max, i);
++              if (i > max)
++                      i = max;
 +              len = i - first;
 +              free += len;
 +              if (len > 1)
index 32a9810..709a0fd 100644 (file)
@@ -6,10 +6,10 @@ group descriptor to avoid reading or scanning them at e2fsck time.
 A checksum of each group descriptor is used to ensure that corruption in
 the group descriptor's bit flags does not cause incorrect operation.
 
-Index: linux-2.6.16.27-0.9-full/include/linux/ext3_fs.h
+Index: linux-2.6.16.54-0.2.5/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/include/linux/ext3_fs.h      2007-03-28 18:20:16.000000000 +0400
-+++ linux-2.6.16.27-0.9-full/include/linux/ext3_fs.h   2007-03-28 18:30:06.000000000 +0400
+--- linux-2.6.16.54-0.2.5.orig/include/linux/ext3_fs.h
++++ linux-2.6.16.54-0.2.5/include/linux/ext3_fs.h
 @@ -153,16 +153,22 @@ struct ext3_allocation_request {
   */
  struct ext3_group_desc
@@ -37,7 +37,7 @@ Index: linux-2.6.16.27-0.9-full/include/linux/ext3_fs.h
  /*
   * Macro-instructions used to manage group descriptors
   */
-@@ -590,6 +596,7 @@ static inline struct ext3_inode_info *EX
+@@ -607,6 +613,7 @@ static inline int ext3_valid_inum(struct
  #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER   0x0001
  #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE     0x0002
  #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR      0x0004
@@ -45,7 +45,7 @@ Index: linux-2.6.16.27-0.9-full/include/linux/ext3_fs.h
  #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK      0x0020
  
  #define EXT3_FEATURE_INCOMPAT_COMPRESSION     0x0001
-@@ -606,6 +613,7 @@ static inline struct ext3_inode_info *EX
+@@ -623,6 +630,7 @@ static inline int ext3_valid_inum(struct
                                         EXT3_FEATURE_INCOMPAT_EXTENTS)
  #define EXT3_FEATURE_RO_COMPAT_SUPP   (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                                         EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
@@ -53,10 +53,10 @@ Index: linux-2.6.16.27-0.9-full/include/linux/ext3_fs.h
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
                                         EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
  
-Index: linux-2.6.16.27-0.9-full/fs/ext3/resize.c
+Index: linux-2.6.16.54-0.2.5/fs/ext3/resize.c
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/fs/ext3/resize.c     2007-03-13 02:56:52.000000000 +0300
-+++ linux-2.6.16.27-0.9-full/fs/ext3/resize.c  2007-03-28 18:30:06.000000000 +0400
+--- linux-2.6.16.54-0.2.5.orig/fs/ext3/resize.c
++++ linux-2.6.16.54-0.2.5/fs/ext3/resize.c
 @@ -19,6 +19,7 @@
  #include <linux/errno.h>
  #include <linux/slab.h>
@@ -65,7 +65,33 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/resize.c
  
  #define outside(b, first, last)       ((b) < (first) || (b) >= (last))
  #define inside(b, first, last)        ((b) >= (first) && (b) < (last))
-@@ -818,6 +819,7 @@ int ext3_group_add(struct super_block *s
+@@ -134,25 +135,6 @@ static struct buffer_head *bclean(handle
+ }
+ /*
+- * To avoid calling the atomic setbit hundreds or thousands of times, we only
+- * need to use it within a single byte (to ensure we get endianness right).
+- * We can use memset for the rest of the bitmap as there are no other users.
+- */
+-static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
+-{
+-      int i;
+-
+-      if (start_bit >= end_bit)
+-              return;
+-
+-      ext3_debug("mark end bits +%d through +%d used\n", start_bit, end_bit);
+-      for (i = start_bit; i < ((start_bit + 7) & ~7UL); i++)
+-              ext3_set_bit(i, bitmap);
+-      if (i < end_bit)
+-              memset(bitmap + (i >> 3), 0xff, (end_bit - i) >> 3);
+-}
+-
+-/*
+  * Set up the block and inode bitmaps, and the inode table for the new group.
+  * This doesn't need to be part of the main transaction, since we are only
+  * changing blocks outside the actual filesystem.  We still do journaling to
+@@ -818,6 +800,7 @@ int ext3_group_add(struct super_block *s
        gdp->bg_inode_table = cpu_to_le32(input->inode_table);
        gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
        gdp->bg_free_inodes_count = cpu_to_le16(EXT3_INODES_PER_GROUP(sb));
@@ -73,10 +99,10 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/resize.c
  
        /*
         * Make the new blocks and inodes valid next.  We do this before
-Index: linux-2.6.16.27-0.9-full/fs/ext3/super.c
+Index: linux-2.6.16.54-0.2.5/fs/ext3/super.c
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/fs/ext3/super.c      2007-03-28 18:25:51.000000000 +0400
-+++ linux-2.6.16.27-0.9-full/fs/ext3/super.c   2007-03-28 18:30:06.000000000 +0400
+--- linux-2.6.16.54-0.2.5.orig/fs/ext3/super.c
++++ linux-2.6.16.54-0.2.5/fs/ext3/super.c
 @@ -42,6 +42,7 @@
  #include "xattr.h"
  #include "acl.h"
@@ -85,7 +111,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/super.c
  
  static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
                             unsigned long journal_devnum);
-@@ -1221,6 +1222,90 @@ static int ext3_setup_super(struct super
+@@ -1220,6 +1221,90 @@ static int ext3_setup_super(struct super
        return res;
  }
  
@@ -176,7 +202,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/super.c
  /* Called at mount-time, super-block is locked */
  static int ext3_check_descriptors (struct super_block * sb)
  {
-@@ -1270,6 +1355,13 @@ static int ext3_check_descriptors (struc
+@@ -1269,6 +1354,13 @@ static int ext3_check_descriptors (struc
                                        le32_to_cpu(gdp->bg_inode_table));
                        return 0;
                }
@@ -190,11 +216,11 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/super.c
                block += EXT3_BLOCKS_PER_GROUP(sb);
                gdp++;
        }
-Index: linux-2.6.16.27-0.9-full/fs/ext3/group.h
+Index: linux-2.6.16.54-0.2.5/fs/ext3/group.h
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/fs/ext3/group.h      2007-02-13 18:39:59.640066087 +0300
-+++ linux-2.6.16.27-0.9-full/fs/ext3/group.h   2007-03-28 18:30:06.000000000 +0400
-@@ -0,0 +1,29 @@
+--- /dev/null
++++ linux-2.6.16.54-0.2.5/fs/ext3/group.h
+@@ -0,0 +1,30 @@
 +/*
 + *  linux/fs/ext3/group.h
 + *
@@ -223,11 +249,12 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/group.h
 +extern unsigned ext3_init_inode_bitmap(struct super_block *sb,
 +                                     struct buffer_head *bh, int group,
 +                                     struct ext3_group_desc *desc);
++extern void mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
 +#endif /* _LINUX_EXT3_GROUP_H */
-Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
+Index: linux-2.6.16.54-0.2.5/fs/ext3/ialloc.c
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/fs/ext3/ialloc.c     2007-03-28 18:20:17.000000000 +0400
-+++ linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c  2007-03-28 18:30:06.000000000 +0400
+--- linux-2.6.16.54-0.2.5.orig/fs/ext3/ialloc.c
++++ linux-2.6.16.54-0.2.5/fs/ext3/ialloc.c
 @@ -28,6 +28,7 @@
  
  #include "xattr.h"
@@ -245,7 +272,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
 + * need to use it within a single byte (to ensure we get endianness right).
 + * We can use memset for the rest of the bitmap as there are no other users.
 + */
-+static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
++void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
 +{
 +      int i;
 +
@@ -320,7 +347,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
                        spin_unlock(sb_bgl_lock(sbi, block_group));
                        percpu_counter_inc(&sbi->s_freeinodes_counter);
                        if (is_directory)
-@@ -453,7 +513,7 @@ struct inode *ext3_new_inode(handle_t *h
+@@ -452,7 +512,7 @@ struct inode *ext3_new_inode(handle_t *h
        struct ext3_sb_info *sbi;
        int err = 0;
        struct inode *ret;
@@ -329,7 +356,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
  
        /* Cannot create files in a deleted directory */
        if (!dir || !dir->i_nlink)
-@@ -570,11 +630,13 @@ repeat_in_this_group:
+@@ -569,11 +629,13 @@ repeat_in_this_group:
        goto out;
  
  got:
@@ -348,7 +375,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
                err = -EIO;
                goto fail;
        }
-@@ -582,13 +644,65 @@ got:
+@@ -581,13 +643,65 @@ got:
        BUFFER_TRACE(bh2, "get_write_access");
        err = ext3_journal_get_write_access(handle, bh2);
        if (err) goto fail;
@@ -414,7 +441,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
        spin_unlock(sb_bgl_lock(sbi, group));
        BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");
        err = ext3_journal_dirty_metadata(handle, bh2);
-@@ -610,7 +724,7 @@ got:
+@@ -609,7 +723,7 @@ got:
                inode->i_gid = current->fsgid;
        inode->i_mode = mode;
  
@@ -423,10 +450,10 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/ialloc.c
        /* This is the optimal IO size (for stat), not the fs block size */
        inode->i_blksize = PAGE_SIZE;
        inode->i_blocks = 0;
-Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
+Index: linux-2.6.16.54-0.2.5/fs/ext3/mballoc.c
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/fs/ext3/mballoc.c    2007-03-28 16:03:19.000000000 +0400
-+++ linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c 2007-03-28 18:30:36.000000000 +0400
+--- linux-2.6.16.54-0.2.5.orig/fs/ext3/mballoc.c
++++ linux-2.6.16.54-0.2.5/fs/ext3/mballoc.c
 @@ -36,6 +36,8 @@
  #include <linux/seq_file.h>
  #include <linux/version.h>
@@ -444,7 +471,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
        unsigned short  bb_first_free;
        unsigned short  bb_free;
        unsigned short  bb_fragments;
-@@ -928,10 +931,7 @@ static int ext3_mb_init_cache(struct pag
+@@ -943,10 +946,7 @@ static int ext3_mb_init_cache(struct pag
                if (first_group + i >= EXT3_SB(sb)->s_groups_count)
                        break;
  
@@ -456,7 +483,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
  
                err = -ENOMEM;
                bh[i] = sb_getblk(sb, le32_to_cpu(desc->bg_block_bitmap));
-@@ -946,7 +946,12 @@ static int ext3_mb_init_cache(struct pag
+@@ -961,7 +961,12 @@ static int ext3_mb_init_cache(struct pag
                        unlock_buffer(bh[i]);
                        continue;
                }
@@ -470,7 +497,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
                get_bh(bh[i]);
                bh[i]->b_end_io = end_buffer_read_sync;
                submit_bh(READ, bh[i]);
-@@ -1703,6 +1708,10 @@ static int ext3_mb_good_group(struct ext
+@@ -1733,6 +1738,10 @@ static int ext3_mb_good_group(struct ext
        switch (cr) {
                case 0:
                        BUG_ON(ac->ac_2order == 0);
@@ -481,7 +508,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
                        bits = ac->ac_sb->s_blocksize_bits + 1;
                        for (i = ac->ac_2order; i <= bits; i++)
                                if (grp->bb_counters[i] > 0)
-@@ -1796,7 +1805,9 @@ repeat:
+@@ -1826,7 +1835,9 @@ repeat:
                        }
  
                        ac->ac_groups_scanned++;
@@ -492,7 +519,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
                                ext3_mb_simple_scan_group(ac, &e3b);
                        else if (cr == 1 && ac->ac_g_ex.fe_len == sbi->s_stripe)
                                ext3_mb_scan_aligned(ac, &e3b);
-@@ -2267,12 +2278,13 @@ int ext3_mb_init_backend(struct super_bl
+@@ -2306,12 +2317,13 @@ int ext3_mb_init_backend(struct super_bl
                        i--;
                        goto err_freebuddy;
                }
@@ -507,8 +534,8 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
                set_bit(EXT3_GROUP_INFO_NEED_INIT_BIT,
                        &meta_group_info[j]->bb_state);
  
-@@ -2936,9 +2948,17 @@ int ext3_mb_mark_diskspace_used(struct e
-       mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+@@ -2945,9 +2957,17 @@ int ext3_mb_mark_diskspace_used(struct e
+                   ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
  
        spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
 +      if (gdp->bg_flags & cpu_to_le16(EXT3_BG_BLOCK_UNINIT)) {
@@ -525,7 +552,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, - ac->ac_b_ex.fe_len);
  
-@@ -4303,6 +4323,7 @@ do_more:
+@@ -4357,6 +4377,7 @@ do_more:
        spin_lock(sb_bgl_lock(sbi, block_group));
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) + count);
@@ -533,10 +560,10 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
+Index: linux-2.6.16.54-0.2.5/fs/ext3/balloc.c
 ===================================================================
---- linux-2.6.16.27-0.9-full.orig/fs/ext3/balloc.c     2007-03-28 16:03:20.000000000 +0400
-+++ linux-2.6.16.27-0.9-full/fs/ext3/balloc.c  2007-03-28 18:30:06.000000000 +0400
+--- linux-2.6.16.54-0.2.5.orig/fs/ext3/balloc.c
++++ linux-2.6.16.54-0.2.5/fs/ext3/balloc.c
 @@ -21,6 +21,7 @@
  #include <linux/quotaops.h>
  #include <linux/buffer_head.h>
@@ -545,7 +572,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
  /*
   * balloc.c contains the blocks allocation and deallocation routines
   */
-@@ -74,6 +75,75 @@ struct ext3_group_desc * ext3_get_group_
+@@ -74,6 +75,83 @@ struct ext3_group_desc * ext3_get_group_
        return desc + offset;
  }
  
@@ -613,6 +640,14 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
 +              for (bit = le32_to_cpu(gdp->bg_inode_table) - start,
 +                   bit_max = bit + sbi->s_itb_per_group; bit < bit_max; bit++)
 +                      ext3_set_bit(bit, bh->b_data);
++
++              /*
++               * Also if the number of blocks within the group is
++               * less than the blocksize * 8 ( which is the size
++               * of bitmap ), set rest of the block bitmap to 1
++               */
++              mark_bitmap_end(EXT3_BLOCKS_PER_GROUP(sb), sb->s_blocksize * 8,
++                              bh->b_data);
 +      }
 +
 +      return free_blocks - sbi->s_itb_per_group - 2;
@@ -621,7 +656,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
  /*
   * Read the bitmap for a given block_group, reading into the specified 
   * slot in the superblock's bitmap cache.
-@@ -89,7 +159,19 @@ read_block_bitmap(struct super_block *sb
+@@ -89,7 +167,19 @@ read_block_bitmap(struct super_block *sb
        desc = ext3_get_group_desc (sb, block_group, NULL);
        if (!desc)
                goto error_out;
@@ -642,7 +677,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
        if (!bh)
                ext3_error (sb, "read_block_bitmap",
                            "Cannot read block bitmap - "
-@@ -468,6 +550,7 @@ do_more:
+@@ -468,6 +558,7 @@ do_more:
        desc->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(desc->bg_free_blocks_count) +
                        group_freed);
@@ -650,7 +685,7 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-@@ -1378,8 +1461,11 @@ allocated:
+@@ -1378,8 +1469,11 @@ allocated:
                        ret_block, goal_hits, goal_attempts);
  
        spin_lock(sb_bgl_lock(sbi, group_no));
@@ -662,13 +697,3 @@ Index: linux-2.6.16.27-0.9-full/fs/ext3/balloc.c
        spin_unlock(sb_bgl_lock(sbi, group_no));
        percpu_counter_mod(&sbi->s_freeblocks_counter, -1);
  
-
-%diffstat
- fs/ext3/balloc.c        |   88 +++++++++++++++++++++++++++++
- fs/ext3/group.h         |   38 ++++++++++++
- fs/ext3/ialloc.c        |  144 +++++++++++++++++++++++++++++++++++++++++++-----
- fs/ext3/mballoc.c       |   35 +++++++++--
- fs/ext3/resize.c        |    2 
- fs/ext3/super.c         |   92 ++++++++++++++++++++++++++++++
- include/linux/ext3_fs.h |   16 ++++-
- 7 files changed, 388 insertions(+), 27 deletions(-)
index 80bf99b..8fccc39 100644 (file)
@@ -6,10 +6,10 @@ group descriptor to avoid reading or scanning them at e2fsck time.
 A checksum of each group descriptor is used to ensure that corruption in
 the group descriptor's bit flags does not cause incorrect operation.
 
-Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h
+Index: linux-2.6.5-7.311/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.5-7.283-full.orig/include/linux/ext3_fs.h        2007-03-28 17:33:05.000000000 +0400
-+++ linux-2.6.5-7.283-full/include/linux/ext3_fs.h     2007-03-28 18:33:35.000000000 +0400
+--- linux-2.6.5-7.311.orig/include/linux/ext3_fs.h
++++ linux-2.6.5-7.311/include/linux/ext3_fs.h
 @@ -153,16 +153,22 @@ struct ext3_allocation_request {
   */
  struct ext3_group_desc
@@ -37,7 +37,7 @@ Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h
  /*
   * Macro-instructions used to manage group descriptors
   */
-@@ -458,7 +464,7 @@ struct ext3_super_block {
+@@ -466,7 +472,7 @@ struct ext3_super_block {
         */
        __u8    s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
        __u8    s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
@@ -46,7 +46,7 @@ Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h
        /*
         * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
         */
-@@ -546,6 +552,7 @@ static inline struct ext3_inode_info *EX
+@@ -554,6 +560,7 @@ static inline struct ext3_inode_info *EX
  #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER   0x0001
  #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE     0x0002
  #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR      0x0004
@@ -54,7 +54,7 @@ Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h
  #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK      0x0020
  
  #define EXT3_FEATURE_INCOMPAT_COMPRESSION     0x0001
-@@ -562,6 +569,7 @@ static inline struct ext3_inode_info *EX
+@@ -570,6 +577,7 @@ static inline struct ext3_inode_info *EX
                                         EXT3_FEATURE_INCOMPAT_EXTENTS)
  #define EXT3_FEATURE_RO_COMPAT_SUPP   (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                                         EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
@@ -62,10 +62,10 @@ Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
                                         EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
  
-Index: linux-2.6.5-7.283-full/fs/ext3/super.c
+Index: linux-2.6.5-7.311/fs/ext3/super.c
 ===================================================================
---- linux-2.6.5-7.283-full.orig/fs/ext3/super.c        2007-03-28 17:33:05.000000000 +0400
-+++ linux-2.6.5-7.283-full/fs/ext3/super.c     2007-03-28 18:33:35.000000000 +0400
+--- linux-2.6.5-7.311.orig/fs/ext3/super.c
++++ linux-2.6.5-7.311/fs/ext3/super.c
 @@ -36,6 +36,7 @@
  #include <linux/quotaops.h>
  #include "xattr.h"
@@ -74,7 +74,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/super.c
  
  static int ext3_load_journal(struct super_block *, struct ext3_super_block *);
  static int ext3_create_journal(struct super_block *, struct ext3_super_block *,
-@@ -996,6 +997,90 @@ static int ext3_setup_super(struct super
+@@ -998,6 +999,90 @@ static int ext3_setup_super(struct super
        return res;
  }
  
@@ -165,7 +165,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/super.c
  static int ext3_check_descriptors (struct super_block * sb)
  {
        struct ext3_sb_info *sbi = EXT3_SB(sb);
-@@ -1044,6 +1129,13 @@ static int ext3_check_descriptors (struc
+@@ -1046,6 +1131,13 @@ static int ext3_check_descriptors (struc
                                        le32_to_cpu(gdp->bg_inode_table));
                        return 0;
                }
@@ -179,11 +179,11 @@ Index: linux-2.6.5-7.283-full/fs/ext3/super.c
                block += EXT3_BLOCKS_PER_GROUP(sb);
                gdp++;
        }
-Index: linux-2.6.5-7.283-full/fs/ext3/group.h
+Index: linux-2.6.5-7.311/fs/ext3/group.h
 ===================================================================
---- linux-2.6.5-7.283-full.orig/fs/ext3/group.h        2007-02-13 18:39:59.640066087 +0300
-+++ linux-2.6.5-7.283-full/fs/ext3/group.h     2007-03-28 18:33:35.000000000 +0400
-@@ -0,0 +1,29 @@
+--- /dev/null
++++ linux-2.6.5-7.311/fs/ext3/group.h
+@@ -0,0 +1,30 @@
 +/*
 + *  linux/fs/ext3/group.h
 + *
@@ -212,11 +212,12 @@ Index: linux-2.6.5-7.283-full/fs/ext3/group.h
 +extern unsigned ext3_init_inode_bitmap(struct super_block *sb,
 +                                     struct buffer_head *bh, int group,
 +                                     struct ext3_group_desc *desc);
++extern void mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
 +#endif /* _LINUX_EXT3_GROUP_H */
-Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
+Index: linux-2.6.5-7.311/fs/ext3/ialloc.c
 ===================================================================
---- linux-2.6.5-7.283-full.orig/fs/ext3/ialloc.c       2007-03-28 17:33:03.000000000 +0400
-+++ linux-2.6.5-7.283-full/fs/ext3/ialloc.c    2007-03-28 18:33:35.000000000 +0400
+--- linux-2.6.5-7.311.orig/fs/ext3/ialloc.c
++++ linux-2.6.5-7.311/fs/ext3/ialloc.c
 @@ -28,6 +28,7 @@
  
  #include "xattr.h"
@@ -234,7 +235,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
 + * need to use it within a single byte (to ensure we get endianness right).
 + * We can use memset for the rest of the bitmap as there are no other users.
 + */
-+static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
++void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
 +{
 +      int i;
 +
@@ -309,7 +310,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
                        spin_unlock(sb_bgl_lock(sbi, block_group));
                        percpu_counter_inc(&sbi->s_freeinodes_counter);
                        if (is_directory)
-@@ -454,7 +514,7 @@ struct inode *ext3_new_inode(handle_t *h
+@@ -453,7 +513,7 @@ struct inode *ext3_new_inode(handle_t *h
        struct ext3_sb_info *sbi;
        int err = 0;
        struct inode *ret;
@@ -318,7 +319,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
  
        /* Cannot create files in a deleted directory */
        if (!dir || !dir->i_nlink)
-@@ -570,11 +630,13 @@ repeat_in_this_group:
+@@ -569,11 +629,13 @@ repeat_in_this_group:
        goto out;
  
  got:
@@ -337,7 +338,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
                err = -EIO;
                goto fail;
        }
-@@ -582,13 +644,65 @@ got:
+@@ -581,13 +643,65 @@ got:
        BUFFER_TRACE(bh2, "get_write_access");
        err = ext3_journal_get_write_access(handle, bh2);
        if (err) goto fail;
@@ -403,7 +404,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
        spin_unlock(sb_bgl_lock(sbi, group));
        BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");
        err = ext3_journal_dirty_metadata(handle, bh2);
-@@ -610,7 +724,7 @@ got:
+@@ -609,7 +723,7 @@ got:
                inode->i_gid = current->fsgid;
        inode->i_mode = mode;
  
@@ -412,10 +413,10 @@ Index: linux-2.6.5-7.283-full/fs/ext3/ialloc.c
        /* This is the optimal IO size (for stat), not the fs block size */
        inode->i_blksize = PAGE_SIZE;
        inode->i_blocks = 0;
-Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
+Index: linux-2.6.5-7.311/fs/ext3/mballoc.c
 ===================================================================
---- linux-2.6.5-7.283-full.orig/fs/ext3/mballoc.c      2007-03-28 15:46:00.000000000 +0400
-+++ linux-2.6.5-7.283-full/fs/ext3/mballoc.c   2007-03-28 18:33:35.000000000 +0400
+--- linux-2.6.5-7.311.orig/fs/ext3/mballoc.c
++++ linux-2.6.5-7.311/fs/ext3/mballoc.c
 @@ -36,6 +36,8 @@
  #include <linux/seq_file.h>
  #include <linux/version.h>
@@ -433,7 +434,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
        unsigned short  bb_first_free;
        unsigned short  bb_free;
        unsigned short  bb_fragments;
-@@ -928,10 +931,7 @@ static int ext3_mb_init_cache(struct pag
+@@ -943,10 +946,7 @@ static int ext3_mb_init_cache(struct pag
                if (first_group + i >= EXT3_SB(sb)->s_groups_count)
                        break;
  
@@ -445,7 +446,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
  
                err = -ENOMEM;
                bh[i] = sb_getblk(sb, le32_to_cpu(desc->bg_block_bitmap));
-@@ -946,7 +946,12 @@ static int ext3_mb_init_cache(struct pag
+@@ -961,7 +961,12 @@ static int ext3_mb_init_cache(struct pag
                        unlock_buffer(bh[i]);
                        continue;
                }
@@ -459,7 +460,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
                get_bh(bh[i]);
                bh[i]->b_end_io = end_buffer_read_sync;
                submit_bh(READ, bh[i]);
-@@ -1703,6 +1708,10 @@ static int ext3_mb_good_group(struct ext
+@@ -1733,6 +1738,10 @@ static int ext3_mb_good_group(struct ext
        switch (cr) {
                case 0:
                        BUG_ON(ac->ac_2order == 0);
@@ -470,7 +471,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
                        bits = ac->ac_sb->s_blocksize_bits + 1;
                        for (i = ac->ac_2order; i <= bits; i++)
                                if (grp->bb_counters[i] > 0)
-@@ -1796,7 +1805,9 @@ repeat:
+@@ -1826,7 +1835,9 @@ repeat:
                        }
  
                        ac->ac_groups_scanned++;
@@ -481,7 +482,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
                                ext3_mb_simple_scan_group(ac, &e3b);
                        else if (cr == 1 && ac->ac_g_ex.fe_len == sbi->s_stripe)
                                ext3_mb_scan_aligned(ac, &e3b);
-@@ -2267,12 +2278,13 @@ int ext3_mb_init_backend(struct super_bl
+@@ -2306,12 +2317,13 @@ int ext3_mb_init_backend(struct super_bl
                        i--;
                        goto err_freebuddy;
                }
@@ -496,8 +497,8 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
                set_bit(EXT3_GROUP_INFO_NEED_INIT_BIT,
                        &meta_group_info[j]->bb_state);
  
-@@ -2936,9 +2948,17 @@ int ext3_mb_mark_diskspace_used(struct e
-       mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+@@ -2945,9 +2957,17 @@ int ext3_mb_mark_diskspace_used(struct e
+                   ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
  
        spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
 +      if (gdp->bg_flags & cpu_to_le16(EXT3_BG_BLOCK_UNINIT)) {
@@ -514,7 +515,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, - ac->ac_b_ex.fe_len);
  
-@@ -4303,6 +4323,7 @@ do_more:
+@@ -4357,6 +4377,7 @@ do_more:
        spin_lock(sb_bgl_lock(sbi, block_group));
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) + count);
@@ -522,10 +523,10 @@ Index: linux-2.6.5-7.283-full/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-Index: linux-2.6.5-7.283-full/fs/ext3/balloc.c
+Index: linux-2.6.5-7.311/fs/ext3/balloc.c
 ===================================================================
---- linux-2.6.5-7.283-full.orig/fs/ext3/balloc.c       2007-03-28 17:33:02.000000000 +0400
-+++ linux-2.6.5-7.283-full/fs/ext3/balloc.c    2007-03-28 18:33:35.000000000 +0400
+--- linux-2.6.5-7.311.orig/fs/ext3/balloc.c
++++ linux-2.6.5-7.311/fs/ext3/balloc.c
 @@ -20,6 +20,7 @@
  #include <linux/quotaops.h>
  #include <linux/buffer_head.h>
@@ -534,7 +535,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/balloc.c
  /*
   * balloc.c contains the blocks allocation and deallocation routines
   */
-@@ -72,6 +73,75 @@ struct ext3_group_desc * ext3_get_group_
+@@ -72,6 +73,83 @@ struct ext3_group_desc * ext3_get_group_
        return gdp + desc;
  }
  
@@ -602,6 +603,14 @@ Index: linux-2.6.5-7.283-full/fs/ext3/balloc.c
 +              for (bit = le32_to_cpu(gdp->bg_inode_table) - start,
 +                   bit_max = bit + sbi->s_itb_per_group; bit < bit_max; bit++)
 +                      ext3_set_bit(bit, bh->b_data);
++
++              /*
++               * Also if the number of blocks within the group is
++               * less than the blocksize * 8 ( which is the size
++               * of bitmap ), set rest of the block bitmap to 1
++               */
++              mark_bitmap_end(EXT3_BLOCKS_PER_GROUP(sb), sb->s_blocksize * 8,
++                              bh->b_data);
 +      }
 +
 +      return free_blocks - sbi->s_itb_per_group - 2;
@@ -610,7 +619,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/balloc.c
  /*
   * Read the bitmap for a given block_group, reading into the specified 
   * slot in the superblock's bitmap cache.
-@@ -87,7 +157,19 @@ read_block_bitmap(struct super_block *sb
+@@ -87,7 +165,19 @@ read_block_bitmap(struct super_block *sb
        desc = ext3_get_group_desc (sb, block_group, NULL);
        if (!desc)
                goto error_out;
@@ -631,7 +640,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/balloc.c
        if (!bh)
                ext3_error (sb, "read_block_bitmap",
                            "Cannot read block bitmap - "
-@@ -432,6 +514,7 @@ do_more:
+@@ -432,6 +522,7 @@ do_more:
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) +
                        dquot_freed_blocks);
@@ -639,7 +648,7 @@ Index: linux-2.6.5-7.283-full/fs/ext3/balloc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-@@ -1372,8 +1455,11 @@ allocated:
+@@ -1372,8 +1463,11 @@ allocated:
                        ret_block, goal_hits, goal_attempts);
  
        spin_lock(sb_bgl_lock(sbi, group_no));
index 8f1c077..70e5d08 100644 (file)
@@ -6,10 +6,10 @@ group descriptor to avoid reading or scanning them at e2fsck time.
 A checksum of each group descriptor is used to ensure that corruption in
 the group descriptor's bit flags does not cause incorrect operation.
 
-Index: linux-rhel5/include/linux/ext3_fs.h
+Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h
 ===================================================================
---- linux-rhel5.orig/include/linux/ext3_fs.h   2007-07-18 17:32:04.000000000 +0200
-+++ linux-rhel5/include/linux/ext3_fs.h        2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.18-53.1.14.orig/include/linux/ext3_fs.h
++++ linux-2.6.18-53.1.14/include/linux/ext3_fs.h
 @@ -150,16 +150,22 @@ struct ext3_allocation_request {
   */
  struct ext3_group_desc
@@ -53,10 +53,10 @@ Index: linux-rhel5/include/linux/ext3_fs.h
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
                                         EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
  
-Index: linux-rhel5/fs/ext3/resize.c
+Index: linux-2.6.18-53.1.14/fs/ext3/resize.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/resize.c  2007-07-15 09:36:00.000000000 +0200
-+++ linux-rhel5/fs/ext3/resize.c       2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.18-53.1.14.orig/fs/ext3/resize.c
++++ linux-2.6.18-53.1.14/fs/ext3/resize.c
 @@ -18,6 +18,7 @@
  #include <linux/errno.h>
  #include <linux/slab.h>
@@ -65,7 +65,33 @@ Index: linux-rhel5/fs/ext3/resize.c
  
  #define outside(b, first, last)       ((b) < (first) || (b) >= (last))
  #define inside(b, first, last)        ((b) >= (first) && (b) < (last))
-@@ -834,6 +835,7 @@ int ext3_group_add(struct super_block *s
+@@ -137,25 +138,6 @@ static struct buffer_head *bclean(handle
+ }
+ /*
+- * To avoid calling the atomic setbit hundreds or thousands of times, we only
+- * need to use it within a single byte (to ensure we get endianness right).
+- * We can use memset for the rest of the bitmap as there are no other users.
+- */
+-static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
+-{
+-      int i;
+-
+-      if (start_bit >= end_bit)
+-              return;
+-
+-      ext3_debug("mark end bits +%d through +%d used\n", start_bit, end_bit);
+-      for (i = start_bit; i < ((start_bit + 7) & ~7UL); i++)
+-              ext3_set_bit(i, bitmap);
+-      if (i < end_bit)
+-              memset(bitmap + (i >> 3), 0xff, (end_bit - i) >> 3);
+-}
+-
+-/*
+  * Set up the block and inode bitmaps, and the inode table for the new group.
+  * This doesn't need to be part of the main transaction, since we are only
+  * changing blocks outside the actual filesystem.  We still do journaling to
+@@ -834,6 +816,7 @@ int ext3_group_add(struct super_block *s
        gdp->bg_inode_table = cpu_to_le32(input->inode_table);
        gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
        gdp->bg_free_inodes_count = cpu_to_le16(EXT3_INODES_PER_GROUP(sb));
@@ -73,10 +99,10 @@ Index: linux-rhel5/fs/ext3/resize.c
  
        /*
         * Make the new blocks and inodes valid next.  We do this before
-Index: linux-rhel5/fs/ext3/super.c
+Index: linux-2.6.18-53.1.14/fs/ext3/super.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/super.c   2007-07-18 17:32:06.000000000 +0200
-+++ linux-rhel5/fs/ext3/super.c        2007-07-18 17:35:03.000000000 +0200
+--- linux-2.6.18-53.1.14.orig/fs/ext3/super.c
++++ linux-2.6.18-53.1.14/fs/ext3/super.c
 @@ -41,6 +41,7 @@
  #include "xattr.h"
  #include "acl.h"
@@ -85,7 +111,7 @@ Index: linux-rhel5/fs/ext3/super.c
  
  static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
                             unsigned long journal_devnum);
-@@ -1225,6 +1226,91 @@ static int ext3_setup_super(struct super
+@@ -1227,6 +1228,91 @@ static int ext3_setup_super(struct super
        return res;
  }
  
@@ -177,7 +203,7 @@ Index: linux-rhel5/fs/ext3/super.c
  /* Called at mount-time, super-block is locked */
  static int ext3_check_descriptors (struct super_block * sb)
  {
-@@ -1279,6 +1365,13 @@ static int ext3_check_descriptors (struc
+@@ -1281,6 +1367,13 @@ static int ext3_check_descriptors (struc
                                        le32_to_cpu(gdp->bg_inode_table));
                        return 0;
                }
@@ -191,11 +217,11 @@ Index: linux-rhel5/fs/ext3/super.c
                first_block += EXT3_BLOCKS_PER_GROUP(sb);
                gdp++;
        }
-Index: linux-rhel5/fs/ext3/group.h
+Index: linux-2.6.18-53.1.14/fs/ext3/group.h
 ===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-rhel5/fs/ext3/group.h        2007-07-18 17:32:15.000000000 +0200
-@@ -0,0 +1,29 @@
+--- /dev/null
++++ linux-2.6.18-53.1.14/fs/ext3/group.h
+@@ -0,0 +1,30 @@
 +/*
 + *  linux/fs/ext3/group.h
 + *
@@ -224,11 +250,12 @@ Index: linux-rhel5/fs/ext3/group.h
 +extern unsigned ext3_init_inode_bitmap(struct super_block *sb,
 +                                     struct buffer_head *bh, int group,
 +                                     struct ext3_group_desc *desc);
++extern void mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
 +#endif /* _LINUX_EXT3_GROUP_H */
-Index: linux-rhel5/fs/ext3/ialloc.c
+Index: linux-2.6.18-53.1.14/fs/ext3/ialloc.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/ialloc.c  2007-07-18 17:32:05.000000000 +0200
-+++ linux-rhel5/fs/ext3/ialloc.c       2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.18-53.1.14.orig/fs/ext3/ialloc.c
++++ linux-2.6.18-53.1.14/fs/ext3/ialloc.c
 @@ -28,6 +28,7 @@
  
  #include "xattr.h"
@@ -246,7 +273,7 @@ Index: linux-rhel5/fs/ext3/ialloc.c
 + * need to use it within a single byte (to ensure we get endianness right).
 + * We can use memset for the rest of the bitmap as there are no other users.
 + */
-+static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
++void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
 +{
 +      int i;
 +
@@ -423,10 +450,10 @@ Index: linux-rhel5/fs/ext3/ialloc.c
        /* This is the optimal IO size (for stat), not the fs block size */
        inode->i_blocks = 0;
        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
-Index: linux-rhel5/fs/ext3/mballoc.c
+Index: linux-2.6.18-53.1.14/fs/ext3/mballoc.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/mballoc.c 2007-07-18 17:32:04.000000000 +0200
-+++ linux-rhel5/fs/ext3/mballoc.c      2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.18-53.1.14.orig/fs/ext3/mballoc.c
++++ linux-2.6.18-53.1.14/fs/ext3/mballoc.c
 @@ -36,6 +36,8 @@
  #include <linux/seq_file.h>
  #include <linux/version.h>
@@ -444,7 +471,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
        unsigned short  bb_first_free;
        unsigned short  bb_free;
        unsigned short  bb_fragments;
-@@ -943,10 +946,7 @@ static int ext3_mb_init_cache(struct pag
+@@ -941,10 +944,7 @@ static int ext3_mb_init_cache(struct pag
                if (first_group + i >= EXT3_SB(sb)->s_groups_count)
                        break;
  
@@ -456,7 +483,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
  
                err = -ENOMEM;
                bh[i] = sb_getblk(sb, le32_to_cpu(desc->bg_block_bitmap));
-@@ -961,7 +961,12 @@ static int ext3_mb_init_cache(struct pag
+@@ -959,7 +959,12 @@ static int ext3_mb_init_cache(struct pag
                        unlock_buffer(bh[i]);
                        continue;
                }
@@ -470,7 +497,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                get_bh(bh[i]);
                bh[i]->b_end_io = end_buffer_read_sync;
                submit_bh(READ, bh[i]);
-@@ -1732,6 +1737,10 @@ static int ext3_mb_good_group(struct ext
+@@ -1731,6 +1736,10 @@ static int ext3_mb_good_group(struct ext
        switch (cr) {
                case 0:
                        BUG_ON(ac->ac_2order == 0);
@@ -481,7 +508,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                        bits = ac->ac_sb->s_blocksize_bits + 1;
                        for (i = ac->ac_2order; i <= bits; i++)
                                if (grp->bb_counters[i] > 0)
-@@ -1825,7 +1834,9 @@ repeat:
+@@ -1824,7 +1833,9 @@ repeat:
                        }
  
                        ac->ac_groups_scanned++;
@@ -507,8 +534,8 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                set_bit(EXT3_GROUP_INFO_NEED_INIT_BIT,
                        &meta_group_info[j]->bb_state);
  
-@@ -2958,9 +2970,17 @@ int ext3_mb_mark_diskspace_used(struct e
-       mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+@@ -2943,9 +2955,17 @@ int ext3_mb_mark_diskspace_used(struct e
+                   ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
  
        spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
 +      if (gdp->bg_flags & cpu_to_le16(EXT3_BG_BLOCK_UNINIT)) {
@@ -525,7 +552,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, - ac->ac_b_ex.fe_len);
  
-@@ -4346,6 +4366,7 @@ do_more:
+@@ -4355,6 +4375,7 @@ do_more:
        spin_lock(sb_bgl_lock(sbi, block_group));
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) + count);
@@ -533,10 +560,10 @@ Index: linux-rhel5/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-Index: linux-rhel5/fs/ext3/balloc.c
+Index: linux-2.6.18-53.1.14/fs/ext3/balloc.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/balloc.c  2007-07-18 17:32:04.000000000 +0200
-+++ linux-rhel5/fs/ext3/balloc.c       2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.18-53.1.14.orig/fs/ext3/balloc.c
++++ linux-2.6.18-53.1.14/fs/ext3/balloc.c
 @@ -20,6 +20,7 @@
  #include <linux/quotaops.h>
  #include <linux/buffer_head.h>
@@ -545,7 +572,7 @@ Index: linux-rhel5/fs/ext3/balloc.c
  /*
   * balloc.c contains the blocks allocation and deallocation routines
   */
-@@ -73,6 +74,75 @@ struct ext3_group_desc * ext3_get_group_
+@@ -73,6 +74,83 @@ struct ext3_group_desc * ext3_get_group_
        return desc + offset;
  }
  
@@ -613,6 +640,14 @@ Index: linux-rhel5/fs/ext3/balloc.c
 +              for (bit = le32_to_cpu(gdp->bg_inode_table) - start,
 +                   bit_max = bit + sbi->s_itb_per_group; bit < bit_max; bit++)
 +                      ext3_set_bit(bit, bh->b_data);
++
++              /*
++               * Also if the number of blocks within the group is
++               * less than the blocksize * 8 ( which is the size
++               * of bitmap ), set rest of the block bitmap to 1
++               */
++              mark_bitmap_end(EXT3_BLOCKS_PER_GROUP(sb), sb->s_blocksize * 8,
++                              bh->b_data);
 +      }
 +
 +      return free_blocks - sbi->s_itb_per_group - 2;
@@ -621,7 +656,7 @@ Index: linux-rhel5/fs/ext3/balloc.c
  /*
   * Read the bitmap for a given block_group, reading into the specified 
   * slot in the superblock's bitmap cache.
-@@ -88,7 +158,19 @@ read_block_bitmap(struct super_block *sb
+@@ -88,7 +166,19 @@ read_block_bitmap(struct super_block *sb
        desc = ext3_get_group_desc (sb, block_group, NULL);
        if (!desc)
                goto error_out;
@@ -642,7 +677,7 @@ Index: linux-rhel5/fs/ext3/balloc.c
        if (!bh)
                ext3_error (sb, "read_block_bitmap",
                            "Cannot read block bitmap - "
-@@ -467,6 +549,7 @@ do_more:
+@@ -467,6 +557,7 @@ do_more:
        desc->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(desc->bg_free_blocks_count) +
                        group_freed);
@@ -650,7 +685,7 @@ Index: linux-rhel5/fs/ext3/balloc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-@@ -1434,8 +1517,11 @@ allocated:
+@@ -1434,8 +1525,11 @@ allocated:
                        ret_block, goal_hits, goal_attempts);
  
        spin_lock(sb_bgl_lock(sbi, group_no));
index fb63542..1fb9c00 100644 (file)
@@ -6,11 +6,11 @@ group descriptor to avoid reading or scanning them at e2fsck time.
 A checksum of each group descriptor is used to ensure that corruption in
 the group descriptor's bit flags does not cause incorrect operation.
 
-Index: linux-rhel5/include/linux/ext3_fs.h
+Index: linux-2.6.22.14/include/linux/ext3_fs.h
 ===================================================================
---- linux-rhel5.orig/include/linux/ext3_fs.h   2007-07-18 17:32:04.000000000 +0200
-+++ linux-rhel5/include/linux/ext3_fs.h        2007-07-18 17:32:15.000000000 +0200
-@@ -150,16 +150,22 @@ struct ext3_allocation_request {
+--- linux-2.6.22.14.orig/include/linux/ext3_fs.h
++++ linux-2.6.22.14/include/linux/ext3_fs.h
+@@ -146,16 +146,22 @@ struct ext3_allocation_request {
   */
  struct ext3_group_desc
  {
@@ -37,7 +37,7 @@ Index: linux-rhel5/include/linux/ext3_fs.h
  /*
   * Macro-instructions used to manage group descriptors
   */
-@@ -603,6 +609,7 @@ static inline int ext3_valid_inum(struct
+@@ -617,6 +623,7 @@ static inline int ext3_valid_inum(struct
  #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER   0x0001
  #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE     0x0002
  #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR      0x0004
@@ -45,7 +45,7 @@ Index: linux-rhel5/include/linux/ext3_fs.h
  #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK      0x0020
  
  #define EXT3_FEATURE_INCOMPAT_COMPRESSION     0x0001
-@@ -619,6 +626,7 @@ static inline int ext3_valid_inum(struct
+@@ -633,6 +640,7 @@ static inline int ext3_valid_inum(struct
                                         EXT3_FEATURE_INCOMPAT_EXTENTS)
  #define EXT3_FEATURE_RO_COMPAT_SUPP   (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                                         EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
@@ -53,11 +53,11 @@ Index: linux-rhel5/include/linux/ext3_fs.h
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
                                         EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
  
-Index: linux-rhel5/fs/ext3/resize.c
+Index: linux-2.6.22.14/fs/ext3/resize.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/resize.c  2007-07-15 09:36:00.000000000 +0200
-+++ linux-rhel5/fs/ext3/resize.c       2007-07-18 17:32:15.000000000 +0200
-@@ -18,6 +18,7 @@
+--- linux-2.6.22.14.orig/fs/ext3/resize.c
++++ linux-2.6.22.14/fs/ext3/resize.c
+@@ -16,6 +16,7 @@
  #include <linux/errno.h>
  #include <linux/slab.h>
  
@@ -65,7 +65,33 @@ Index: linux-rhel5/fs/ext3/resize.c
  
  #define outside(b, first, last)       ((b) < (first) || (b) >= (last))
  #define inside(b, first, last)        ((b) >= (first) && (b) < (last))
-@@ -834,6 +835,7 @@ int ext3_group_add(struct super_block *s
+@@ -135,25 +136,6 @@ static struct buffer_head *bclean(handle
+ }
+ /*
+- * To avoid calling the atomic setbit hundreds or thousands of times, we only
+- * need to use it within a single byte (to ensure we get endianness right).
+- * We can use memset for the rest of the bitmap as there are no other users.
+- */
+-static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
+-{
+-      int i;
+-
+-      if (start_bit >= end_bit)
+-              return;
+-
+-      ext3_debug("mark end bits +%d through +%d used\n", start_bit, end_bit);
+-      for (i = start_bit; i < ((start_bit + 7) & ~7UL); i++)
+-              ext3_set_bit(i, bitmap);
+-      if (i < end_bit)
+-              memset(bitmap + (i >> 3), 0xff, (end_bit - i) >> 3);
+-}
+-
+-/*
+  * Set up the block and inode bitmaps, and the inode table for the new group.
+  * This doesn't need to be part of the main transaction, since we are only
+  * changing blocks outside the actual filesystem.  We still do journaling to
+@@ -833,6 +815,7 @@ int ext3_group_add(struct super_block *s
        gdp->bg_inode_table = cpu_to_le32(input->inode_table);
        gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
        gdp->bg_free_inodes_count = cpu_to_le16(EXT3_INODES_PER_GROUP(sb));
@@ -73,10 +99,10 @@ Index: linux-rhel5/fs/ext3/resize.c
  
        /*
         * Make the new blocks and inodes valid next.  We do this before
-Index: linux-rhel5/fs/ext3/super.c
+Index: linux-2.6.22.14/fs/ext3/super.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/super.c   2007-07-18 17:32:06.000000000 +0200
-+++ linux-rhel5/fs/ext3/super.c        2007-07-18 17:35:03.000000000 +0200
+--- linux-2.6.22.14.orig/fs/ext3/super.c
++++ linux-2.6.22.14/fs/ext3/super.c
 @@ -41,6 +41,7 @@
  #include "xattr.h"
  #include "acl.h"
@@ -85,7 +111,7 @@ Index: linux-rhel5/fs/ext3/super.c
  
  static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
                             unsigned long journal_devnum);
-@@ -1225,6 +1226,91 @@ static int ext3_setup_super(struct super
+@@ -1224,6 +1225,91 @@ static int ext3_setup_super(struct super
        return res;
  }
  
@@ -177,7 +203,7 @@ Index: linux-rhel5/fs/ext3/super.c
  /* Called at mount-time, super-block is locked */
  static int ext3_check_descriptors (struct super_block * sb)
  {
-@@ -1279,6 +1365,13 @@ static int ext3_check_descriptors (struc
+@@ -1278,6 +1364,13 @@ static int ext3_check_descriptors (struc
                                        le32_to_cpu(gdp->bg_inode_table));
                        return 0;
                }
@@ -191,11 +217,11 @@ Index: linux-rhel5/fs/ext3/super.c
                first_block += EXT3_BLOCKS_PER_GROUP(sb);
                gdp++;
        }
-Index: linux-rhel5/fs/ext3/group.h
+Index: linux-2.6.22.14/fs/ext3/group.h
 ===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-rhel5/fs/ext3/group.h        2007-07-18 17:32:15.000000000 +0200
-@@ -0,0 +1,29 @@
+--- /dev/null
++++ linux-2.6.22.14/fs/ext3/group.h
+@@ -0,0 +1,30 @@
 +/*
 + *  linux/fs/ext3/group.h
 + *
@@ -224,11 +250,12 @@ Index: linux-rhel5/fs/ext3/group.h
 +extern unsigned ext3_init_inode_bitmap(struct super_block *sb,
 +                                     struct buffer_head *bh, int group,
 +                                     struct ext3_group_desc *desc);
++extern void mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
 +#endif /* _LINUX_EXT3_GROUP_H */
-Index: linux-rhel5/fs/ext3/ialloc.c
+Index: linux-2.6.22.14/fs/ext3/ialloc.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/ialloc.c  2007-07-18 17:32:05.000000000 +0200
-+++ linux-rhel5/fs/ext3/ialloc.c       2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.22.14.orig/fs/ext3/ialloc.c
++++ linux-2.6.22.14/fs/ext3/ialloc.c
 @@ -28,6 +28,7 @@
  
  #include "xattr.h"
@@ -246,7 +273,7 @@ Index: linux-rhel5/fs/ext3/ialloc.c
 + * need to use it within a single byte (to ensure we get endianness right).
 + * We can use memset for the rest of the bitmap as there are no other users.
 + */
-+static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
++void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
 +{
 +      int i;
 +
@@ -423,10 +450,10 @@ Index: linux-rhel5/fs/ext3/ialloc.c
        /* This is the optimal IO size (for stat), not the fs block size */
        inode->i_blocks = 0;
        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
-Index: linux-rhel5/fs/ext3/mballoc.c
+Index: linux-2.6.22.14/fs/ext3/mballoc.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/mballoc.c 2007-07-18 17:32:04.000000000 +0200
-+++ linux-rhel5/fs/ext3/mballoc.c      2007-07-18 17:32:15.000000000 +0200
+--- linux-2.6.22.14.orig/fs/ext3/mballoc.c
++++ linux-2.6.22.14/fs/ext3/mballoc.c
 @@ -36,6 +36,8 @@
  #include <linux/seq_file.h>
  #include <linux/version.h>
@@ -470,7 +497,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                get_bh(bh[i]);
                bh[i]->b_end_io = end_buffer_read_sync;
                submit_bh(READ, bh[i]);
-@@ -1732,6 +1737,10 @@ static int ext3_mb_good_group(struct ext
+@@ -1733,6 +1738,10 @@ static int ext3_mb_good_group(struct ext
        switch (cr) {
                case 0:
                        BUG_ON(ac->ac_2order == 0);
@@ -481,7 +508,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                        bits = ac->ac_sb->s_blocksize_bits + 1;
                        for (i = ac->ac_2order; i <= bits; i++)
                                if (grp->bb_counters[i] > 0)
-@@ -1825,7 +1834,9 @@ repeat:
+@@ -1826,7 +1835,9 @@ repeat:
                        }
  
                        ac->ac_groups_scanned++;
@@ -492,7 +519,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                                ext3_mb_simple_scan_group(ac, &e3b);
                        else if (cr == 1 && ac->ac_g_ex.fe_len == sbi->s_stripe)
                                ext3_mb_scan_aligned(ac, &e3b);
-@@ -2304,12 +2315,13 @@ int ext3_mb_init_backend(struct super_bl
+@@ -2306,12 +2317,13 @@ int ext3_mb_init_backend(struct super_bl
                        i--;
                        goto err_freebuddy;
                }
@@ -507,8 +534,8 @@ Index: linux-rhel5/fs/ext3/mballoc.c
                set_bit(EXT3_GROUP_INFO_NEED_INIT_BIT,
                        &meta_group_info[j]->bb_state);
  
-@@ -2958,9 +2970,17 @@ int ext3_mb_mark_diskspace_used(struct e
-       mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+@@ -2945,9 +2957,17 @@ int ext3_mb_mark_diskspace_used(struct e
+                   ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
  
        spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
 +      if (gdp->bg_flags & cpu_to_le16(EXT3_BG_BLOCK_UNINIT)) {
@@ -525,7 +552,7 @@ Index: linux-rhel5/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, - ac->ac_b_ex.fe_len);
  
-@@ -4346,6 +4366,7 @@ do_more:
+@@ -4357,6 +4377,7 @@ do_more:
        spin_lock(sb_bgl_lock(sbi, block_group));
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) + count);
@@ -533,11 +560,11 @@ Index: linux-rhel5/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-Index: linux-rhel5/fs/ext3/balloc.c
+Index: linux-2.6.22.14/fs/ext3/balloc.c
 ===================================================================
---- linux-rhel5.orig/fs/ext3/balloc.c  2007-07-18 17:32:04.000000000 +0200
-+++ linux-rhel5/fs/ext3/balloc.c       2007-07-18 17:32:15.000000000 +0200
-@@ -20,6 +20,7 @@
+--- linux-2.6.22.14.orig/fs/ext3/balloc.c
++++ linux-2.6.22.14/fs/ext3/balloc.c
+@@ -20,10 +20,88 @@
  #include <linux/quotaops.h>
  #include <linux/buffer_head.h>
  
@@ -545,9 +572,6 @@ Index: linux-rhel5/fs/ext3/balloc.c
  /*
   * balloc.c contains the blocks allocation and deallocation routines
   */
-@@ -73,6 +74,75 @@ struct ext3_group_desc * ext3_get_group_
-       return desc + offset;
- }
  
 +/* Initializes an uninitialized block bitmap if given, and returns the
 + * number of blocks free in the group. */
@@ -613,15 +637,23 @@ Index: linux-rhel5/fs/ext3/balloc.c
 +              for (bit = le32_to_cpu(gdp->bg_inode_table) - start,
 +                   bit_max = bit + sbi->s_itb_per_group; bit < bit_max; bit++)
 +                      ext3_set_bit(bit, bh->b_data);
++
++              /*
++               * Also if the number of blocks within the group is
++               * less than the blocksize * 8 ( which is the size
++               * of bitmap ), set rest of the block bitmap to 1
++               */
++              mark_bitmap_end(EXT3_BLOCKS_PER_GROUP(sb), sb->s_blocksize * 8,
++                              bh->b_data);
 +      }
 +
 +      return free_blocks - sbi->s_itb_per_group - 2;
 +}
 +
  /*
-  * Read the bitmap for a given block_group, reading into the specified 
-  * slot in the superblock's bitmap cache.
-@@ -88,7 +158,19 @@ read_block_bitmap(struct super_block *sb
+  * The free blocks are managed by bitmaps.  A file system contains several
+  * blocks groups.  Each group contains 1 bitmap block for blocks, 1 bitmap
+@@ -99,7 +177,19 @@ read_block_bitmap(struct super_block *sb
        desc = ext3_get_group_desc (sb, block_group, NULL);
        if (!desc)
                goto error_out;
@@ -642,7 +674,7 @@ Index: linux-rhel5/fs/ext3/balloc.c
        if (!bh)
                ext3_error (sb, "read_block_bitmap",
                            "Cannot read block bitmap - "
-@@ -467,6 +549,7 @@ do_more:
+@@ -571,6 +661,7 @@ do_more:
        desc->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(desc->bg_free_blocks_count) +
                        group_freed);
@@ -650,7 +682,7 @@ Index: linux-rhel5/fs/ext3/balloc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-@@ -1434,8 +1517,11 @@ allocated:
+@@ -1637,8 +1728,11 @@ allocated:
                        ret_block, goal_hits, goal_attempts);
  
        spin_lock(sb_bgl_lock(sbi, group_no));
index b956664..2b02b68 100644 (file)
@@ -6,10 +6,10 @@ group descriptor to avoid reading or scanning them at e2fsck time.
 A checksum of each group descriptor is used to ensure that corruption in
 the group descriptor's bit flags does not cause incorrect operation.
 
-Index: linux-2.6.9-full/include/linux/ext3_fs.h
+Index: linux-2.6.9-67.0.15/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.9-full.orig/include/linux/ext3_fs.h      2007-03-28 18:35:41.000000000 +0400
-+++ linux-2.6.9-full/include/linux/ext3_fs.h   2007-03-28 18:36:16.000000000 +0400
+--- linux-2.6.9-67.0.15.orig/include/linux/ext3_fs.h
++++ linux-2.6.9-67.0.15/include/linux/ext3_fs.h
 @@ -153,16 +153,22 @@ struct ext3_allocation_request {
   */
  struct ext3_group_desc
@@ -37,7 +37,7 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
  /*
   * Macro-instructions used to manage group descriptors
   */
-@@ -572,6 +578,7 @@ static inline struct ext3_inode_info *EX
+@@ -580,6 +586,7 @@ static inline struct ext3_inode_info *EX
  #define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER   0x0001
  #define EXT3_FEATURE_RO_COMPAT_LARGE_FILE     0x0002
  #define EXT3_FEATURE_RO_COMPAT_BTREE_DIR      0x0004
@@ -45,7 +45,7 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
  #define EXT4_FEATURE_RO_COMPAT_DIR_NLINK      0x0020
  
  #define EXT3_FEATURE_INCOMPAT_COMPRESSION     0x0001
-@@ -588,6 +595,7 @@ static inline struct ext3_inode_info *EX
+@@ -596,6 +603,7 @@ static inline struct ext3_inode_info *EX
                                         EXT3_FEATURE_INCOMPAT_EXTENTS)
  #define EXT3_FEATURE_RO_COMPAT_SUPP   (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                                         EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
@@ -53,10 +53,10 @@ Index: linux-2.6.9-full/include/linux/ext3_fs.h
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
                                         EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
  
-Index: linux-2.6.9-full/fs/ext3/resize.c
+Index: linux-2.6.9-67.0.15/fs/ext3/resize.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/resize.c     2006-03-10 18:20:03.000000000 +0300
-+++ linux-2.6.9-full/fs/ext3/resize.c  2007-03-28 18:36:16.000000000 +0400
+--- linux-2.6.9-67.0.15.orig/fs/ext3/resize.c
++++ linux-2.6.9-67.0.15/fs/ext3/resize.c
 @@ -19,6 +19,7 @@
  #include <linux/errno.h>
  #include <linux/slab.h>
@@ -65,7 +65,33 @@ Index: linux-2.6.9-full/fs/ext3/resize.c
  
  #define outside(b, first, last)       ((b) < (first) || (b) >= (last))
  #define inside(b, first, last)        ((b) >= (first) && (b) < (last))
-@@ -807,6 +808,7 @@ int ext3_group_add(struct super_block *s
+@@ -132,25 +133,6 @@ static struct buffer_head *bclean(handle
+ }
+ /*
+- * To avoid calling the atomic setbit hundreds or thousands of times, we only
+- * need to use it within a single byte (to ensure we get endianness right).
+- * We can use memset for the rest of the bitmap as there are no other users.
+- */
+-static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
+-{
+-      int i;
+-
+-      if (start_bit >= end_bit)
+-              return;
+-
+-      ext3_debug("mark end bits +%d through +%d used\n", start_bit, end_bit);
+-      for (i = start_bit; i < ((start_bit + 7) & ~7UL); i++)
+-              ext3_set_bit(i, bitmap);
+-      if (i < end_bit)
+-              memset(bitmap + (i >> 3), 0xff, (end_bit - i) >> 3);
+-}
+-
+-/*
+  * Set up the block and inode bitmaps, and the inode table for the new group.
+  * This doesn't need to be part of the main transaction, since we are only
+  * changing blocks outside the actual filesystem.  We still do journaling to
+@@ -807,6 +789,7 @@ int ext3_group_add(struct super_block *s
        gdp->bg_inode_table = cpu_to_le32(input->inode_table);
        gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
        gdp->bg_free_inodes_count = cpu_to_le16(EXT3_INODES_PER_GROUP(sb));
@@ -73,19 +99,19 @@ Index: linux-2.6.9-full/fs/ext3/resize.c
  
        /*
         * Make the new blocks and inodes valid next.  We do this before
-Index: linux-2.6.9-full/fs/ext3/super.c
+Index: linux-2.6.9-67.0.15/fs/ext3/super.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/super.c      2007-03-28 18:35:42.000000000 +0400
-+++ linux-2.6.9-full/fs/ext3/super.c   2007-03-28 18:36:16.000000000 +0400
+--- linux-2.6.9-67.0.15.orig/fs/ext3/super.c
++++ linux-2.6.9-67.0.15/fs/ext3/super.c
 @@ -38,6 +38,7 @@
  #include <asm/uaccess.h>
  #include "xattr.h"
  #include "acl.h"
 +#include "group.h"
  
- static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
-                            unsigned long journal_devnum);
-@@ -1090,6 +1091,90 @@ static int ext3_setup_super(struct super
+ static int ext3_load_journal(struct super_block *, struct ext3_super_block *);
+ static int ext3_create_journal(struct super_block *, struct ext3_super_block *,
+@@ -1130,6 +1131,90 @@ static int ext3_setup_super(struct super
        return res;
  }
  
@@ -176,7 +202,7 @@ Index: linux-2.6.9-full/fs/ext3/super.c
  /* Called at mount-time, super-block is locked */
  static int ext3_check_descriptors (struct super_block * sb)
  {
-@@ -1139,6 +1224,13 @@ static int ext3_check_descriptors (struc
+@@ -1179,6 +1264,13 @@ static int ext3_check_descriptors (struc
                                        le32_to_cpu(gdp->bg_inode_table));
                        return 0;
                }
@@ -190,11 +216,11 @@ Index: linux-2.6.9-full/fs/ext3/super.c
                block += EXT3_BLOCKS_PER_GROUP(sb);
                gdp++;
        }
-Index: linux-2.6.9-full/fs/ext3/group.h
+Index: linux-2.6.9-67.0.15/fs/ext3/group.h
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/group.h      2007-02-13 18:39:59.640066087 +0300
-+++ linux-2.6.9-full/fs/ext3/group.h   2007-03-28 18:36:16.000000000 +0400
-@@ -0,0 +1,29 @@
+--- /dev/null
++++ linux-2.6.9-67.0.15/fs/ext3/group.h
+@@ -0,0 +1,30 @@
 +/*
 + *  linux/fs/ext3/group.h
 + *
@@ -223,11 +249,12 @@ Index: linux-2.6.9-full/fs/ext3/group.h
 +extern unsigned ext3_init_inode_bitmap(struct super_block *sb,
 +                                     struct buffer_head *bh, int group,
 +                                     struct ext3_group_desc *desc);
++extern void mark_bitmap_end(int start_bit, int end_bit, char *bitmap);
 +#endif /* _LINUX_EXT3_GROUP_H */
-Index: linux-2.6.9-full/fs/ext3/ialloc.c
+Index: linux-2.6.9-67.0.15/fs/ext3/ialloc.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/ialloc.c     2007-03-28 18:35:38.000000000 +0400
-+++ linux-2.6.9-full/fs/ext3/ialloc.c  2007-03-28 18:36:16.000000000 +0400
+--- linux-2.6.9-67.0.15.orig/fs/ext3/ialloc.c
++++ linux-2.6.9-67.0.15/fs/ext3/ialloc.c
 @@ -28,6 +28,7 @@
  
  #include "xattr.h"
@@ -245,7 +272,7 @@ Index: linux-2.6.9-full/fs/ext3/ialloc.c
 + * need to use it within a single byte (to ensure we get endianness right).
 + * We can use memset for the rest of the bitmap as there are no other users.
 + */
-+static void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
++void mark_bitmap_end(int start_bit, int end_bit, char *bitmap)
 +{
 +      int i;
 +
@@ -320,7 +347,7 @@ Index: linux-2.6.9-full/fs/ext3/ialloc.c
                        spin_unlock(sb_bgl_lock(sbi, block_group));
                        percpu_counter_inc(&sbi->s_freeinodes_counter);
                        if (is_directory)
-@@ -453,7 +513,7 @@ struct inode *ext3_new_inode(handle_t *h
+@@ -452,7 +512,7 @@ struct inode *ext3_new_inode(handle_t *h
        struct ext3_sb_info *sbi;
        int err = 0;
        struct inode *ret;
@@ -329,7 +356,7 @@ Index: linux-2.6.9-full/fs/ext3/ialloc.c
  
        /* Cannot create files in a deleted directory */
        if (!dir || !dir->i_nlink)
-@@ -566,11 +626,13 @@ repeat_in_this_group:
+@@ -568,11 +628,13 @@ repeat_in_this_group:
        goto out;
  
  got:
@@ -348,7 +375,7 @@ Index: linux-2.6.9-full/fs/ext3/ialloc.c
                err = -EIO;
                goto fail;
        }
-@@ -578,13 +640,65 @@ got:
+@@ -580,13 +642,65 @@ got:
        BUFFER_TRACE(bh2, "get_write_access");
        err = ext3_journal_get_write_access(handle, bh2);
        if (err) goto fail;
@@ -414,7 +441,7 @@ Index: linux-2.6.9-full/fs/ext3/ialloc.c
        spin_unlock(sb_bgl_lock(sbi, group));
        BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");
        err = ext3_journal_dirty_metadata(handle, bh2);
-@@ -606,7 +720,7 @@ got:
+@@ -608,7 +722,7 @@ got:
                inode->i_gid = current->fsgid;
        inode->i_mode = mode;
  
@@ -423,10 +450,10 @@ Index: linux-2.6.9-full/fs/ext3/ialloc.c
        /* This is the optimal IO size (for stat), not the fs block size */
        inode->i_blksize = PAGE_SIZE;
        inode->i_blocks = 0;
-Index: linux-2.6.9-full/fs/ext3/mballoc.c
+Index: linux-2.6.9-67.0.15/fs/ext3/mballoc.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/mballoc.c    2007-03-28 15:42:45.000000000 +0400
-+++ linux-2.6.9-full/fs/ext3/mballoc.c 2007-03-28 18:36:16.000000000 +0400
+--- linux-2.6.9-67.0.15.orig/fs/ext3/mballoc.c
++++ linux-2.6.9-67.0.15/fs/ext3/mballoc.c
 @@ -36,6 +36,8 @@
  #include <linux/seq_file.h>
  #include <linux/version.h>
@@ -444,7 +471,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
        unsigned short  bb_first_free;
        unsigned short  bb_free;
        unsigned short  bb_fragments;
-@@ -928,10 +931,7 @@ static int ext3_mb_init_cache(struct pag
+@@ -943,10 +946,7 @@ static int ext3_mb_init_cache(struct pag
                if (first_group + i >= EXT3_SB(sb)->s_groups_count)
                        break;
  
@@ -456,7 +483,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
  
                err = -ENOMEM;
                bh[i] = sb_getblk(sb, le32_to_cpu(desc->bg_block_bitmap));
-@@ -946,7 +946,12 @@ static int ext3_mb_init_cache(struct pag
+@@ -961,7 +961,12 @@ static int ext3_mb_init_cache(struct pag
                        unlock_buffer(bh[i]);
                        continue;
                }
@@ -470,7 +497,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
                get_bh(bh[i]);
                bh[i]->b_end_io = end_buffer_read_sync;
                submit_bh(READ, bh[i]);
-@@ -1703,6 +1708,10 @@ static int ext3_mb_good_group(struct ext
+@@ -1733,6 +1738,10 @@ static int ext3_mb_good_group(struct ext
        switch (cr) {
                case 0:
                        BUG_ON(ac->ac_2order == 0);
@@ -481,7 +508,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
                        bits = ac->ac_sb->s_blocksize_bits + 1;
                        for (i = ac->ac_2order; i <= bits; i++)
                                if (grp->bb_counters[i] > 0)
-@@ -1796,7 +1805,9 @@ repeat:
+@@ -1826,7 +1835,9 @@ repeat:
                        }
  
                        ac->ac_groups_scanned++;
@@ -492,7 +519,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
                                ext3_mb_simple_scan_group(ac, &e3b);
                        else if (cr == 1 && ac->ac_g_ex.fe_len == sbi->s_stripe)
                                ext3_mb_scan_aligned(ac, &e3b);
-@@ -2267,12 +2278,13 @@ int ext3_mb_init_backend(struct super_bl
+@@ -2306,12 +2317,13 @@ int ext3_mb_init_backend(struct super_bl
                        i--;
                        goto err_freebuddy;
                }
@@ -507,8 +534,8 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
                set_bit(EXT3_GROUP_INFO_NEED_INIT_BIT,
                        &meta_group_info[j]->bb_state);
  
-@@ -2936,9 +2948,17 @@ int ext3_mb_mark_diskspace_used(struct e
-       mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+@@ -2945,9 +2957,17 @@ int ext3_mb_mark_diskspace_used(struct e
+                   ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
  
        spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
 +      if (gdp->bg_flags & cpu_to_le16(EXT3_BG_BLOCK_UNINIT)) {
@@ -525,7 +552,7 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, - ac->ac_b_ex.fe_len);
  
-@@ -4303,6 +4323,7 @@ do_more:
+@@ -4357,6 +4377,7 @@ do_more:
        spin_lock(sb_bgl_lock(sbi, block_group));
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) + count);
@@ -533,10 +560,10 @@ Index: linux-2.6.9-full/fs/ext3/mballoc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-Index: linux-2.6.9-full/fs/ext3/balloc.c
+Index: linux-2.6.9-67.0.15/fs/ext3/balloc.c
 ===================================================================
---- linux-2.6.9-full.orig/fs/ext3/balloc.c     2007-03-28 15:45:41.000000000 +0400
-+++ linux-2.6.9-full/fs/ext3/balloc.c  2007-03-28 18:36:16.000000000 +0400
+--- linux-2.6.9-67.0.15.orig/fs/ext3/balloc.c
++++ linux-2.6.9-67.0.15/fs/ext3/balloc.c
 @@ -20,6 +20,7 @@
  #include <linux/quotaops.h>
  #include <linux/buffer_head.h>
@@ -545,7 +572,7 @@ Index: linux-2.6.9-full/fs/ext3/balloc.c
  /*
   * balloc.c contains the blocks allocation and deallocation routines
   */
-@@ -73,6 +74,75 @@ struct ext3_group_desc * ext3_get_group_
+@@ -73,6 +74,83 @@ struct ext3_group_desc * ext3_get_group_
        return gdp + desc;
  }
  
@@ -613,6 +640,14 @@ Index: linux-2.6.9-full/fs/ext3/balloc.c
 +              for (bit = le32_to_cpu(gdp->bg_inode_table) - start,
 +                   bit_max = bit + sbi->s_itb_per_group; bit < bit_max; bit++)
 +                      ext3_set_bit(bit, bh->b_data);
++
++              /*
++               * Also if the number of blocks within the group is
++               * less than the blocksize * 8 ( which is the size
++               * of bitmap ), set rest of the block bitmap to 1
++               */
++              mark_bitmap_end(EXT3_BLOCKS_PER_GROUP(sb), sb->s_blocksize * 8,
++                              bh->b_data);
 +      }
 +
 +      return free_blocks - sbi->s_itb_per_group - 2;
@@ -621,7 +656,7 @@ Index: linux-2.6.9-full/fs/ext3/balloc.c
  /*
   * Read the bitmap for a given block_group, reading into the specified 
   * slot in the superblock's bitmap cache.
-@@ -88,7 +158,19 @@ read_block_bitmap(struct super_block *sb
+@@ -88,7 +166,19 @@ read_block_bitmap(struct super_block *sb
        desc = ext3_get_group_desc (sb, block_group, NULL);
        if (!desc)
                goto error_out;
@@ -642,7 +677,7 @@ Index: linux-2.6.9-full/fs/ext3/balloc.c
        if (!bh)
                ext3_error (sb, "read_block_bitmap",
                            "Cannot read block bitmap - "
-@@ -429,6 +511,7 @@ do_more:
+@@ -429,6 +519,7 @@ do_more:
        gdp->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) +
                        *pdquot_freed_blocks);
@@ -650,7 +685,7 @@ Index: linux-2.6.9-full/fs/ext3/balloc.c
        spin_unlock(sb_bgl_lock(sbi, block_group));
        percpu_counter_mod(&sbi->s_freeblocks_counter, count);
  
-@@ -1330,8 +1413,11 @@ allocated:
+@@ -1330,8 +1421,11 @@ allocated:
                        ret_block, goal_hits, goal_attempts);
  
        spin_lock(sb_bgl_lock(sbi, group_no));