|
@@ -445,11 +445,15 @@ EXPORT_SYMBOL_GPL(apei_resources_sub);
|
|
|
int apei_resources_request(struct apei_resources *resources,
|
|
|
const char *desc)
|
|
|
{
|
|
|
- struct apei_res *res, *res_bak;
|
|
|
+ struct apei_res *res, *res_bak = NULL;
|
|
|
struct resource *r;
|
|
|
+ int rc;
|
|
|
|
|
|
- apei_resources_sub(resources, &apei_resources_all);
|
|
|
+ rc = apei_resources_sub(resources, &apei_resources_all);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
|
|
|
+ rc = -EINVAL;
|
|
|
list_for_each_entry(res, &resources->iomem, list) {
|
|
|
r = request_mem_region(res->start, res->end - res->start,
|
|
|
desc);
|
|
@@ -475,7 +479,11 @@ int apei_resources_request(struct apei_resources *resources,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- apei_resources_merge(&apei_resources_all, resources);
|
|
|
+ rc = apei_resources_merge(&apei_resources_all, resources);
|
|
|
+ if (rc) {
|
|
|
+ pr_err(APEI_PFX "Fail to merge resources!\n");
|
|
|
+ goto err_unmap_ioport;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
err_unmap_ioport:
|
|
@@ -491,12 +499,13 @@ err_unmap_iomem:
|
|
|
break;
|
|
|
release_mem_region(res->start, res->end - res->start);
|
|
|
}
|
|
|
- return -EINVAL;
|
|
|
+ return rc;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(apei_resources_request);
|
|
|
|
|
|
void apei_resources_release(struct apei_resources *resources)
|
|
|
{
|
|
|
+ int rc;
|
|
|
struct apei_res *res;
|
|
|
|
|
|
list_for_each_entry(res, &resources->iomem, list)
|
|
@@ -504,7 +513,9 @@ void apei_resources_release(struct apei_resources *resources)
|
|
|
list_for_each_entry(res, &resources->ioport, list)
|
|
|
release_region(res->start, res->end - res->start);
|
|
|
|
|
|
- apei_resources_sub(&apei_resources_all, resources);
|
|
|
+ rc = apei_resources_sub(&apei_resources_all, resources);
|
|
|
+ if (rc)
|
|
|
+ pr_err(APEI_PFX "Fail to sub resources!\n");
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(apei_resources_release);
|
|
|
|