Commit 75a2d422 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

driver core: class: mark the struct class for sysfs callbacks as constant

struct class should never be modified in a sysfs callback as there is
nothing in the structure to modify, and frankly, the structure is almost
never used in a sysfs callback, so mark it as constant to allow struct
class to be moved to read-only memory.

While we are touching all class sysfs callbacks also mark the attribute
as constant as it can not be modified.  The bonding code still uses this
structure so it can not be removed from the function callbacks.

Cc: "David S. Miller" <davem@davemloft.net>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Miquel Raynal <miquel.raynal@bootlin.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Russ Weight <russell.h.weight@intel.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Steve French <sfrench@samba.org>
Cc: Vignesh Raghavendra <vigneshr@ti.com>
Cc: linux-cifs@vger.kernel.org
Cc: linux-gpio@vger.kernel.org
Cc: linux-mtd@lists.infradead.org
Cc: linux-rdma@vger.kernel.org
Cc: linux-s390@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: netdev@vger.kernel.org
Reviewed-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
Link: https://lore.kernel.org/r/20230325084537.3622280-1-gregkh@linuxfoundation.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8ad266d1
...@@ -512,7 +512,7 @@ static int dlpar_parse_id_type(char **cmd, struct pseries_hp_errorlog *hp_elog) ...@@ -512,7 +512,7 @@ static int dlpar_parse_id_type(char **cmd, struct pseries_hp_errorlog *hp_elog)
return 0; return 0;
} }
static ssize_t dlpar_store(struct class *class, struct class_attribute *attr, static ssize_t dlpar_store(const struct class *class, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct pseries_hp_errorlog hp_elog; struct pseries_hp_errorlog hp_elog;
...@@ -551,7 +551,7 @@ static ssize_t dlpar_store(struct class *class, struct class_attribute *attr, ...@@ -551,7 +551,7 @@ static ssize_t dlpar_store(struct class *class, struct class_attribute *attr,
return rc ? rc : count; return rc ? rc : count;
} }
static ssize_t dlpar_show(struct class *class, struct class_attribute *attr, static ssize_t dlpar_show(const struct class *class, const struct class_attribute *attr,
char *buf) char *buf)
{ {
return sprintf(buf, "%s\n", "memory,cpu"); return sprintf(buf, "%s\n", "memory,cpu");
......
...@@ -787,8 +787,8 @@ int rtas_syscall_dispatch_ibm_suspend_me(u64 handle) ...@@ -787,8 +787,8 @@ int rtas_syscall_dispatch_ibm_suspend_me(u64 handle)
return pseries_migrate_partition(handle); return pseries_migrate_partition(handle);
} }
static ssize_t migration_store(struct class *class, static ssize_t migration_store(const struct class *class,
struct class_attribute *attr, const char *buf, const struct class_attribute *attr, const char *buf,
size_t count) size_t count)
{ {
u64 streamid; u64 streamid;
......
...@@ -482,8 +482,8 @@ void class_interface_unregister(struct class_interface *class_intf) ...@@ -482,8 +482,8 @@ void class_interface_unregister(struct class_interface *class_intf)
} }
EXPORT_SYMBOL_GPL(class_interface_unregister); EXPORT_SYMBOL_GPL(class_interface_unregister);
ssize_t show_class_attr_string(struct class *class, ssize_t show_class_attr_string(const struct class *class,
struct class_attribute *attr, char *buf) const struct class_attribute *attr, char *buf)
{ {
struct class_attribute_string *cs; struct class_attribute_string *cs;
......
...@@ -167,7 +167,7 @@ static int devcd_free(struct device *dev, void *data) ...@@ -167,7 +167,7 @@ static int devcd_free(struct device *dev, void *data)
return 0; return 0;
} }
static ssize_t disabled_show(struct class *class, struct class_attribute *attr, static ssize_t disabled_show(const struct class *class, const struct class_attribute *attr,
char *buf) char *buf)
{ {
return sysfs_emit(buf, "%d\n", devcd_disabled); return sysfs_emit(buf, "%d\n", devcd_disabled);
...@@ -197,7 +197,7 @@ static ssize_t disabled_show(struct class *class, struct class_attribute *attr, ...@@ -197,7 +197,7 @@ static ssize_t disabled_show(struct class *class, struct class_attribute *attr,
* so, above situation would not occur. * so, above situation would not occur.
*/ */
static ssize_t disabled_store(struct class *class, struct class_attribute *attr, static ssize_t disabled_store(const struct class *class, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
long tmp = simple_strtol(buf, NULL, 10); long tmp = simple_strtol(buf, NULL, 10);
......
...@@ -25,7 +25,7 @@ void __fw_load_abort(struct fw_priv *fw_priv) ...@@ -25,7 +25,7 @@ void __fw_load_abort(struct fw_priv *fw_priv)
} }
#ifdef CONFIG_FW_LOADER_USER_HELPER #ifdef CONFIG_FW_LOADER_USER_HELPER
static ssize_t timeout_show(struct class *class, struct class_attribute *attr, static ssize_t timeout_show(const struct class *class, const struct class_attribute *attr,
char *buf) char *buf)
{ {
return sysfs_emit(buf, "%d\n", __firmware_loading_timeout()); return sysfs_emit(buf, "%d\n", __firmware_loading_timeout());
...@@ -44,7 +44,7 @@ static ssize_t timeout_show(struct class *class, struct class_attribute *attr, ...@@ -44,7 +44,7 @@ static ssize_t timeout_show(struct class *class, struct class_attribute *attr,
* *
* Note: zero means 'wait forever'. * Note: zero means 'wait forever'.
**/ **/
static ssize_t timeout_store(struct class *class, struct class_attribute *attr, static ssize_t timeout_store(const struct class *class, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int tmp_loading_timeout = simple_strtol(buf, NULL, 10); int tmp_loading_timeout = simple_strtol(buf, NULL, 10);
......
...@@ -343,7 +343,7 @@ static void class_pktcdvd_release(struct class *cls) ...@@ -343,7 +343,7 @@ static void class_pktcdvd_release(struct class *cls)
kfree(cls); kfree(cls);
} }
static ssize_t device_map_show(struct class *c, struct class_attribute *attr, static ssize_t device_map_show(const struct class *c, const struct class_attribute *attr,
char *data) char *data)
{ {
int n = 0; int n = 0;
...@@ -364,7 +364,7 @@ static ssize_t device_map_show(struct class *c, struct class_attribute *attr, ...@@ -364,7 +364,7 @@ static ssize_t device_map_show(struct class *c, struct class_attribute *attr,
} }
static CLASS_ATTR_RO(device_map); static CLASS_ATTR_RO(device_map);
static ssize_t add_store(struct class *c, struct class_attribute *attr, static ssize_t add_store(const struct class *c, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
unsigned int major, minor; unsigned int major, minor;
...@@ -385,7 +385,7 @@ static ssize_t add_store(struct class *c, struct class_attribute *attr, ...@@ -385,7 +385,7 @@ static ssize_t add_store(struct class *c, struct class_attribute *attr,
} }
static CLASS_ATTR_WO(add); static CLASS_ATTR_WO(add);
static ssize_t remove_store(struct class *c, struct class_attribute *attr, static ssize_t remove_store(const struct class *c, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
unsigned int major, minor; unsigned int major, minor;
......
...@@ -2424,8 +2424,8 @@ static int zram_remove(struct zram *zram) ...@@ -2424,8 +2424,8 @@ static int zram_remove(struct zram *zram)
* creates a new un-initialized zram device and returns back this device's * creates a new un-initialized zram device and returns back this device's
* device_id (or an error code if it fails to create a new device). * device_id (or an error code if it fails to create a new device).
*/ */
static ssize_t hot_add_show(struct class *class, static ssize_t hot_add_show(const struct class *class,
struct class_attribute *attr, const struct class_attribute *attr,
char *buf) char *buf)
{ {
int ret; int ret;
...@@ -2438,11 +2438,10 @@ static ssize_t hot_add_show(struct class *class, ...@@ -2438,11 +2438,10 @@ static ssize_t hot_add_show(struct class *class,
return ret; return ret;
return scnprintf(buf, PAGE_SIZE, "%d\n", ret); return scnprintf(buf, PAGE_SIZE, "%d\n", ret);
} }
static struct class_attribute class_attr_hot_add = static CLASS_ATTR_RO(hot_add);
__ATTR(hot_add, 0400, hot_add_show, NULL);
static ssize_t hot_remove_store(struct class *class, static ssize_t hot_remove_store(const struct class *class,
struct class_attribute *attr, const struct class_attribute *attr,
const char *buf, const char *buf,
size_t count) size_t count)
{ {
......
...@@ -426,8 +426,8 @@ ATTRIBUTE_GROUPS(gpiochip); ...@@ -426,8 +426,8 @@ ATTRIBUTE_GROUPS(gpiochip);
* /sys/class/gpio/unexport ... write-only * /sys/class/gpio/unexport ... write-only
* integer N ... number of GPIO to unexport * integer N ... number of GPIO to unexport
*/ */
static ssize_t export_store(struct class *class, static ssize_t export_store(const struct class *class,
struct class_attribute *attr, const struct class_attribute *attr,
const char *buf, size_t len) const char *buf, size_t len)
{ {
long gpio; long gpio;
...@@ -478,8 +478,8 @@ static ssize_t export_store(struct class *class, ...@@ -478,8 +478,8 @@ static ssize_t export_store(struct class *class,
} }
static CLASS_ATTR_WO(export); static CLASS_ATTR_WO(export);
static ssize_t unexport_store(struct class *class, static ssize_t unexport_store(const struct class *class,
struct class_attribute *attr, const struct class_attribute *attr,
const char *buf, size_t len) const char *buf, size_t len)
{ {
long gpio; long gpio;
......
...@@ -1229,8 +1229,8 @@ static char *umad_devnode(const struct device *dev, umode_t *mode) ...@@ -1229,8 +1229,8 @@ static char *umad_devnode(const struct device *dev, umode_t *mode)
return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev)); return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev));
} }
static ssize_t abi_version_show(struct class *class, static ssize_t abi_version_show(const struct class *class,
struct class_attribute *attr, char *buf) const struct class_attribute *attr, char *buf)
{ {
return sysfs_emit(buf, "%d\n", IB_USER_MAD_ABI_VERSION); return sysfs_emit(buf, "%d\n", IB_USER_MAD_ABI_VERSION);
} }
......
...@@ -95,7 +95,7 @@ static DEFINE_SPINLOCK(ubi_devices_lock); ...@@ -95,7 +95,7 @@ static DEFINE_SPINLOCK(ubi_devices_lock);
/* "Show" method for files in '/<sysfs>/class/ubi/' */ /* "Show" method for files in '/<sysfs>/class/ubi/' */
/* UBI version attribute ('/<sysfs>/class/ubi/version') */ /* UBI version attribute ('/<sysfs>/class/ubi/version') */
static ssize_t version_show(struct class *class, struct class_attribute *attr, static ssize_t version_show(const struct class *class, const struct class_attribute *attr,
char *buf) char *buf)
{ {
return sprintf(buf, "%d\n", UBI_VERSION); return sprintf(buf, "%d\n", UBI_VERSION);
......
...@@ -31,12 +31,12 @@ ...@@ -31,12 +31,12 @@
/* "show" function for the bond_masters attribute. /* "show" function for the bond_masters attribute.
* The class parameter is ignored. * The class parameter is ignored.
*/ */
static ssize_t bonding_show_bonds(struct class *cls, static ssize_t bonding_show_bonds(const struct class *cls,
struct class_attribute *attr, const struct class_attribute *attr,
char *buf) char *buf)
{ {
struct bond_net *bn = const struct bond_net *bn =
container_of(attr, struct bond_net, class_attr_bonding_masters); container_of_const(attr, struct bond_net, class_attr_bonding_masters);
int res = 0; int res = 0;
struct bonding *bond; struct bonding *bond;
...@@ -59,7 +59,7 @@ static ssize_t bonding_show_bonds(struct class *cls, ...@@ -59,7 +59,7 @@ static ssize_t bonding_show_bonds(struct class *cls,
return res; return res;
} }
static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifname) static struct net_device *bond_get_by_name(const struct bond_net *bn, const char *ifname)
{ {
struct bonding *bond; struct bonding *bond;
...@@ -75,12 +75,12 @@ static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifna ...@@ -75,12 +75,12 @@ static struct net_device *bond_get_by_name(struct bond_net *bn, const char *ifna
* *
* The class parameter is ignored. * The class parameter is ignored.
*/ */
static ssize_t bonding_store_bonds(struct class *cls, static ssize_t bonding_store_bonds(const struct class *cls,
struct class_attribute *attr, const struct class_attribute *attr,
const char *buffer, size_t count) const char *buffer, size_t count)
{ {
struct bond_net *bn = const struct bond_net *bn =
container_of(attr, struct bond_net, class_attr_bonding_masters); container_of_const(attr, struct bond_net, class_attr_bonding_masters);
char command[IFNAMSIZ + 1] = {0, }; char command[IFNAMSIZ + 1] = {0, };
char *ifname; char *ifname;
int rv, res = count; int rv, res = count;
......
...@@ -340,8 +340,8 @@ static const struct attribute_group *zcdn_dev_attr_groups[] = { ...@@ -340,8 +340,8 @@ static const struct attribute_group *zcdn_dev_attr_groups[] = {
NULL NULL
}; };
static ssize_t zcdn_create_store(struct class *class, static ssize_t zcdn_create_store(const struct class *class,
struct class_attribute *attr, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int rc; int rc;
...@@ -357,8 +357,8 @@ static ssize_t zcdn_create_store(struct class *class, ...@@ -357,8 +357,8 @@ static ssize_t zcdn_create_store(struct class *class,
static const struct class_attribute class_attr_zcdn_create = static const struct class_attribute class_attr_zcdn_create =
__ATTR(create, 0600, NULL, zcdn_create_store); __ATTR(create, 0600, NULL, zcdn_create_store);
static ssize_t zcdn_destroy_store(struct class *class, static ssize_t zcdn_destroy_store(const struct class *class,
struct class_attribute *attr, const struct class_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int rc; int rc;
......
...@@ -418,7 +418,7 @@ int server_queue_ctrl_reset_work(void) ...@@ -418,7 +418,7 @@ int server_queue_ctrl_reset_work(void)
return __queue_ctrl_work(SERVER_CTRL_TYPE_RESET); return __queue_ctrl_work(SERVER_CTRL_TYPE_RESET);
} }
static ssize_t stats_show(struct class *class, struct class_attribute *attr, static ssize_t stats_show(const struct class *class, const struct class_attribute *attr,
char *buf) char *buf)
{ {
/* /*
...@@ -437,8 +437,8 @@ static ssize_t stats_show(struct class *class, struct class_attribute *attr, ...@@ -437,8 +437,8 @@ static ssize_t stats_show(struct class *class, struct class_attribute *attr,
server_conf.ipc_last_active / HZ); server_conf.ipc_last_active / HZ);
} }
static ssize_t kill_server_store(struct class *class, static ssize_t kill_server_store(const struct class *class,
struct class_attribute *attr, const char *buf, const struct class_attribute *attr, const char *buf,
size_t len) size_t len)
{ {
if (!sysfs_streq(buf, "hard")) if (!sysfs_streq(buf, "hard"))
...@@ -458,7 +458,7 @@ static const char * const debug_type_strings[] = {"smb", "auth", "vfs", ...@@ -458,7 +458,7 @@ static const char * const debug_type_strings[] = {"smb", "auth", "vfs",
"oplock", "ipc", "conn", "oplock", "ipc", "conn",
"rdma"}; "rdma"};
static ssize_t debug_show(struct class *class, struct class_attribute *attr, static ssize_t debug_show(const struct class *class, const struct class_attribute *attr,
char *buf) char *buf)
{ {
ssize_t sz = 0; ssize_t sz = 0;
...@@ -476,7 +476,7 @@ static ssize_t debug_show(struct class *class, struct class_attribute *attr, ...@@ -476,7 +476,7 @@ static ssize_t debug_show(struct class *class, struct class_attribute *attr,
return sz; return sz;
} }
static ssize_t debug_store(struct class *class, struct class_attribute *attr, static ssize_t debug_store(const struct class *class, const struct class_attribute *attr,
const char *buf, size_t len) const char *buf, size_t len)
{ {
int i; int i;
......
...@@ -174,10 +174,10 @@ static inline struct device *class_find_device_by_acpi_dev(const struct class *c ...@@ -174,10 +174,10 @@ static inline struct device *class_find_device_by_acpi_dev(const struct class *c
struct class_attribute { struct class_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct class *class, struct class_attribute *attr, ssize_t (*show)(const struct class *class, const struct class_attribute *attr,
char *buf); char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr, ssize_t (*store)(const struct class *class, const struct class_attribute *attr,
const char *buf, size_t count); const char *buf, size_t count);
}; };
#define CLASS_ATTR_RW(_name) \ #define CLASS_ATTR_RW(_name) \
...@@ -217,7 +217,8 @@ struct class_attribute_string { ...@@ -217,7 +217,8 @@ struct class_attribute_string {
struct class_attribute_string class_attr_##_name = \ struct class_attribute_string class_attr_##_name = \
_CLASS_ATTR_STRING(_name, _mode, _str) _CLASS_ATTR_STRING(_name, _mode, _str)
ssize_t show_class_attr_string(struct class *class, struct class_attribute *attr, char *buf); ssize_t show_class_attr_string(const struct class *class, const struct class_attribute *attr,
char *buf);
struct class_interface { struct class_interface {
struct list_head node; struct list_head node;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment