|
@@ -46,7 +46,7 @@ struct fuse_file *fuse_file_alloc(struct fuse_conn *fc)
|
|
|
{
|
|
|
struct fuse_file *ff;
|
|
|
|
|
|
- ff = kmalloc(sizeof(struct fuse_file), GFP_KERNEL);
|
|
|
+ ff = kzalloc(sizeof(struct fuse_file), GFP_KERNEL);
|
|
|
if (unlikely(!ff))
|
|
|
return NULL;
|
|
|
|
|
@@ -609,7 +609,7 @@ static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_req *req)
|
|
|
struct fuse_io_priv *io = req->io;
|
|
|
ssize_t pos = -1;
|
|
|
|
|
|
- fuse_release_user_pages(req, !io->write);
|
|
|
+ fuse_release_user_pages(req, io->should_dirty);
|
|
|
|
|
|
if (io->write) {
|
|
|
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,
|
|
|
loff_t *ppos, int flags)
|
|
|
{
|
|
|
int write = flags & FUSE_DIO_WRITE;
|
|
|
- bool should_dirty = !write && iter_is_iovec(iter);
|
|
|
int cuse = flags & FUSE_DIO_CUSE;
|
|
|
struct file *file = io->file;
|
|
|
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,
|
|
|
inode_unlock(inode);
|
|
|
}
|
|
|
|
|
|
+ io->should_dirty = !write && iter_is_iovec(iter);
|
|
|
while (count) {
|
|
|
size_t nres;
|
|
|
fl_owner_t owner = current->files;
|
|
@@ -1360,7 +1360,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
|
|
|
nres = fuse_send_read(req, io, pos, nbytes, owner);
|
|
|
|
|
|
if (!io->async)
|
|
|
- fuse_release_user_pages(req, should_dirty);
|
|
|
+ fuse_release_user_pages(req, io->should_dirty);
|
|
|
if (req->out.h.error) {
|
|
|
err = req->out.h.error;
|
|
|
break;
|
|
@@ -1669,6 +1669,7 @@ err_nofile:
|
|
|
err_free:
|
|
|
fuse_request_free(req);
|
|
|
err:
|
|
|
+ mapping_set_error(page->mapping, error);
|
|
|
end_page_writeback(page);
|
|
|
return error;
|
|
|
}
|