Merge tag 'ecryptfs-3.6-rc6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs

Pull ecryptfs fixes from Tyler Hicks:

- Fixes a regression, introduced in 3.6-rc1, when a file is closed
before its shared memory mapping is dirtied and unmapped. The lower
file was being released when the eCryptfs file was closed and the
dirtied pages could not be written out.
- Adds a call to the lower filesystem's ->flush() from
ecryptfs_flush().
- Fixes a regression, introduced in 2.6.39, when a file is renamed on
top of another file. The target file's inode was not being evicted
and the space taken by the file was not reclaimed until eCryptfs was
unmounted.

* tag 'ecryptfs-3.6-rc6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs:
eCryptfs: Copy up attributes of the lower target inode after rename
eCryptfs: Call lower ->flush() from ecryptfs_flush()
eCryptfs: Write out all dirty pages just before releasing the lower file

+14 -2
+8 -2
fs/ecryptfs/file.c
··· 275 276 static int ecryptfs_flush(struct file *file, fl_owner_t td) 277 { 278 - return file->f_mode & FMODE_WRITE 279 - ? filemap_write_and_wait(file->f_mapping) : 0; 280 } 281 282 static int ecryptfs_release(struct inode *inode, struct file *file)
··· 275 276 static int ecryptfs_flush(struct file *file, fl_owner_t td) 277 { 278 + struct file *lower_file = ecryptfs_file_to_lower(file); 279 + 280 + if (lower_file->f_op && lower_file->f_op->flush) { 281 + filemap_write_and_wait(file->f_mapping); 282 + return lower_file->f_op->flush(lower_file, td); 283 + } 284 + 285 + return 0; 286 } 287 288 static int ecryptfs_release(struct inode *inode, struct file *file)
+5
fs/ecryptfs/inode.c
··· 619 struct dentry *lower_old_dir_dentry; 620 struct dentry *lower_new_dir_dentry; 621 struct dentry *trap = NULL; 622 623 lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); 624 lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); ··· 627 dget(lower_new_dentry); 628 lower_old_dir_dentry = dget_parent(lower_old_dentry); 629 lower_new_dir_dentry = dget_parent(lower_new_dentry); 630 trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); 631 /* source should not be ancestor of target */ 632 if (trap == lower_old_dentry) { ··· 643 lower_new_dir_dentry->d_inode, lower_new_dentry); 644 if (rc) 645 goto out_lock; 646 fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode); 647 if (new_dir != old_dir) 648 fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
··· 619 struct dentry *lower_old_dir_dentry; 620 struct dentry *lower_new_dir_dentry; 621 struct dentry *trap = NULL; 622 + struct inode *target_inode; 623 624 lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); 625 lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); ··· 626 dget(lower_new_dentry); 627 lower_old_dir_dentry = dget_parent(lower_old_dentry); 628 lower_new_dir_dentry = dget_parent(lower_new_dentry); 629 + target_inode = new_dentry->d_inode; 630 trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); 631 /* source should not be ancestor of target */ 632 if (trap == lower_old_dentry) { ··· 641 lower_new_dir_dentry->d_inode, lower_new_dentry); 642 if (rc) 643 goto out_lock; 644 + if (target_inode) 645 + fsstack_copy_attr_all(target_inode, 646 + ecryptfs_inode_to_lower(target_inode)); 647 fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode); 648 if (new_dir != old_dir) 649 fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
+1
fs/ecryptfs/main.c
··· 162 inode_info = ecryptfs_inode_to_private(inode); 163 if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count, 164 &inode_info->lower_file_mutex)) { 165 fput(inode_info->lower_file); 166 inode_info->lower_file = NULL; 167 mutex_unlock(&inode_info->lower_file_mutex);
··· 162 inode_info = ecryptfs_inode_to_private(inode); 163 if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count, 164 &inode_info->lower_file_mutex)) { 165 + filemap_write_and_wait(inode->i_mapping); 166 fput(inode_info->lower_file); 167 inode_info->lower_file = NULL; 168 mutex_unlock(&inode_info->lower_file_mutex);