[PATCH] raceless request_region() fix (was Re: Linux 2.6.0-test4)

insecure
2003-08-25T21:26:58Z

On Tuesday 26 August 2003 00:20, insecure wrote:
> > o [arcnet com90io] replace check_region with temporary
> > request_region, in probe phase.
>
> check_region() is deprecated because it is racy.
> Replacing it with request_region in probe:
>
> int probe() {
> if(!request_region(...))
> return 0;
> /* probe */
> release_region(...);
> }
>
> int init() {
> request_region(...);
> }
>
> only removes 'deprecated' warning. Race remains.

Corrected com90io.c patch is below.
--
vda

--- linux-2.6.0-test4/drivers/net/arcnet/com90io.c.orig Sat Aug 23 02:53:52 2003
+++ linux-2.6.0-test4/drivers/net/arcnet/com90io.c Tue Aug 26 00:22:51 2003
@@ -158,7 +158,7 @@
"must specify the base address!\n");
return -ENODEV;
}
- if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com90io probe")) {
+ if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (COM90xx-IO)")) {
BUGMSG(D_INIT_REASONS, "IO check_region %x-%x failed.\n",
ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
return -ENXIO;
@@ -218,7 +218,6 @@
goto err_out;
}
}
- release_region(ioaddr, ARCNET_TOTAL_SIZE); /* end of probing */
return com90io_found(dev);

err_out:
@@ -237,13 +236,9 @@

/* Reserve the irq */
if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (COM90xx-IO)", dev)) {
+ release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq);
return -ENODEV;
- }
- /* Reserve the I/O region - guaranteed to work by check_region */
- if (!request_region(dev->base_addr, ARCNET_TOTAL_SIZE, "arcnet (COM90xx-IO)")) {
- free_irq(dev->irq, dev);
- return -EBUSY;
}

/* Initialize the rest of the device structure. */