rem: if ((source->protection & (B_KERNEL_WRITE_AREA | B_WRITE_AREA)) != 0) vm_copy_on_write_area(source);
add: if ((source->protection & (B_KERNEL_WRITE_AREA | B_WRITE_AREA)) != 0) {  if (vm_copy_on_write_area(source) < B_OK) panic("vm_copy_on_write_area() failed!\n"); }
context: vm_copy_area(aspace_id addressSpaceID, const char *name, void **_address, uint32 addressSpec,	uint32 protection, area_id sourceID){	vm_address_space *addressSpace;	vm_cache_ref *cacheRef;	vm_area *target, *source;	status_t status;	if ((protection & B_KERNEL_PROTECTION) == 0)		protection |= B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA;	if ((source = vm_get_area(sourceID)) == NULL)		return B_BAD_VALUE;	addressSpace = vm_get_aspace_by_id(addressSpaceID);	cacheRef = source->cache_ref;	if (addressSpec == B_CLONE_ADDRESS) {		addressSpec = B_EXACT_ADDRESS;		*_address = (void *)source->base;	}	// First, create a cache on top of the source area	status = map_backing_store(addressSpace, cacheRef->cache->store, _address,		source->cache_offset, source->size, addressSpec, source->wiring, protection,		protection & (B_KERNEL_WRITE_AREA | B_WRITE_AREA) ? REGION_PRIVATE_MAP : REGION_NO_PRIVATE_MAP,		&target, name);	if (status < B_OK)		goto err;	// If the source area is writable, we need to move it one layer up as well	if ((source->protection & (B_KERNEL_WRITE_AREA | B_WRITE_AREA)) != 0)		vm_copy_on_write_area(source);	// we want to return the ID of the newly created area	status = target->id;err:	vm_put_aspace(addressSpace);	vm_put_area(source);	return status;}