Commit 5b8e28f3 authored by Rusty Russell's avatar Rusty Russell Committed by Anton Blanchard

[PATCH] Get rid of check_resource() before it becomes a problem

The new resource interface foolishly replicated the (obsolete,
racy) spirit of the check_region call as check_resource.  You
should use request_resource/release_resource instead.
parent d5c74234
......@@ -124,16 +124,36 @@ static struct resource *resource_parent(unsigned long b, unsigned long n,
return &ioport_resource;
}
/* FIXME: Fundamentally racy. */
static inline int check_io_resource(unsigned long b, unsigned long n,
struct pci_dev *dev)
{
return check_resource(resource_parent(b, n, IORESOURCE_IO, dev), b, n);
struct resource *region;
region = __request_region(resource_parent(b, n, IORESOURCE_IO, dev),
b, n, "check_io_resource");
if (!region)
return -EBUSY;
release_resource(region);
kfree(region);
return 0;
}
/* FIXME: Fundamentally racy. */
static inline int check_mem_resource(unsigned long b, unsigned long n,
struct pci_dev *dev)
{
return check_resource(resource_parent(b, n, IORESOURCE_MEM, dev), b, n);
struct resource *region;
region = __request_region(resource_parent(b, n, IORESOURCE_MEM, dev),
b, n, "check_mem_resource");
if (!region)
return -EBUSY;
release_resource(region);
kfree(region);
return 0;
}
static struct resource *make_resource(unsigned long b, unsigned long n,
......
......@@ -85,7 +85,6 @@ extern struct resource iomem_resource;
extern int get_resource_list(struct resource *, char *buf, int size);
extern int check_resource(struct resource *root, unsigned long, unsigned long);
extern int request_resource(struct resource *root, struct resource *new);
extern int release_resource(struct resource *new);
extern int allocate_resource(struct resource *root, struct resource *new,
......
......@@ -445,7 +445,6 @@ EXPORT_SYMBOL(enable_hlt);
EXPORT_SYMBOL(request_resource);
EXPORT_SYMBOL(release_resource);
EXPORT_SYMBOL(allocate_resource);
EXPORT_SYMBOL(check_resource);
EXPORT_SYMBOL(__request_region);
EXPORT_SYMBOL(__check_region);
EXPORT_SYMBOL(__release_region);
......
......@@ -131,20 +131,6 @@ int release_resource(struct resource *old)
return retval;
}
int check_resource(struct resource *root, unsigned long start, unsigned long len)
{
struct resource *conflict, tmp;
tmp.start = start;
tmp.end = start + len - 1;
write_lock(&resource_lock);
conflict = __request_resource(root, &tmp);
if (!conflict)
__release_resource(&tmp);
write_unlock(&resource_lock);
return conflict ? -EBUSY : 0;
}
/*
* Find empty slot in the resource tree given range and alignment.
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment