From: Ilpo Järvinen Date: Mon, 28 Oct 2024 17:40:45 +0000 (+0200) Subject: PCI/sysfs: Use __free() in reset_method_store() X-Git-Tag: v6.14-rc1~90^2~17^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6e5c46d8330ce818d8056cc5b8447d210caf196;p=thirdparty%2Fkernel%2Fstable.git PCI/sysfs: Use __free() in reset_method_store() Use __free() from cleanup.h to handle freeing options in reset_method_store() as it simplifies the code flow. Link: https://lore.kernel.org/r/20241028174046.1736-3-ilpo.jarvinen@linux.intel.com Signed-off-by: Ilpo Järvinen Signed-off-by: Krzysztof Wilczyński --- diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 3765bb1d18da6..40bc59d33e6b5 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -13,6 +13,7 @@ */ #include +#include #include #include #include @@ -1460,7 +1461,7 @@ static ssize_t reset_method_store(struct device *dev, const char *buf, size_t count) { struct pci_dev *pdev = to_pci_dev(dev); - char *options, *tmp_options, *name; + char *tmp_options, *name; int m, n; u8 reset_methods[PCI_NUM_RESET_METHODS] = { 0 }; @@ -1475,7 +1476,7 @@ static ssize_t reset_method_store(struct device *dev, return count; } - options = kstrndup(buf, count, GFP_KERNEL); + char *options __free(kfree) = kstrndup(buf, count, GFP_KERNEL); if (!options) return -ENOMEM; @@ -1487,20 +1488,21 @@ static ssize_t reset_method_store(struct device *dev, name = strim(name); + /* Leave previous methods unchanged if input is invalid */ m = reset_method_lookup(name); if (!m) { pci_err(pdev, "Invalid reset method '%s'", name); - goto error; + return -EINVAL; } if (pci_reset_fn_methods[m].reset_fn(pdev, PCI_RESET_PROBE)) { pci_err(pdev, "Unsupported reset method '%s'", name); - goto error; + return -EINVAL; } if (n == PCI_NUM_RESET_METHODS - 1) { pci_err(pdev, "Too many reset methods\n"); - goto error; + return -EINVAL; } reset_methods[n++] = m; @@ -1513,13 +1515,7 @@ static ssize_t reset_method_store(struct device *dev, reset_methods[0] != 1) pci_warn(pdev, "Device-specific reset disabled/de-prioritized by user"); memcpy(pdev->reset_methods, reset_methods, sizeof(pdev->reset_methods)); - kfree(options); return count; - -error: - /* Leave previous methods unchanged */ - kfree(options); - return -EINVAL; } static DEVICE_ATTR_RW(reset_method);