aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2008-09-23 09:18:24 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-09-23 09:18:24 -0400
commit9f6200bbfc962d8f926278cf5d5ddb90a228c322 (patch)
tree86cf42e4f1fff753a38c64d49971efd04bfdd5f9 /fs/ext4
parentf702ba0fd7d50b5f5f5aea5317875a10d40b869f (diff)
ext4: move /proc setup and teardown out of mballoc.c
...and into the core setup/teardown code in fs/ext4/super.c so that other parts of ext4 can define tuning parameters. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/ext4.h2
-rw-r--r--fs/ext4/ext4_sb.h2
-rw-r--r--fs/ext4/mballoc.c76
-rw-r--r--fs/ext4/mballoc.h1
-rw-r--r--fs/ext4/super.c17
5 files changed, 42 insertions, 56 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 50a4846c7e71..b9c9371d8164 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -955,6 +955,8 @@ ext4_group_first_block_no(struct super_block *sb, ext4_group_t group_no)
955void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr, 955void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
956 unsigned long *blockgrpp, ext4_grpblk_t *offsetp); 956 unsigned long *blockgrpp, ext4_grpblk_t *offsetp);
957 957
958extern struct proc_dir_entry *ext4_proc_root;
959
958/* 960/*
959 * Function prototypes 961 * Function prototypes
960 */ 962 */
diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
index a5577e0ccd3b..95e046e77cb1 100644
--- a/fs/ext4/ext4_sb.h
+++ b/fs/ext4/ext4_sb.h
@@ -61,6 +61,7 @@ struct ext4_sb_info {
61 struct percpu_counter s_dirs_counter; 61 struct percpu_counter s_dirs_counter;
62 struct percpu_counter s_dirtyblocks_counter; 62 struct percpu_counter s_dirtyblocks_counter;
63 struct blockgroup_lock s_blockgroup_lock; 63 struct blockgroup_lock s_blockgroup_lock;
64 struct proc_dir_entry *s_proc;
64 65
65 /* root of the per fs reservation window tree */ 66 /* root of the per fs reservation window tree */
66 spinlock_t s_rsv_window_lock; 67 spinlock_t s_rsv_window_lock;
@@ -122,7 +123,6 @@ struct ext4_sb_info {
122 int s_mb_history_cur; 123 int s_mb_history_cur;
123 int s_mb_history_max; 124 int s_mb_history_max;
124 int s_mb_history_num; 125 int s_mb_history_num;
125 struct proc_dir_entry *s_mb_proc;
126 spinlock_t s_mb_history_lock; 126 spinlock_t s_mb_history_lock;
127 int s_mb_history_filter; 127 int s_mb_history_filter;
128 128
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 14ebd572bea8..842d4017006e 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -2170,9 +2170,10 @@ static void ext4_mb_history_release(struct super_block *sb)
2170{ 2170{
2171 struct ext4_sb_info *sbi = EXT4_SB(sb); 2171 struct ext4_sb_info *sbi = EXT4_SB(sb);
2172 2172
2173 remove_proc_entry("mb_groups", sbi->s_mb_proc); 2173 if (sbi->s_proc != NULL) {
2174 remove_proc_entry("mb_history", sbi->s_mb_proc); 2174 remove_proc_entry("mb_groups", sbi->s_proc);
2175 2175 remove_proc_entry("mb_history", sbi->s_proc);
2176 }
2176 kfree(sbi->s_mb_history); 2177 kfree(sbi->s_mb_history);
2177} 2178}
2178 2179
@@ -2181,10 +2182,10 @@ static void ext4_mb_history_init(struct super_block *sb)
2181 struct ext4_sb_info *sbi = EXT4_SB(sb); 2182 struct ext4_sb_info *sbi = EXT4_SB(sb);
2182 int i; 2183 int i;
2183 2184
2184 if (sbi->s_mb_proc != NULL) { 2185 if (sbi->s_proc != NULL) {
2185 proc_create_data("mb_history", S_IRUGO, sbi->s_mb_proc, 2186 proc_create_data("mb_history", S_IRUGO, sbi->s_proc,
2186 &ext4_mb_seq_history_fops, sb); 2187 &ext4_mb_seq_history_fops, sb);
2187 proc_create_data("mb_groups", S_IRUGO, sbi->s_mb_proc, 2188 proc_create_data("mb_groups", S_IRUGO, sbi->s_proc,
2188 &ext4_mb_seq_groups_fops, sb); 2189 &ext4_mb_seq_groups_fops, sb);
2189 } 2190 }
2190 2191
@@ -2720,8 +2721,6 @@ ext4_mb_free_committed_blocks(struct super_block *sb)
2720#define EXT4_MB_STREAM_REQ "stream_req" 2721#define EXT4_MB_STREAM_REQ "stream_req"
2721#define EXT4_MB_GROUP_PREALLOC "group_prealloc" 2722#define EXT4_MB_GROUP_PREALLOC "group_prealloc"
2722 2723
2723
2724
2725#define MB_PROC_FOPS(name) \ 2724#define MB_PROC_FOPS(name) \
2726static int ext4_mb_##name##_proc_show(struct seq_file *m, void *v) \ 2725static int ext4_mb_##name##_proc_show(struct seq_file *m, void *v) \
2727{ \ 2726{ \
@@ -2771,7 +2770,7 @@ MB_PROC_FOPS(group_prealloc);
2771 2770
2772#define MB_PROC_HANDLER(name, var) \ 2771#define MB_PROC_HANDLER(name, var) \
2773do { \ 2772do { \
2774 proc = proc_create_data(name, mode, sbi->s_mb_proc, \ 2773 proc = proc_create_data(name, mode, sbi->s_proc, \
2775 &ext4_mb_##var##_proc_fops, sbi); \ 2774 &ext4_mb_##var##_proc_fops, sbi); \
2776 if (proc == NULL) { \ 2775 if (proc == NULL) { \
2777 printk(KERN_ERR "EXT4-fs: can't to create %s\n", name); \ 2776 printk(KERN_ERR "EXT4-fs: can't to create %s\n", name); \
@@ -2784,20 +2783,9 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)
2784 mode_t mode = S_IFREG | S_IRUGO | S_IWUSR; 2783 mode_t mode = S_IFREG | S_IRUGO | S_IWUSR;
2785 struct ext4_sb_info *sbi = EXT4_SB(sb); 2784 struct ext4_sb_info *sbi = EXT4_SB(sb);
2786 struct proc_dir_entry *proc; 2785 struct proc_dir_entry *proc;
2787 char devname[BDEVNAME_SIZE], *p;
2788 2786
2789 if (proc_root_ext4 == NULL) { 2787 if (sbi->s_proc == NULL)
2790 sbi->s_mb_proc = NULL;
2791 return -EINVAL; 2788 return -EINVAL;
2792 }
2793 bdevname(sb->s_bdev, devname);
2794 p = devname;
2795 while ((p = strchr(p, '/')))
2796 *p = '!';
2797
2798 sbi->s_mb_proc = proc_mkdir(devname, proc_root_ext4);
2799 if (!sbi->s_mb_proc)
2800 goto err_create_dir;
2801 2789
2802 MB_PROC_HANDLER(EXT4_MB_STATS_NAME, stats); 2790 MB_PROC_HANDLER(EXT4_MB_STATS_NAME, stats);
2803 MB_PROC_HANDLER(EXT4_MB_MAX_TO_SCAN_NAME, max_to_scan); 2791 MB_PROC_HANDLER(EXT4_MB_MAX_TO_SCAN_NAME, max_to_scan);
@@ -2805,43 +2793,31 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)
2805 MB_PROC_HANDLER(EXT4_MB_ORDER2_REQ, order2_reqs); 2793 MB_PROC_HANDLER(EXT4_MB_ORDER2_REQ, order2_reqs);
2806 MB_PROC_HANDLER(EXT4_MB_STREAM_REQ, stream_request); 2794 MB_PROC_HANDLER(EXT4_MB_STREAM_REQ, stream_request);
2807 MB_PROC_HANDLER(EXT4_MB_GROUP_PREALLOC, group_prealloc); 2795 MB_PROC_HANDLER(EXT4_MB_GROUP_PREALLOC, group_prealloc);
2808
2809 return 0; 2796 return 0;
2810 2797
2811err_out: 2798err_out:
2812 remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_mb_proc); 2799 remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_proc);
2813 remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_mb_proc); 2800 remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_proc);
2814 remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_mb_proc); 2801 remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_proc);
2815 remove_proc_entry(EXT4_MB_MIN_TO_SCAN_NAME, sbi->s_mb_proc); 2802 remove_proc_entry(EXT4_MB_MIN_TO_SCAN_NAME, sbi->s_proc);
2816 remove_proc_entry(EXT4_MB_MAX_TO_SCAN_NAME, sbi->s_mb_proc); 2803 remove_proc_entry(EXT4_MB_MAX_TO_SCAN_NAME, sbi->s_proc);
2817 remove_proc_entry(EXT4_MB_STATS_NAME, sbi->s_mb_proc); 2804 remove_proc_entry(EXT4_MB_STATS_NAME, sbi->s_proc);
2818 remove_proc_entry(devname, proc_root_ext4);
2819 sbi->s_mb_proc = NULL;
2820err_create_dir:
2821 printk(KERN_ERR "EXT4-fs: Unable to create %s\n", devname);
2822
2823 return -ENOMEM; 2805 return -ENOMEM;
2824} 2806}
2825 2807
2826static int ext4_mb_destroy_per_dev_proc(struct super_block *sb) 2808static int ext4_mb_destroy_per_dev_proc(struct super_block *sb)
2827{ 2809{
2828 struct ext4_sb_info *sbi = EXT4_SB(sb); 2810 struct ext4_sb_info *sbi = EXT4_SB(sb);
2829 char devname[BDEVNAME_SIZE], *p;
2830 2811
2831 if (sbi->s_mb_proc == NULL) 2812 if (sbi->s_proc == NULL)
2832 return -EINVAL; 2813 return -EINVAL;
2833 2814
2834 bdevname(sb->s_bdev, devname); 2815 remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_proc);
2835 p = devname; 2816 remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_proc);
2836 while ((p = strchr(p, '/'))) 2817 remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_proc);
2837 *p = '!'; 2818 remove_proc_entry(EXT4_MB_MIN_TO_SCAN_NAME, sbi->s_proc);
2838 remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_mb_proc); 2819 remove_proc_entry(EXT4_MB_MAX_TO_SCAN_NAME, sbi->s_proc);
2839 remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_mb_proc); 2820 remove_proc_entry(EXT4_MB_STATS_NAME, sbi->s_proc);
2840 remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_mb_proc);
2841 remove_proc_entry(EXT4_MB_MIN_TO_SCAN_NAME, sbi->s_mb_proc);
2842 remove_proc_entry(EXT4_MB_MAX_TO_SCAN_NAME, sbi->s_mb_proc);
2843 remove_proc_entry(EXT4_MB_STATS_NAME, sbi->s_mb_proc);
2844 remove_proc_entry(devname, proc_root_ext4);
2845 2821
2846 return 0; 2822 return 0;
2847} 2823}
@@ -2863,11 +2839,6 @@ int __init init_ext4_mballoc(void)
2863 kmem_cache_destroy(ext4_pspace_cachep); 2839 kmem_cache_destroy(ext4_pspace_cachep);
2864 return -ENOMEM; 2840 return -ENOMEM;
2865 } 2841 }
2866#ifdef CONFIG_PROC_FS
2867 proc_root_ext4 = proc_mkdir("fs/ext4", NULL);
2868 if (proc_root_ext4 == NULL)
2869 printk(KERN_ERR "EXT4-fs: Unable to create fs/ext4\n");
2870#endif
2871 return 0; 2842 return 0;
2872} 2843}
2873 2844
@@ -2876,9 +2847,6 @@ void exit_ext4_mballoc(void)
2876 /* XXX: synchronize_rcu(); */ 2847 /* XXX: synchronize_rcu(); */
2877 kmem_cache_destroy(ext4_pspace_cachep); 2848 kmem_cache_destroy(ext4_pspace_cachep);
2878 kmem_cache_destroy(ext4_ac_cachep); 2849 kmem_cache_destroy(ext4_ac_cachep);
2879#ifdef CONFIG_PROC_FS
2880 remove_proc_entry("fs/ext4", NULL);
2881#endif
2882} 2850}
2883 2851
2884 2852
diff --git a/fs/ext4/mballoc.h b/fs/ext4/mballoc.h
index c7c9906c2a75..b3b4828f8b89 100644
--- a/fs/ext4/mballoc.h
+++ b/fs/ext4/mballoc.h
@@ -257,7 +257,6 @@ static void ext4_mb_store_history(struct ext4_allocation_context *ac);
257 257
258#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) 258#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
259 259
260static struct proc_dir_entry *proc_root_ext4;
261struct buffer_head *read_block_bitmap(struct super_block *, ext4_group_t); 260struct buffer_head *read_block_bitmap(struct super_block *, ext4_group_t);
262 261
263static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, 262static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index fb5766e2bffe..7feeec6f7c39 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -34,6 +34,7 @@
34#include <linux/namei.h> 34#include <linux/namei.h>
35#include <linux/quotaops.h> 35#include <linux/quotaops.h>
36#include <linux/seq_file.h> 36#include <linux/seq_file.h>
37#include <linux/proc_fs.h>
37#include <linux/log2.h> 38#include <linux/log2.h>
38#include <linux/crc16.h> 39#include <linux/crc16.h>
39#include <asm/uaccess.h> 40#include <asm/uaccess.h>
@@ -45,6 +46,8 @@
45#include "namei.h" 46#include "namei.h"
46#include "group.h" 47#include "group.h"
47 48
49struct proc_dir_entry *ext4_proc_root;
50
48static int ext4_load_journal(struct super_block *, struct ext4_super_block *, 51static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
49 unsigned long journal_devnum); 52 unsigned long journal_devnum);
50static int ext4_create_journal(struct super_block *, struct ext4_super_block *, 53static int ext4_create_journal(struct super_block *, struct ext4_super_block *,
@@ -512,6 +515,8 @@ static void ext4_put_super(struct super_block *sb)
512 mark_buffer_dirty(sbi->s_sbh); 515 mark_buffer_dirty(sbi->s_sbh);
513 ext4_commit_super(sb, es, 1); 516 ext4_commit_super(sb, es, 1);
514 } 517 }
518 if (sbi->s_proc)
519 remove_proc_entry(sb->s_id, ext4_proc_root);
515 520
516 for (i = 0; i < sbi->s_gdb_count; i++) 521 for (i = 0; i < sbi->s_gdb_count; i++)
517 brelse(sbi->s_group_desc[i]); 522 brelse(sbi->s_group_desc[i]);
@@ -1916,6 +1921,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
1916 unsigned long journal_devnum = 0; 1921 unsigned long journal_devnum = 0;
1917 unsigned long def_mount_opts; 1922 unsigned long def_mount_opts;
1918 struct inode *root; 1923 struct inode *root;
1924 char *cp;
1919 int ret = -EINVAL; 1925 int ret = -EINVAL;
1920 int blocksize; 1926 int blocksize;
1921 int db_count; 1927 int db_count;
@@ -1936,6 +1942,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
1936 1942
1937 unlock_kernel(); 1943 unlock_kernel();
1938 1944
1945 /* Cleanup superblock name */
1946 for (cp = sb->s_id; (cp = strchr(cp, '/'));)
1947 *cp = '!';
1948
1939 blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE); 1949 blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);
1940 if (!blocksize) { 1950 if (!blocksize) {
1941 printk(KERN_ERR "EXT4-fs: unable to set blocksize\n"); 1951 printk(KERN_ERR "EXT4-fs: unable to set blocksize\n");
@@ -2221,6 +2231,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
2221 goto failed_mount; 2231 goto failed_mount;
2222 } 2232 }
2223 2233
2234 if (ext4_proc_root)
2235 sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root);
2236
2224 bgl_lock_init(&sbi->s_blockgroup_lock); 2237 bgl_lock_init(&sbi->s_blockgroup_lock);
2225 2238
2226 for (i = 0; i < db_count; i++) { 2239 for (i = 0; i < db_count; i++) {
@@ -2500,6 +2513,8 @@ failed_mount2:
2500 brelse(sbi->s_group_desc[i]); 2513 brelse(sbi->s_group_desc[i]);
2501 kfree(sbi->s_group_desc); 2514 kfree(sbi->s_group_desc);
2502failed_mount: 2515failed_mount:
2516 if (sbi->s_proc)
2517 remove_proc_entry(sb->s_id, ext4_proc_root);
2503#ifdef CONFIG_QUOTA 2518#ifdef CONFIG_QUOTA
2504 for (i = 0; i < MAXQUOTAS; i++) 2519 for (i = 0; i < MAXQUOTAS; i++)
2505 kfree(sbi->s_qf_names[i]); 2520 kfree(sbi->s_qf_names[i]);
@@ -3538,6 +3553,7 @@ static int __init init_ext4_fs(void)
3538{ 3553{
3539 int err; 3554 int err;
3540 3555
3556 ext4_proc_root = proc_mkdir("fs/ext4", NULL);
3541 err = init_ext4_mballoc(); 3557 err = init_ext4_mballoc();
3542 if (err) 3558 if (err)
3543 return err; 3559 return err;
@@ -3567,6 +3583,7 @@ static void __exit exit_ext4_fs(void)
3567 destroy_inodecache(); 3583 destroy_inodecache();
3568 exit_ext4_xattr(); 3584 exit_ext4_xattr();
3569 exit_ext4_mballoc(); 3585 exit_ext4_mballoc();
3586 remove_proc_entry("fs/ext4", NULL);
3570} 3587}
3571 3588
3572MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); 3589MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");