Wrapfs: update parent directory inode size in inode ops
authorErez Zadok <ezk@cs.sunysb.edu>
Fri, 18 Mar 2011 03:21:55 +0000 (23:21 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 19:04:49 +0000 (14:04 -0500)
After ->unlink, ->rmdir, and ->rename, we need to copy the (possibly
changed) inode size of the parent directory(ies) where the operation took
place.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/inode.c

index 9e8e54c2f1f3820d3f598dfb46e39a752dcbad87..0eb895b874b49f385a1ac14d788ce82453f296c2 100644 (file)
@@ -126,6 +126,7 @@ static int wrapfs_unlink(struct inode *dir, struct dentry *dentry)
        if (err)
                goto out;
        fsstack_copy_attr_times(dir, lower_dir_inode);
+       fsstack_copy_inode_size(dir, lower_dir_inode);
        dentry->d_inode->i_nlink =
                wrapfs_lower_inode(dentry->d_inode)->i_nlink;
        dentry->d_inode->i_ctime = dir->i_ctime;
@@ -230,6 +231,7 @@ static int wrapfs_rmdir(struct inode *dir, struct dentry *dentry)
                goto out;
 
        fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
+       fsstack_copy_inode_size(dir, lower_dir_dentry->d_inode);
        dir->i_nlink = lower_dir_dentry->d_inode->i_nlink;
 
 out:
@@ -318,12 +320,15 @@ static int wrapfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                         lower_new_dir_dentry->d_inode, lower_new_dentry);
        if (err)
                goto out_err;
-       if (old_dentry->d_inode)
-               fsstack_copy_attr_times(old_dentry->d_inode,
-                               wrapfs_lower_inode(old_dentry->d_inode));
-       if (new_dentry->d_inode)
-               fsstack_copy_attr_times(new_dentry->d_inode,
-                               wrapfs_lower_inode(new_dentry->d_inode));
+
+       fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode);
+       fsstack_copy_inode_size(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);
+               fsstack_copy_inode_size(old_dir,
+                                       lower_old_dir_dentry->d_inode);
+       }
 
 out_err:
        mnt_drop_write(lower_new_path.mnt);