| From 03f104698bab76f6b96714116985a17fe6fd39ba Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 8 Feb 2024 16:02:50 +0000 |
| Subject: Revert "kobject: Remove redundant checks for whether ktype is NULL" |
| |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| [ Upstream commit 3ca8fbabcceb8bfe44f7f50640092fd8f1de375c ] |
| |
| This reverts commit 1b28cb81dab7c1eedc6034206f4e8d644046ad31. |
| |
| It is reported to cause problems, so revert it for now until the root |
| cause can be found. |
| |
| Reported-by: kernel test robot <oliver.sang@intel.com> |
| Fixes: 1b28cb81dab7 ("kobject: Remove redundant checks for whether ktype is NULL") |
| Cc: Zhen Lei <thunder.leizhen@huawei.com> |
| Closes: https://lore.kernel.org/oe-lkp/202402071403.e302e33a-oliver.sang@intel.com |
| Link: https://lore.kernel.org/r/2024020849-consensus-length-6264@gregkh |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| lib/kobject.c | 24 ++++++++++++++---------- |
| 1 file changed, 14 insertions(+), 10 deletions(-) |
| |
| diff --git a/lib/kobject.c b/lib/kobject.c |
| index 59dbcbdb1c91..72fa20f405f1 100644 |
| --- a/lib/kobject.c |
| +++ b/lib/kobject.c |
| @@ -74,10 +74,12 @@ static int create_dir(struct kobject *kobj) |
| if (error) |
| return error; |
| |
| - error = sysfs_create_groups(kobj, ktype->default_groups); |
| - if (error) { |
| - sysfs_remove_dir(kobj); |
| - return error; |
| + if (ktype) { |
| + error = sysfs_create_groups(kobj, ktype->default_groups); |
| + if (error) { |
| + sysfs_remove_dir(kobj); |
| + return error; |
| + } |
| } |
| |
| /* |
| @@ -589,7 +591,8 @@ static void __kobject_del(struct kobject *kobj) |
| sd = kobj->sd; |
| ktype = get_ktype(kobj); |
| |
| - sysfs_remove_groups(kobj, ktype->default_groups); |
| + if (ktype) |
| + sysfs_remove_groups(kobj, ktype->default_groups); |
| |
| /* send "remove" if the caller did not do it but sent "add" */ |
| if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) { |
| @@ -666,6 +669,10 @@ static void kobject_cleanup(struct kobject *kobj) |
| pr_debug("'%s' (%p): %s, parent %p\n", |
| kobject_name(kobj), kobj, __func__, kobj->parent); |
| |
| + if (t && !t->release) |
| + pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n", |
| + kobject_name(kobj), kobj); |
| + |
| /* remove from sysfs if the caller did not do it */ |
| if (kobj->state_in_sysfs) { |
| pr_debug("'%s' (%p): auto cleanup kobject_del\n", |
| @@ -676,13 +683,10 @@ static void kobject_cleanup(struct kobject *kobj) |
| parent = NULL; |
| } |
| |
| - if (t->release) { |
| + if (t && t->release) { |
| pr_debug("'%s' (%p): calling ktype release\n", |
| kobject_name(kobj), kobj); |
| t->release(kobj); |
| - } else { |
| - pr_debug("'%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n", |
| - kobject_name(kobj), kobj); |
| } |
| |
| /* free name if we allocated it */ |
| @@ -1056,7 +1060,7 @@ const struct kobj_ns_type_operations *kobj_child_ns_ops(const struct kobject *pa |
| { |
| const struct kobj_ns_type_operations *ops = NULL; |
| |
| - if (parent && parent->ktype->child_ns_type) |
| + if (parent && parent->ktype && parent->ktype->child_ns_type) |
| ops = parent->ktype->child_ns_type(parent); |
| |
| return ops; |
| -- |
| 2.43.0 |
| |