diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-10-10 13:39:05 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-10-10 13:58:16 -0400 |
commit | cd27e455042da85b088bdd3a6e00da1d5b4df9f1 (patch) | |
tree | d1a17b68a4098b632c79103a2d2c2184b11cee6f /fs | |
parent | b57332b4105abf1d518d93886e547ee2f98cd414 (diff) | |
download | linux-cd27e455042da85b088bdd3a6e00da1d5b4df9f1.tar.gz linux-cd27e455042da85b088bdd3a6e00da1d5b4df9f1.tar.bz2 linux-cd27e455042da85b088bdd3a6e00da1d5b4df9f1.zip |
[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 <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 2 |
1 files changed, 1 insertions, 1 deletions
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 |