]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
[btrfs] fix check_direct_IO() for non-iovec iterators
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 10 Oct 2016 17:39:05 +0000 (13:39 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 10 Oct 2016 17:58:16 +0000 (13:58 -0400)
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 <viro@zeniv.linux.org.uk>
fs/btrfs/inode.c

index e6811c42e41ef34d27119ee5420d4c6653df8519..ff15cf42763a7449038ad9ac73dc9cae914c5a0f 100644 (file)
@@ -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