summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/vm/vnode_pager.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index e683a84..b4a9bf6 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -701,7 +701,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
int runend;
struct buf *bp;
int count;
- int error = 0;
+ int error;
object = vp->v_object;
count = bytecount / PAGE_SIZE;
@@ -724,7 +724,8 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
/*
* if we can't bmap, use old VOP code
*/
- if (VOP_BMAP(vp, foff / bsize, &bo, &reqblock, NULL, NULL)) {
+ error = VOP_BMAP(vp, foff / bsize, &bo, &reqblock, NULL, NULL);
+ if (error == EOPNOTSUPP) {
VM_OBJECT_LOCK(object);
vm_page_lock_queues();
for (i = 0; i < count; i++)
@@ -736,6 +737,15 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
error = vnode_pager_input_old(object, m[reqpage]);
VM_OBJECT_UNLOCK(object);
return (error);
+ } else if (error != 0) {
+ VM_OBJECT_LOCK(object);
+ vm_page_lock_queues();
+ for (i = 0; i < count; i++)
+ if (i != reqpage)
+ vm_page_free(m[i]);
+ vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(object);
+ return (VM_PAGER_ERROR);
/*
* if the blocksize is smaller than a page size, then use
OpenPOWER on IntegriCloud