Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_cluster.c
Show First 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | cluster_read(struct vnode *vp, u_quad_t filesize, daddr_t lblkno, long size, | ||||
struct thread *td; | struct thread *td; | ||||
daddr_t blkno, origblkno; | daddr_t blkno, origblkno; | ||||
int maxra, racluster; | int maxra, racluster; | ||||
int error, ncontig; | int error, ncontig; | ||||
int i; | int i; | ||||
error = 0; | error = 0; | ||||
td = curthread; | td = curthread; | ||||
bo = &vp->v_bufobj; | bo = vp2bo(vp); | ||||
if (!unmapped_buf_allowed) | if (!unmapped_buf_allowed) | ||||
gbflags &= ~GB_UNMAPPED; | gbflags &= ~GB_UNMAPPED; | ||||
/* | /* | ||||
* Try to limit the amount of read-ahead by a few | * Try to limit the amount of read-ahead by a few | ||||
* ad-hoc parameters. This needs work!!! | * ad-hoc parameters. This needs work!!! | ||||
*/ | */ | ||||
racluster = vp->v_mount->mnt_iosize_max / size; | racluster = vp->v_mount->mnt_iosize_max / size; | ||||
Show All 28 Lines | if (bp->b_flags & B_CACHE) { | ||||
} else { | } else { | ||||
bp->b_flags &= ~B_RAM; | bp->b_flags &= ~B_RAM; | ||||
BO_RLOCK(bo); | BO_RLOCK(bo); | ||||
for (i = 1; i < maxra; i++) { | for (i = 1; i < maxra; i++) { | ||||
/* | /* | ||||
* Stop if the buffer does not exist or it | * Stop if the buffer does not exist or it | ||||
* is invalid (about to go away?) | * is invalid (about to go away?) | ||||
*/ | */ | ||||
rbp = gbincore(&vp->v_bufobj, lblkno+i); | rbp = gbincore(vp2bo(vp), lblkno + i); | ||||
if (rbp == NULL || (rbp->b_flags & B_INVAL)) | if (rbp == NULL || (rbp->b_flags & B_INVAL)) | ||||
break; | break; | ||||
/* | /* | ||||
* Set another read-ahead mark so we know | * Set another read-ahead mark so we know | ||||
* to check again. (If we can lock the | * to check again. (If we can lock the | ||||
* buffer without waiting) | * buffer without waiting) | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 243 Lines • ▼ Show 20 Lines | cluster_rbuild(struct vnode *vp, u_quad_t filesize, daddr_t lbn, | ||||
bp->b_bcount = 0; | bp->b_bcount = 0; | ||||
bp->b_bufsize = 0; | bp->b_bufsize = 0; | ||||
bp->b_npages = 0; | bp->b_npages = 0; | ||||
inc = btodb(size); | inc = btodb(size); | ||||
for (bn = blkno, i = 0; i < run; ++i, bn += inc) { | for (bn = blkno, i = 0; i < run; ++i, bn += inc) { | ||||
if (i == 0) { | if (i == 0) { | ||||
vm_object_pip_add(tbp->b_bufobj->bo_object, | vm_object_pip_add(tbp->b_vp->v_object, | ||||
tbp->b_npages); | tbp->b_npages); | ||||
vfs_busy_pages_acquire(tbp); | vfs_busy_pages_acquire(tbp); | ||||
} else { | } else { | ||||
if ((bp->b_npages * PAGE_SIZE) + | if ((bp->b_npages * PAGE_SIZE) + | ||||
round_page(size) > vp->v_mount->mnt_iosize_max) { | round_page(size) > vp->v_mount->mnt_iosize_max) { | ||||
break; | break; | ||||
} | } | ||||
Show All 34 Lines | if (i == 0) { | ||||
tinc = PAGE_SIZE - toff; | tinc = PAGE_SIZE - toff; | ||||
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 & | if ((tbp->b_pages[j]->valid & | ||||
vm_page_bits(toff, tinc)) != 0) { | vm_page_bits(toff, tinc)) != 0) { | ||||
vm_page_sunbusy(tbp->b_pages[j]); | vm_page_sunbusy(tbp->b_pages[j]); | ||||
break; | break; | ||||
} | } | ||||
vm_object_pip_add(tbp->b_bufobj->bo_object, 1); | vm_object_pip_add(tbp->b_vp->v_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_vp->v_object, | ||||
j); | j); | ||||
for (k = 0; k < j; k++) | for (k = 0; k < j; k++) | ||||
vm_page_sunbusy(tbp->b_pages[k]); | vm_page_sunbusy(tbp->b_pages[k]); | ||||
bqrelse(tbp); | bqrelse(tbp); | ||||
break; | break; | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 331 Lines • ▼ Show 20 Lines | cluster_wbuild(struct vnode *vp, long size, daddr_t start_lbn, int len, | ||||
struct bufobj *bo; | struct bufobj *bo; | ||||
int i, j; | int i, j; | ||||
int totalwritten = 0; | int totalwritten = 0; | ||||
int dbsize = btodb(size); | int dbsize = btodb(size); | ||||
if (!unmapped_buf_allowed) | if (!unmapped_buf_allowed) | ||||
gbflags &= ~GB_UNMAPPED; | gbflags &= ~GB_UNMAPPED; | ||||
bo = &vp->v_bufobj; | bo = vp2bo(vp); | ||||
while (len > 0) { | while (len > 0) { | ||||
/* | /* | ||||
* If the buffer is not delayed-write (i.e. dirty), or it | * If the buffer is not delayed-write (i.e. dirty), or it | ||||
* is delayed-write but either locked or inval, it cannot | * is delayed-write but either locked or inval, it cannot | ||||
* partake in the clustered write. | * partake in the clustered write. | ||||
*/ | */ | ||||
BO_LOCK(bo); | BO_LOCK(bo); | ||||
if ((tbp = gbincore(&vp->v_bufobj, start_lbn)) == NULL || | if ((tbp = gbincore(bo, start_lbn)) == NULL || | ||||
(tbp->b_vflags & BV_BKGRDINPROG)) { | (tbp->b_vflags & BV_BKGRDINPROG)) { | ||||
BO_UNLOCK(bo); | BO_UNLOCK(bo); | ||||
++start_lbn; | ++start_lbn; | ||||
--len; | --len; | ||||
continue; | continue; | ||||
} | } | ||||
if (BUF_LOCK(tbp, | if (BUF_LOCK(tbp, | ||||
LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, BO_LOCKPTR(bo))) { | LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, BO_LOCKPTR(bo))) { | ||||
▲ Show 20 Lines • Show All 145 Lines • ▼ Show 20 Lines | for (i = 0; i < len; ++i, ++start_lbn) { | ||||
for (j--; j >= 0; j--) | for (j--; j >= 0; j--) | ||||
vm_page_sunbusy( | vm_page_sunbusy( | ||||
tbp->b_pages[j]); | tbp->b_pages[j]); | ||||
bqrelse(tbp); | bqrelse(tbp); | ||||
goto finishcluster; | goto finishcluster; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
vm_object_pip_add(tbp->b_bufobj->bo_object, | vm_object_pip_add(tbp->b_vp->v_object, | ||||
tbp->b_npages); | tbp->b_npages); | ||||
for (j = 0; j < tbp->b_npages; j += 1) { | for (j = 0; j < tbp->b_npages; j += 1) { | ||||
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++; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines |