Message ID | 1347736154-5577-2-git-send-email-colin.king@canonical.com |
---|---|
State | New |
Headers | show |
On 09/15/2012 12:09 PM, Colin King wrote: > From: Tyler Hicks <tyhicks@canonical.com> > > Fixes a regression caused by: > > 821f749 eCryptfs: Revert to a writethrough cache model > > That patch reverted some code (specifically, 32001d6f) that was > necessary to properly handle open() -> mmap() -> close() -> dirty pages > -> munmap(), because the lower file could be closed before the dirty > pages are written out. > > Rather than reapplying 32001d6f, this approach is a better way of > ensuring that the lower file is still open in order to handle writing > out the dirty pages. It is called from ecryptfs_release(), while we have > a lock on the lower file pointer, just before the lower file gets the > final fput() and we overwrite the pointer. > > BugLink: https://launchpad.net/bugs/1047261 > > Signed-off-by: Tyler Hicks <tyhicks@canonical.com> > Reported-by: Artemy Tregubenko <me@arty.name> > Tested-by: Artemy Tregubenko <me@arty.name> > Tested-by: Colin Ian King <colin.king@canonical.com> > (upstream cherry pick 7149f2558d5b5b988726662fe58b1c388337805b) > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > fs/ecryptfs/main.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c > index 2768138..9b627c1 100644 > --- a/fs/ecryptfs/main.c > +++ b/fs/ecryptfs/main.c > @@ -162,6 +162,7 @@ void ecryptfs_put_lower_file(struct inode *inode) > inode_info = ecryptfs_inode_to_private(inode); > if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count, > &inode_info->lower_file_mutex)) { > + filemap_write_and_wait(inode->i_mapping); > fput(inode_info->lower_file); > inode_info->lower_file = NULL; > mutex_unlock(&inode_info->lower_file_mutex); >
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 2768138..9b627c1 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -162,6 +162,7 @@ void ecryptfs_put_lower_file(struct inode *inode) inode_info = ecryptfs_inode_to_private(inode); if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count, &inode_info->lower_file_mutex)) { + filemap_write_and_wait(inode->i_mapping); fput(inode_info->lower_file); inode_info->lower_file = NULL; mutex_unlock(&inode_info->lower_file_mutex);