From: Al Viro Date: Mon, 10 Oct 2016 17:39:05 +0000 (-0400) Subject: [btrfs] fix check_direct_IO() for non-iovec iterators X-Git-Tag: v4.9-rc1~56^2 X-Git-Url: http://git.cascardo.info/?p=cascardo%2Flinux.git;a=commitdiff_plain;h=cd27e455042da85b088bdd3a6e00da1d5b4df9f1 [btrfs] fix check_direct_IO() for non-iovec iterators looking for duplicate ->iov_base makes sense only for iovec-backed iterators; for kvec-backed ones it's pointless, for bvec-backed ones it's pointless and broken on 32bit (we walk through an array of struct bio_vec accessing them as if they were struct iovec; works by accident on 64bit, but on 32bit it'll blow up) and for pipe-backed ones it's pointless and ends up oopsing. Signed-off-by: Al Viro --- diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index e6811c42e41e..ff15cf42763a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8618,7 +8618,7 @@ static ssize_t check_direct_IO(struct btrfs_root *root, struct kiocb *iocb, goto out; /* If this is a write we don't need to check anymore */ - if (iov_iter_rw(iter) == WRITE) + if (iov_iter_rw(iter) != READ || !iter_is_iovec(iter)) return 0; /* * Check to make sure we don't have duplicate iov_base's in this