diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index e1fb1d5de58e..436b4223df66 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1448,6 +1448,8 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | |||
1448 | { | 1448 | { |
1449 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 1449 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
1450 | const struct mount_opts *m; | 1450 | const struct mount_opts *m; |
1451 | kuid_t uid; | ||
1452 | kgid_t gid; | ||
1451 | int arg = 0; | 1453 | int arg = 0; |
1452 | 1454 | ||
1453 | #ifdef CONFIG_QUOTA | 1455 | #ifdef CONFIG_QUOTA |
@@ -1474,10 +1476,20 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | |||
1474 | "Ignoring removed %s option", opt); | 1476 | "Ignoring removed %s option", opt); |
1475 | return 1; | 1477 | return 1; |
1476 | case Opt_resuid: | 1478 | case Opt_resuid: |
1477 | sbi->s_resuid = arg; | 1479 | uid = make_kuid(current_user_ns(), arg); |
1480 | if (!uid_valid(uid)) { | ||
1481 | ext4_msg(sb, KERN_ERR, "Invalid uid value %d", arg); | ||
1482 | return -1; | ||
1483 | } | ||
1484 | sbi->s_resuid = uid; | ||
1478 | return 1; | 1485 | return 1; |
1479 | case Opt_resgid: | 1486 | case Opt_resgid: |
1480 | sbi->s_resgid = arg; | 1487 | gid = make_kgid(current_user_ns(), arg); |
1488 | if (!gid_valid(gid)) { | ||
1489 | ext4_msg(sb, KERN_ERR, "Invalid gid value %d", arg); | ||
1490 | return -1; | ||
1491 | } | ||
1492 | sbi->s_resgid = gid; | ||
1481 | return 1; | 1493 | return 1; |
1482 | case Opt_abort: | 1494 | case Opt_abort: |
1483 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; | 1495 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; |
@@ -1732,12 +1744,14 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb, | |||
1732 | SEQ_OPTS_PRINT("%s", token2str(m->token)); | 1744 | SEQ_OPTS_PRINT("%s", token2str(m->token)); |
1733 | } | 1745 | } |
1734 | 1746 | ||
1735 | if (nodefs || sbi->s_resuid != EXT4_DEF_RESUID || | 1747 | if (nodefs || !uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT4_DEF_RESUID)) || |
1736 | le16_to_cpu(es->s_def_resuid) != EXT4_DEF_RESUID) | 1748 | le16_to_cpu(es->s_def_resuid) != EXT4_DEF_RESUID) |
1737 | SEQ_OPTS_PRINT("resuid=%u", sbi->s_resuid); | 1749 | SEQ_OPTS_PRINT("resuid=%u", |
1738 | if (nodefs || sbi->s_resgid != EXT4_DEF_RESGID || | 1750 | from_kuid_munged(&init_user_ns, sbi->s_resuid)); |
1751 | if (nodefs || !gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT4_DEF_RESGID)) || | ||
1739 | le16_to_cpu(es->s_def_resgid) != EXT4_DEF_RESGID) | 1752 | le16_to_cpu(es->s_def_resgid) != EXT4_DEF_RESGID) |
1740 | SEQ_OPTS_PRINT("resgid=%u", sbi->s_resgid); | 1753 | SEQ_OPTS_PRINT("resgid=%u", |
1754 | from_kgid_munged(&init_user_ns, sbi->s_resgid)); | ||
1741 | def_errors = nodefs ? -1 : le16_to_cpu(es->s_errors); | 1755 | def_errors = nodefs ? -1 : le16_to_cpu(es->s_errors); |
1742 | if (test_opt(sb, ERRORS_RO) && def_errors != EXT4_ERRORS_RO) | 1756 | if (test_opt(sb, ERRORS_RO) && def_errors != EXT4_ERRORS_RO) |
1743 | SEQ_OPTS_PUTS("errors=remount-ro"); | 1757 | SEQ_OPTS_PUTS("errors=remount-ro"); |
@@ -2980,8 +2994,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
2980 | } | 2994 | } |
2981 | sb->s_fs_info = sbi; | 2995 | sb->s_fs_info = sbi; |
2982 | sbi->s_mount_opt = 0; | 2996 | sbi->s_mount_opt = 0; |
2983 | sbi->s_resuid = EXT4_DEF_RESUID; | 2997 | sbi->s_resuid = make_kuid(&init_user_ns, EXT4_DEF_RESUID); |
2984 | sbi->s_resgid = EXT4_DEF_RESGID; | 2998 | sbi->s_resgid = make_kgid(&init_user_ns, EXT4_DEF_RESGID); |
2985 | sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS; | 2999 | sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS; |
2986 | sbi->s_sb_block = sb_block; | 3000 | sbi->s_sb_block = sb_block; |
2987 | if (sb->s_bdev->bd_part) | 3001 | if (sb->s_bdev->bd_part) |
@@ -3060,8 +3074,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3060 | if (def_mount_opts & EXT4_DEFM_DISCARD) | 3074 | if (def_mount_opts & EXT4_DEFM_DISCARD) |
3061 | set_opt(sb, DISCARD); | 3075 | set_opt(sb, DISCARD); |
3062 | 3076 | ||
3063 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); | 3077 | sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid)); |
3064 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); | 3078 | sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid)); |
3065 | sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ; | 3079 | sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ; |
3066 | sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME; | 3080 | sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME; |
3067 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; | 3081 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; |
@@ -4213,8 +4227,8 @@ static int ext4_unfreeze(struct super_block *sb) | |||
4213 | struct ext4_mount_options { | 4227 | struct ext4_mount_options { |
4214 | unsigned long s_mount_opt; | 4228 | unsigned long s_mount_opt; |
4215 | unsigned long s_mount_opt2; | 4229 | unsigned long s_mount_opt2; |
4216 | uid_t s_resuid; | 4230 | kuid_t s_resuid; |
4217 | gid_t s_resgid; | 4231 | kgid_t s_resgid; |
4218 | unsigned long s_commit_interval; | 4232 | unsigned long s_commit_interval; |
4219 | u32 s_min_batch_time, s_max_batch_time; | 4233 | u32 s_min_batch_time, s_max_batch_time; |
4220 | #ifdef CONFIG_QUOTA | 4234 | #ifdef CONFIG_QUOTA |