| From 32001d6fe9ac6b0423e674a3093aa56740849f3b Mon Sep 17 00:00:00 2001 |
| From: Tyler Hicks <tyhicks@canonical.com> |
| Date: Mon, 21 Nov 2011 17:31:29 -0600 |
| Subject: eCryptfs: Flush file in vma close |
| |
| From: Tyler Hicks <tyhicks@canonical.com> |
| |
| commit 32001d6fe9ac6b0423e674a3093aa56740849f3b upstream. |
| |
| Dirty pages weren't being written back when an mmap'ed eCryptfs file was |
| closed before the mapping was unmapped. Since f_ops->flush() is not |
| called by the munmap() path, the lower file was simply being released. |
| This patch flushes the eCryptfs file in the vm_ops->close() path. |
| |
| https://launchpad.net/bugs/870326 |
| |
| Signed-off-by: Tyler Hicks <tyhicks@canonical.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/ecryptfs/file.c | 23 ++++++++++++++++++++++- |
| 1 file changed, 22 insertions(+), 1 deletion(-) |
| |
| --- a/fs/ecryptfs/file.c |
| +++ b/fs/ecryptfs/file.c |
| @@ -139,6 +139,27 @@ out: |
| return rc; |
| } |
| |
| +static void ecryptfs_vma_close(struct vm_area_struct *vma) |
| +{ |
| + filemap_write_and_wait(vma->vm_file->f_mapping); |
| +} |
| + |
| +static const struct vm_operations_struct ecryptfs_file_vm_ops = { |
| + .close = ecryptfs_vma_close, |
| + .fault = filemap_fault, |
| +}; |
| + |
| +static int ecryptfs_file_mmap(struct file *file, struct vm_area_struct *vma) |
| +{ |
| + int rc; |
| + |
| + rc = generic_file_mmap(file, vma); |
| + if (!rc) |
| + vma->vm_ops = &ecryptfs_file_vm_ops; |
| + |
| + return rc; |
| +} |
| + |
| struct kmem_cache *ecryptfs_file_info_cache; |
| |
| /** |
| @@ -348,7 +369,7 @@ const struct file_operations ecryptfs_ma |
| #ifdef CONFIG_COMPAT |
| .compat_ioctl = ecryptfs_compat_ioctl, |
| #endif |
| - .mmap = generic_file_mmap, |
| + .mmap = ecryptfs_file_mmap, |
| .open = ecryptfs_open, |
| .flush = ecryptfs_flush, |
| .release = ecryptfs_release, |