From: Al Viro Date: Tue, 7 Apr 2015 19:06:19 +0000 (-0400) Subject: fuse: ->direct_IO() doesn't need generic_write_checks() X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=6b775b18eecf60b8a44723e05f8eb6251b71a7a9;p=openwrt%2Fstaging%2Fblogic.git fuse: ->direct_IO() doesn't need generic_write_checks() already done by caller. We used to call __fuse_direct_write(), which called generic_write_checks(); now the former got expanded, bringing the latter to the surface. It used to be called all along and calling it from there had been wrong all along... Signed-off-by: Al Viro --- diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 4c04a8144a75..8c15d0a077e8 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -2806,8 +2806,8 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) if (async_dio && iov_iter_rw(iter) != WRITE && offset + count > i_size) { if (offset >= i_size) return 0; - count = min_t(loff_t, count, fuse_round_up(i_size - offset)); - iov_iter_truncate(iter, count); + iov_iter_truncate(iter, fuse_round_up(i_size - offset)); + count = iov_iter_count(iter); } io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); @@ -2841,12 +2841,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) io->done = &wait; if (iov_iter_rw(iter) == WRITE) { - ret = generic_write_checks(file, &pos, &count); - if (!ret) { - iov_iter_truncate(iter, count); - ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); - } - + ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); fuse_invalidate_attr(inode); } else { ret = __fuse_direct_read(io, iter, &pos);