|
@@ -890,8 +890,8 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
|
|
|
|
|
|
newpage = buf->page;
|
|
|
|
|
|
- if (WARN_ON(!PageUptodate(newpage)))
|
|
|
- return -EIO;
|
|
|
+ if (!PageUptodate(newpage))
|
|
|
+ SetPageUptodate(newpage);
|
|
|
|
|
|
ClearPageMappedToDisk(newpage);
|
|
|
|
|
@@ -1353,6 +1353,17 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file,
|
|
|
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,
|
|
|
unsigned long nr_segs, loff_t pos)
|
|
|
{
|
|
@@ -1797,6 +1808,9 @@ copy_finish:
|
|
|
static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code,
|
|
|
unsigned int size, struct fuse_copy_state *cs)
|
|
|
{
|
|
|
+ /* Don't try to move pages (yet) */
|
|
|
+ cs->move_pages = 0;
|
|
|
+
|
|
|
switch (code) {
|
|
|
case FUSE_NOTIFY_POLL:
|
|
|
return fuse_notify_poll(fc, size, cs);
|
|
@@ -2217,6 +2231,7 @@ static int fuse_dev_fasync(int fd, struct file *file, int on)
|
|
|
|
|
|
const struct file_operations fuse_dev_operations = {
|
|
|
.owner = THIS_MODULE,
|
|
|
+ .open = fuse_dev_open,
|
|
|
.llseek = no_llseek,
|
|
|
.read = do_sync_read,
|
|
|
.aio_read = fuse_dev_read,
|