lkml.org 
[lkml]   [2012]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 038/218] eCryptfs: Copy up attributes of the lower target inode after rename
    Date
    3.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Tyler Hicks <tyhicks@canonical.com>

    commit 8335eafc2859e1a26282bef7c3d19f3d68868b8a upstream.

    After calling into the lower filesystem to do a rename, the lower target
    inode's attributes were not copied up to the eCryptfs target inode. This
    resulted in the eCryptfs target inode staying around, rather than being
    evicted, because i_nlink was not updated for the eCryptfs inode. This
    also meant that eCryptfs didn't do the final iput() on the lower target
    inode so it stayed around, as well. This would result in a failure to
    free up space occupied by the target file in the rename() operation.
    Both target inodes would eventually be evicted when the eCryptfs
    filesystem was unmounted.

    This patch calls fsstack_copy_attr_all() after the lower filesystem
    does its ->rename() so that important inode attributes, such as i_nlink,
    are updated at the eCryptfs layer. ecryptfs_evict_inode() is now called
    and eCryptfs can drop its final reference on the lower inode.

    http://launchpad.net/bugs/561129

    Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
    Tested-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/ecryptfs/inode.c | 5 +++++
    1 file changed, 5 insertions(+)

    --- a/fs/ecryptfs/inode.c
    +++ b/fs/ecryptfs/inode.c
    @@ -621,6 +621,7 @@ ecryptfs_rename(struct inode *old_dir, s
    struct dentry *lower_old_dir_dentry;
    struct dentry *lower_new_dir_dentry;
    struct dentry *trap = NULL;
    + struct inode *target_inode;

    lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
    lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
    @@ -628,6 +629,7 @@ ecryptfs_rename(struct inode *old_dir, s
    dget(lower_new_dentry);
    lower_old_dir_dentry = dget_parent(lower_old_dentry);
    lower_new_dir_dentry = dget_parent(lower_new_dentry);
    + target_inode = new_dentry->d_inode;
    trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
    /* source should not be ancestor of target */
    if (trap == lower_old_dentry) {
    @@ -643,6 +645,9 @@ ecryptfs_rename(struct inode *old_dir, s
    lower_new_dir_dentry->d_inode, lower_new_dentry);
    if (rc)
    goto out_lock;
    + if (target_inode)
    + fsstack_copy_attr_all(target_inode,
    + ecryptfs_inode_to_lower(target_inode));
    fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode);
    if (new_dir != old_dir)
    fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);



    \
     
     \ /
      Last update: 2012-09-29 01:01    [W:4.224 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site