]> Pileus Git - ~andy/linux/blobdiff - fs/fuse/dev.c
ocfs2 syncs the wrong range...
[~andy/linux] / fs / fuse / dev.c
index ef74ad5fd362b193d858fdd2cfe3335d951d2a99..0a648bb455ae70b5a84e55ad9209c5894822d1be 100644 (file)
@@ -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++;
@@ -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);
                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);
                unlock_page(page);
                page_cache_release(page);