diff options
Diffstat (limited to 'fs/overlayfs/inode.c')
-rw-r--r-- | fs/overlayfs/inode.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index ec0c2a050043..4060ffde8722 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c | |||
@@ -12,8 +12,7 @@ | |||
12 | #include <linux/xattr.h> | 12 | #include <linux/xattr.h> |
13 | #include "overlayfs.h" | 13 | #include "overlayfs.h" |
14 | 14 | ||
15 | static int ovl_copy_up_last(struct dentry *dentry, struct iattr *attr, | 15 | static int ovl_copy_up_truncate(struct dentry *dentry) |
16 | bool no_data) | ||
17 | { | 16 | { |
18 | int err; | 17 | int err; |
19 | struct dentry *parent; | 18 | struct dentry *parent; |
@@ -30,10 +29,8 @@ static int ovl_copy_up_last(struct dentry *dentry, struct iattr *attr, | |||
30 | if (err) | 29 | if (err) |
31 | goto out_dput_parent; | 30 | goto out_dput_parent; |
32 | 31 | ||
33 | if (no_data) | 32 | stat.size = 0; |
34 | stat.size = 0; | 33 | err = ovl_copy_up_one(parent, dentry, &lowerpath, &stat); |
35 | |||
36 | err = ovl_copy_up_one(parent, dentry, &lowerpath, &stat, attr); | ||
37 | 34 | ||
38 | out_dput_parent: | 35 | out_dput_parent: |
39 | dput(parent); | 36 | dput(parent); |
@@ -49,13 +46,13 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) | |||
49 | if (err) | 46 | if (err) |
50 | goto out; | 47 | goto out; |
51 | 48 | ||
52 | upperdentry = ovl_dentry_upper(dentry); | 49 | err = ovl_copy_up(dentry); |
53 | if (upperdentry) { | 50 | if (!err) { |
51 | upperdentry = ovl_dentry_upper(dentry); | ||
52 | |||
54 | mutex_lock(&upperdentry->d_inode->i_mutex); | 53 | mutex_lock(&upperdentry->d_inode->i_mutex); |
55 | err = notify_change(upperdentry, attr, NULL); | 54 | err = notify_change(upperdentry, attr, NULL); |
56 | mutex_unlock(&upperdentry->d_inode->i_mutex); | 55 | mutex_unlock(&upperdentry->d_inode->i_mutex); |
57 | } else { | ||
58 | err = ovl_copy_up_last(dentry, attr, false); | ||
59 | } | 56 | } |
60 | ovl_drop_write(dentry); | 57 | ovl_drop_write(dentry); |
61 | out: | 58 | out: |
@@ -353,7 +350,7 @@ struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags) | |||
353 | return ERR_PTR(err); | 350 | return ERR_PTR(err); |
354 | 351 | ||
355 | if (file_flags & O_TRUNC) | 352 | if (file_flags & O_TRUNC) |
356 | err = ovl_copy_up_last(dentry, NULL, true); | 353 | err = ovl_copy_up_truncate(dentry); |
357 | else | 354 | else |
358 | err = ovl_copy_up(dentry); | 355 | err = ovl_copy_up(dentry); |
359 | ovl_drop_write(dentry); | 356 | ovl_drop_write(dentry); |