diff options
| -rw-r--r-- | arch/s390/hypfs/inode.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c index 6767b437a10..124ec1a55cc 100644 --- a/arch/s390/hypfs/inode.c +++ b/arch/s390/hypfs/inode.c @@ -31,8 +31,8 @@ static struct dentry *hypfs_create_update_file(struct super_block *sb,  					       struct dentry *dir);  struct hypfs_sb_info { -	uid_t uid;			/* uid used for files and dirs */ -	gid_t gid;			/* gid used for files and dirs */ +	kuid_t uid;			/* uid used for files and dirs */ +	kgid_t gid;			/* gid used for files and dirs */  	struct dentry *update_file;	/* file to trigger update */  	time_t last_update;		/* last update time in secs since 1970 */  	struct mutex lock;		/* lock to protect update process */ @@ -229,6 +229,8 @@ static int hypfs_parse_options(char *options, struct super_block *sb)  {  	char *str;  	substring_t args[MAX_OPT_ARGS]; +	kuid_t uid; +	kgid_t gid;  	if (!options)  		return 0; @@ -243,12 +245,18 @@ static int hypfs_parse_options(char *options, struct super_block *sb)  		case opt_uid:  			if (match_int(&args[0], &option))  				return -EINVAL; -			hypfs_info->uid = option; +			uid = make_kuid(current_user_ns(), option); +			if (!uid_valid(uid)) +				return -EINVAL; +			hypfs_info->uid = uid;  			break;  		case opt_gid:  			if (match_int(&args[0], &option))  				return -EINVAL; -			hypfs_info->gid = option; +			gid = make_kgid(current_user_ns(), option); +			if (!gid_valid(gid)) +				return -EINVAL; +			hypfs_info->gid = gid;  			break;  		case opt_err:  		default: @@ -263,8 +271,8 @@ static int hypfs_show_options(struct seq_file *s, struct dentry *root)  {  	struct hypfs_sb_info *hypfs_info = root->d_sb->s_fs_info; -	seq_printf(s, ",uid=%u", hypfs_info->uid); -	seq_printf(s, ",gid=%u", hypfs_info->gid); +	seq_printf(s, ",uid=%u", from_kuid_munged(&init_user_ns, hypfs_info->uid)); +	seq_printf(s, ",gid=%u", from_kgid_munged(&init_user_ns, hypfs_info->gid));  	return 0;  }  |