Commit 1e744c93 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse

Pull fuse fixes from Miklos Szeredi:
 "This fixes bugs in zero-copy splice to the fuse device"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse:
  fuse: explicitly set /dev/fuse file's private_data
  fuse: set stolen page uptodate
  fuse: notify: don't move pages
parents e409ac35 94e4fe2c
...@@ -890,8 +890,8 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep) ...@@ -890,8 +890,8 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
newpage = buf->page; newpage = buf->page;
if (WARN_ON(!PageUptodate(newpage))) if (!PageUptodate(newpage))
return -EIO; SetPageUptodate(newpage);
ClearPageMappedToDisk(newpage); ClearPageMappedToDisk(newpage);
...@@ -1353,6 +1353,17 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file, ...@@ -1353,6 +1353,17 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file,
return err; return err;
} }
static int fuse_dev_open(struct inode *inode, struct file *file)
{
/*
* The fuse device's file's private_data is used to hold
* the fuse_conn(ection) when it is mounted, and is used to
* keep track of whether the file has been mounted already.
*/
file->private_data = NULL;
return 0;
}
static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov, static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos) unsigned long nr_segs, loff_t pos)
{ {
...@@ -1797,6 +1808,9 @@ static int fuse_notify_retrieve(struct fuse_conn *fc, unsigned int size, ...@@ -1797,6 +1808,9 @@ static int fuse_notify_retrieve(struct fuse_conn *fc, unsigned int size,
static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code, static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code,
unsigned int size, struct fuse_copy_state *cs) unsigned int size, struct fuse_copy_state *cs)
{ {
/* Don't try to move pages (yet) */
cs->move_pages = 0;
switch (code) { switch (code) {
case FUSE_NOTIFY_POLL: case FUSE_NOTIFY_POLL:
return fuse_notify_poll(fc, size, cs); return fuse_notify_poll(fc, size, cs);
...@@ -2217,6 +2231,7 @@ static int fuse_dev_fasync(int fd, struct file *file, int on) ...@@ -2217,6 +2231,7 @@ static int fuse_dev_fasync(int fd, struct file *file, int on)
const struct file_operations fuse_dev_operations = { const struct file_operations fuse_dev_operations = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = fuse_dev_open,
.llseek = no_llseek, .llseek = no_llseek,
.read = do_sync_read, .read = do_sync_read,
.aio_read = fuse_dev_read, .aio_read = fuse_dev_read,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment