diff options
author | kib <kib@FreeBSD.org> | 2011-06-11 20:13:28 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2011-06-11 20:13:28 +0000 |
commit | 27bd440e100100525af7024fe2fcf722059ac220 (patch) | |
tree | 7c9178bd3a5b147d9daef9037abeb422fef8205c /sys/vm/vnode_pager.c | |
parent | 820661759dae361df907bef9e8f264082689ad81 (diff) | |
download | FreeBSD-src-27bd440e100100525af7024fe2fcf722059ac220.zip FreeBSD-src-27bd440e100100525af7024fe2fcf722059ac220.tar.gz |
Fix a bug in r222586. Lock the page owner object around the modification
of the m->dirty.
Reported and tested by: nwhitehorn
Reviewed by: alc
Diffstat (limited to 'sys/vm/vnode_pager.c')
-rw-r--r-- | sys/vm/vnode_pager.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 98a5be0..a8eca20 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -1195,8 +1195,13 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page_t *ma, int bytecount, void vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written) { + vm_object_t obj; int i, pos; + if (written == 0) + return; + obj = ma[0]->object; + VM_OBJECT_LOCK(obj); for (i = 0, pos = 0; pos < written; i++, pos += PAGE_SIZE) { if (pos < trunc_page(written)) { rtvals[i] = VM_PAGER_OK; @@ -1207,4 +1212,5 @@ vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written) vm_page_clear_dirty(ma[i], 0, written & PAGE_MASK); } } + VM_OBJECT_UNLOCK(obj); } |