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
This commit is contained in:
Xin LI 2007-06-18 01:43:13 +00:00
parent 7faa61e65d
commit 21cf0e3907
2 changed files with 7 additions and 0 deletions

View File

@ -898,7 +898,10 @@ tmpfs_reg_resize(struct vnode *vp, off_t newsize)
node->tn_reg.tn_aobj_pages = newpages;
TMPFS_LOCK(tmp);
tmp->tm_pages_used += (newpages - oldpages);
TMPFS_UNLOCK(tmp);
node->tn_size = newsize;
vnode_pager_setsize(vp, newsize);
if (newsize < oldsize) {

View File

@ -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();