summaryrefslogtreecommitdiffstats
path: root/sys/fs/tmpfs/tmpfs_vnops.c
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2007-06-18 01:43:13 +0000
committerdelphij <delphij@FreeBSD.org>2007-06-18 01:43:13 +0000
commitd50b261fe6e7f3f67e3bfbdd03cbd09850712bd9 (patch)
tree78902b02076c9a77796f306d712d4baa54c2e59e /sys/fs/tmpfs/tmpfs_vnops.c
parenta5faebae4a45342f035681844764b46bc962865c (diff)
downloadFreeBSD-src-d50b261fe6e7f3f67e3bfbdd03cbd09850712bd9.zip
FreeBSD-src-d50b261fe6e7f3f67e3bfbdd03cbd09850712bd9.tar.gz
MFp4: fix two locking problems:
- Hold TMPFS_LOCK while updating tm_pages_used. - Hold vm page while doing uiomove. This will hopefully fix all known panics. Submitted by: Howard Su
Diffstat (limited to 'sys/fs/tmpfs/tmpfs_vnops.c')
-rw-r--r--sys/fs/tmpfs/tmpfs_vnops.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c
index a3711b6..d7aea01 100644
--- a/sys/fs/tmpfs/tmpfs_vnops.c
+++ b/sys/fs/tmpfs/tmpfs_vnops.c
@@ -505,6 +505,9 @@ tmpfs_uio_xfer(struct tmpfs_mount *tmp, struct tmpfs_node *node,
if (uio->uio_rw == UIO_READ && m->valid != VM_PAGE_BITS_ALL)
if (vm_pager_get_pages(uobj, &m, 1, 0) != VM_PAGER_OK)
vm_page_zero_invalid(m, TRUE);
+ vm_page_lock_queues();
+ vm_page_hold(m);
+ vm_page_unlock_queues();
VM_OBJECT_UNLOCK(uobj);
sched_pin();
sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
@@ -518,6 +521,7 @@ tmpfs_uio_xfer(struct tmpfs_mount *tmp, struct tmpfs_node *node,
vm_page_zero_invalid(m, TRUE);
vm_page_dirty(m);
}
+ vm_page_unhold(m);
vm_page_activate(m);
vm_page_wakeup(m);
vm_page_unlock_queues();
OpenPOWER on IntegriCloud