|
@@ -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));
|
|
|
}
|
|
|
|
|
|
-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,
|
|
|
struct pipe_inode_info *pipe,
|
|
|
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->offset = bufs[page_nr].offset;
|
|
|
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++;
|
|
|
page_nr++;
|