Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/md/md.c
Show First 20 Lines • Show All 1,009 Lines • ▼ Show 20 Lines | mdstart_swap(struct md_s *sc, struct bio *bp) | ||||
for (i = bp->bio_offset / PAGE_SIZE; i <= lastp; i++) { | for (i = bp->bio_offset / PAGE_SIZE; i <= lastp; i++) { | ||||
len = ((i == lastp) ? lastend : PAGE_SIZE) - offs; | len = ((i == lastp) ? lastend : PAGE_SIZE) - offs; | ||||
m = vm_page_grab(sc->object, i, VM_ALLOC_SYSTEM); | m = vm_page_grab(sc->object, i, VM_ALLOC_SYSTEM); | ||||
if (bp->bio_cmd == BIO_READ) { | if (bp->bio_cmd == BIO_READ) { | ||||
if (m->valid == VM_PAGE_BITS_ALL) | if (m->valid == VM_PAGE_BITS_ALL) | ||||
rv = VM_PAGER_OK; | rv = VM_PAGER_OK; | ||||
else | else | ||||
rv = vm_pager_get_pages(sc->object, &m, 1, | rv = vm_pager_get_pages(sc->object, &m, 1, | ||||
NULL, NULL); | VM_PROT_ALL, NULL, NULL); | ||||
if (rv == VM_PAGER_ERROR) { | if (rv == VM_PAGER_ERROR) { | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
break; | break; | ||||
} else if (rv == VM_PAGER_FAIL) { | } else if (rv == VM_PAGER_FAIL) { | ||||
/* | /* | ||||
* Pager does not have the page. Zero | * Pager does not have the page. Zero | ||||
* the allocated page, and mark it as | * the allocated page, and mark it as | ||||
* valid. Do not set dirty, the page | * valid. Do not set dirty, the page | ||||
Show All 11 Lines | if (bp->bio_cmd == BIO_READ) { | ||||
cpu_flush_dcache(p, len); | cpu_flush_dcache(p, len); | ||||
} else { | } else { | ||||
physcopyout(VM_PAGE_TO_PHYS(m) + offs, p, len); | physcopyout(VM_PAGE_TO_PHYS(m) + offs, p, len); | ||||
cpu_flush_dcache(p, len); | cpu_flush_dcache(p, len); | ||||
} | } | ||||
} else if (bp->bio_cmd == BIO_WRITE) { | } else if (bp->bio_cmd == BIO_WRITE) { | ||||
if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) | if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) | ||||
rv = vm_pager_get_pages(sc->object, &m, 1, | rv = vm_pager_get_pages(sc->object, &m, 1, | ||||
NULL, NULL); | VM_PROT_ALL, NULL, NULL); | ||||
else | else | ||||
rv = VM_PAGER_OK; | rv = VM_PAGER_OK; | ||||
if (rv == VM_PAGER_ERROR) { | if (rv == VM_PAGER_ERROR) { | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
break; | break; | ||||
} | } | ||||
if ((bp->bio_flags & BIO_UNMAPPED) != 0) { | if ((bp->bio_flags & BIO_UNMAPPED) != 0) { | ||||
pmap_copy_pages(bp->bio_ma, ma_offs, &m, | pmap_copy_pages(bp->bio_ma, ma_offs, &m, | ||||
offs, len); | offs, len); | ||||
} else if ((bp->bio_flags & BIO_VLIST) != 0) { | } else if ((bp->bio_flags & BIO_VLIST) != 0) { | ||||
physcopyin_vlist(vlist, ma_offs, | physcopyin_vlist(vlist, ma_offs, | ||||
VM_PAGE_TO_PHYS(m) + offs, len); | VM_PAGE_TO_PHYS(m) + offs, len); | ||||
} else { | } else { | ||||
physcopyin(p, VM_PAGE_TO_PHYS(m) + offs, len); | physcopyin(p, VM_PAGE_TO_PHYS(m) + offs, len); | ||||
} | } | ||||
m->valid = VM_PAGE_BITS_ALL; | m->valid = VM_PAGE_BITS_ALL; | ||||
} else if (bp->bio_cmd == BIO_DELETE) { | } else if (bp->bio_cmd == BIO_DELETE) { | ||||
if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) | if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) | ||||
rv = vm_pager_get_pages(sc->object, &m, 1, | rv = vm_pager_get_pages(sc->object, &m, 1, | ||||
NULL, NULL); | VM_PROT_ALL, NULL, NULL); | ||||
else | else | ||||
rv = VM_PAGER_OK; | rv = VM_PAGER_OK; | ||||
if (rv == VM_PAGER_ERROR) { | if (rv == VM_PAGER_ERROR) { | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
break; | break; | ||||
} | } | ||||
if (len != PAGE_SIZE) { | if (len != PAGE_SIZE) { | ||||
pmap_zero_page_area(m, offs, len); | pmap_zero_page_area(m, offs, len); | ||||
▲ Show 20 Lines • Show All 801 Lines • Show Last 20 Lines |