|
@@ -619,6 +619,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
struct dentry *lower_old_dir_dentry;
|
|
struct dentry *lower_old_dir_dentry;
|
|
struct dentry *lower_new_dir_dentry;
|
|
struct dentry *lower_new_dir_dentry;
|
|
struct dentry *trap = NULL;
|
|
struct dentry *trap = NULL;
|
|
|
|
+ struct inode *target_inode;
|
|
|
|
|
|
lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
|
|
lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
|
|
lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
|
|
lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
|
|
@@ -626,6 +627,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
dget(lower_new_dentry);
|
|
dget(lower_new_dentry);
|
|
lower_old_dir_dentry = dget_parent(lower_old_dentry);
|
|
lower_old_dir_dentry = dget_parent(lower_old_dentry);
|
|
lower_new_dir_dentry = dget_parent(lower_new_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);
|
|
trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
|
|
/* source should not be ancestor of target */
|
|
/* source should not be ancestor of target */
|
|
if (trap == lower_old_dentry) {
|
|
if (trap == lower_old_dentry) {
|
|
@@ -641,6 +643,9 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
lower_new_dir_dentry->d_inode, lower_new_dentry);
|
|
lower_new_dir_dentry->d_inode, lower_new_dentry);
|
|
if (rc)
|
|
if (rc)
|
|
goto out_lock;
|
|
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);
|
|
fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode);
|
|
if (new_dir != old_dir)
|
|
if (new_dir != old_dir)
|
|
fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
|
|
fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
|