1 ext4: add support for adding boolean toggles to ext4's sysfs directory
3 Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
5 fs/ext4/super.c | 36 +++++++++++++++++++++++++++++++++---
6 1 file changed, 33 insertions(+), 3 deletions(-)
8 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
9 index 85b3dd6..d31f51b 100644
12 @@ -2400,6 +2400,7 @@ struct ext4_attr {
19 static int parse_strtoull(const char *buf,
20 @@ -2532,7 +2533,33 @@ static ssize_t sbi_deprecated_show(struct ext4_attr *a,
21 return snprintf(buf, PAGE_SIZE, "%d\n", a->u.deprecated_val);
24 -#define EXT4_ATTR_OFFSET(_name,_mode,_show,_store,_elname) \
25 +static ssize_t sbi_bool_show(struct ext4_attr *a,
26 + struct ext4_sb_info *sbi, char *buf)
28 + unsigned int *ui = (unsigned int *) (((char *) sbi) + a->u.offset);
30 + return snprintf(buf, PAGE_SIZE, "%d\n",
31 + ((*ui & a->mask) == 0) ? 0 : 1);
34 +static ssize_t sbi_bool_store(struct ext4_attr *a,
35 + struct ext4_sb_info *sbi,
36 + const char *buf, size_t count)
38 + unsigned int *ui = (unsigned int *) (((char *) sbi) + a->u.offset);
39 + unsigned long long t;
41 + if (parse_strtoull(buf, 0xffffffff, &t))
51 +#define EXT4_ATTR_OFFSET(_name,_mode,_show,_store,_elname,_mask)\
52 static struct ext4_attr ext4_attr_##_name = { \
53 .attr = {.name = __stringify(_name), .mode = _mode }, \
55 @@ -2540,6 +2567,7 @@ static struct ext4_attr ext4_attr_##_name = { \
57 .offset = offsetof(struct ext4_sb_info, _elname),\
61 #define EXT4_ATTR(name, mode, show, store) \
62 static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store)
63 @@ -2548,7 +2576,9 @@ static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store)
64 #define EXT4_RO_ATTR(name) EXT4_ATTR(name, 0444, name##_show, NULL)
65 #define EXT4_RW_ATTR(name) EXT4_ATTR(name, 0644, name##_show, name##_store)
66 #define EXT4_RW_ATTR_SBI_UI(name, elname) \
67 - EXT4_ATTR_OFFSET(name, 0644, sbi_ui_show, sbi_ui_store, elname)
68 + EXT4_ATTR_OFFSET(name, 0644, sbi_ui_show, sbi_ui_store, elname, 0)
69 +#define EXT4_RW_ATTR_SBI_BOOL(name, elname, mask) \
70 +EXT4_ATTR_OFFSET(name, 0644, sbi_bool_show, sbi_bool_store, elname, mask)
71 #define ATTR_LIST(name) &ext4_attr_##name.attr
72 #define EXT4_DEPRECATED_ATTR(_name, _val) \
73 static struct ext4_attr ext4_attr_##_name = { \
74 @@ -2564,7 +2594,7 @@ EXT4_RO_ATTR(session_write_kbytes);
75 EXT4_RO_ATTR(lifetime_write_kbytes);
76 EXT4_RW_ATTR(reserved_clusters);
77 EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
78 - inode_readahead_blks_store, s_inode_readahead_blks);
79 + inode_readahead_blks_store, s_inode_readahead_blks, 0);
80 EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
81 EXT4_RW_ATTR_SBI_UI(mb_stats, s_mb_stats);
82 EXT4_RW_ATTR_SBI_UI(mb_max_to_scan, s_mb_max_to_scan);