From 39846197c6ba8ea102c05a82e70f1891aad99ea9 Mon Sep 17 00:00:00 2001
From: girish <girish>
Date: Fri, 4 Jul 2008 14:55:01 +0000
Subject: [PATCH] Fix hunk failures and thus add a slightly different patch for
 2.6.5 (SLES9) b=16258

---
 .../ext3-max-dir-size-2.6.5-suse.patch        | 144 ++++++++++++++++++
 .../series/ldiskfs-2.6-suse.series            |   2 +-
 2 files changed, 145 insertions(+), 1 deletion(-)
 create mode 100644 ldiskfs/kernel_patches/patches/ext3-max-dir-size-2.6.5-suse.patch

diff --git a/ldiskfs/kernel_patches/patches/ext3-max-dir-size-2.6.5-suse.patch b/ldiskfs/kernel_patches/patches/ext3-max-dir-size-2.6.5-suse.patch
new file mode 100644
index 0000000000..39f5b276e5
--- /dev/null
+++ b/ldiskfs/kernel_patches/patches/ext3-max-dir-size-2.6.5-suse.patch
@@ -0,0 +1,144 @@
+Index: linux-stage/fs/ext3/ialloc.c
+===================================================================
+--- linux-stage.orig/fs/ext3/ialloc.c
++++ linux-stage/fs/ext3/ialloc.c
+@@ -520,12 +520,15 @@ struct inode *ext3_new_inode(handle_t *h
+ 		return ERR_PTR(-EPERM);
+ 
+ 	sb = dir->i_sb;
++	sbi = EXT3_SB(sb);
++	if (sbi->s_max_dir_size > 0 && i_size_read(dir) >= sbi->s_max_dir_size)
++		return ERR_PTR(-EFBIG);
++
+ 	inode = new_inode(sb);
+ 	if (!inode)
+ 		return ERR_PTR(-ENOMEM);
+ 	ei = EXT3_I(inode);
+ 
+-	sbi = EXT3_SB(sb);
+ 	es = sbi->s_es;
+ 	if (goal) {
+ 		group = (goal - 1) / EXT3_INODES_PER_GROUP(sb);
+Index: linux-stage/fs/ext3/super.c
+===================================================================
+--- linux-stage.orig/fs/ext3/super.c
++++ linux-stage/fs/ext3/super.c
+@@ -37,6 +37,12 @@
+ #include "acl.h"
+ #include "group.h"
+ 
++/*
++ * max directory size tunable
++ */
++#define EXT3_DEFAULT_MAX_DIR_SIZE		0
++#define EXT3_MAX_DIR_SIZE_NAME		"max_dir_size"
++
+ static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
+ 			     unsigned long journal_devnum);
+ static int ext3_create_journal(struct super_block *, struct ext3_super_block *,
+@@ -431,6 +437,7 @@ void ext3_put_super (struct super_block 
+ 		invalidate_bdev(sbi->journal_bdev, 0);
+ 		ext3_blkdev_remove(sbi);
+ 	}
++ 	remove_proc_entry(EXT3_MAX_DIR_SIZE_NAME, sbi->s_dev_proc);
+ 	remove_proc_entry(sb->s_id, proc_root_ext3);
+ 	sbi->s_dev_proc = NULL;
+ 	sb->s_fs_info = NULL;
+@@ -1251,6 +1258,45 @@ static unsigned long descriptor_loc(stru
+ 	return (first_data_block + has_super + (bg * sbi->s_blocks_per_group));
+ }
+ 
++static int ext3_max_dir_size_read(char *page, char **start, off_t off,
++                                  int count, int *eof, void *data)
++{
++	struct ext3_sb_info *sbi = data;
++	int len;
++
++	*eof = 1;
++	if (off != 0)
++		return 0;
++
++	len = sprintf(page, "%lu\n", sbi->s_max_dir_size);
++	*start = page;
++	return len;
++}
++
++static int ext3_max_dir_size_write(struct file *file, const char *buffer,
++                                   unsigned long count, void *data)
++{
++	struct ext3_sb_info *sbi = data;
++	char str[32];
++	unsigned long value;
++	char *end;
++
++	if (count >= sizeof(str)) {
++		printk(KERN_ERR "EXT3-fs: %s string too long, max %u bytes\n",
++		       EXT3_MAX_DIR_SIZE_NAME, (int)sizeof(str));
++		return -EOVERFLOW;
++	}
++
++	if (copy_from_user(str, buffer, count))
++		return -EFAULT;
++
++	value = simple_strtol(str, &end, 0);
++	if (value < 0)
++		return -ERANGE;
++
++	sbi->s_max_dir_size = value;
++	return count;
++}
+ 
+ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
+ {
+@@ -1270,6 +1316,7 @@ static int ext3_fill_super (struct super
+ 	int db_count;
+ 	int i;
+ 	int needs_recovery;
++	struct proc_dir_entry *proc;
+ 
+ 	sbi = kmalloc(sizeof(*sbi), GFP_KERNEL);
+ 	if (!sbi)
+@@ -1287,6 +1334,23 @@ static int ext3_fill_super (struct super
+ 		return -ENOMEM;
+ 	}
+ 
++	sbi->s_max_dir_size = EXT3_DEFAULT_MAX_DIR_SIZE;
++	proc = create_proc_entry(EXT3_MAX_DIR_SIZE_NAME,
++		                 S_IFREG | S_IRUGO | S_IWUSR, sbi->s_dev_proc);
++	if (proc == NULL) {
++		printk(KERN_ERR "EXT3-fs: unable to create %s\n", 
++		       EXT3_MAX_DIR_SIZE_NAME);
++		remove_proc_entry(EXT3_MAX_DIR_SIZE_NAME, sbi->s_dev_proc);
++		remove_proc_entry(sb->s_id, proc_root_ext3);
++		sbi->s_dev_proc = NULL;
++		sb->s_fs_info = NULL;
++		kfree(sbi);
++		return -ENOMEM;
++	}
++	proc->data = sbi;
++	proc->read_proc = ext3_max_dir_size_read;
++	proc->write_proc = ext3_max_dir_size_write;
++
+ 	blocksize = sb_min_blocksize(sb, EXT3_MIN_BLOCK_SIZE);
+ 	if (!blocksize) {
+ 		printk(KERN_ERR "EXT3-fs: unable to set blocksize\n");
+@@ -1701,6 +1765,7 @@ failed_mount:
+ 	ext3_blkdev_remove(sbi);
+ 	brelse(bh);
+ out_fail:
++	remove_proc_entry(EXT3_MAX_DIR_SIZE_NAME, sbi->s_dev_proc);
+ 	remove_proc_entry(sb->s_id, proc_root_ext3);
+ 	sbi->s_dev_proc = NULL;
+ 	sb->s_fs_info = NULL;
+Index: linux-stage/include/linux/ext3_fs_sb.h
+===================================================================
+--- linux-stage.orig/include/linux/ext3_fs_sb.h
++++ linux-stage/include/linux/ext3_fs_sb.h
+@@ -111,6 +111,7 @@ struct ext3_sb_info {
+ 	unsigned long s_mb_max_groups_to_scan;
+ 	unsigned long s_mb_stats;
+ 	unsigned long s_mb_order2_reqs;
++	unsigned long s_max_dir_size;
+ 
+ 	/* history to debug policy */
+ 	struct ext3_mb_history *s_mb_history;
diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
index f263ea3a27..ce02d10e82 100644
--- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
+++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
@@ -22,5 +22,5 @@ ext3-uninit-2.6-suse.patch
 ext3-nanosecond-2.6-suse.patch
 ext3-fiemap-stub-suse.patch
 ext3-external-journal-2.6.5.patch
-ext3-max-dir-size-2.6-suse.patch
+ext3-max-dir-size-2.6.5-suse.patch
 ext3-print-inum-in-htree-warning.patch
-- 
GitLab