diff options
-rw-r--r-- | fs/overlayfs/dir.c | 2 | ||||
-rw-r--r-- | fs/overlayfs/inode.c | 2 | ||||
-rw-r--r-- | fs/overlayfs/overlayfs.h | 6 | ||||
-rw-r--r-- | fs/overlayfs/super.c | 1 |
4 files changed, 11 insertions, 0 deletions
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 40650c43f5c..c4446c45280 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -304,6 +304,7 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, } } ovl_dentry_update(dentry, newdentry); + ovl_copyattr(newdentry->d_inode, inode); d_instantiate(dentry, inode); inode = NULL; newdentry = NULL; @@ -446,6 +447,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir, new->d_fsdata); if (!newinode) goto link_fail; + ovl_copyattr(upperdir->d_inode, newinode); ovl_dentry_version_inc(new->d_parent); ovl_dentry_update(new, newdentry); diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index f3a534fbb31..e7ab09bda2c 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -31,6 +31,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) mutex_lock(&upperdentry->d_inode->i_mutex); err = notify_change(upperdentry, attr); + if (!err) + ovl_copyattr(upperdentry->d_inode, dentry->d_inode); mutex_unlock(&upperdentry->d_inode->i_mutex); return err; diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index fe1241dd331..1cba38ff39a 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -56,6 +56,12 @@ int ovl_removexattr(struct dentry *dentry, const char *name); struct inode *ovl_new_inode(struct super_block *sb, umode_t mode, struct ovl_entry *oe); +static inline void ovl_copyattr(struct inode *from, struct inode *to) +{ + to->i_uid = from->i_uid; + to->i_gid = from->i_gid; +} + /* dir.c */ extern const struct inode_operations ovl_dir_inode_operations; diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 64d26959eb7..9808408b579 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -343,6 +343,7 @@ static int ovl_do_lookup(struct dentry *dentry) oe); if (!inode) goto out_dput; + ovl_copyattr(realdentry->d_inode, inode); } if (upperdentry) |