lkml.org 
[lkml]   [2008]   [Oct]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 28/42] ext4: Combine proc file handling into a single set of functions
    Date
    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: "Theodore Ts'o" <tytso@mit.edu>
    ---
    fs/ext4/ext4.h | 16 ++++++++++++
    fs/ext4/ext4_sb.h | 12 ++++----
    fs/ext4/mballoc.c | 69 ++++------------------------------------------------
    fs/ext4/super.c | 42 ++++++++++++++++++++++++++++++++
    4 files changed, 70 insertions(+), 69 deletions(-)

    diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
    index b9c9371..163c445 100644
    --- a/fs/ext4/ext4.h
    +++ b/fs/ext4/ext4.h
    @@ -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;

    +#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
    */
    diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
    index 95e046e..f92af01 100644
    --- a/fs/ext4/ext4_sb.h
    +++ b/fs/ext4/ext4_sb.h
    @@ -108,12 +108,12 @@ struct ext4_sb_info {

    /* tunables */
    unsigned long s_stripe;
    - unsigned long s_mb_stream_request;
    - unsigned long s_mb_max_to_scan;
    - unsigned long s_mb_min_to_scan;
    - unsigned long s_mb_stats;
    - unsigned long s_mb_order2_reqs;
    - unsigned long s_mb_group_prealloc;
    + unsigned int s_mb_stream_request;
    + unsigned int s_mb_max_to_scan;
    + unsigned int s_mb_min_to_scan;
    + unsigned int s_mb_stats;
    + unsigned int s_mb_order2_reqs;
    + unsigned int s_mb_group_prealloc;
    /* where last allocation was done - for stream allocation */
    unsigned long s_mb_last_group;
    unsigned long s_mb_last_start;
    diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
    index 705870c..3373f89 100644
    --- a/fs/ext4/mballoc.c
    +++ b/fs/ext4/mballoc.c
    @@ -2721,63 +2721,6 @@ ext4_mb_free_committed_blocks(struct super_block *sb)
    #define EXT4_MB_STREAM_REQ "stream_req"
    #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)
    {
    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)
    return -EINVAL;

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

    err_out:
    diff --git a/fs/ext4/super.c b/fs/ext4/super.c
    index 7feeec6..9f5468f 100644
    --- a/fs/ext4/super.c
    +++ b/fs/ext4/super.c
    @@ -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);
    }

    +#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 = {
    .owner = THIS_MODULE,
    .name = "ext4dev",
    --
    1.5.6.1.205.ge2c7.dirty


    \
     
     \ /
      Last update: 2008-10-09 06:17    [W:0.048 / U:91.780 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site