Merge tag 'pci-v5.14-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
[linux-2.6-microblaze.git] / drivers / pci / pci.c
index e3bb0d0..aacf575 100644 (file)
@@ -5030,6 +5030,16 @@ static int pci_dev_reset_slot_function(struct pci_dev *dev, int probe)
        return pci_reset_hotplug_slot(dev->slot->hotplug, probe);
 }
 
+static int pci_reset_bus_function(struct pci_dev *dev, int probe)
+{
+       int rc;
+
+       rc = pci_dev_reset_slot_function(dev, probe);
+       if (rc != -ENOTTY)
+               return rc;
+       return pci_parent_bus_reset(dev, probe);
+}
+
 static void pci_dev_lock(struct pci_dev *dev)
 {
        pci_cfg_access_lock(dev);
@@ -5152,10 +5162,7 @@ int __pci_reset_function_locked(struct pci_dev *dev)
        rc = pci_pm_reset(dev, 0);
        if (rc != -ENOTTY)
                return rc;
-       rc = pci_dev_reset_slot_function(dev, 0);
-       if (rc != -ENOTTY)
-               return rc;
-       return pci_parent_bus_reset(dev, 0);
+       return pci_reset_bus_function(dev, 0);
 }
 EXPORT_SYMBOL_GPL(__pci_reset_function_locked);
 
@@ -5185,13 +5192,10 @@ int pci_probe_reset_function(struct pci_dev *dev)
        if (rc != -ENOTTY)
                return rc;
        rc = pci_pm_reset(dev, 1);
-       if (rc != -ENOTTY)
-               return rc;
-       rc = pci_dev_reset_slot_function(dev, 1);
        if (rc != -ENOTTY)
                return rc;
 
-       return pci_parent_bus_reset(dev, 1);
+       return pci_reset_bus_function(dev, 1);
 }
 
 /**
@@ -6451,34 +6455,40 @@ static ssize_t resource_alignment_show(struct bus_type *bus, char *buf)
 
        spin_lock(&resource_alignment_lock);
        if (resource_alignment_param)
-               count = scnprintf(buf, PAGE_SIZE, "%s", resource_alignment_param);
+               count = sysfs_emit(buf, "%s\n", resource_alignment_param);
        spin_unlock(&resource_alignment_lock);
 
-       /*
-        * When set by the command line, resource_alignment_param will not
-        * have a trailing line feed, which is ugly. So conditionally add
-        * it here.
-        */
-       if (count >= 2 && buf[count - 2] != '\n' && count < PAGE_SIZE - 1) {
-               buf[count - 1] = '\n';
-               buf[count++] = 0;
-       }
-
        return count;
 }
 
 static ssize_t resource_alignment_store(struct bus_type *bus,
                                        const char *buf, size_t count)
 {
-       char *param = kstrndup(buf, count, GFP_KERNEL);
+       char *param, *old, *end;
+
+       if (count >= (PAGE_SIZE - 1))
+               return -EINVAL;
 
+       param = kstrndup(buf, count, GFP_KERNEL);
        if (!param)
                return -ENOMEM;
 
+       end = strchr(param, '\n');
+       if (end)
+               *end = '\0';
+
        spin_lock(&resource_alignment_lock);
-       kfree(resource_alignment_param);
-       resource_alignment_param = param;
+       old = resource_alignment_param;
+       if (strlen(param)) {
+               resource_alignment_param = param;
+       } else {
+               kfree(param);
+               resource_alignment_param = NULL;
+       }
        spin_unlock(&resource_alignment_lock);
+
+       kfree(old);
+
        return count;
 }