Commit fb4d64e78ceab77cf20f7796f74aa10ebe862032

Authored by Frederik Deweerdt
Committed by Linus Torvalds
1 parent f5de611148

[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

... ... @@ -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 }