Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/fuse/fuse_io.c
Show First 20 Lines • Show All 149 Lines • ▼ Show 20 Lines | if (directio) { | ||||
err = fuse_read_directbackend(vp, uio, cred, fufh); | err = fuse_read_directbackend(vp, uio, cred, fufh); | ||||
} else { | } else { | ||||
FS_DEBUG("buffered read of vnode %ju\n", | FS_DEBUG("buffered read of vnode %ju\n", | ||||
(uintmax_t)VTOILLU(vp)); | (uintmax_t)VTOILLU(vp)); | ||||
err = fuse_read_biobackend(vp, uio, cred, fufh); | err = fuse_read_biobackend(vp, uio, cred, fufh); | ||||
} | } | ||||
break; | break; | ||||
case UIO_WRITE: | case UIO_WRITE: | ||||
if (directio) { | /* | ||||
* Kludge: simulate write-through caching via write-around | |||||
* caching. Same effect, as far as never caching dirty data, | |||||
* but slightly pessimal in that newly written data is not | |||||
* cached. | |||||
*/ | |||||
if (directio || fuse_data_cache_mode == FUSE_CACHE_WT) { | |||||
FS_DEBUG("direct write of vnode %ju via file handle %ju\n", | FS_DEBUG("direct write of vnode %ju via file handle %ju\n", | ||||
(uintmax_t)VTOILLU(vp), (uintmax_t)fufh->fh_id); | (uintmax_t)VTOILLU(vp), (uintmax_t)fufh->fh_id); | ||||
err = fuse_write_directbackend(vp, uio, cred, fufh, ioflag); | err = fuse_write_directbackend(vp, uio, cred, fufh, ioflag); | ||||
} else { | } else { | ||||
FS_DEBUG("buffered write of vnode %ju\n", | FS_DEBUG("buffered write of vnode %ju\n", | ||||
(uintmax_t)VTOILLU(vp)); | (uintmax_t)VTOILLU(vp)); | ||||
err = fuse_write_biobackend(vp, uio, cred, fufh, ioflag); | err = fuse_write_biobackend(vp, uio, cred, fufh, ioflag); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 191 Lines • ▼ Show 20 Lines | while (uio->uio_resid > 0) { | ||||
diff = chunksize - ((struct fuse_write_out *)fdi.answ)->size; | diff = chunksize - ((struct fuse_write_out *)fdi.answ)->size; | ||||
if (diff < 0) { | if (diff < 0) { | ||||
err = EINVAL; | err = EINVAL; | ||||
break; | break; | ||||
} | } | ||||
uio->uio_resid += diff; | uio->uio_resid += diff; | ||||
uio->uio_offset -= diff; | uio->uio_offset -= diff; | ||||
if (uio->uio_offset > fvdat->filesize && | if (uio->uio_offset > fvdat->filesize && | ||||
fuse_data_cache_enable) { | fuse_data_cache_mode != FUSE_CACHE_UC) { | ||||
fuse_vnode_setsize(vp, cred, uio->uio_offset); | fuse_vnode_setsize(vp, cred, uio->uio_offset); | ||||
fvdat->flag &= ~FN_SIZECHANGE; | fvdat->flag &= ~FN_SIZECHANGE; | ||||
} | } | ||||
} | } | ||||
fdisp_destroy(&fdi); | fdisp_destroy(&fdi); | ||||
return (err); | return (err); | ||||
▲ Show 20 Lines • Show All 444 Lines • Show Last 20 Lines |