diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2007-10-17 02:31:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 11:43:03 -0400 |
commit | b10099792b6276c31cee4c021e0a5d3f9a9e33ed (patch) | |
tree | c90873999de5936d27b0a10e61c4de3b742bf401 /fs/fuse | |
parent | e00d2c2d4aead747d0fbee99001b00612d1082b0 (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>
Diffstat (limited to 'fs/fuse')
-rw-r--r-- | fs/fuse/file.c | 2 | ||||
-rw-r--r-- | fs/fuse/inode.c | 2 |
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 | ||