diff options
author | alc <alc@FreeBSD.org> | 2002-07-21 20:01:32 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-21 20:01:32 +0000 |
commit | 2e0c2c9a4894aef0a0e16997aee0ee344a63ab13 (patch) | |
tree | e580867ed9d5964a3007fc3f8a481e049529135f /sys/nfsclient/nfs_bio.c | |
parent | ae5301d38f82283223c907fccaf5725df2cf57cd (diff) | |
download | FreeBSD-src-2e0c2c9a4894aef0a0e16997aee0ee344a63ab13.zip FreeBSD-src-2e0c2c9a4894aef0a0e16997aee0ee344a63ab13.tar.gz |
o Lock page queue accesses in nfs_getpages().
Diffstat (limited to 'sys/nfsclient/nfs_bio.c')
-rw-r--r-- | sys/nfsclient/nfs_bio.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c index e244c64..685c6d1 100644 --- a/sys/nfsclient/nfs_bio.c +++ b/sys/nfsclient/nfs_bio.c @@ -131,6 +131,7 @@ nfs_getpages(struct vop_getpages_args *ap) { vm_page_t m = pages[ap->a_reqpage]; + vm_page_lock_queues(); if (m->valid != 0) { /* handled by vm_fault now */ /* vm_page_zero_invalid(m, TRUE); */ @@ -138,8 +139,10 @@ nfs_getpages(struct vop_getpages_args *ap) if (i != ap->a_reqpage) vm_page_free(pages[i]); } + vm_page_unlock_queues(); return(0); } + vm_page_unlock_queues(); } /* @@ -170,10 +173,12 @@ nfs_getpages(struct vop_getpages_args *ap) if (error && (uio.uio_resid == count)) { printf("nfs_getpages: error %d\n", error); + vm_page_lock_queues(); for (i = 0; i < npages; ++i) { if (i != ap->a_reqpage) vm_page_free(pages[i]); } + vm_page_unlock_queues(); return VM_PAGER_ERROR; } @@ -184,7 +189,7 @@ nfs_getpages(struct vop_getpages_args *ap) */ size = count - uio.uio_resid; - + vm_page_lock_queues(); for (i = 0, toff = 0; i < npages; i++, toff = nextoff) { vm_page_t m; nextoff = toff + PAGE_SIZE; @@ -238,6 +243,7 @@ nfs_getpages(struct vop_getpages_args *ap) } } } + vm_page_unlock_queues(); return 0; } |