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>
 
                rc = pci_request_region(pdev, i, name);
                if (rc)
-                       goto err_region;
+                       goto err_inval;
 
                rc = -ENOMEM;
                if (!pcim_iomap(pdev, i, 0))
-                       goto err_iomap;
+                       goto err_region;
        }
 
        return 0;
 
- err_iomap:
-       pcim_iounmap(pdev, iomap[i]);
  err_region:
        pci_release_region(pdev, i);
  err_inval:
        while (--i >= 0) {
+               if (!(mask & (1 << i)))
+                       continue;
                pcim_iounmap(pdev, iomap[i]);
                pci_release_region(pdev, i);
        }