Re: btrfs_direct_IO oops

From: Al Viro
Date: Sat Oct 08 2016 - 14:30:32 EST


On Sat, Oct 08, 2016 at 02:08:06PM -0400, Dave Jones wrote:
> That code: matches this dissembly:
>
> for (i = seg + 1; i < iter->nr_segs; i++) {

*whoa*

OK, that loop in check_direct_IO() should be done *ONLY* for
iovec iter - even for a bvec one it's completely bogus, and
for pipe ones it blows up immediately.

Sorry, I'd missed that bogosity - replace
if (iov_iter_rw(iter) == WRITE)
return 0;
with
if (iov_iter_rw(iter) != READ || !iter_is_iovec(iter))
return 0;
in there; that should fix the damn thing.