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>
This commit is contained in:
parent
e00d2c2d4a
commit
b10099792b
@ -87,7 +87,7 @@ void fuse_finish_open(struct inode *inode, struct file *file,
|
||||
if (outarg->open_flags & FOPEN_DIRECT_IO)
|
||||
file->f_op = &fuse_direct_io_file_operations;
|
||||
if (!(outarg->open_flags & FOPEN_KEEP_CACHE))
|
||||
invalidate_mapping_pages(inode->i_mapping, 0, -1);
|
||||
invalidate_inode_pages2(inode->i_mapping);
|
||||
ff->fh = outarg->fh;
|
||||
file->private_data = fuse_file_get(ff);
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr)
|
||||
if (S_ISREG(inode->i_mode) && oldsize != attr->size) {
|
||||
if (attr->size < oldsize)
|
||||
fuse_truncate(inode->i_mapping, attr->size);
|
||||
invalidate_mapping_pages(inode->i_mapping, 0, -1);
|
||||
invalidate_inode_pages2(inode->i_mapping);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user