* out allowed
*/
io->ci_allow_unaligned_dio = true;
+ if (args)
+ io->ci_hybrid_switched = args->via_hybrid_switched;
ll_io_set_mirror(io, file);
}
if (iocb_ki_flags_check(flags, DIRECT)) {
if (iocb_ki_flags_check(flags, APPEND))
dio_lock = true;
- if (!is_sync_kiocb(args->u.normal.via_iocb))
+ if (!is_sync_kiocb(args->u.normal.via_iocb) &&
+ /* hybrid IO is also potentially async */
+ !args->via_hybrid_switched)
is_aio = true;
/* the kernel does not support AIO on pipes, and parallel DIO
ll_ras_enter(file, iocb->ki_pos, iov_iter_count(to));
+ args = ll_env_args(env);
+ args->u.normal.via_iter = to;
+ args->u.normal.via_iocb = iocb;
+
if (ll_hybrid_bio_dio_switch_check(file, iocb, CIT_READ,
iov_iter_count(to))) {
#ifdef IOCB_DIRECT
iocb->ki_flags |= IOCB_DIRECT;
CDEBUG(D_VFSTRACE, "switching to DIO\n");
+ args->via_hybrid_switched = 1;
#endif
}
- args = ll_env_args(env);
- args->u.normal.via_iter = to;
- args->u.normal.via_iocb = iocb;
-
result = ll_do_fast_read(iocb, to);
if (result < 0 || iov_iter_count(to) == 0)
GOTO(out, result);
*/
static ssize_t ll_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
+ struct file *file = iocb->ki_filp;
struct vvp_io_args *args;
struct lu_env *env;
- ssize_t rc_tiny = 0, rc_normal;
- struct file *file = iocb->ki_filp;
int flags = iocb_ki_flags_get(file, iocb);
+ ktime_t kstart = ktime_get();
+ bool hybrid_switched = false;
+ ssize_t rc_tiny = 0;
+ ssize_t rc_normal;
__u16 refcheck;
bool cached;
- ktime_t kstart = ktime_get();
int result;
ENTRY;
#ifdef IOCB_DIRECT
iocb->ki_flags |= IOCB_DIRECT;
CDEBUG(D_VFSTRACE, "switching to DIO\n");
+ hybrid_switched = true;
#endif
}
args = ll_env_args(env);
args->u.normal.via_iter = from;
args->u.normal.via_iocb = iocb;
+ args->via_hybrid_switched = hybrid_switched;
rc_normal = ll_file_io_generic(env, args, file, CIT_WRITE,
&iocb->ki_pos, iov_iter_count(from));
if (ll_iov_iter_alignment(iter) & ~PAGE_MASK)
unaligned = true;
+ lcc = ll_cl_find(inode);
+ if (lcc == NULL)
+ RETURN(-EIO);
+
+ env = lcc->lcc_env;
+ LASSERT(!IS_ERR(env));
+ vio = vvp_env_io(env);
+ io = lcc->lcc_io;
+ LASSERT(io != NULL);
+
CDEBUG(D_VFSTRACE,
- "VFS Op:inode="DFID"(%p), size=%zd (max %lu), offset=%lld=%llx, pages %zd (max %lu)%s\n",
+ "VFS Op:inode="DFID"(%p), size=%zd (max %lu), offset=%lld=%llx, pages %zd (max %lu)%s%s%s%s\n",
PFID(ll_inode2fid(inode)), inode, count, MAX_DIO_SIZE,
file_offset, file_offset,
(count >> PAGE_SHIFT) + !!(count & ~PAGE_MASK),
- MAX_DIO_SIZE >> PAGE_SHIFT, unaligned ? ", unaligned" : "");
+ MAX_DIO_SIZE >> PAGE_SHIFT,
+ io->ci_dio_lock ? ", locked" : ", lockless",
+ io->ci_parallel_dio ? ", parallel" : "",
+ unaligned ? ", unaligned" : "",
+ io->ci_hybrid_switched ? ", hybrid" : "");
/* Check EOF by ourselves */
if (rw == READ && file_offset >= i_size_read(inode))
if (unaligned && iov_iter_is_pipe(iter))
RETURN(0);
- lcc = ll_cl_find(inode);
- if (lcc == NULL)
- RETURN(-EIO);
-
- env = lcc->lcc_env;
- LASSERT(!IS_ERR(env));
- vio = vvp_env_io(env);
- io = lcc->lcc_io;
- LASSERT(io != NULL);
-
/* this means we encountered an old server which can't safely support
* unaligned DIO, so we have to disable it
*/