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:
parent
7faa61e65d
commit
21cf0e3907
@ -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) {
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user