]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blame - drivers/md/bcache/sysfs.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[mirror_ubuntu-kernels.git] / drivers / md / bcache / sysfs.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
cafe5635
KO
2#ifndef _BCACHE_SYSFS_H_
3#define _BCACHE_SYSFS_H_
4
5#define KTYPE(type) \
6struct kobj_type type ## _ktype = { \
7 .release = type ## _release, \
8 .sysfs_ops = &((const struct sysfs_ops) { \
9 .show = type ## _show, \
10 .store = type ## _store \
11 }), \
12 .default_attrs = type ## _files \
13}
14
15#define SHOW(fn) \
16static ssize_t fn ## _show(struct kobject *kobj, struct attribute *attr,\
17 char *buf) \
18
19#define STORE(fn) \
20static ssize_t fn ## _store(struct kobject *kobj, struct attribute *attr,\
21 const char *buf, size_t size) \
22
23#define SHOW_LOCKED(fn) \
24SHOW(fn) \
25{ \
26 ssize_t ret; \
27 mutex_lock(&bch_register_lock); \
28 ret = __ ## fn ## _show(kobj, attr, buf); \
29 mutex_unlock(&bch_register_lock); \
30 return ret; \
31}
32
33#define STORE_LOCKED(fn) \
34STORE(fn) \
35{ \
36 ssize_t ret; \
37 mutex_lock(&bch_register_lock); \
38 ret = __ ## fn ## _store(kobj, attr, buf, size); \
39 mutex_unlock(&bch_register_lock); \
40 return ret; \
41}
42
43#define __sysfs_attribute(_name, _mode) \
44 static struct attribute sysfs_##_name = \
45 { .name = #_name, .mode = _mode }
46
47#define write_attribute(n) __sysfs_attribute(n, S_IWUSR)
48#define read_attribute(n) __sysfs_attribute(n, S_IRUGO)
49#define rw_attribute(n) __sysfs_attribute(n, S_IRUGO|S_IWUSR)
50
51#define sysfs_printf(file, fmt, ...) \
52do { \
53 if (attr == &sysfs_ ## file) \
54 return snprintf(buf, PAGE_SIZE, fmt "\n", __VA_ARGS__); \
55} while (0)
56
57#define sysfs_print(file, var) \
58do { \
59 if (attr == &sysfs_ ## file) \
60 return snprint(buf, PAGE_SIZE, var); \
61} while (0)
62
63#define sysfs_hprint(file, val) \
64do { \
65 if (attr == &sysfs_ ## file) { \
169ef1cf 66 ssize_t ret = bch_hprint(buf, val); \
cafe5635
KO
67 strcat(buf, "\n"); \
68 return ret + 1; \
69 } \
70} while (0)
71
72#define var_printf(_var, fmt) sysfs_printf(_var, fmt, var(_var))
73#define var_print(_var) sysfs_print(_var, var(_var))
74#define var_hprint(_var) sysfs_hprint(_var, var(_var))
75
76#define sysfs_strtoul(file, var) \
77do { \
78 if (attr == &sysfs_ ## file) \
79 return strtoul_safe(buf, var) ?: (ssize_t) size; \
80} while (0)
81
82#define sysfs_strtoul_clamp(file, var, min, max) \
83do { \
84 if (attr == &sysfs_ ## file) \
85 return strtoul_safe_clamp(buf, var, min, max) \
86 ?: (ssize_t) size; \
87} while (0)
88
89#define strtoul_or_return(cp) \
90({ \
91 unsigned long _v; \
92 int _r = kstrtoul(cp, 10, &_v); \
93 if (_r) \
94 return _r; \
95 _v; \
96})
97
98#define strtoi_h_or_return(cp, v) \
99do { \
100 int _r = strtoi_h(cp, &v); \
101 if (_r) \
102 return _r; \
103} while (0)
104
105#define sysfs_hatoi(file, var) \
106do { \
107 if (attr == &sysfs_ ## file) \
108 return strtoi_h(buf, &var) ?: (ssize_t) size; \
109} while (0)
110
111#endif /* _BCACHE_SYSFS_H_ */