diff options
author | dyson <dyson@FreeBSD.org> | 1998-05-16 23:03:20 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1998-05-16 23:03:20 +0000 |
commit | 9b04841c1bd3ffd81c2ef5dcbc033b53388c4dea (patch) | |
tree | 5392786c0941806c2c7ce898c069db14d4f96d6e /sys/vm/vm_map.c | |
parent | 4c2eaaf8c88254d6366a944b9236c29cc734750a (diff) | |
download | FreeBSD-src-9b04841c1bd3ffd81c2ef5dcbc033b53388c4dea.zip FreeBSD-src-9b04841c1bd3ffd81c2ef5dcbc033b53388c4dea.tar.gz |
An important fix for proper inheritance of backing objects for
object splits. Another excellent detective job by Tor.
Submitted by: Tor Egge <Tor.Egge@idi.ntnu.no>
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r-- | sys/vm/vm_map.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index aeecbf8..d17f6ea 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.124 1998/05/04 03:01:44 dyson Exp $ + * $Id: vm_map.c,v 1.125 1998/05/04 17:12:52 dyson Exp $ */ /* @@ -1942,7 +1942,7 @@ vm_map_split(entry) vm_map_entry_t entry; { vm_page_t m; - vm_object_t orig_object, new_object; + vm_object_t orig_object, new_object, source; vm_offset_t s, e; vm_pindex_t offidxstart, offidxend, idx; vm_size_t size; @@ -1967,6 +1967,19 @@ vm_map_split(entry) if (new_object == NULL) return; + source = orig_object->backing_object; + if (source != NULL) { + vm_object_reference(source); /* Referenced by new_object */ + TAILQ_INSERT_TAIL(&source->shadow_head, + new_object, shadow_list); + source->flags &= ~OBJ_ONEMAPPING; + new_object->backing_object_offset = + orig_object->backing_object_offset + offidxstart; + new_object->backing_object = source; + source->shadow_count++; + source->generation++; + } + for (idx = 0; idx < size; idx++) { vm_page_t m; |