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;
+               }
        }
 
        /*
        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) {
        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",
                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 */
 {
        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;