aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>1999-05-28 03:39:44 +0000
committerAlan Cox <alc@FreeBSD.org>1999-05-28 03:39:44 +0000
commit9a2f6362a7c2d6169bd5c7b05387d3e1cb031764 (patch)
tree980dd4d223c43b4210b60718e4fa4a5caab18335
parent323d972c29b7a50cf43c65626af694e44982fde0 (diff)
Notes
-rw-r--r--sys/vm/vm_map.c12
-rw-r--r--sys/vm/vm_object.c12
2 files changed, 20 insertions, 4 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 1fb91f0b8653..39e6444d0086 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.c,v 1.163 1999/05/17 00:53:53 alc Exp $
+ * $Id: vm_map.c,v 1.164 1999/05/18 05:38:48 alc Exp $
*/
/*
@@ -2276,7 +2276,14 @@ vmspace_fork(vm1)
atop(old_entry->end - old_entry->start));
old_entry->object.vm_object = object;
old_entry->offset = (vm_offset_t) 0;
- } else if (old_entry->eflags & MAP_ENTRY_NEEDS_COPY) {
+ }
+
+ /*
+ * Add the reference before calling vm_object_shadow
+ * to insure that a shadow object is created.
+ */
+ vm_object_reference(object);
+ if (old_entry->eflags & MAP_ENTRY_NEEDS_COPY) {
vm_object_shadow(&old_entry->object.vm_object,
&old_entry->offset,
atop(old_entry->end - old_entry->start));
@@ -2291,7 +2298,6 @@ vmspace_fork(vm1)
new_entry = vm_map_entry_create(new_map);
*new_entry = *old_entry;
new_entry->wired_count = 0;
- vm_object_reference(object);
/*
* Insert the entry into the new map -- we know we're
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index e53756ada2f6..0dccdf177f4f 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_object.c,v 1.153 1999/03/14 06:36:00 alc Exp $
+ * $Id: vm_object.c,v 1.154 1999/05/16 05:07:34 alc Exp $
*/
/*
@@ -868,6 +868,16 @@ vm_object_shadow(object, offset, length)
source = *object;
/*
+ * Don't create the new object if the old object isn't shared.
+ */
+
+ if (source->ref_count == 1 &&
+ source->handle == NULL &&
+ (source->type == OBJT_DEFAULT ||
+ source->type == OBJT_SWAP))
+ return;
+
+ /*
* Allocate a new object with the given length
*/