diff options
Diffstat (limited to 'fs/ext2/super.c')
| -rw-r--r-- | fs/ext2/super.c | 49 | 
1 files changed, 24 insertions, 25 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index e1025c7a437a..b3621cb7ea31 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -130,9 +130,6 @@ static void ext2_put_super (struct super_block * sb)  	dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); -	if (sb->s_dirt) -		ext2_write_super(sb); -  	ext2_xattr_put_super(sb);  	if (!(sb->s_flags & MS_RDONLY)) {  		struct ext2_super_block *es = sbi->s_es; @@ -228,13 +225,15 @@ static int ext2_show_options(struct seq_file *seq, struct dentry *root)  		seq_puts(seq, ",grpid");  	if (!test_opt(sb, GRPID) && (def_mount_opts & EXT2_DEFM_BSDGROUPS))  		seq_puts(seq, ",nogrpid"); -	if (sbi->s_resuid != EXT2_DEF_RESUID || +	if (!uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT2_DEF_RESUID)) ||  	    le16_to_cpu(es->s_def_resuid) != EXT2_DEF_RESUID) { -		seq_printf(seq, ",resuid=%u", sbi->s_resuid); +		seq_printf(seq, ",resuid=%u", +				from_kuid_munged(&init_user_ns, sbi->s_resuid));  	} -	if (sbi->s_resgid != EXT2_DEF_RESGID || +	if (!gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT2_DEF_RESGID)) ||  	    le16_to_cpu(es->s_def_resgid) != EXT2_DEF_RESGID) { -		seq_printf(seq, ",resgid=%u", sbi->s_resgid); +		seq_printf(seq, ",resgid=%u", +				from_kgid_munged(&init_user_ns, sbi->s_resgid));  	}  	if (test_opt(sb, ERRORS_RO)) {  		int def_errors = le16_to_cpu(es->s_errors); @@ -305,7 +304,6 @@ static const struct super_operations ext2_sops = {  	.write_inode	= ext2_write_inode,  	.evict_inode	= ext2_evict_inode,  	.put_super	= ext2_put_super, -	.write_super	= ext2_write_super,  	.sync_fs	= ext2_sync_fs,  	.statfs		= ext2_statfs,  	.remount_fs	= ext2_remount, @@ -356,11 +354,6 @@ static struct dentry *ext2_fh_to_parent(struct super_block *sb, struct fid *fid,  				    ext2_nfs_get_inode);  } -/* Yes, most of these are left as NULL!! - * A NULL value implies the default, which works with ext2-like file - * systems, but can be improved upon. - * Currently only get_parent is required. - */  static const struct export_operations ext2_export_ops = {  	.fh_to_dentry = ext2_fh_to_dentry,  	.fh_to_parent = ext2_fh_to_parent, @@ -436,6 +429,8 @@ static int parse_options(char *options, struct super_block *sb)  	struct ext2_sb_info *sbi = EXT2_SB(sb);  	substring_t args[MAX_OPT_ARGS];  	int option; +	kuid_t uid; +	kgid_t gid;  	if (!options)  		return 1; @@ -462,12 +457,23 @@ static int parse_options(char *options, struct super_block *sb)  		case Opt_resuid:  			if (match_int(&args[0], &option))  				return 0; -			sbi->s_resuid = option; +			uid = make_kuid(current_user_ns(), option); +			if (!uid_valid(uid)) { +				ext2_msg(sb, KERN_ERR, "Invalid uid value %d", option); +				return -1; + +			} +			sbi->s_resuid = uid;  			break;  		case Opt_resgid:  			if (match_int(&args[0], &option))  				return 0; -			sbi->s_resgid = option; +			gid = make_kgid(current_user_ns(), option); +			if (!gid_valid(gid)) { +				ext2_msg(sb, KERN_ERR, "Invalid gid value %d", option); +				return -1; +			} +			sbi->s_resgid = gid;  			break;  		case Opt_sb:  			/* handled by get_sb_block() instead of here */ @@ -841,8 +847,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)  	else  		set_opt(sbi->s_mount_opt, ERRORS_RO); -	sbi->s_resuid = le16_to_cpu(es->s_def_resuid); -	sbi->s_resgid = le16_to_cpu(es->s_def_resgid); +	sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid)); +	sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid));  	set_opt(sbi->s_mount_opt, RESERVATION); @@ -1161,7 +1167,6 @@ static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,  	mark_buffer_dirty(EXT2_SB(sb)->s_sbh);  	if (wait)  		sync_dirty_buffer(EXT2_SB(sb)->s_sbh); -	sb->s_dirt = 0;  }  /* @@ -1194,8 +1199,6 @@ void ext2_write_super(struct super_block *sb)  {  	if (!(sb->s_flags & MS_RDONLY))  		ext2_sync_fs(sb, 1); -	else -		sb->s_dirt = 0;  }  static int ext2_remount (struct super_block * sb, int * flags, char * data) @@ -1441,7 +1444,6 @@ static ssize_t ext2_quota_write(struct super_block *sb, int type,  	struct buffer_head tmp_bh;  	struct buffer_head *bh; -	mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA);  	while (towrite > 0) {  		tocopy = sb->s_blocksize - offset < towrite ?  				sb->s_blocksize - offset : towrite; @@ -1471,16 +1473,13 @@ static ssize_t ext2_quota_write(struct super_block *sb, int type,  		blk++;  	}  out: -	if (len == towrite) { -		mutex_unlock(&inode->i_mutex); +	if (len == towrite)  		return err; -	}  	if (inode->i_size < off+len-towrite)  		i_size_write(inode, off+len-towrite);  	inode->i_version++;  	inode->i_mtime = inode->i_ctime = CURRENT_TIME;  	mark_inode_dirty(inode); -	mutex_unlock(&inode->i_mutex);  	return len - towrite;  }  | 
