Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_default.c
Show First 20 Lines • Show All 709 Lines • ▼ Show 20 Lines | struct vop_bmap_args /* { | ||||
struct vnode *a_vp; | struct vnode *a_vp; | ||||
daddr_t a_bn; | daddr_t a_bn; | ||||
struct bufobj **a_bop; | struct bufobj **a_bop; | ||||
daddr_t *a_bnp; | daddr_t *a_bnp; | ||||
int *a_runp; | int *a_runp; | ||||
int *a_runb; | int *a_runb; | ||||
} */ *ap; | } */ *ap; | ||||
{ | { | ||||
struct vnode *vp; | |||||
if (ap->a_bop != NULL) | vp = ap->a_vp; | ||||
*ap->a_bop = &ap->a_vp->v_bufobj; | if (ap->a_bop != NULL) { | ||||
if ((vp->v_irflag & VIRF_BUFOBJ) != 0) | |||||
*ap->a_bop = vp2bo(vp); | |||||
else | |||||
*ap->a_bop = NULL; | |||||
} | |||||
if (ap->a_bnp != NULL) | if (ap->a_bnp != NULL) | ||||
*ap->a_bnp = ap->a_bn * btodb(ap->a_vp->v_mount->mnt_stat.f_iosize); | *ap->a_bnp = ap->a_bn * btodb(ap->a_vp->v_mount-> | ||||
mnt_stat.f_iosize); | |||||
if (ap->a_runp != NULL) | if (ap->a_runp != NULL) | ||||
*ap->a_runp = 0; | *ap->a_runp = 0; | ||||
if (ap->a_runb != NULL) | if (ap->a_runb != NULL) | ||||
*ap->a_runb = 0; | *ap->a_runb = 0; | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
▲ Show 20 Lines • Show All 360 Lines • ▼ Show 20 Lines | vop_stdadvise(struct vop_advise_args *ap) | ||||
case POSIX_FADV_DONTNEED: | case POSIX_FADV_DONTNEED: | ||||
error = 0; | error = 0; | ||||
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); | vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); | ||||
if (VN_IS_DOOMED(vp)) { | if (VN_IS_DOOMED(vp)) { | ||||
VOP_UNLOCK(vp); | VOP_UNLOCK(vp); | ||||
break; | break; | ||||
} | } | ||||
bo = (vp->v_irflag & VIRF_BUFOBJ) != 0 ? vp2bo(vp) : NULL; | |||||
/* | /* | ||||
* Round to block boundaries (and later possibly further to | * Round to block boundaries (and later possibly further to | ||||
* page boundaries). Applications cannot reasonably be aware | * page boundaries). Applications cannot reasonably be aware | ||||
* of the boundaries, and the rounding must be to expand at | * of the boundaries, and the rounding must be to expand at | ||||
* both extremities to cover enough. It still doesn't cover | * both extremities to cover enough. It still doesn't cover | ||||
* read-ahead. For partial blocks, this gives unnecessary | * read-ahead. For partial blocks, this gives unnecessary | ||||
* discarding of buffers but is efficient enough since the | * discarding of buffers but is efficient enough since the | ||||
* pages usually remain in VMIO for some time. | * pages usually remain in VMIO for some time. | ||||
*/ | */ | ||||
bsize = vp->v_bufobj.bo_bsize; | if (bo != NULL) | ||||
bsize = bo->bo_bsize; | |||||
else | |||||
bsize = vp->v_mount->mnt_stat.f_bsize; | |||||
bstart = rounddown(ap->a_start, bsize); | bstart = rounddown(ap->a_start, bsize); | ||||
bend = roundup(ap->a_end, bsize); | bend = roundup(ap->a_end, bsize); | ||||
/* | /* | ||||
* Deactivate pages in the specified range from the backing VM | * Deactivate pages in the specified range from the backing VM | ||||
* object. Pages that are resident in the buffer cache will | * object. Pages that are resident in the buffer cache will | ||||
* remain wired until their corresponding buffers are released | * remain wired until their corresponding buffers are released | ||||
* below. | * below. | ||||
*/ | */ | ||||
if (vp->v_object != NULL) { | if (vp->v_object != NULL) { | ||||
start = trunc_page(bstart); | start = trunc_page(bstart); | ||||
end = round_page(bend); | end = round_page(bend); | ||||
VM_OBJECT_RLOCK(vp->v_object); | VM_OBJECT_RLOCK(vp->v_object); | ||||
vm_object_page_noreuse(vp->v_object, OFF_TO_IDX(start), | vm_object_page_noreuse(vp->v_object, OFF_TO_IDX(start), | ||||
OFF_TO_IDX(end)); | OFF_TO_IDX(end)); | ||||
VM_OBJECT_RUNLOCK(vp->v_object); | VM_OBJECT_RUNLOCK(vp->v_object); | ||||
} | } | ||||
bo = &vp->v_bufobj; | if (bo != NULL) { | ||||
BO_RLOCK(bo); | BO_RLOCK(bo); | ||||
startn = bstart / bsize; | startn = bstart / bsize; | ||||
endn = bend / bsize; | endn = bend / bsize; | ||||
error = bnoreuselist(&bo->bo_clean, bo, startn, endn); | error = bnoreuselist(&bo->bo_clean, bo, startn, endn); | ||||
if (error == 0) | if (error == 0) | ||||
error = bnoreuselist(&bo->bo_dirty, bo, startn, endn); | error = bnoreuselist(&bo->bo_dirty, bo, startn, | ||||
endn); | |||||
BO_RUNLOCK(bo); | BO_RUNLOCK(bo); | ||||
} | |||||
VOP_UNLOCK(vp); | VOP_UNLOCK(vp); | ||||
break; | break; | ||||
default: | default: | ||||
error = EINVAL; | error = EINVAL; | ||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 202 Lines • ▼ Show 20 Lines | vfs_stdsync(mp, waitfor) | ||||
lockreq = LK_EXCLUSIVE | LK_INTERLOCK; | lockreq = LK_EXCLUSIVE | LK_INTERLOCK; | ||||
if (waitfor != MNT_WAIT) | if (waitfor != MNT_WAIT) | ||||
lockreq |= LK_NOWAIT; | lockreq |= LK_NOWAIT; | ||||
/* | /* | ||||
* Force stale buffer cache information to be flushed. | * Force stale buffer cache information to be flushed. | ||||
*/ | */ | ||||
loop: | loop: | ||||
MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | ||||
if (vp->v_bufobj.bo_dirty.bv_cnt == 0) { | if ((vp->v_irflag & VIRF_BUFOBJ) != 0 && | ||||
vp2bo(vp)->bo_dirty.bv_cnt == 0) { | |||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
continue; | continue; | ||||
} | } | ||||
if ((error = vget(vp, lockreq)) != 0) { | if ((error = vget(vp, lockreq)) != 0) { | ||||
if (error == ENOENT) { | if (error == ENOENT) { | ||||
MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | ||||
goto loop; | goto loop; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 240 Lines • Show Last 20 Lines |