Skip to content

Commit

Permalink
eCryptfs: Flush file in vma close
Browse files Browse the repository at this point in the history
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>
Cc: stable@kernel.org [2.6.39+]
  • Loading branch information
Tyler Hicks committed Nov 23, 2011
1 parent b59db43 commit 32001d6
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion fs/ecryptfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,27 @@ static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)
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;

/**
Expand Down Expand Up @@ -349,7 +370,7 @@ const struct file_operations ecryptfs_main_fops = {
#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,
Expand Down

0 comments on commit 32001d6

Please sign in to comment.