diff options
author | alc <alc@FreeBSD.org> | 2002-07-28 08:01:48 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-28 08:01:48 +0000 |
commit | 27bb8a731053c781fa1e0e6b76b8d1927cbe7496 (patch) | |
tree | 9803ae09fb8ba774595a3f89e83a86d2238eb4d5 /sys | |
parent | 82b3ef03869b7a2ffde4e167655034422dfe28a8 (diff) | |
download | FreeBSD-src-27bb8a731053c781fa1e0e6b76b8d1927cbe7496.zip FreeBSD-src-27bb8a731053c781fa1e0e6b76b8d1927cbe7496.tar.gz |
Lock page queue accesses by vm_page_free().
Diffstat (limited to 'sys')
-rw-r--r-- | sys/ufs/ufs/ufs_readwrite.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/ufs/ufs/ufs_readwrite.c b/sys/ufs/ufs/ufs_readwrite.c index 9db4e87..0e998d6 100644 --- a/sys/ufs/ufs/ufs_readwrite.c +++ b/sys/ufs/ufs/ufs_readwrite.c @@ -648,11 +648,13 @@ ffs_getpages(ap) if (mreq->valid) { if (mreq->valid != VM_PAGE_BITS_ALL) vm_page_zero_invalid(mreq, TRUE); + vm_page_lock_queues(); for (i = 0; i < pcount; i++) { if (i != ap->a_reqpage) { vm_page_free(ap->a_m[i]); } } + vm_page_unlock_queues(); return VM_PAGER_OK; } @@ -678,10 +680,12 @@ ffs_getpages(ap) dp = VTOI(vp)->i_devvp; if (ufs_bmaparray(vp, reqlblkno, &reqblkno, 0, &bforwards, &bbackwards) || (reqblkno == -1)) { + vm_page_lock_queues(); for(i = 0; i < pcount; i++) { if (i != ap->a_reqpage) vm_page_free(ap->a_m[i]); } + vm_page_unlock_queues(); if (reqblkno == -1) { if ((mreq->flags & PG_ZERO) == 0) vm_page_zero_fill(mreq); @@ -705,8 +709,10 @@ ffs_getpages(ap) pbackwards = poff + bbackwards * pagesperblock; if (ap->a_reqpage > pbackwards) { firstpage = ap->a_reqpage - pbackwards; + vm_page_lock_queues(); for(i=0;i<firstpage;i++) vm_page_free(ap->a_m[i]); + vm_page_unlock_queues(); } /* @@ -716,8 +722,10 @@ ffs_getpages(ap) pforwards = (pagesperblock - (poff + 1)) + bforwards * pagesperblock; if (pforwards < (pcount - (ap->a_reqpage + 1))) { + vm_page_lock_queues(); for( i = ap->a_reqpage + pforwards + 1; i < pcount; i++) vm_page_free(ap->a_m[i]); + vm_page_unlock_queues(); pcount = ap->a_reqpage + pforwards + 1; } |