add: reserved->cache_offset = next->cache_offset;
context: find_reserved_area(vm_virtual_map *map, addr_t start, addr_t size, vm_area *area){	vm_area *next, *last = NULL;	next = map->areas;	while (next) {		if (next->base <= start && next->base + next->size >= start + size) {			// this area covers the requested range			if (next->id != RESERVED_AREA_ID) {				// but it's not reserved space, it's a real area				return B_BAD_VALUE;			}			break;		}		last = next;		next = next->aspace_next;	}	if (next == NULL)		return B_ENTRY_NOT_FOUND;	// now we have to transfer the requested part of the reserved	// range to the new area - and remove, resize or split the old	// reserved area.		if (start == next->base) {		// the area starts at the beginning of the reserved range		if (last)			last->aspace_next = area;		else			map->areas = area;		if (size == next->size) {			// the new area fully covers the reversed range			area->aspace_next = next->aspace_next;			free(next);		} else {			// resize the reserved range behind the area			area->aspace_next = next;			next->base += size;			next->size -= size;		}	} else if (start + size == next->base + next->size) {		// the area is at the end of the reserved range		area->aspace_next = next->aspace_next;		next->aspace_next = area;		// resize the reserved range before the area		next->size = start - next->base;	} else {		// the area splits the reserved range into two separate ones		// we need a new reserved area to cover this space		vm_area *reserved = _vm_create_reserved_region_struct(map, 0);		if (reserved == NULL)			return B_NO_MEMORY;		reserved->aspace_next = next->aspace_next;		area->aspace_next = reserved;		next->aspace_next = area;		// resize regions		reserved->size = next->base + next->size - start - size;		next->size = start - next->base;		reserved->base = start + size;	}	area->base = start;	area->size = size;	map->change_count++;	return B_OK;}