aboutsummaryrefslogtreecommitdiff
path: root/libpager
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2021-05-06 15:56:26 +0300
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-05-06 23:54:32 +0200
commita9f1e487350cca14ac7df732ac24437822d4eac9 (patch)
tree24ff6a41fce282e503e70796293c0aac5323e534 /libpager
parentc1e4791543544e91d52d3e85590a370494c03603 (diff)
downloadhurd-a9f1e487350cca14ac7df732ac24437822d4eac9.tar.gz
hurd-a9f1e487350cca14ac7df732ac24437822d4eac9.tar.bz2
hurd-a9f1e487350cca14ac7df732ac24437822d4eac9.zip
libpager: Fix mixing up success and error
_pager_pagemap_resize () returns an error or 0 on success, not a boolean. Message-Id: <20210506125631.79117-2-bugaevc@gmail.com>
Diffstat (limited to 'libpager')
-rw-r--r--libpager/offer-page.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/libpager/offer-page.c b/libpager/offer-page.c
index 9f090bcb..ddea236a 100644
--- a/libpager/offer-page.c
+++ b/libpager/offer-page.c
@@ -31,21 +31,22 @@ pager_offer_page (struct pager *p,
pthread_mutex_lock (&p->interlock);
if (_pager_pagemap_resize (p, offset + vm_page_size))
+ goto release_out;
+
+ short *pm_entry = &p->pagemap[offset / vm_page_size];
+
+ while (*pm_entry & PM_INCORE)
{
- short *pm_entry = &p->pagemap[offset / vm_page_size];
-
- while (*pm_entry & PM_INCORE)
- {
- pthread_mutex_unlock (&p->interlock);
- pager_flush_some (p, offset, vm_page_size, 1);
- pthread_mutex_lock (&p->interlock);
- }
- *pm_entry |= PM_INCORE;
-
- memory_object_data_supply (p->memobjcntl, offset, buf, vm_page_size, 0,
- writelock ? VM_PROT_WRITE : VM_PROT_NONE,
- precious, MACH_PORT_NULL);
+ pthread_mutex_unlock (&p->interlock);
+ pager_flush_some (p, offset, vm_page_size, 1);
+ pthread_mutex_lock (&p->interlock);
}
+ *pm_entry |= PM_INCORE;
+
+ memory_object_data_supply (p->memobjcntl, offset, buf, vm_page_size, 0,
+ writelock ? VM_PROT_WRITE : VM_PROT_NONE,
+ precious, MACH_PORT_NULL);
+ release_out:
pthread_mutex_unlock (&p->interlock);
}