|
@@ -1296,22 +1296,6 @@ static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
|
|
return fuse_dev_do_read(fc, file, &cs, iov_length(iov, nr_segs));
|
|
return fuse_dev_do_read(fc, file, &cs, iov_length(iov, nr_segs));
|
|
}
|
|
}
|
|
|
|
|
|
-static int fuse_dev_pipe_buf_steal(struct pipe_inode_info *pipe,
|
|
|
|
- struct pipe_buffer *buf)
|
|
|
|
-{
|
|
|
|
- return 1;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static const struct pipe_buf_operations fuse_dev_pipe_buf_ops = {
|
|
|
|
- .can_merge = 0,
|
|
|
|
- .map = generic_pipe_buf_map,
|
|
|
|
- .unmap = generic_pipe_buf_unmap,
|
|
|
|
- .confirm = generic_pipe_buf_confirm,
|
|
|
|
- .release = generic_pipe_buf_release,
|
|
|
|
- .steal = fuse_dev_pipe_buf_steal,
|
|
|
|
- .get = generic_pipe_buf_get,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
|
|
static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
|
|
struct pipe_inode_info *pipe,
|
|
struct pipe_inode_info *pipe,
|
|
size_t len, unsigned int flags)
|
|
size_t len, unsigned int flags)
|
|
@@ -1358,7 +1342,11 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
|
|
buf->page = bufs[page_nr].page;
|
|
buf->page = bufs[page_nr].page;
|
|
buf->offset = bufs[page_nr].offset;
|
|
buf->offset = bufs[page_nr].offset;
|
|
buf->len = bufs[page_nr].len;
|
|
buf->len = bufs[page_nr].len;
|
|
- buf->ops = &fuse_dev_pipe_buf_ops;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Need to be careful about this. Having buf->ops in module
|
|
|
|
+ * code can Oops if the buffer persists after module unload.
|
|
|
|
+ */
|
|
|
|
+ buf->ops = &nosteal_pipe_buf_ops;
|
|
|
|
|
|
pipe->nrbufs++;
|
|
pipe->nrbufs++;
|
|
page_nr++;
|
|
page_nr++;
|
|
@@ -1599,7 +1587,8 @@ static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
|
|
|
|
|
|
this_num = min_t(unsigned, num, PAGE_CACHE_SIZE - offset);
|
|
this_num = min_t(unsigned, num, PAGE_CACHE_SIZE - offset);
|
|
err = fuse_copy_page(cs, &page, offset, this_num, 0);
|
|
err = fuse_copy_page(cs, &page, offset, this_num, 0);
|
|
- if (!err && offset == 0 && (num != 0 || file_size == end))
|
|
|
|
|
|
+ if (!err && offset == 0 &&
|
|
|
|
+ (this_num == PAGE_CACHE_SIZE || file_size == end))
|
|
SetPageUptodate(page);
|
|
SetPageUptodate(page);
|
|
unlock_page(page);
|
|
unlock_page(page);
|
|
page_cache_release(page);
|
|
page_cache_release(page);
|