Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb4d64e7 authored by Frederik Deweerdt's avatar Frederik Deweerdt Committed by Linus Torvalds
Browse files

[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: default avatarFrederik 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f5de6111
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -274,21 +274,21 @@ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)


		rc = pci_request_region(pdev, i, name);
		rc = pci_request_region(pdev, i, name);
		if (rc)
		if (rc)
			goto err_region;
			goto err_inval;


		rc = -ENOMEM;
		rc = -ENOMEM;
		if (!pcim_iomap(pdev, i, 0))
		if (!pcim_iomap(pdev, i, 0))
			goto err_iomap;
			goto err_region;
	}
	}


	return 0;
	return 0;


 err_iomap:
	pcim_iounmap(pdev, iomap[i]);
 err_region:
 err_region:
	pci_release_region(pdev, i);
	pci_release_region(pdev, i);
 err_inval:
 err_inval:
	while (--i >= 0) {
	while (--i >= 0) {
		if (!(mask & (1 << i)))
			continue;
		pcim_iounmap(pdev, iomap[i]);
		pcim_iounmap(pdev, iomap[i]);
		pci_release_region(pdev, i);
		pci_release_region(pdev, i);
	}
	}