mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
kobject: Allow the constification of kobject attributes
Allow kobject attribute to reside in read-only memory. Both const and non-const attributes are handled by the utility macros and attributes can be migrated one-by-one. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Link: https://patch.msgid.link/20260707-sysfs-const-attr-kobj-attr-prep-v2-3-35ae1bc0f9ef@weissschuh.net Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
committed by
Danilo Krummrich
parent
a3a9c7453f
commit
ed96337a5b
+51
-6
@@ -138,17 +138,62 @@ struct kset_uevent_ops {
|
||||
|
||||
struct kobj_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
char *buf);
|
||||
ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
__SYSFS_FUNCTION_ALTERNATIVE(
|
||||
ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
|
||||
ssize_t (*show_const)(struct kobject *kobj, const struct kobj_attribute *attr,
|
||||
char *buf);
|
||||
);
|
||||
__SYSFS_FUNCTION_ALTERNATIVE(
|
||||
ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
ssize_t (*store_const)(struct kobject *kobj, const struct kobj_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
);
|
||||
};
|
||||
|
||||
typedef ssize_t __kobj_show_handler_const(struct kobject *kobj, const struct kobj_attribute *attr,
|
||||
char *buf);
|
||||
typedef ssize_t __kobj_store_handler_const(struct kobject *kobj, const struct kobj_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
|
||||
#ifdef CONFIG_CFI
|
||||
|
||||
#define __KOBJ_ATTR_SHOW_STORE(_show, _store) \
|
||||
.show = _Generic(_show, \
|
||||
__kobj_show_handler_const * : NULL, \
|
||||
default : _show \
|
||||
), \
|
||||
.show_const = _Generic(_show, \
|
||||
__kobj_show_handler_const * : _show, \
|
||||
default : NULL \
|
||||
), \
|
||||
.store = _Generic(_store, \
|
||||
__kobj_store_handler_const * : NULL, \
|
||||
default : _store \
|
||||
), \
|
||||
.store_const = _Generic(_store, \
|
||||
__kobj_store_handler_const * : _store, \
|
||||
default : NULL \
|
||||
),
|
||||
|
||||
#else
|
||||
|
||||
#define __KOBJ_ATTR_SHOW_STORE(_show, _store) \
|
||||
.show = _Generic(_show, \
|
||||
__kobj_show_handler_const * : (void *)_show, \
|
||||
default : _show \
|
||||
), \
|
||||
.store = _Generic(_store, \
|
||||
__kobj_store_handler_const * : (void *)_store, \
|
||||
default : _store \
|
||||
), \
|
||||
|
||||
#endif
|
||||
|
||||
#define __KOBJ_ATTR(_name, _mode, _show, _store) { \
|
||||
.attr = { .name = __stringify(_name), \
|
||||
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
|
||||
.show = _show, \
|
||||
.store = _store, \
|
||||
__KOBJ_ATTR_SHOW_STORE(_show, _store) \
|
||||
}
|
||||
|
||||
#define __KOBJ_ATTR_RO_MODE(_name, _mode) \
|
||||
|
||||
+6
-2
@@ -823,9 +823,11 @@ static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
|
||||
struct kobj_attribute *kattr;
|
||||
ssize_t ret = -EIO;
|
||||
|
||||
kattr = container_of(attr, struct kobj_attribute, attr);
|
||||
kattr = container_of_const(attr, struct kobj_attribute, attr);
|
||||
if (kattr->show)
|
||||
ret = kattr->show(kobj, kattr, buf);
|
||||
else if (kattr->show_const)
|
||||
ret = kattr->show_const(kobj, kattr, buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -835,9 +837,11 @@ static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
|
||||
struct kobj_attribute *kattr;
|
||||
ssize_t ret = -EIO;
|
||||
|
||||
kattr = container_of(attr, struct kobj_attribute, attr);
|
||||
kattr = container_of_const(attr, struct kobj_attribute, attr);
|
||||
if (kattr->store)
|
||||
ret = kattr->store(kobj, kattr, buf, count);
|
||||
else if (kattr->store_const)
|
||||
ret = kattr->store_const(kobj, kattr, buf, count);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user