diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index b0983e2a4e2c..a6d9f2220392 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -1409,6 +1409,21 @@ static int configfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode else ret = configfs_attach_item(parent_item, item, dentry, frag); + /* inherit uid/gid from process creating the directory */ + if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID) || + !gid_eq(current_fsgid(), GLOBAL_ROOT_GID)) { + struct iattr ia = { + .ia_uid = current_fsuid(), + .ia_gid = current_fsgid(), + .ia_valid = ATTR_UID | ATTR_GID, + }; + struct inode *inode = d_inode(dentry); + inode->i_uid = ia.ia_uid; + inode->i_gid = ia.ia_gid; + /* the above manual assignments skip the permission checks */ + configfs_setattr(dentry, &ia); + } + spin_lock(&configfs_dirent_lock); sd->s_type &= ~CONFIGFS_USET_IN_MKDIR; if (!ret)