diff options
author | alc <alc@FreeBSD.org> | 2003-10-04 20:38:32 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-10-04 20:38:32 +0000 |
commit | 96e57c74e6b01016ed04d9977ddd48cf53c5d165 (patch) | |
tree | 7aebdcff073f0ba9861f02cdefb16c5d21767a24 /sys/ufs | |
parent | 7c11eaebacba51be590dbfcfc8a8dcc8513a0eb2 (diff) | |
download | FreeBSD-src-96e57c74e6b01016ed04d9977ddd48cf53c5d165.zip FreeBSD-src-96e57c74e6b01016ed04d9977ddd48cf53c5d165.tar.gz |
Synchronize access to a vm page's valid field using the containing
vm object's lock.
Diffstat (limited to 'sys/ufs')
-rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 15480fe..061ebc1 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -824,10 +824,10 @@ ffs_getpages(ap) * user programs might reference data beyond the actual end of file * occuring within the page. We have to zero that data. */ + VM_OBJECT_LOCK(mreq->object); if (mreq->valid) { if (mreq->valid != VM_PAGE_BITS_ALL) vm_page_zero_invalid(mreq, TRUE); - VM_OBJECT_LOCK(mreq->object); vm_page_lock_queues(); for (i = 0; i < pcount; i++) { if (i != ap->a_reqpage) { @@ -838,7 +838,7 @@ ffs_getpages(ap) VM_OBJECT_UNLOCK(mreq->object); return VM_PAGER_OK; } - + VM_OBJECT_UNLOCK(mreq->object); vp = ap->a_vp; obj = vp->v_object; bsize = vp->v_mount->mnt_stat.f_iosize; @@ -868,14 +868,15 @@ ffs_getpages(ap) vm_page_free(ap->a_m[i]); } vm_page_unlock_queues(); - VM_OBJECT_UNLOCK(obj); if (reqblkno == -1) { if ((mreq->flags & PG_ZERO) == 0) pmap_zero_page(mreq); vm_page_undirty(mreq); mreq->valid = VM_PAGE_BITS_ALL; + VM_OBJECT_UNLOCK(obj); return VM_PAGER_OK; } else { + VM_OBJECT_UNLOCK(obj); return VM_PAGER_ERROR; } } |