^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _BCACHE_SYSFS_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _BCACHE_SYSFS_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #define KTYPE(type) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) struct kobj_type type ## _ktype = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) .release = type ## _release, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) .sysfs_ops = &((const struct sysfs_ops) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) .show = type ## _show, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) .store = type ## _store \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) }), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) .default_attrs = type ## _files \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define SHOW(fn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static ssize_t fn ## _show(struct kobject *kobj, struct attribute *attr,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) char *buf) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define STORE(fn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static ssize_t fn ## _store(struct kobject *kobj, struct attribute *attr,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) const char *buf, size_t size) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define SHOW_LOCKED(fn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) SHOW(fn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) ssize_t ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) mutex_lock(&bch_register_lock); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ret = __ ## fn ## _show(kobj, attr, buf); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) mutex_unlock(&bch_register_lock); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) return ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define STORE_LOCKED(fn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) STORE(fn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ssize_t ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) mutex_lock(&bch_register_lock); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ret = __ ## fn ## _store(kobj, attr, buf, size); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) mutex_unlock(&bch_register_lock); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) return ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define __sysfs_attribute(_name, _mode) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static struct attribute sysfs_##_name = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) { .name = #_name, .mode = _mode }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define write_attribute(n) __sysfs_attribute(n, 0200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define read_attribute(n) __sysfs_attribute(n, 0444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define rw_attribute(n) __sysfs_attribute(n, 0644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define sysfs_printf(file, fmt, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (attr == &sysfs_ ## file) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return snprintf(buf, PAGE_SIZE, fmt "\n", __VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define sysfs_print(file, var) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (attr == &sysfs_ ## file) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) return snprint(buf, PAGE_SIZE, var); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define sysfs_hprint(file, val) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if (attr == &sysfs_ ## file) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ssize_t ret = bch_hprint(buf, val); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) strcat(buf, "\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return ret + 1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define var_printf(_var, fmt) sysfs_printf(_var, fmt, var(_var))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define var_print(_var) sysfs_print(_var, var(_var))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define var_hprint(_var) sysfs_hprint(_var, var(_var))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define sysfs_strtoul(file, var) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (attr == &sysfs_ ## file) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) return strtoul_safe(buf, var) ?: (ssize_t) size; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define sysfs_strtoul_bool(file, var) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) if (attr == &sysfs_ ## file) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) unsigned long v = strtoul_or_return(buf); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) var = v ? 1 : 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return size; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define sysfs_strtoul_clamp(file, var, min, max) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (attr == &sysfs_ ## file) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) unsigned long v = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ssize_t ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ret = strtoul_safe_clamp(buf, v, min, max); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (!ret) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) var = v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return size; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define strtoul_or_return(cp) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) unsigned long _v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) int _r = kstrtoul(cp, 10, &_v); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (_r) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return _r; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) _v; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define strtoi_h_or_return(cp, v) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) int _r = strtoi_h(cp, &v); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (_r) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return _r; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define sysfs_hatoi(file, var) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) if (attr == &sysfs_ ## file) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) return strtoi_h(buf, &var) ?: (ssize_t) size; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #endif /* _BCACHE_SYSFS_H_ */