Commit 247dbed8 authored by Christoph Hellwig's avatar Christoph Hellwig

ext4: simplify procfs code

Use remove_proc_subtree to remove the whole subtree on cleanup, and
unwind the registration loop into individual calls.  Switch to use
proc_create_seq where applicable.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 353861cf
...@@ -2390,7 +2390,7 @@ extern int ext4_init_inode_table(struct super_block *sb, ...@@ -2390,7 +2390,7 @@ extern int ext4_init_inode_table(struct super_block *sb,
extern void ext4_end_bitmap_read(struct buffer_head *bh, int uptodate); extern void ext4_end_bitmap_read(struct buffer_head *bh, int uptodate);
/* mballoc.c */ /* mballoc.c */
extern const struct file_operations ext4_seq_mb_groups_fops; extern const struct seq_operations ext4_mb_seq_groups_ops;
extern long ext4_mb_stats; extern long ext4_mb_stats;
extern long ext4_mb_max_to_scan; extern long ext4_mb_max_to_scan;
extern int ext4_mb_init(struct super_block *); extern int ext4_mb_init(struct super_block *);
......
...@@ -2254,7 +2254,7 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac) ...@@ -2254,7 +2254,7 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
static void *ext4_mb_seq_groups_start(struct seq_file *seq, loff_t *pos) static void *ext4_mb_seq_groups_start(struct seq_file *seq, loff_t *pos)
{ {
struct super_block *sb = seq->private; struct super_block *sb = PDE_DATA(file_inode(seq->file));
ext4_group_t group; ext4_group_t group;
if (*pos < 0 || *pos >= ext4_get_groups_count(sb)) if (*pos < 0 || *pos >= ext4_get_groups_count(sb))
...@@ -2265,7 +2265,7 @@ static void *ext4_mb_seq_groups_start(struct seq_file *seq, loff_t *pos) ...@@ -2265,7 +2265,7 @@ static void *ext4_mb_seq_groups_start(struct seq_file *seq, loff_t *pos)
static void *ext4_mb_seq_groups_next(struct seq_file *seq, void *v, loff_t *pos) static void *ext4_mb_seq_groups_next(struct seq_file *seq, void *v, loff_t *pos)
{ {
struct super_block *sb = seq->private; struct super_block *sb = PDE_DATA(file_inode(seq->file));
ext4_group_t group; ext4_group_t group;
++*pos; ++*pos;
...@@ -2277,7 +2277,7 @@ static void *ext4_mb_seq_groups_next(struct seq_file *seq, void *v, loff_t *pos) ...@@ -2277,7 +2277,7 @@ static void *ext4_mb_seq_groups_next(struct seq_file *seq, void *v, loff_t *pos)
static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v) static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
{ {
struct super_block *sb = seq->private; struct super_block *sb = PDE_DATA(file_inode(seq->file));
ext4_group_t group = (ext4_group_t) ((unsigned long) v); ext4_group_t group = (ext4_group_t) ((unsigned long) v);
int i; int i;
int err, buddy_loaded = 0; int err, buddy_loaded = 0;
...@@ -2330,34 +2330,13 @@ static void ext4_mb_seq_groups_stop(struct seq_file *seq, void *v) ...@@ -2330,34 +2330,13 @@ static void ext4_mb_seq_groups_stop(struct seq_file *seq, void *v)
{ {
} }
static const struct seq_operations ext4_mb_seq_groups_ops = { const struct seq_operations ext4_mb_seq_groups_ops = {
.start = ext4_mb_seq_groups_start, .start = ext4_mb_seq_groups_start,
.next = ext4_mb_seq_groups_next, .next = ext4_mb_seq_groups_next,
.stop = ext4_mb_seq_groups_stop, .stop = ext4_mb_seq_groups_stop,
.show = ext4_mb_seq_groups_show, .show = ext4_mb_seq_groups_show,
}; };
static int ext4_mb_seq_groups_open(struct inode *inode, struct file *file)
{
struct super_block *sb = PDE_DATA(inode);
int rc;
rc = seq_open(file, &ext4_mb_seq_groups_ops);
if (rc == 0) {
struct seq_file *m = file->private_data;
m->private = sb;
}
return rc;
}
const struct file_operations ext4_seq_mb_groups_fops = {
.open = ext4_mb_seq_groups_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
static struct kmem_cache *get_groupinfo_cache(int blocksize_bits) static struct kmem_cache *get_groupinfo_cache(int blocksize_bits)
{ {
int cache_index = blocksize_bits - EXT4_MIN_BLOCK_LOG_SIZE; int cache_index = blocksize_bits - EXT4_MIN_BLOCK_LOG_SIZE;
......
...@@ -346,39 +346,9 @@ static struct kobject *ext4_root; ...@@ -346,39 +346,9 @@ static struct kobject *ext4_root;
static struct kobject *ext4_feat; static struct kobject *ext4_feat;
#define PROC_FILE_SHOW_DEFN(name) \
static int name##_open(struct inode *inode, struct file *file) \
{ \
return single_open(file, ext4_seq_##name##_show, PDE_DATA(inode)); \
} \
\
static const struct file_operations ext4_seq_##name##_fops = { \
.open = name##_open, \
.read = seq_read, \
.llseek = seq_lseek, \
.release = single_release, \
}
#define PROC_FILE_LIST(name) \
{ __stringify(name), &ext4_seq_##name##_fops }
PROC_FILE_SHOW_DEFN(es_shrinker_info);
PROC_FILE_SHOW_DEFN(options);
static const struct ext4_proc_files {
const char *name;
const struct file_operations *fops;
} proc_files[] = {
PROC_FILE_LIST(options),
PROC_FILE_LIST(es_shrinker_info),
PROC_FILE_LIST(mb_groups),
{ NULL, NULL },
};
int ext4_register_sysfs(struct super_block *sb) int ext4_register_sysfs(struct super_block *sb)
{ {
struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_sb_info *sbi = EXT4_SB(sb);
const struct ext4_proc_files *p;
int err; int err;
init_completion(&sbi->s_kobj_unregister); init_completion(&sbi->s_kobj_unregister);
...@@ -392,11 +362,14 @@ int ext4_register_sysfs(struct super_block *sb) ...@@ -392,11 +362,14 @@ int ext4_register_sysfs(struct super_block *sb)
if (ext4_proc_root) if (ext4_proc_root)
sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root); sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root);
if (sbi->s_proc) { if (sbi->s_proc) {
for (p = proc_files; p->name; p++) proc_create_single_data("options", S_IRUGO, sbi->s_proc,
proc_create_data(p->name, S_IRUGO, sbi->s_proc, ext4_seq_options_show, sb);
p->fops, sb); proc_create_single_data("es_shrinker_info", S_IRUGO,
sbi->s_proc, ext4_seq_es_shrinker_info_show,
sb);
proc_create_seq_data("mb_groups", S_IRUGO, sbi->s_proc,
&ext4_mb_seq_groups_ops, sb);
} }
return 0; return 0;
} }
...@@ -404,13 +377,9 @@ int ext4_register_sysfs(struct super_block *sb) ...@@ -404,13 +377,9 @@ int ext4_register_sysfs(struct super_block *sb)
void ext4_unregister_sysfs(struct super_block *sb) void ext4_unregister_sysfs(struct super_block *sb)
{ {
struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_sb_info *sbi = EXT4_SB(sb);
const struct ext4_proc_files *p;
if (sbi->s_proc) { if (sbi->s_proc)
for (p = proc_files; p->name; p++) remove_proc_subtree(sb->s_id, ext4_proc_root);
remove_proc_entry(p->name, sbi->s_proc);
remove_proc_entry(sb->s_id, ext4_proc_root);
}
kobject_del(&sbi->s_kobj); kobject_del(&sbi->s_kobj);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment