Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_default.c
Show First 20 Lines • Show All 1,068 Lines • ▼ Show 20 Lines | out: | ||||
*ap->a_len = len; | *ap->a_len = len; | ||||
*ap->a_offset = offset; | *ap->a_offset = offset; | ||||
free(buf, M_TEMP); | free(buf, M_TEMP); | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp, | vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp, | ||||
struct ucred *cred) | int ioflag, struct ucred *cred) | ||||
{ | { | ||||
int iosize; | int iosize; | ||||
int error = 0; | int error = 0; | ||||
struct iovec aiov; | struct iovec aiov; | ||||
struct uio auio; | struct uio auio; | ||||
struct thread *td; | struct thread *td; | ||||
off_t offset, len; | off_t offset, len; | ||||
Show All 19 Lines | while (len > 0) { | ||||
auio.uio_iov = &aiov; | auio.uio_iov = &aiov; | ||||
auio.uio_iovcnt = 1; | auio.uio_iovcnt = 1; | ||||
auio.uio_offset = offset; | auio.uio_offset = offset; | ||||
auio.uio_resid = xfersize; | auio.uio_resid = xfersize; | ||||
auio.uio_segflg = UIO_SYSSPACE; | auio.uio_segflg = UIO_SYSSPACE; | ||||
auio.uio_rw = UIO_WRITE; | auio.uio_rw = UIO_WRITE; | ||||
auio.uio_td = td; | auio.uio_td = td; | ||||
error = VOP_WRITE(vp, &auio, 0, cred); | error = VOP_WRITE(vp, &auio, ioflag, cred); | ||||
if (error != 0) { | if (error != 0) { | ||||
len -= xfersize - auio.uio_resid; | len -= xfersize - auio.uio_resid; | ||||
offset += xfersize - auio.uio_resid; | offset += xfersize - auio.uio_resid; | ||||
break; | break; | ||||
} | } | ||||
len -= xfersize; | len -= xfersize; | ||||
offset += xfersize; | offset += xfersize; | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | if (noff != offset) { | ||||
break; | break; | ||||
} | } | ||||
error = vn_bmap_seekhole_locked(vp, FIOSEEKHOLE, &noff, cred); | error = vn_bmap_seekhole_locked(vp, FIOSEEKHOLE, &noff, cred); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
/* Fill zeroes */ | /* Fill zeroes */ | ||||
xfersize = rem = omin(noff - offset, len); | xfersize = rem = omin(noff - offset, len); | ||||
error = vp_zerofill(vp, &va, &offset, &rem, cred); | error = vp_zerofill(vp, &va, &offset, &rem, ap->a_ioflag, cred); | ||||
if (error) { | if (error) { | ||||
len -= xfersize - rem; | len -= xfersize - rem; | ||||
goto out; | goto out; | ||||
} | } | ||||
len -= xfersize; | len -= xfersize; | ||||
if (should_yield()) | if (should_yield()) | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 566 Lines • Show Last 20 Lines |