aboutsummaryrefslogtreecommitdiff
path: root/libpager/data-request.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpager/data-request.c')
-rw-r--r--libpager/data-request.c38
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);