Commit fb4d64e78ceab77cf20f7796f74aa10ebe862032
Committed by
Linus Torvalds
1 parent
f5de611148
Exists in
master
and in
39 other branches
[PATCH] pci_iomap_regions() error handling fix
It appears that the pcim_iomap_regions() function doesn't get the error handling right. It BUGs early at boot with a backtrace along the lines of: ahci_init pci_register_driver driver_register [...] ahci_init_one pcim_iomap_region pcim_iounmap The following patch allows me to boot. Only the if(mask..) continue; part fixes the problem actually, the gotos where changed so that we don't try to unmap something we couldn't map anyway. Signed-off-by: Frederik Deweerdt <frederik.deweerdt@gmail.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Tejun Heo <htejun@gmail.com> Cc: Jeff Garzik <jeff@garzik.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 4 additions and 4 deletions Side-by-side Diff
lib/devres.c
... | ... | @@ -274,21 +274,21 @@ |
274 | 274 | |
275 | 275 | rc = pci_request_region(pdev, i, name); |
276 | 276 | if (rc) |
277 | - goto err_region; | |
277 | + goto err_inval; | |
278 | 278 | |
279 | 279 | rc = -ENOMEM; |
280 | 280 | if (!pcim_iomap(pdev, i, 0)) |
281 | - goto err_iomap; | |
281 | + goto err_region; | |
282 | 282 | } |
283 | 283 | |
284 | 284 | return 0; |
285 | 285 | |
286 | - err_iomap: | |
287 | - pcim_iounmap(pdev, iomap[i]); | |
288 | 286 | err_region: |
289 | 287 | pci_release_region(pdev, i); |
290 | 288 | err_inval: |
291 | 289 | while (--i >= 0) { |
290 | + if (!(mask & (1 << i))) | |
291 | + continue; | |
292 | 292 | pcim_iounmap(pdev, iomap[i]); |
293 | 293 | pci_release_region(pdev, i); |
294 | 294 | } |