diff options
Diffstat (limited to 'libpager/data-request.c')
-rw-r--r-- | libpager/data-request.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/libpager/data-request.c b/libpager/data-request.c index 341fb924..36725b11 100644 --- a/libpager/data-request.c +++ b/libpager/data-request.c @@ -1,5 +1,5 @@ /* Implementation of memory_object_data_request for pager library - Copyright (C) 1994, 1995, 1996 Free Software Foundation + Copyright (C) 1994,95,96,97,2000,02,10 Free Software Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -22,7 +22,7 @@ /* Implement pagein callback as described in <mach/memory_object.defs>. */ kern_return_t -_pager_seqnos_memory_object_data_request (mach_port_t object, +_pager_seqnos_memory_object_data_request (mach_port_t object, mach_port_seqno_t seqno, mach_port_t control, vm_offset_t offset, @@ -30,7 +30,7 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, vm_prot_t access) { struct pager *p; - char *pm_entry; + short *pm_entry; int doread, doerror; error_t err; vm_address_t page; @@ -43,7 +43,7 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, /* Acquire the right to meddle with the pagemap */ mutex_lock (&p->interlock); _pager_wait_for_seqno (p, seqno); - + /* sanity checks -- we don't do multi-page requests yet. */ if (control != p->memobjcntl) { @@ -52,7 +52,7 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, } if (length != __vm_page_size) { - printf ("incg data request: bad length size %d\n", length); + printf ("incg data request: bad length size %zd\n", length); goto release_out; } if (offset % __vm_page_size) @@ -61,18 +61,18 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, goto release_out; } - _pager_block_termination (p); /* prevent termination until + _pager_block_termination (p); /* prevent termination until mark_object_error is done */ if (p->pager_state != NORMAL) { printf ("pager in wrong state for read\n"); - _pager_release_seqno (p, seqno); - mutex_unlock (&p->interlock); - goto allow_term_out; + goto allow_release_out; } - _pager_pagemap_resize (p, offset + length); + err = _pager_pagemap_resize (p, offset + length); + if (err) + goto allow_release_out; /* Can't do much about the actual error. */ /* If someone is paging this out right now, the disk contents are unreliable, so we have to wait. It is too expensive (right now) to @@ -97,9 +97,9 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, if (PM_NEXTERROR (*pm_entry) != PAGE_NOERR && (access & VM_PROT_WRITE)) { - memory_object_data_error (control, offset, length, + memory_object_data_error (control, offset, length, _pager_page_errors[PM_NEXTERROR (*pm_entry)]); - _pager_mark_object_error (p, offset, length, + _pager_mark_object_error (p, offset, length, _pager_page_errors[PM_NEXTERROR (*pm_entry)]); *pm_entry = SET_PM_NEXTERROR (*pm_entry, PAGE_NOERR); doread = 0; @@ -117,7 +117,7 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, err = pager_read_page (p->upi, offset, &page, &write_lock); if (err) goto error_read; - + memory_object_data_supply (p->memobjcntl, offset, page, length, 1, write_lock ? VM_PROT_WRITE : VM_PROT_NONE, 0, MACH_PORT_NULL); @@ -128,20 +128,18 @@ _pager_seqnos_memory_object_data_request (mach_port_t object, ports_port_deref (p); return 0; - allow_term_out: - mutex_lock (&p->interlock); - _pager_allow_termination (p); - mutex_unlock (&p->interlock); - ports_port_deref (p); - return 0; - error_read: memory_object_data_error (p->memobjcntl, offset, length, EIO); _pager_mark_object_error (p, offset, length, EIO); + allow_term_out: + mutex_lock (&p->interlock); _pager_allow_termination (p); + mutex_unlock (&p->interlock); ports_port_deref (p); return 0; + allow_release_out: + _pager_allow_termination (p); release_out: _pager_release_seqno (p, seqno); mutex_unlock (&p->interlock); |