diff options
author | delphij <delphij@FreeBSD.org> | 2007-06-18 01:43:13 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2007-06-18 01:43:13 +0000 |
commit | d50b261fe6e7f3f67e3bfbdd03cbd09850712bd9 (patch) | |
tree | 78902b02076c9a77796f306d712d4baa54c2e59e /sys/fs/tmpfs/tmpfs_vnops.c | |
parent | a5faebae4a45342f035681844764b46bc962865c (diff) | |
download | FreeBSD-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.c | 4 |
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(); |