diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2013-10-10 15:19:06 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2014-04-02 15:38:49 +0200 |
commit | e7cc133c370f541fa16723ad7df24de375c26fce (patch) | |
tree | cf50cb96cb5e950478664b54581c022496b8b9bd /fs/fuse | |
parent | fuse: Trust kernel i_mtime only (diff) | |
download | linux-e7cc133c370f541fa16723ad7df24de375c26fce.tar.xz linux-e7cc133c370f541fa16723ad7df24de375c26fce.zip |
fuse: Flush files on wb close
Any write request requires a file handle to report to the userspace. Thus
when we close a file (and free the fuse_file with this info) we have to
flush all the outstanding dirty pages.
filemap_write_and_wait() is enough because every page under fuse writeback
is accounted in ff->count. This delays actual close until all fuse wb is
completed.
In case of "write cache" turned off, the flush is ensured by fuse_vma_close().
Signed-off-by: Maxim Patlasov <MPatlasov@parallels.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse')
-rw-r--r-- | fs/fuse/file.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 69de9b860c39..530b1e804a32 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -308,6 +308,12 @@ static int fuse_open(struct inode *inode, struct file *file) static int fuse_release(struct inode *inode, struct file *file) { + struct fuse_conn *fc = get_fuse_conn(inode); + + /* see fuse_vma_close() for !writeback_cache case */ + if (fc->writeback_cache) + filemap_write_and_wait(file->f_mapping); + if (test_bit(FUSE_I_MTIME_DIRTY, &get_fuse_inode(inode)->state)) fuse_flush_mtime(file, true); |