diff options
Diffstat (limited to 'drivers/xen/xen-pciback/vpci.c')
-rw-r--r-- | drivers/xen/xen-pciback/vpci.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/xen/xen-pciback/vpci.c b/drivers/xen/xen-pciback/vpci.c index 51afff96c515..c99f8bb1c56c 100644 --- a/drivers/xen/xen-pciback/vpci.c +++ b/drivers/xen/xen-pciback/vpci.c | |||
@@ -145,7 +145,7 @@ out: | |||
145 | } | 145 | } |
146 | 146 | ||
147 | static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev, | 147 | static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev, |
148 | struct pci_dev *dev) | 148 | struct pci_dev *dev, bool lock) |
149 | { | 149 | { |
150 | int slot; | 150 | int slot; |
151 | struct vpci_dev_data *vpci_dev = pdev->pci_dev_data; | 151 | struct vpci_dev_data *vpci_dev = pdev->pci_dev_data; |
@@ -169,8 +169,13 @@ static void __xen_pcibk_release_pci_dev(struct xen_pcibk_device *pdev, | |||
169 | out: | 169 | out: |
170 | mutex_unlock(&vpci_dev->lock); | 170 | mutex_unlock(&vpci_dev->lock); |
171 | 171 | ||
172 | if (found_dev) | 172 | if (found_dev) { |
173 | if (lock) | ||
174 | device_lock(&found_dev->dev); | ||
173 | pcistub_put_pci_dev(found_dev); | 175 | pcistub_put_pci_dev(found_dev); |
176 | if (lock) | ||
177 | device_unlock(&found_dev->dev); | ||
178 | } | ||
174 | } | 179 | } |
175 | 180 | ||
176 | static int __xen_pcibk_init_devices(struct xen_pcibk_device *pdev) | 181 | static int __xen_pcibk_init_devices(struct xen_pcibk_device *pdev) |
@@ -208,8 +213,11 @@ static void __xen_pcibk_release_devices(struct xen_pcibk_device *pdev) | |||
208 | struct pci_dev_entry *e, *tmp; | 213 | struct pci_dev_entry *e, *tmp; |
209 | list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot], | 214 | list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot], |
210 | list) { | 215 | list) { |
216 | struct pci_dev *dev = e->dev; | ||
211 | list_del(&e->list); | 217 | list_del(&e->list); |
212 | pcistub_put_pci_dev(e->dev); | 218 | device_lock(&dev->dev); |
219 | pcistub_put_pci_dev(dev); | ||
220 | device_unlock(&dev->dev); | ||
213 | kfree(e); | 221 | kfree(e); |
214 | } | 222 | } |
215 | } | 223 | } |