Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_cluster.c
Show First 20 Lines • Show All 459 Lines • ▼ Show 20 Lines | if (i == 0) { | ||||
tsize = size; | tsize = size; | ||||
VM_OBJECT_WLOCK(tbp->b_bufobj->bo_object); | VM_OBJECT_WLOCK(tbp->b_bufobj->bo_object); | ||||
for (j = 0; tsize > 0; j++) { | for (j = 0; tsize > 0; j++) { | ||||
toff = off & PAGE_MASK; | toff = off & PAGE_MASK; | ||||
tinc = tsize; | tinc = tsize; | ||||
if (toff + tinc > PAGE_SIZE) | if (toff + tinc > PAGE_SIZE) | ||||
tinc = PAGE_SIZE - toff; | tinc = PAGE_SIZE - toff; | ||||
VM_OBJECT_ASSERT_WLOCKED(tbp->b_pages[j]->object); | VM_OBJECT_ASSERT_WLOCKED(tbp->b_pages[j]->object); | ||||
if ((tbp->b_pages[j]->valid & | |||||
vm_page_bits(toff, tinc)) != 0) | |||||
break; | |||||
if (vm_page_trysbusy(tbp->b_pages[j]) == 0) | if (vm_page_trysbusy(tbp->b_pages[j]) == 0) | ||||
break; | break; | ||||
if ((tbp->b_pages[j]->valid & | |||||
vm_page_bits(toff, tinc)) != 0) { | |||||
vm_page_sunbusy(tbp->b_pages[j]); | |||||
break; | |||||
} | |||||
vm_object_pip_add(tbp->b_bufobj->bo_object, 1); | vm_object_pip_add(tbp->b_bufobj->bo_object, 1); | ||||
off += tinc; | off += tinc; | ||||
tsize -= tinc; | tsize -= tinc; | ||||
} | } | ||||
if (tsize > 0) { | if (tsize > 0) { | ||||
clean_sbusy: | clean_sbusy: | ||||
vm_object_pip_wakeupn(tbp->b_bufobj->bo_object, | vm_object_pip_wakeupn(tbp->b_bufobj->bo_object, | ||||
j); | j); | ||||
Show All 38 Lines | clean_sbusy: | ||||
for (j = 0; j < tbp->b_npages; j += 1) { | for (j = 0; j < tbp->b_npages; j += 1) { | ||||
vm_page_t m; | vm_page_t m; | ||||
m = tbp->b_pages[j]; | m = tbp->b_pages[j]; | ||||
if ((bp->b_npages == 0) || | if ((bp->b_npages == 0) || | ||||
(bp->b_pages[bp->b_npages-1] != m)) { | (bp->b_pages[bp->b_npages-1] != m)) { | ||||
bp->b_pages[bp->b_npages] = m; | bp->b_pages[bp->b_npages] = m; | ||||
bp->b_npages++; | bp->b_npages++; | ||||
} | } | ||||
if (m->valid == VM_PAGE_BITS_ALL) | if (vm_page_all_valid(m)) | ||||
tbp->b_pages[j] = bogus_page; | tbp->b_pages[j] = bogus_page; | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(tbp->b_bufobj->bo_object); | VM_OBJECT_WUNLOCK(tbp->b_bufobj->bo_object); | ||||
/* | /* | ||||
* Don't inherit tbp->b_bufsize as it may be larger due to | * Don't inherit tbp->b_bufsize as it may be larger due to | ||||
* a non-page-aligned size. Instead just aggregate using | * a non-page-aligned size. Instead just aggregate using | ||||
* 'size'. | * 'size'. | ||||
*/ | */ | ||||
if (tbp->b_bcount != size) | if (tbp->b_bcount != size) | ||||
printf("warning: tbp->b_bcount wrong %ld vs %ld\n", tbp->b_bcount, size); | printf("warning: tbp->b_bcount wrong %ld vs %ld\n", tbp->b_bcount, size); | ||||
if (tbp->b_bufsize != size) | if (tbp->b_bufsize != size) | ||||
printf("warning: tbp->b_bufsize wrong %ld vs %ld\n", tbp->b_bufsize, size); | printf("warning: tbp->b_bufsize wrong %ld vs %ld\n", tbp->b_bufsize, size); | ||||
bp->b_bcount += size; | bp->b_bcount += size; | ||||
bp->b_bufsize += size; | bp->b_bufsize += size; | ||||
} | } | ||||
/* | /* | ||||
* Fully valid pages in the cluster are already good and do not need | * Fully valid pages in the cluster are already good and do not need | ||||
* to be re-read from disk. Replace the page with bogus_page | * to be re-read from disk. Replace the page with bogus_page | ||||
*/ | */ | ||||
VM_OBJECT_WLOCK(bp->b_bufobj->bo_object); | VM_OBJECT_WLOCK(bp->b_bufobj->bo_object); | ||||
for (j = 0; j < bp->b_npages; j++) { | for (j = 0; j < bp->b_npages; j++) { | ||||
VM_OBJECT_ASSERT_WLOCKED(bp->b_pages[j]->object); | VM_OBJECT_ASSERT_WLOCKED(bp->b_pages[j]->object); | ||||
if (bp->b_pages[j]->valid == VM_PAGE_BITS_ALL) | if (vm_page_all_valid(bp->b_pages[j])) | ||||
bp->b_pages[j] = bogus_page; | bp->b_pages[j] = bogus_page; | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(bp->b_bufobj->bo_object); | VM_OBJECT_WUNLOCK(bp->b_bufobj->bo_object); | ||||
if (bp->b_bufsize > bp->b_kvasize) | if (bp->b_bufsize > bp->b_kvasize) | ||||
panic("cluster_rbuild: b_bufsize(%ld) > b_kvasize(%d)\n", | panic("cluster_rbuild: b_bufsize(%ld) > b_kvasize(%d)\n", | ||||
bp->b_bufsize, bp->b_kvasize); | bp->b_bufsize, bp->b_kvasize); | ||||
if (buf_mapped(bp)) { | if (buf_mapped(bp)) { | ||||
▲ Show 20 Lines • Show All 538 Lines • Show Last 20 Lines |