|
@@ -372,8 +372,10 @@ retry_locked:
|
|
|
spin_unlock(&resv->lock);
|
|
|
|
|
|
trg = kmalloc(sizeof(*trg), GFP_KERNEL);
|
|
|
- if (!trg)
|
|
|
+ if (!trg) {
|
|
|
+ kfree(nrg);
|
|
|
return -ENOMEM;
|
|
|
+ }
|
|
|
|
|
|
spin_lock(&resv->lock);
|
|
|
list_add(&trg->link, &resv->region_cache);
|
|
@@ -483,8 +485,16 @@ static long region_del(struct resv_map *resv, long f, long t)
|
|
|
retry:
|
|
|
spin_lock(&resv->lock);
|
|
|
list_for_each_entry_safe(rg, trg, head, link) {
|
|
|
- if (rg->to <= f)
|
|
|
+ /*
|
|
|
+ * Skip regions before the range to be deleted. file_region
|
|
|
+ * ranges are normally of the form [from, to). However, there
|
|
|
+ * may be a "placeholder" entry in the map which is of the form
|
|
|
+ * (from, to) with from == to. Check for placeholder entries
|
|
|
+ * at the beginning of the range to be deleted.
|
|
|
+ */
|
|
|
+ if (rg->to <= f && (rg->to != rg->from || rg->to != f))
|
|
|
continue;
|
|
|
+
|
|
|
if (rg->from >= t)
|
|
|
break;
|
|
|
|