Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e8814f2 authored by Theodore Ts'o's avatar Theodore Ts'o
Browse files

ext4: Combine proc file handling into a single set of functions



Previously mballoc created a separate set of functions for each proc
file.  This combines the tunables into a single set of functions which
gets used for all of the per-superblock proc files, saving
approximately 2k of compiled object code.

Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 9f6200bb
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -957,6 +957,22 @@ void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,


extern struct proc_dir_entry *ext4_proc_root;
extern struct proc_dir_entry *ext4_proc_root;


#ifdef CONFIG_PROC_FS
extern const struct file_operations ext4_ui_proc_fops;

#define	EXT4_PROC_HANDLER(name, var)					\
do {									\
	proc = proc_create_data(name, mode, sbi->s_proc,		\
				&ext4_ui_proc_fops, &sbi->s_##var);	\
	if (proc == NULL) {						\
		printk(KERN_ERR "EXT4-fs: can't create %s\n", name);	\
		goto err_out;						\
	}								\
} while (0)
#else
#define EXT4_PROC_HANDLER(name, var)
#endif

/*
/*
 * Function prototypes
 * Function prototypes
 */
 */
+6 −6
Original line number Original line Diff line number Diff line
@@ -108,12 +108,12 @@ struct ext4_sb_info {


	/* tunables */
	/* tunables */
	unsigned long s_stripe;
	unsigned long s_stripe;
	unsigned long s_mb_stream_request;
	unsigned int s_mb_stream_request;
	unsigned long s_mb_max_to_scan;
	unsigned int s_mb_max_to_scan;
	unsigned long s_mb_min_to_scan;
	unsigned int s_mb_min_to_scan;
	unsigned long s_mb_stats;
	unsigned int s_mb_stats;
	unsigned long s_mb_order2_reqs;
	unsigned int s_mb_order2_reqs;
	unsigned long s_mb_group_prealloc;
	unsigned int s_mb_group_prealloc;
	/* where last allocation was done - for stream allocation */
	/* where last allocation was done - for stream allocation */
	unsigned long s_mb_last_group;
	unsigned long s_mb_last_group;
	unsigned long s_mb_last_start;
	unsigned long s_mb_last_start;
+6 −63
Original line number Original line Diff line number Diff line
@@ -2721,63 +2721,6 @@ ext4_mb_free_committed_blocks(struct super_block *sb)
#define EXT4_MB_STREAM_REQ		"stream_req"
#define EXT4_MB_STREAM_REQ		"stream_req"
#define EXT4_MB_GROUP_PREALLOC		"group_prealloc"
#define EXT4_MB_GROUP_PREALLOC		"group_prealloc"


#define MB_PROC_FOPS(name)					\
static int ext4_mb_##name##_proc_show(struct seq_file *m, void *v)	\
{								\
	struct ext4_sb_info *sbi = m->private;			\
								\
	seq_printf(m, "%ld\n", sbi->s_mb_##name);		\
	return 0;						\
}								\
								\
static int ext4_mb_##name##_proc_open(struct inode *inode, struct file *file)\
{								\
	return single_open(file, ext4_mb_##name##_proc_show, PDE(inode)->data);\
}								\
								\
static ssize_t ext4_mb_##name##_proc_write(struct file *file,	\
		const char __user *buf, size_t cnt, loff_t *ppos)	\
{								\
	struct ext4_sb_info *sbi = PDE(file->f_path.dentry->d_inode)->data;\
	char str[32];						\
	long value;						\
	if (cnt >= sizeof(str))					\
		return -EINVAL;					\
	if (copy_from_user(str, buf, cnt))			\
		return -EFAULT;					\
	value = simple_strtol(str, NULL, 0);			\
	if (value <= 0)						\
		return -ERANGE;					\
	sbi->s_mb_##name = value;				\
	return cnt;						\
}								\
								\
static const struct file_operations ext4_mb_##name##_proc_fops = {	\
	.owner		= THIS_MODULE,				\
	.open		= ext4_mb_##name##_proc_open,		\
	.read		= seq_read,				\
	.llseek		= seq_lseek,				\
	.release	= single_release,			\
	.write		= ext4_mb_##name##_proc_write,		\
};

MB_PROC_FOPS(stats);
MB_PROC_FOPS(max_to_scan);
MB_PROC_FOPS(min_to_scan);
MB_PROC_FOPS(order2_reqs);
MB_PROC_FOPS(stream_request);
MB_PROC_FOPS(group_prealloc);

#define	MB_PROC_HANDLER(name, var)					\
do {									\
	proc = proc_create_data(name, mode, sbi->s_proc,		\
				&ext4_mb_##var##_proc_fops, sbi);	\
	if (proc == NULL) {						\
		printk(KERN_ERR "EXT4-fs: can't to create %s\n", name);	\
		goto err_out;						\
	}								\
} while (0)

static int ext4_mb_init_per_dev_proc(struct super_block *sb)
static int ext4_mb_init_per_dev_proc(struct super_block *sb)
{
{
	mode_t mode = S_IFREG | S_IRUGO | S_IWUSR;
	mode_t mode = S_IFREG | S_IRUGO | S_IWUSR;
@@ -2787,12 +2730,12 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)
	if (sbi->s_proc == NULL)
	if (sbi->s_proc == NULL)
		return -EINVAL;
		return -EINVAL;


	MB_PROC_HANDLER(EXT4_MB_STATS_NAME, stats);
	EXT4_PROC_HANDLER(EXT4_MB_STATS_NAME, mb_stats);
	MB_PROC_HANDLER(EXT4_MB_MAX_TO_SCAN_NAME, max_to_scan);
	EXT4_PROC_HANDLER(EXT4_MB_MAX_TO_SCAN_NAME, mb_max_to_scan);
	MB_PROC_HANDLER(EXT4_MB_MIN_TO_SCAN_NAME, min_to_scan);
	EXT4_PROC_HANDLER(EXT4_MB_MIN_TO_SCAN_NAME, mb_min_to_scan);
	MB_PROC_HANDLER(EXT4_MB_ORDER2_REQ, order2_reqs);
	EXT4_PROC_HANDLER(EXT4_MB_ORDER2_REQ, mb_order2_reqs);
	MB_PROC_HANDLER(EXT4_MB_STREAM_REQ, stream_request);
	EXT4_PROC_HANDLER(EXT4_MB_STREAM_REQ, mb_stream_request);
	MB_PROC_HANDLER(EXT4_MB_GROUP_PREALLOC, group_prealloc);
	EXT4_PROC_HANDLER(EXT4_MB_GROUP_PREALLOC, mb_group_prealloc);
	return 0;
	return 0;


err_out:
err_out:
+42 −0
Original line number Original line Diff line number Diff line
@@ -3541,6 +3541,48 @@ static int ext4_get_sb(struct file_system_type *fs_type,
	return get_sb_bdev(fs_type, flags, dev_name, data, ext4_fill_super, mnt);
	return get_sb_bdev(fs_type, flags, dev_name, data, ext4_fill_super, mnt);
}
}


#ifdef CONFIG_PROC_FS
static int ext4_ui_proc_show(struct seq_file *m, void *v)
{
	unsigned int *p = m->private;

	seq_printf(m, "%u\n", *p);
	return 0;
}

static int ext4_ui_proc_open(struct inode *inode, struct file *file)
{
	return single_open(file, ext4_ui_proc_show, PDE(inode)->data);
}

static ssize_t ext4_ui_proc_write(struct file *file, const char __user *buf,
			       size_t cnt, loff_t *ppos)
{
	unsigned int *p = PDE(file->f_path.dentry->d_inode)->data;
	char str[32];
	unsigned long value;

	if (cnt >= sizeof(str))
		return -EINVAL;
	if (copy_from_user(str, buf, cnt))
		return -EFAULT;
	value = simple_strtol(str, NULL, 0);
	if (value < 0)
		return -ERANGE;
	*p = value;
	return cnt;
}

const struct file_operations ext4_ui_proc_fops = {
	.owner		= THIS_MODULE,
	.open		= ext4_ui_proc_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
	.write		= ext4_ui_proc_write,
};
#endif

static struct file_system_type ext4dev_fs_type = {
static struct file_system_type ext4dev_fs_type = {
	.owner		= THIS_MODULE,
	.owner		= THIS_MODULE,
	.name		= "ext4dev",
	.name		= "ext4dev",