aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2007-10-17 02:31:01 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-17 11:43:03 -0400
commitb10099792b6276c31cee4c021e0a5d3f9a9e33ed (patch)
treec90873999de5936d27b0a10e61c4de3b742bf401
parente00d2c2d4aead747d0fbee99001b00612d1082b0 (diff)
fuse: fix page invalidation
Other than truncate, there are two cases, when fuse tries to get rid of cached pages: a) in open, if KEEP_CACHE flag is not set b) in getattr, if file size changed spontaneously Until now invalidate_mapping_pages() were used, which didn't get rid of mapped pages. This is wrong, and becomes more wrong as dirty pages are introduced. So instead properly invalidate all pages with invalidate_inode_pages2(). Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--fs/fuse/file.c2
-rw-r--r--fs/fuse/inode.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 90ce7c5f7b59..fb1713e76756 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -87,7 +87,7 @@ void fuse_finish_open(struct inode *inode, struct file *file,
87 if (outarg->open_flags & FOPEN_DIRECT_IO) 87 if (outarg->open_flags & FOPEN_DIRECT_IO)
88 file->f_op = &fuse_direct_io_file_operations; 88 file->f_op = &fuse_direct_io_file_operations;
89 if (!(outarg->open_flags & FOPEN_KEEP_CACHE)) 89 if (!(outarg->open_flags & FOPEN_KEEP_CACHE))
90 invalidate_mapping_pages(inode->i_mapping, 0, -1); 90 invalidate_inode_pages2(inode->i_mapping);
91 ff->fh = outarg->fh; 91 ff->fh = outarg->fh;
92 file->private_data = fuse_file_get(ff); 92 file->private_data = fuse_file_get(ff);
93} 93}
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index b584de33a6a7..e8d360add50a 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -143,7 +143,7 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr)
143 if (S_ISREG(inode->i_mode) && oldsize != attr->size) { 143 if (S_ISREG(inode->i_mode) && oldsize != attr->size) {
144 if (attr->size < oldsize) 144 if (attr->size < oldsize)
145 fuse_truncate(inode->i_mapping, attr->size); 145 fuse_truncate(inode->i_mapping, attr->size);
146 invalidate_mapping_pages(inode->i_mapping, 0, -1); 146 invalidate_inode_pages2(inode->i_mapping);
147 } 147 }
148} 148}
149 149