summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/vm/vm_mmap.c11
-rw-r--r--sys/vm/vm_object.c7
2 files changed, 15 insertions, 3 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index c17e9ce..ef63f85 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1284,7 +1284,7 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize,
error = EINVAL;
goto done;
}
- if (obj->handle != vp) {
+ if (obj->type == OBJT_VNODE && obj->handle != vp) {
vput(vp);
vp = (struct vnode *)obj->handle;
/*
@@ -1333,7 +1333,14 @@ vm_mmap_vnode(struct thread *td, vm_size_t objsize,
objsize = round_page(va.va_size);
if (va.va_nlink == 0)
flags |= MAP_NOSYNC;
- obj = vm_pager_allocate(OBJT_VNODE, vp, objsize, prot, foff, cred);
+ if (obj->type == OBJT_VNODE)
+ obj = vm_pager_allocate(OBJT_VNODE, vp, objsize, prot, foff,
+ cred);
+ else {
+ KASSERT(obj->type == OBJT_DEFAULT || obj->type == OBJT_SWAP,
+ ("wrong object type"));
+ vm_object_reference(obj);
+ }
if (obj == NULL) {
error = ENOMEM;
goto done;
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 3d9ec61..1f7cb78 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -820,7 +820,12 @@ vm_object_page_clean(vm_object_t object, vm_ooffset_t start, vm_ooffset_t end,
boolean_t clearobjflags, eio, res;
VM_OBJECT_ASSERT_WLOCKED(object);
- KASSERT(object->type == OBJT_VNODE, ("Not a vnode object"));
+
+ /*
+ * The OBJ_MIGHTBEDIRTY flag is only set for OBJT_VNODE
+ * objects. The check below prevents the function from
+ * operating on non-vnode objects.
+ */
if ((object->flags & OBJ_MIGHTBEDIRTY) == 0 ||
object->resident_page_count == 0)
return (TRUE);
OpenPOWER on IntegriCloud