Revert "kobject: Remove redundant checks for whether ktype is NULL"

This reverts commit 1b28cb81da.

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: 1b28cb81da ("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>
This commit is contained in:
Greg Kroah-Hartman 2024-02-08 16:02:50 +00:00
parent 6e7ad1aebb
commit 3ca8fbabcc

View File

@ -74,10 +74,12 @@ static int create_dir(struct kobject *kobj)
if (error) if (error)
return error; return error;
error = sysfs_create_groups(kobj, ktype->default_groups); if (ktype) {
if (error) { error = sysfs_create_groups(kobj, ktype->default_groups);
sysfs_remove_dir(kobj); if (error) {
return error; sysfs_remove_dir(kobj);
return error;
}
} }
/* /*
@ -589,7 +591,8 @@ static void __kobject_del(struct kobject *kobj)
sd = kobj->sd; sd = kobj->sd;
ktype = get_ktype(kobj); 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" */ /* send "remove" if the caller did not do it but sent "add" */
if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) { 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", pr_debug("'%s' (%p): %s, parent %p\n",
kobject_name(kobj), kobj, __func__, kobj->parent); 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 */ /* remove from sysfs if the caller did not do it */
if (kobj->state_in_sysfs) { if (kobj->state_in_sysfs) {
pr_debug("'%s' (%p): auto cleanup kobject_del\n", pr_debug("'%s' (%p): auto cleanup kobject_del\n",
@ -676,13 +683,10 @@ static void kobject_cleanup(struct kobject *kobj)
parent = NULL; parent = NULL;
} }
if (t->release) { if (t && t->release) {
pr_debug("'%s' (%p): calling ktype release\n", pr_debug("'%s' (%p): calling ktype release\n",
kobject_name(kobj), kobj); kobject_name(kobj), kobj);
t->release(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 */ /* 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; 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); ops = parent->ktype->child_ns_type(parent);
return ops; return ops;