diff options
author | alc <alc@FreeBSD.org> | 2002-08-02 05:23:58 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-08-02 05:23:58 +0000 |
commit | 69425db61b078184b18c397d45b84d749a6f0b0c (patch) | |
tree | 8154b3d33efd893ac14b8d1d334d31514a435d08 /sys/fs/smbfs/smbfs_io.c | |
parent | a15cfdccfbf5cab416e0549067bea309ff990d9b (diff) | |
download | FreeBSD-src-69425db61b078184b18c397d45b84d749a6f0b0c.zip FreeBSD-src-69425db61b078184b18c397d45b84d749a6f0b0c.tar.gz |
o Lock page queue accesses in nwfs and smbfs.
o Assert that the page queues lock is held in vm_page_deactivate().
Diffstat (limited to 'sys/fs/smbfs/smbfs_io.c')
-rw-r--r-- | sys/fs/smbfs/smbfs_io.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/fs/smbfs/smbfs_io.c b/sys/fs/smbfs/smbfs_io.c index 6a2877b..ebb0934 100644 --- a/sys/fs/smbfs/smbfs_io.c +++ b/sys/fs/smbfs/smbfs_io.c @@ -455,10 +455,12 @@ smbfs_getpages(ap) if (m->valid != 0) { /* handled by vm_fault now */ /* vm_page_zero_invalid(m, TRUE); */ + vm_page_lock_queues(); for (i = 0; i < npages; ++i) { if (i != reqpage) vm_page_free(pages[i]); } + vm_page_unlock_queues(); return 0; } @@ -488,15 +490,18 @@ smbfs_getpages(ap) if (error && (uio.uio_resid == count)) { printf("smbfs_getpages: error %d\n",error); + vm_page_lock_queues(); for (i = 0; i < npages; i++) { if (reqpage != i) vm_page_free(pages[i]); } + vm_page_unlock_queues(); return VM_PAGER_ERROR; } 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; @@ -551,6 +556,7 @@ smbfs_getpages(ap) } } } + vm_page_unlock_queues(); return 0; #endif /* SMBFS_RWGENERIC */ } @@ -639,10 +645,12 @@ smbfs_putpages(ap) if (!error) { int nwritten = round_page(count - uio.uio_resid) / PAGE_SIZE; + vm_page_lock_queues(); for (i = 0; i < nwritten; i++) { rtvals[i] = VM_PAGER_OK; vm_page_undirty(pages[i]); } + vm_page_unlock_queues(); } return rtvals[0]; #endif /* SMBFS_RWGENERIC */ |