aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/overlayfs/inode.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index 7c7092aaf9b4..e0bb217c01e2 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -19,6 +19,7 @@
19int ovl_setattr(struct dentry *dentry, struct iattr *attr) 19int ovl_setattr(struct dentry *dentry, struct iattr *attr)
20{ 20{
21 int err; 21 int err;
22 bool full_copy_up = false;
22 struct dentry *upperdentry; 23 struct dentry *upperdentry;
23 const struct cred *old_cred; 24 const struct cred *old_cred;
24 25
@@ -36,9 +37,15 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
36 err = -ETXTBSY; 37 err = -ETXTBSY;
37 if (atomic_read(&realinode->i_writecount) < 0) 38 if (atomic_read(&realinode->i_writecount) < 0)
38 goto out_drop_write; 39 goto out_drop_write;
40
41 /* Truncate should trigger data copy up as well */
42 full_copy_up = true;
39 } 43 }
40 44
41 err = ovl_copy_up(dentry); 45 if (!full_copy_up)
46 err = ovl_copy_up(dentry);
47 else
48 err = ovl_copy_up_with_data(dentry);
42 if (!err) { 49 if (!err) {
43 struct inode *winode = NULL; 50 struct inode *winode = NULL;
44 51