Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
Show First 20 Lines • Show All 1,696 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
vmobj = ma[0]->object; | vmobj = ma[0]->object; | ||||
zfs_vmobject_wlock(vmobj); | zfs_vmobject_wlock(vmobj); | ||||
db = dbp[0]; | db = dbp[0]; | ||||
for (i = 0; i < *rbehind; i++) { | for (i = 0; i < *rbehind; i++) { | ||||
m = vm_page_grab(vmobj, ma[0]->pindex - 1 - i, | m = vm_page_grab(vmobj, ma[0]->pindex - 1 - i, | ||||
VM_ALLOC_NORMAL | VM_ALLOC_NOWAIT | VM_ALLOC_NOBUSY); | VM_ALLOC_NORMAL | VM_ALLOC_NOWAIT | | ||||
VM_ALLOC_SBUSY | VM_ALLOC_IGN_SBUSY); | |||||
if (m == NULL) | if (m == NULL) | ||||
break; | break; | ||||
if (m->valid != 0) { | if (!vm_page_none_valid(m)) { | ||||
ASSERT3U(m->valid, ==, VM_PAGE_BITS_ALL); | ASSERT3U(m->valid, ==, VM_PAGE_BITS_ALL); | ||||
vm_page_sunbusy(m); | |||||
break; | break; | ||||
} | } | ||||
ASSERT(m->dirty == 0); | ASSERT(m->dirty == 0); | ||||
ASSERT(!pmap_page_is_mapped(m)); | ASSERT(!pmap_page_is_mapped(m)); | ||||
ASSERT(db->db_size > PAGE_SIZE); | ASSERT(db->db_size > PAGE_SIZE); | ||||
bufoff = IDX_TO_OFF(m->pindex) % db->db_size; | bufoff = IDX_TO_OFF(m->pindex) % db->db_size; | ||||
va = zfs_map_page(m, &sf); | va = zfs_map_page(m, &sf); | ||||
bcopy((char *)db->db_data + bufoff, va, PAGESIZE); | bcopy((char *)db->db_data + bufoff, va, PAGESIZE); | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
vm_page_lock(m); | vm_page_lock(m); | ||||
if ((m->busy_lock & VPB_BIT_WAITERS) != 0) | if ((m->busy_lock & VPB_BIT_WAITERS) != 0) | ||||
vm_page_activate(m); | vm_page_activate(m); | ||||
else | else | ||||
vm_page_deactivate(m); | vm_page_deactivate(m); | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
vm_page_sunbusy(m); | |||||
} | } | ||||
*rbehind = i; | *rbehind = i; | ||||
bufoff = IDX_TO_OFF(ma[0]->pindex) % db->db_size; | bufoff = IDX_TO_OFF(ma[0]->pindex) % db->db_size; | ||||
pgoff = 0; | pgoff = 0; | ||||
for (mi = 0, di = 0; mi < count && di < numbufs; ) { | for (mi = 0, di = 0; mi < count && di < numbufs; ) { | ||||
if (pgoff == 0) { | if (pgoff == 0) { | ||||
m = ma[mi]; | m = ma[mi]; | ||||
if (m != bogus_page) { | if (m != bogus_page) { | ||||
vm_page_assert_xbusied(m); | vm_page_assert_xbusied(m); | ||||
ASSERT(m->valid == 0); | ASSERT(vm_page_none_valid(m)); | ||||
ASSERT(m->dirty == 0); | ASSERT(m->dirty == 0); | ||||
ASSERT(!pmap_page_is_mapped(m)); | ASSERT(!pmap_page_is_mapped(m)); | ||||
va = zfs_map_page(m, &sf); | va = zfs_map_page(m, &sf); | ||||
} | } | ||||
} | } | ||||
if (bufoff == 0) | if (bufoff == 0) | ||||
db = dbp[di]; | db = dbp[di]; | ||||
Show All 11 Lines | for (mi = 0, di = 0; mi < count && di < numbufs; ) { | ||||
if (m != bogus_page) | if (m != bogus_page) | ||||
bcopy((char *)db->db_data + bufoff, va + pgoff, tocpy); | bcopy((char *)db->db_data + bufoff, va + pgoff, tocpy); | ||||
pgoff += tocpy; | pgoff += tocpy; | ||||
ASSERT(pgoff <= PAGESIZE); | ASSERT(pgoff <= PAGESIZE); | ||||
if (pgoff == PAGESIZE) { | if (pgoff == PAGESIZE) { | ||||
if (m != bogus_page) { | if (m != bogus_page) { | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
} | } | ||||
ASSERT(mi < count); | ASSERT(mi < count); | ||||
mi++; | mi++; | ||||
pgoff = 0; | pgoff = 0; | ||||
} | } | ||||
bufoff += tocpy; | bufoff += tocpy; | ||||
ASSERT(bufoff <= db->db_size); | ASSERT(bufoff <= db->db_size); | ||||
Show All 32 Lines | if (pgoff != 0) { | ||||
ASSERT((dbp[0]->db_size & PAGE_MASK) != 0); | ASSERT((dbp[0]->db_size & PAGE_MASK) != 0); | ||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
if (pgoff != 0) { | if (pgoff != 0) { | ||||
ASSERT(m != bogus_page); | ASSERT(m != bogus_page); | ||||
bzero(va + pgoff, PAGESIZE - pgoff); | bzero(va + pgoff, PAGESIZE - pgoff); | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
} | } | ||||
for (i = 0; i < *rahead; i++) { | for (i = 0; i < *rahead; i++) { | ||||
m = vm_page_grab(vmobj, ma[count - 1]->pindex + 1 + i, | m = vm_page_grab(vmobj, ma[count - 1]->pindex + 1 + i, | ||||
VM_ALLOC_NORMAL | VM_ALLOC_NOWAIT | VM_ALLOC_NOBUSY); | VM_ALLOC_NORMAL | VM_ALLOC_NOWAIT | | ||||
VM_ALLOC_SBUSY | VM_ALLOC_IGN_SBUSY); | |||||
if (m == NULL) | if (m == NULL) | ||||
break; | break; | ||||
if (m->valid != 0) { | if (!vm_page_none_valid(m)) { | ||||
ASSERT3U(m->valid, ==, VM_PAGE_BITS_ALL); | ASSERT3U(m->valid, ==, VM_PAGE_BITS_ALL); | ||||
vm_page_sunbusy(m); | |||||
break; | break; | ||||
} | } | ||||
ASSERT(m->dirty == 0); | ASSERT(m->dirty == 0); | ||||
ASSERT(!pmap_page_is_mapped(m)); | ASSERT(!pmap_page_is_mapped(m)); | ||||
ASSERT(db->db_size > PAGE_SIZE); | ASSERT(db->db_size > PAGE_SIZE); | ||||
bufoff = IDX_TO_OFF(m->pindex) % db->db_size; | bufoff = IDX_TO_OFF(m->pindex) % db->db_size; | ||||
tocpy = MIN(db->db_size - bufoff, PAGESIZE); | tocpy = MIN(db->db_size - bufoff, PAGESIZE); | ||||
va = zfs_map_page(m, &sf); | va = zfs_map_page(m, &sf); | ||||
bcopy((char *)db->db_data + bufoff, va, tocpy); | bcopy((char *)db->db_data + bufoff, va, tocpy); | ||||
if (tocpy < PAGESIZE) { | if (tocpy < PAGESIZE) { | ||||
ASSERT(i == *rahead - 1); | ASSERT(i == *rahead - 1); | ||||
ASSERT((db->db_size & PAGE_MASK) != 0); | ASSERT((db->db_size & PAGE_MASK) != 0); | ||||
bzero(va + tocpy, PAGESIZE - tocpy); | bzero(va + tocpy, PAGESIZE - tocpy); | ||||
} | } | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
vm_page_lock(m); | vm_page_lock(m); | ||||
if ((m->busy_lock & VPB_BIT_WAITERS) != 0) | if ((m->busy_lock & VPB_BIT_WAITERS) != 0) | ||||
vm_page_activate(m); | vm_page_activate(m); | ||||
else | else | ||||
vm_page_deactivate(m); | vm_page_deactivate(m); | ||||
vm_page_unlock(m); | vm_page_unlock(m); | ||||
vm_page_sunbusy(m); | |||||
} | } | ||||
*rahead = i; | *rahead = i; | ||||
zfs_vmobject_wunlock(vmobj); | zfs_vmobject_wunlock(vmobj); | ||||
dmu_buf_rele_array(dbp, numbufs, FTAG); | dmu_buf_rele_array(dbp, numbufs, FTAG); | ||||
return (0); | return (0); | ||||
} | } | ||||
#endif /* illumos */ | #endif /* illumos */ | ||||
▲ Show 20 Lines • Show All 851 Lines • Show Last 20 Lines |