A call to kobject_init() is required to be paired with a call to kobject_put() in order to correctly free up the kobject. During cleanup functions it would be useful to know if a kobject was initialized in order to correctly pair the call to kobject_put(). For example this is necessary if we attempt to initialize multiple objects on a list and one fails - in order to correctly do cleanup we need to know which objects have been initialized. Add a predicate kobject_is_initialized() to the kobject API. This function maintains the kobject layer of abstraction; simply returns kobj->state_initialized. Signed-off-by: Tobin C. Harding <tobin@xxxxxxxxxx> --- include/linux/kobject.h | 2 ++ lib/kobject.c | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 1ab0d624fb36..65a317b65d9c 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -100,6 +100,8 @@ int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...); +extern bool kobject_is_initialized(struct kobject *kobj); + extern void kobject_del(struct kobject *kobj); extern struct kobject * __must_check kobject_create(void); diff --git a/lib/kobject.c b/lib/kobject.c index 0181f102cd1c..ecddf417f452 100644 --- a/lib/kobject.c +++ b/lib/kobject.c @@ -366,6 +366,18 @@ void kobject_init(struct kobject *kobj, struct kobj_type *ktype) } EXPORT_SYMBOL(kobject_init); +/** + * kobject_is_initialized() - Kobject initialized predicate. + * @kobj: The kobject to query + * + * Return: True if @kobj has been initialized. + */ +bool kobject_is_initialized(struct kobject *kobj) +{ + return kobj->state_initialized; +} +EXPORT_SYMBOL(kobject_is_initialized); + static __printf(3, 0) int kobject_add_varg(struct kobject *kobj, struct kobject *parent, const char *fmt, va_list vargs) -- 2.21.0