mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	driver core: make kobj_type constant.
This way instances of kobj_type (which contain function pointers) can be stored in .rodata, which means that they cannot be [easily/accidentally] modified at runtime. Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com> Link: https://lore.kernel.org/r/20211224231345.777370-1-wedsonaf@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									67e532a42c
								
							
						
					
					
						commit
						ee6d3dd4ed
					
				
					 6 changed files with 13 additions and 13 deletions
				
			
		|  | @ -118,7 +118,7 @@ Initialization of kobjects | |||
| Code which creates a kobject must, of course, initialize that object. Some | ||||
| of the internal fields are setup with a (mandatory) call to kobject_init():: | ||||
| 
 | ||||
|     void kobject_init(struct kobject *kobj, struct kobj_type *ktype); | ||||
|     void kobject_init(struct kobject *kobj, const struct kobj_type *ktype); | ||||
| 
 | ||||
| The ktype is required for a kobject to be created properly, as every kobject | ||||
| must have an associated kobj_type.  After calling kobject_init(), to | ||||
|  | @ -156,7 +156,7 @@ kobject_name():: | |||
| There is a helper function to both initialize and add the kobject to the | ||||
| kernel at the same time, called surprisingly enough kobject_init_and_add():: | ||||
| 
 | ||||
|     int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, | ||||
|     int kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype, | ||||
|                              struct kobject *parent, const char *fmt, ...); | ||||
| 
 | ||||
| The arguments are the same as the individual kobject_init() and | ||||
|  |  | |||
|  | @ -165,7 +165,7 @@ static struct kobj_type bus_ktype = { | |||
| 
 | ||||
| static int bus_uevent_filter(struct kset *kset, struct kobject *kobj) | ||||
| { | ||||
| 	struct kobj_type *ktype = get_ktype(kobj); | ||||
| 	const struct kobj_type *ktype = get_ktype(kobj); | ||||
| 
 | ||||
| 	if (ktype == &bus_ktype) | ||||
| 		return 1; | ||||
|  |  | |||
|  | @ -2263,7 +2263,7 @@ static struct kobj_type device_ktype = { | |||
| 
 | ||||
| static int dev_uevent_filter(struct kset *kset, struct kobject *kobj) | ||||
| { | ||||
| 	struct kobj_type *ktype = get_ktype(kobj); | ||||
| 	const struct kobj_type *ktype = get_ktype(kobj); | ||||
| 
 | ||||
| 	if (ktype == &device_ktype) { | ||||
| 		struct device *dev = kobj_to_dev(kobj); | ||||
|  |  | |||
|  | @ -66,7 +66,7 @@ struct kobject { | |||
| 	struct list_head	entry; | ||||
| 	struct kobject		*parent; | ||||
| 	struct kset		*kset; | ||||
| 	struct kobj_type	*ktype; | ||||
| 	const struct kobj_type	*ktype; | ||||
| 	struct kernfs_node	*sd; /* sysfs directory entry */ | ||||
| 	struct kref		kref; | ||||
| #ifdef CONFIG_DEBUG_KOBJECT_RELEASE | ||||
|  | @ -90,13 +90,13 @@ static inline const char *kobject_name(const struct kobject *kobj) | |||
| 	return kobj->name; | ||||
| } | ||||
| 
 | ||||
| extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype); | ||||
| extern void kobject_init(struct kobject *kobj, const struct kobj_type *ktype); | ||||
| extern __printf(3, 4) __must_check | ||||
| int kobject_add(struct kobject *kobj, struct kobject *parent, | ||||
| 		const char *fmt, ...); | ||||
| extern __printf(4, 5) __must_check | ||||
| int kobject_init_and_add(struct kobject *kobj, | ||||
| 			 struct kobj_type *ktype, struct kobject *parent, | ||||
| 			 const struct kobj_type *ktype, struct kobject *parent, | ||||
| 			 const char *fmt, ...); | ||||
| 
 | ||||
| extern void kobject_del(struct kobject *kobj); | ||||
|  | @ -217,7 +217,7 @@ static inline void kset_put(struct kset *k) | |||
| 	kobject_put(&k->kobj); | ||||
| } | ||||
| 
 | ||||
| static inline struct kobj_type *get_ktype(struct kobject *kobj) | ||||
| static inline const struct kobj_type *get_ktype(struct kobject *kobj) | ||||
| { | ||||
| 	return kobj->ktype; | ||||
| } | ||||
|  |  | |||
|  | @ -928,7 +928,7 @@ static const struct sysfs_ops module_sysfs_ops = { | |||
| 
 | ||||
| static int uevent_filter(struct kset *kset, struct kobject *kobj) | ||||
| { | ||||
| 	struct kobj_type *ktype = get_ktype(kobj); | ||||
| 	const struct kobj_type *ktype = get_ktype(kobj); | ||||
| 
 | ||||
| 	if (ktype == &module_ktype) | ||||
| 		return 1; | ||||
|  |  | |||
|  | @ -65,7 +65,7 @@ void kobject_get_ownership(struct kobject *kobj, kuid_t *uid, kgid_t *gid) | |||
|  */ | ||||
| static int populate_dir(struct kobject *kobj) | ||||
| { | ||||
| 	struct kobj_type *t = get_ktype(kobj); | ||||
| 	const struct kobj_type *t = get_ktype(kobj); | ||||
| 	struct attribute *attr; | ||||
| 	int error = 0; | ||||
| 	int i; | ||||
|  | @ -346,7 +346,7 @@ EXPORT_SYMBOL(kobject_set_name); | |||
|  * to kobject_put(), not by a call to kfree directly to ensure that all of | ||||
|  * the memory is cleaned up properly. | ||||
|  */ | ||||
| void kobject_init(struct kobject *kobj, struct kobj_type *ktype) | ||||
| void kobject_init(struct kobject *kobj, const struct kobj_type *ktype) | ||||
| { | ||||
| 	char *err_str; | ||||
| 
 | ||||
|  | @ -461,7 +461,7 @@ EXPORT_SYMBOL(kobject_add); | |||
|  * same type of error handling after a call to kobject_add() and kobject | ||||
|  * lifetime rules are the same here. | ||||
|  */ | ||||
| int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, | ||||
| int kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype, | ||||
| 			 struct kobject *parent, const char *fmt, ...) | ||||
| { | ||||
| 	va_list args; | ||||
|  | @ -679,7 +679,7 @@ EXPORT_SYMBOL(kobject_get_unless_zero); | |||
| static void kobject_cleanup(struct kobject *kobj) | ||||
| { | ||||
| 	struct kobject *parent = kobj->parent; | ||||
| 	struct kobj_type *t = get_ktype(kobj); | ||||
| 	const struct kobj_type *t = get_ktype(kobj); | ||||
| 	const char *name = kobj->name; | ||||
| 
 | ||||
| 	pr_debug("kobject: '%s' (%p): %s, parent %p\n", | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Wedson Almeida Filho
						Wedson Almeida Filho