summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-07-28 08:01:48 +0000
committeralc <alc@FreeBSD.org>2002-07-28 08:01:48 +0000
commit27bb8a731053c781fa1e0e6b76b8d1927cbe7496 (patch)
tree9803ae09fb8ba774595a3f89e83a86d2238eb4d5 /sys/ufs
parent82b3ef03869b7a2ffde4e167655034422dfe28a8 (diff)
downloadFreeBSD-src-27bb8a731053c781fa1e0e6b76b8d1927cbe7496.zip
FreeBSD-src-27bb8a731053c781fa1e0e6b76b8d1927cbe7496.tar.gz
Lock page queue accesses by vm_page_free().
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ufs/ufs_readwrite.c8
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;
}
OpenPOWER on IntegriCloud