-Index: linux-2.6.9-full/include/linux/ext3_fs.h
+Index: linux-2.6.5-7.311/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
+--- linux-2.6.5-7.311.orig/include/linux/ext3_fs.h
++++ linux-2.6.5-7.311/include/linux/ext3_fs.h
@@ -57,6 +57,30 @@ struct statfs;
#define ext3_debug(f, a...) do {} while (0)
#endif
/*
* Special inodes numbers
*/
-@@ -387,6 +411,14 @@ struct ext3_inode {
+@@ -361,6 +385,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
/*
* Maximal mount counts between two filesystem checks
*/
-@@ -763,6 +795,20 @@ extern unsigned long ext3_count_dirs (st
+@@ -735,6 +767,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);
/* 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);
+@@ -769,6 +815,10 @@ extern int ext3_htree_fill_tree(struct f
+ __u32 start_minor_hash, __u32 *next_hash);
/* super.c */
+extern struct proc_dir_entry *proc_root_ext3;
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.5-7.311/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.5-7.311.orig/include/linux/ext3_fs_sb.h
++++ linux-2.6.5-7.311/include/linux/ext3_fs_sb.h
+@@ -78,6 +78,61 @@ struct ext3_sb_info {
+ struct timer_list turn_ro_timer; /* For turning read-only (crash simulation) */
+ wait_queue_head_t ro_wait_queue; /* For people waiting for the fs to go read-only */
#endif
+
+ /* for buddy allocator */
+ [(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.5-7.311/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.5-7.311.orig/fs/ext3/super.c
++++ linux-2.6.5-7.311/fs/ext3/super.c
+@@ -389,6 +389,7 @@ void ext3_put_super (struct super_block
struct ext3_super_block *es = sbi->s_es;
int i;
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
+@@ -428,6 +429,8 @@ void ext3_put_super (struct super_block
invalidate_bdev(sbi->journal_bdev, 0);
ext3_blkdev_remove(sbi);
}
sb->s_fs_info = NULL;
kfree(sbi);
return;
-@@ -463,6 +466,8 @@ static struct inode *ext3_alloc_inode(st
+@@ -453,6 +456,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));
return &ei->vfs_inode;
}
-@@ -1353,6 +1358,13 @@ static int ext3_fill_super (struct super
+@@ -1151,6 +1156,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;
blocksize = sb_min_blocksize(sb, EXT3_MIN_BLOCK_SIZE);
if (!blocksize) {
-@@ -1729,6 +1741,8 @@ failed_mount:
+@@ -1526,6 +1538,8 @@ failed_mount:
ext3_blkdev_remove(sbi);
brelse(bh);
out_fail:
sb->s_fs_info = NULL;
kfree(sbi);
return -EINVAL;
-@@ -2593,9 +2607,47 @@ static struct file_system_type ext3_fs_t
+@@ -2158,9 +2172,46 @@ static struct file_system_type ext3_fs_t
.fs_flags = FS_REQUIRES_DEV,
};
+
+int __init init_ext3_proc(void)
+{
-+ struct proc_dir_entry *proc;
+ int ret;
+
+ if ((ret = init_ext3_mb_proc()))
if (err)
return err;
err = init_inodecache();
-@@ -2617,6 +2669,7 @@ static void __exit exit_ext3_fs(void)
+@@ -2189,6 +2240,7 @@ static void __exit exit_ext3_fs(void)
unregister_filesystem(&ext3_fs_type);
destroy_inodecache();
exit_ext3_xattr();
}
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.5-7.311/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.5-7.311/fs/ext3/mballoc.c
+@@ -0,0 +1,4385 @@
+/*
-+ * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
++ * Copyright 2008 Sun Microsystems, Inc.
+ * Written by Alex Tomas <alex@clusterfs.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+#define EXT3_BB_MAX_BLOCKS 30
+
+struct ext3_free_metadata {
-+ unsigned short group;
++ unsigned group;
+ unsigned short num;
+ unsigned short blocks[EXT3_BB_MAX_BLOCKS];
+ struct list_head list;
+ void *bd_bitmap;
+ struct ext3_group_info *bd_info;
+ struct super_block *bd_sb;
-+ __u16 bd_blkbits;
-+ __u16 bd_group;
++ unsigned bd_group;
++ unsigned bd_blkbits;
+};
+#define EXT3_MB_BITMAP(e3b) ((e3b)->bd_bitmap)
+#define EXT3_MB_BUDDY(e3b) ((e3b)->bd_buddy)
+ 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)
+
+ /* in this short window concurrent discard can set pa_deleted */
+ spin_lock(&pa->pa_lock);
-+ if (pa->pa_deleted == 0) {
++ if (pa->pa_deleted == 1) {
+ spin_unlock(&pa->pa_lock);
+ return;
+ }
+ ext3_std_error(sb, err);
+ return;
+}
++
++EXPORT_SYMBOL(ext3_free_blocks);
++EXPORT_SYMBOL(ext3_mb_discard_inode_preallocations);