diff options
-rw-r--r-- | fs/fuse/file.c | 6 | ||||
-rw-r--r-- | fs/fuse/fuse_i.h | 1 |
2 files changed, 4 insertions, 3 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 76eac2a554c4..810ed4f99e38 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -609,7 +609,7 @@ static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_req *req) | |||
609 | struct fuse_io_priv *io = req->io; | 609 | struct fuse_io_priv *io = req->io; |
610 | ssize_t pos = -1; | 610 | ssize_t pos = -1; |
611 | 611 | ||
612 | fuse_release_user_pages(req, !io->write); | 612 | fuse_release_user_pages(req, io->should_dirty); |
613 | 613 | ||
614 | if (io->write) { | 614 | if (io->write) { |
615 | if (req->misc.write.in.size != req->misc.write.out.size) | 615 | if (req->misc.write.in.size != req->misc.write.out.size) |
@@ -1316,7 +1316,6 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, | |||
1316 | loff_t *ppos, int flags) | 1316 | loff_t *ppos, int flags) |
1317 | { | 1317 | { |
1318 | int write = flags & FUSE_DIO_WRITE; | 1318 | int write = flags & FUSE_DIO_WRITE; |
1319 | bool should_dirty = !write && iter_is_iovec(iter); | ||
1320 | int cuse = flags & FUSE_DIO_CUSE; | 1319 | int cuse = flags & FUSE_DIO_CUSE; |
1321 | struct file *file = io->file; | 1320 | struct file *file = io->file; |
1322 | struct inode *inode = file->f_mapping->host; | 1321 | struct inode *inode = file->f_mapping->host; |
@@ -1346,6 +1345,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, | |||
1346 | inode_unlock(inode); | 1345 | inode_unlock(inode); |
1347 | } | 1346 | } |
1348 | 1347 | ||
1348 | io->should_dirty = !write && iter_is_iovec(iter); | ||
1349 | while (count) { | 1349 | while (count) { |
1350 | size_t nres; | 1350 | size_t nres; |
1351 | fl_owner_t owner = current->files; | 1351 | fl_owner_t owner = current->files; |
@@ -1360,7 +1360,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, | |||
1360 | nres = fuse_send_read(req, io, pos, nbytes, owner); | 1360 | nres = fuse_send_read(req, io, pos, nbytes, owner); |
1361 | 1361 | ||
1362 | if (!io->async) | 1362 | if (!io->async) |
1363 | fuse_release_user_pages(req, should_dirty); | 1363 | fuse_release_user_pages(req, io->should_dirty); |
1364 | if (req->out.h.error) { | 1364 | if (req->out.h.error) { |
1365 | err = req->out.h.error; | 1365 | err = req->out.h.error; |
1366 | break; | 1366 | break; |
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 1bd7ffdad593..bd4d2a3e1ec1 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -249,6 +249,7 @@ struct fuse_io_priv { | |||
249 | size_t size; | 249 | size_t size; |
250 | __u64 offset; | 250 | __u64 offset; |
251 | bool write; | 251 | bool write; |
252 | bool should_dirty; | ||
252 | int err; | 253 | int err; |
253 | struct kiocb *iocb; | 254 | struct kiocb *iocb; |
254 | struct file *file; | 255 | struct file *file; |