Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_vnops.c
Show First 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | |||||
static fo_rdwr_t vn_io_fault; | static fo_rdwr_t vn_io_fault; | ||||
static fo_truncate_t vn_truncate; | static fo_truncate_t vn_truncate; | ||||
static fo_ioctl_t vn_ioctl; | static fo_ioctl_t vn_ioctl; | ||||
static fo_poll_t vn_poll; | static fo_poll_t vn_poll; | ||||
static fo_kqfilter_t vn_kqfilter; | static fo_kqfilter_t vn_kqfilter; | ||||
static fo_stat_t vn_statfile; | static fo_stat_t vn_statfile; | ||||
static fo_close_t vn_closefile; | static fo_close_t vn_closefile; | ||||
static fo_mmap_t vn_mmap; | static fo_mmap_t vn_mmap; | ||||
static fo_fallocate_t vn_fallocate; | |||||
struct fileops vnops = { | struct fileops vnops = { | ||||
.fo_read = vn_io_fault, | .fo_read = vn_io_fault, | ||||
.fo_write = vn_io_fault, | .fo_write = vn_io_fault, | ||||
.fo_truncate = vn_truncate, | .fo_truncate = vn_truncate, | ||||
.fo_ioctl = vn_ioctl, | .fo_ioctl = vn_ioctl, | ||||
.fo_poll = vn_poll, | .fo_poll = vn_poll, | ||||
.fo_kqfilter = vn_kqfilter, | .fo_kqfilter = vn_kqfilter, | ||||
.fo_stat = vn_statfile, | .fo_stat = vn_statfile, | ||||
.fo_close = vn_closefile, | .fo_close = vn_closefile, | ||||
.fo_chmod = vn_chmod, | .fo_chmod = vn_chmod, | ||||
.fo_chown = vn_chown, | .fo_chown = vn_chown, | ||||
.fo_sendfile = vn_sendfile, | .fo_sendfile = vn_sendfile, | ||||
.fo_seek = vn_seek, | .fo_seek = vn_seek, | ||||
.fo_fill_kinfo = vn_fill_kinfo, | .fo_fill_kinfo = vn_fill_kinfo, | ||||
.fo_mmap = vn_mmap, | .fo_mmap = vn_mmap, | ||||
.fo_fallocate = vn_fallocate, | |||||
.fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE | .fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE | ||||
}; | }; | ||||
static const int io_hold_cnt = 16; | static const int io_hold_cnt = 16; | ||||
static int vn_io_fault_enable = 1; | static int vn_io_fault_enable = 1; | ||||
SYSCTL_INT(_debug, OID_AUTO, vn_io_fault_enable, CTLFLAG_RW, | SYSCTL_INT(_debug, OID_AUTO, vn_io_fault_enable, CTLFLAG_RW, | ||||
&vn_io_fault_enable, 0, "Enable vn_io_fault lock avoidance"); | &vn_io_fault_enable, 0, "Enable vn_io_fault lock avoidance"); | ||||
static int vn_io_fault_prefault = 0; | static int vn_io_fault_prefault = 0; | ||||
▲ Show 20 Lines • Show All 3,013 Lines • ▼ Show 20 Lines | while (copylen > 0 && error == 0 && !eof) { | ||||
} | } | ||||
} | } | ||||
xfer = blksize; | xfer = blksize; | ||||
} | } | ||||
} | } | ||||
out: | out: | ||||
*lenp = savlen - len; | *lenp = savlen - len; | ||||
free(dat, M_TEMP); | free(dat, M_TEMP); | ||||
return (error); | |||||
} | |||||
static int | |||||
vn_fallocate(struct file *fp, off_t offset, off_t len, struct thread *td) | |||||
{ | |||||
struct mount *mp; | |||||
struct vnode *vp; | |||||
off_t olen, ooffset; | |||||
int error; | |||||
#ifdef AUDIT | |||||
int audited_vnode1 = 0; | |||||
#endif | |||||
vp = fp->f_vnode; | |||||
if (vp->v_type != VREG) | |||||
return (ENODEV); | |||||
/* Allocating blocks may take a long time, so iterate. */ | |||||
for (;;) { | |||||
olen = len; | |||||
ooffset = offset; | |||||
bwillwrite(); | |||||
mp = NULL; | |||||
error = vn_start_write(vp, &mp, V_WAIT | PCATCH); | |||||
if (error != 0) | |||||
break; | |||||
error = vn_lock(vp, LK_EXCLUSIVE); | |||||
if (error != 0) { | |||||
vn_finished_write(mp); | |||||
break; | |||||
} | |||||
#ifdef AUDIT | |||||
if (!audited_vnode1) { | |||||
AUDIT_ARG_VNODE1(vp); | |||||
audited_vnode1 = 1; | |||||
} | |||||
#endif | |||||
#ifdef MAC | |||||
error = mac_vnode_check_write(td->td_ucred, fp->f_cred, vp); | |||||
if (error == 0) | |||||
#endif | |||||
error = VOP_ALLOCATE(vp, &offset, &len); | |||||
VOP_UNLOCK(vp); | |||||
vn_finished_write(mp); | |||||
if (olen + ooffset != offset + len) { | |||||
panic("offset + len changed from %jx/%jx to %jx/%jx", | |||||
ooffset, olen, offset, len); | |||||
} | |||||
if (error != 0 || len == 0) | |||||
break; | |||||
KASSERT(olen > len, ("Iteration did not make progress?")); | |||||
maybe_yield(); | |||||
} | |||||
return (error); | return (error); | ||||
} | } |