Merge tag 'driver-core-5.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core

Pull driver core fixes from Greg KH:
"Here are some small driver core and debugfs fixes for 5.9-rc5

Included in here are:

- firmware loader memory leak fix

- firmware loader testing fixes for non-EFI systems

- device link locking fixes found by lockdep

- kobject_del() bugfix that has been affecting some callers

- debugfs minor fix

All of these have been in linux-next for a while with no reported
issues"

* tag 'driver-core-5.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core:
test_firmware: Test platform fw loading on non-EFI systems
PM: <linux/device.h>: fix @em_pd kernel-doc warning
kobject: Drop unneeded conditional in __kobject_del()
driver core: Fix device_pm_lock() locking for device links
MAINTAINERS: Add the security document to SECURITY CONTACT
driver code: print symbolic error code
debugfs: Fix module state check condition
kobject: Restore old behaviour of kobject_del(NULL)
firmware_loader: fix memory leak for paged buffer

Changed files
+39 -27
drivers
base
firmware_loader
firmware
fs
debugfs
include
lib
+1
MAINTAINERS
··· 15577 15577 SECURITY CONTACT 15578 15578 M: Security Officers <security@kernel.org> 15579 15579 S: Supported 15580 + F: Documentation/admin-guide/security-bugs.rst 15580 15581 15581 15582 SECURITY SUBSYSTEM 15582 15583 M: James Morris <jmorris@namei.org>
+2 -6
drivers/base/core.c
··· 807 807 void device_link_del(struct device_link *link) 808 808 { 809 809 device_links_write_lock(); 810 - device_pm_lock(); 811 810 device_link_put_kref(link); 812 - device_pm_unlock(); 813 811 device_links_write_unlock(); 814 812 } 815 813 EXPORT_SYMBOL_GPL(device_link_del); ··· 828 830 return; 829 831 830 832 device_links_write_lock(); 831 - device_pm_lock(); 832 833 833 834 list_for_each_entry(link, &supplier->links.consumers, s_node) { 834 835 if (link->consumer == consumer) { ··· 836 839 } 837 840 } 838 841 839 - device_pm_unlock(); 840 842 device_links_write_unlock(); 841 843 } 842 844 EXPORT_SYMBOL_GPL(device_link_remove); ··· 4233 4237 vaf.va = &args; 4234 4238 4235 4239 if (err != -EPROBE_DEFER) { 4236 - dev_err(dev, "error %d: %pV", err, &vaf); 4240 + dev_err(dev, "error %pe: %pV", ERR_PTR(err), &vaf); 4237 4241 } else { 4238 4242 device_set_deferred_probe_reason(dev, &vaf); 4239 - dev_dbg(dev, "error %d: %pV", err, &vaf); 4243 + dev_dbg(dev, "error %pe: %pV", ERR_PTR(err), &vaf); 4240 4244 } 4241 4245 4242 4246 va_end(args);
+2
drivers/base/firmware_loader/firmware.h
··· 142 142 void fw_free_paged_buf(struct fw_priv *fw_priv); 143 143 int fw_grow_paged_buf(struct fw_priv *fw_priv, int pages_needed); 144 144 int fw_map_paged_buf(struct fw_priv *fw_priv); 145 + bool fw_is_paged_buf(struct fw_priv *fw_priv); 145 146 #else 146 147 static inline void fw_free_paged_buf(struct fw_priv *fw_priv) {} 147 148 static inline int fw_grow_paged_buf(struct fw_priv *fw_priv, int pages_needed) { return -ENXIO; } 148 149 static inline int fw_map_paged_buf(struct fw_priv *fw_priv) { return -ENXIO; } 150 + static inline bool fw_is_paged_buf(struct fw_priv *fw_priv) { return false; } 149 151 #endif 150 152 151 153 #endif /* __FIRMWARE_LOADER_H */
+11 -6
drivers/base/firmware_loader/main.c
··· 252 252 list_del(&fw_priv->list); 253 253 spin_unlock(&fwc->lock); 254 254 255 - fw_free_paged_buf(fw_priv); /* free leftover pages */ 256 - if (!fw_priv->allocated_size) 255 + if (fw_is_paged_buf(fw_priv)) 256 + fw_free_paged_buf(fw_priv); 257 + else if (!fw_priv->allocated_size) 257 258 vfree(fw_priv->data); 259 + 258 260 kfree_const(fw_priv->fw_name); 259 261 kfree(fw_priv); 260 262 } ··· 270 268 } 271 269 272 270 #ifdef CONFIG_FW_LOADER_PAGED_BUF 271 + bool fw_is_paged_buf(struct fw_priv *fw_priv) 272 + { 273 + return fw_priv->is_paged_buf; 274 + } 275 + 273 276 void fw_free_paged_buf(struct fw_priv *fw_priv) 274 277 { 275 278 int i; 276 279 277 280 if (!fw_priv->pages) 278 281 return; 282 + 283 + vunmap(fw_priv->data); 279 284 280 285 for (i = 0; i < fw_priv->nr_pages; i++) 281 286 __free_page(fw_priv->pages[i]); ··· 336 327 PAGE_KERNEL_RO); 337 328 if (!fw_priv->data) 338 329 return -ENOMEM; 339 - 340 - /* page table is no longer needed after mapping, let's free */ 341 - kvfree(fw_priv->pages); 342 - fw_priv->pages = NULL; 343 330 344 331 return 0; 345 332 }
+5 -5
drivers/firmware/efi/embedded-firmware.c
··· 16 16 17 17 /* Exported for use by lib/test_firmware.c only */ 18 18 LIST_HEAD(efi_embedded_fw_list); 19 - EXPORT_SYMBOL_GPL(efi_embedded_fw_list); 20 - 21 - static bool checked_for_fw; 19 + EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_list, TEST_FIRMWARE); 20 + bool efi_embedded_fw_checked; 21 + EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_checked, TEST_FIRMWARE); 22 22 23 23 static const struct dmi_system_id * const embedded_fw_table[] = { 24 24 #ifdef CONFIG_TOUCHSCREEN_DMI ··· 116 116 } 117 117 } 118 118 119 - checked_for_fw = true; 119 + efi_embedded_fw_checked = true; 120 120 } 121 121 122 122 int efi_get_embedded_fw(const char *name, const u8 **data, size_t *size) 123 123 { 124 124 struct efi_embedded_fw *iter, *fw = NULL; 125 125 126 - if (!checked_for_fw) { 126 + if (!efi_embedded_fw_checked) { 127 127 pr_warn("Warning %s called while we did not check for embedded fw\n", 128 128 __func__); 129 129 return -ENOENT;
+2 -2
fs/debugfs/file.c
··· 177 177 goto out; 178 178 179 179 if (!fops_get(real_fops)) { 180 - #ifdef MODULE 180 + #ifdef CONFIG_MODULES 181 181 if (real_fops->owner && 182 182 real_fops->owner->state == MODULE_STATE_GOING) 183 183 goto out; ··· 312 312 goto out; 313 313 314 314 if (!fops_get(real_fops)) { 315 - #ifdef MODULE 315 + #ifdef CONFIG_MODULES 316 316 if (real_fops->owner && 317 317 real_fops->owner->state == MODULE_STATE_GOING) 318 318 goto out;
+2 -4
include/linux/efi_embedded_fw.h
··· 8 8 #define EFI_EMBEDDED_FW_PREFIX_LEN 8 9 9 10 10 /* 11 - * This struct and efi_embedded_fw_list are private to the efi-embedded fw 12 - * implementation they are in this header for use by lib/test_firmware.c only! 11 + * This struct is private to the efi-embedded fw implementation. 12 + * They are in this header for use by lib/test_firmware.c only! 13 13 */ 14 14 struct efi_embedded_fw { 15 15 struct list_head list; ··· 17 17 const u8 *data; 18 18 size_t length; 19 19 }; 20 - 21 - extern struct list_head efi_embedded_fw_list; 22 20 23 21 /** 24 22 * struct efi_embedded_fw_desc - This struct is used by the EFI embedded-fw
+5 -4
lib/kobject.c
··· 604 604 struct kernfs_node *sd; 605 605 const struct kobj_type *ktype; 606 606 607 - if (!kobj) 608 - return; 609 - 610 607 sd = kobj->sd; 611 608 ktype = get_ktype(kobj); 612 609 ··· 634 637 */ 635 638 void kobject_del(struct kobject *kobj) 636 639 { 637 - struct kobject *parent = kobj->parent; 640 + struct kobject *parent; 638 641 642 + if (!kobj) 643 + return; 644 + 645 + parent = kobj->parent; 639 646 __kobject_del(kobj); 640 647 kobject_put(parent); 641 648 }
+9
lib/test_firmware.c
··· 26 26 #include <linux/vmalloc.h> 27 27 #include <linux/efi_embedded_fw.h> 28 28 29 + MODULE_IMPORT_NS(TEST_FIRMWARE); 30 + 29 31 #define TEST_FIRMWARE_NAME "test-firmware.bin" 30 32 #define TEST_FIRMWARE_NUM_REQS 4 31 33 #define TEST_FIRMWARE_BUF_SIZE SZ_1K ··· 491 489 static DEVICE_ATTR_WO(trigger_request); 492 490 493 491 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE 492 + extern struct list_head efi_embedded_fw_list; 493 + extern bool efi_embedded_fw_checked; 494 + 494 495 static ssize_t trigger_request_platform_store(struct device *dev, 495 496 struct device_attribute *attr, 496 497 const char *buf, size_t count) ··· 506 501 }; 507 502 struct efi_embedded_fw efi_embedded_fw; 508 503 const struct firmware *firmware = NULL; 504 + bool saved_efi_embedded_fw_checked; 509 505 char *name; 510 506 int rc; 511 507 ··· 519 513 efi_embedded_fw.data = (void *)test_data; 520 514 efi_embedded_fw.length = sizeof(test_data); 521 515 list_add(&efi_embedded_fw.list, &efi_embedded_fw_list); 516 + saved_efi_embedded_fw_checked = efi_embedded_fw_checked; 517 + efi_embedded_fw_checked = true; 522 518 523 519 pr_info("loading '%s'\n", name); 524 520 rc = firmware_request_platform(&firmware, name, dev); ··· 538 530 rc = count; 539 531 540 532 out: 533 + efi_embedded_fw_checked = saved_efi_embedded_fw_checked; 541 534 release_firmware(firmware); 542 535 list_del(&efi_embedded_fw.list); 543 536 kfree(name);