- } else if (use_page_lists) {
- int options;
-
- /*
- * Use page list copy mechanism if specified.
- */
- if (steal_pages == FALSE) {
- /*
- * XXX Temporary Hackaround.
- * XXX Because the same page
- * XXX might be in more than one
- * XXX out of line region, steal
- * XXX (busy) pages from previous
- * XXX region so that this copyin
- * XXX won't block (permanently).
- */
- if (copy != VM_MAP_COPY_NULL)
- vm_map_copy_steal_pages(copy);
- }
-
- /*
- * Set up options for copying in page list.
- * If deallocating, steal pages to prevent
- * vm code from lazy evaluating deallocation.
- */
- options = VM_PROT_READ;
- if (dealloc) {
- options |= VM_MAP_COPYIN_OPT_SRC_DESTROY |
- VM_MAP_COPYIN_OPT_STEAL_PAGES;
- }
- else if (steal_pages) {
- options |= VM_MAP_COPYIN_OPT_STEAL_PAGES;
- }
-
- if (vm_map_copyin_page_list(map, addr, length, options,
- ©, FALSE)
- != KERN_SUCCESS) {
-
- ipc_kmsg_clean_partial(kmsg, i, paddr, space_needed);
- return MACH_SEND_INVALID_MEMORY;
- }
-
- dsc->address = (void *) copy;
- dsc->copy = MACH_MSG_PAGE_LIST_COPY_T;
-