From f29ba63ec91fe9ed9f731e690254bba1d38f0b78 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 22 Jun 2003 21:35:41 +0000 Subject: Maintain a lock on the vm object of interest throughout vm_fault(), releasing the lock only if we are about to sleep (e.g., vm_pager_get_pages() or vm_pager_has_pages()). If we sleep, we have marked the vm object with the paging-in-progress flag. --- sys/vm/vnode_pager.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sys/vm/vnode_pager.c') diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index bfc255d67ebf..69f4b421a6bc 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -214,7 +214,7 @@ vnode_pager_haspage(object, pindex, before, after) int bsize; int pagesperblock, blocksperpage; - GIANT_REQUIRED; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); /* * If no vp or vp is doomed or marked transparent to VM, we do not * have the page. @@ -245,8 +245,10 @@ vnode_pager_haspage(object, pindex, before, after) blocksperpage = (PAGE_SIZE / bsize); reqblock = pindex * blocksperpage; } + VM_OBJECT_UNLOCK(object); err = VOP_BMAP(vp, reqblock, (struct vnode **) 0, &bn, after, before); + VM_OBJECT_LOCK(object); if (err) return TRUE; if (bn == -1) -- cgit v1.3