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