diff options
-rw-r--r-- | fs/overlayfs/inode.c | 9 |
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 @@ | |||
19 | int ovl_setattr(struct dentry *dentry, struct iattr *attr) | 19 | int 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 | ||