aboutsummaryrefslogtreecommitdiff
path: root/sys/vm
diff options
context:
space:
mode:
authorTor Egge <tegge@FreeBSD.org>2006-03-02 22:13:28 +0000
committerTor Egge <tegge@FreeBSD.org>2006-03-02 22:13:28 +0000
commit3b582b4e72350d7a6342af85ca1356dcd1f2b2bc (patch)
treea136dfc347b9ef7b044439ec33fe997d02fb4061 /sys/vm
parent6b085058e4179f8bfd9ce1534f13cfa8ea2236a6 (diff)
Notes
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_contig.c3
-rw-r--r--sys/vm/vm_object.c3
-rw-r--r--sys/vm/vnode_pager.c2
3 files changed, 6 insertions, 2 deletions
diff --git a/sys/vm/vm_contig.c b/sys/vm/vm_contig.c
index 488a16c76597..c8768850dc92 100644
--- a/sys/vm/vm_contig.c
+++ b/sys/vm/vm_contig.c
@@ -91,6 +91,7 @@ vm_contig_launder_page(vm_page_t m)
vm_object_t object;
vm_page_t m_tmp;
struct vnode *vp;
+ struct mount *mp;
object = m->object;
if (!VM_OBJECT_TRYLOCK(object))
@@ -109,12 +110,14 @@ vm_contig_launder_page(vm_page_t m)
vp = object->handle;
vm_object_reference_locked(object);
VM_OBJECT_UNLOCK(object);
+ (void) vn_start_write(vp, &mp, V_WAIT);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
VM_OBJECT_LOCK(object);
vm_object_page_clean(object, 0, 0, OBJPC_SYNC);
VM_OBJECT_UNLOCK(object);
VOP_UNLOCK(vp, 0, curthread);
vm_object_deallocate(object);
+ vn_finished_write(mp);
vm_page_lock_queues();
return (0);
} else if (object->type == OBJT_SWAP ||
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 5321b537b5bb..845752988ca4 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -993,6 +993,7 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size,
{
vm_object_t backing_object;
struct vnode *vp;
+ struct mount *mp;
int flags;
if (object == NULL)
@@ -1023,6 +1024,7 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size,
int vfslocked;
vp = object->handle;
VM_OBJECT_UNLOCK(object);
+ (void) vn_start_write(vp, &mp, V_WAIT);
vfslocked = VFS_LOCK_GIANT(vp->v_mount);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
flags = (syncio || invalidate) ? OBJPC_SYNC : 0;
@@ -1035,6 +1037,7 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size,
VM_OBJECT_UNLOCK(object);
VOP_UNLOCK(vp, 0, curthread);
VFS_UNLOCK_GIANT(vfslocked);
+ vn_finished_write(mp);
VM_OBJECT_LOCK(object);
}
if ((object->type == OBJT_VNODE ||
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index aafdea168e41..8532bbf2fe76 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -1017,11 +1017,9 @@ vnode_pager_putpages(object, m, count, sync, rtvals)
VM_OBJECT_UNLOCK(object);
if (vp->v_type != VREG)
mp = NULL;
- (void)vn_start_write(vp, &mp, V_WAIT);
rtval = VOP_PUTPAGES(vp, m, bytes, sync, rtvals, 0);
KASSERT(rtval != EOPNOTSUPP,
("vnode_pager: stale FS putpages\n"));
- vn_finished_write(mp);
VM_OBJECT_LOCK(object);
}