From f9966ce9e8106e72749aa3390aeefb55e65dbbad Mon Sep 17 00:00:00 2001 From: alc Date: Sat, 3 May 2003 20:28:26 +0000 Subject: [PATCH] Lock the vm_object on entry to vm_object_vndeallocate(). --- sys/ufs/ffs/ffs_vnops.c | 5 +++++ sys/vm/vm_object.c | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index eda8b0b09491..9bcd7ffabc4d 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -549,6 +549,7 @@ ffs_read(ap) } if (object) { + VM_OBJECT_LOCK(object); vm_object_vndeallocate(object); } if ((error == 0 || uio->uio_resid != orig_resid) && @@ -613,6 +614,7 @@ ffs_write(ap) uio->uio_offset = ip->i_size; if ((ip->i_flags & APPEND) && uio->uio_offset != ip->i_size) { if (object) { + VM_OBJECT_LOCK(object); vm_object_vndeallocate(object); } return (EPERM); @@ -634,6 +636,7 @@ ffs_write(ap) if (uio->uio_offset < 0 || (u_int64_t)uio->uio_offset + uio->uio_resid > fs->fs_maxfilesize) { if (object) { + VM_OBJECT_LOCK(object); vm_object_vndeallocate(object); } return (EFBIG); @@ -650,6 +653,7 @@ ffs_write(ap) psignal(td->td_proc, SIGXFSZ); PROC_UNLOCK(td->td_proc); if (object) { + VM_OBJECT_LOCK(object); vm_object_vndeallocate(object); } return (EFBIG); @@ -774,6 +778,7 @@ ffs_write(ap) error = UFS_UPDATE(vp, 1); if (object) { + VM_OBJECT_LOCK(object); vm_object_vndeallocate(object); } diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 5a9d7e03d2d1..3c7a2398ae1d 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -399,6 +399,7 @@ vm_object_vndeallocate(vm_object_t object) struct vnode *vp = (struct vnode *) object->handle; GIANT_REQUIRED; + VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); KASSERT(object->type == OBJT_VNODE, ("vm_object_vndeallocate: not a vnode object")); KASSERT(vp != NULL, ("vm_object_vndeallocate: missing vp")); @@ -414,6 +415,7 @@ vm_object_vndeallocate(vm_object_t object) mp_fixme("Unlocked vflag access."); vp->v_vflag &= ~VV_TEXT; } + VM_OBJECT_UNLOCK(object); /* * vrele may need a vop lock */ @@ -440,8 +442,9 @@ vm_object_deallocate(vm_object_t object) while (object != NULL) { if (object->type == OBJT_VNODE) { + VM_OBJECT_LOCK(object); vm_object_vndeallocate(object); - vm_object_unlock(object); + mtx_unlock(&Giant); return; }