Skip to content

Commit 12c84dd

Browse files
committed
ext4: add support for 32-bit default reserved uid and gid values
Support for specifying the default user id and group id that is allowed to use the reserved block space was added way back when Linux only supported 16-bit uid's and gid's. (Yeah, that long ago.) It's not a commonly used feature, but let's add support for 32-bit user and group id's. Signed-off-by: Theodore Ts'o <[email protected]> Message-ID: <[email protected]> Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 8ecb790 commit 12c84dd

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

fs/ext4/ext4.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,9 @@ struct ext4_super_block {
14421442
__le16 s_encoding; /* Filename charset encoding */
14431443
__le16 s_encoding_flags; /* Filename charset encoding flags */
14441444
__le32 s_orphan_file_inum; /* Inode for tracking orphan inodes */
1445-
__le32 s_reserved[94]; /* Padding to the end of the block */
1445+
__le16 s_def_resuid_hi;
1446+
__le16 s_def_resgid_hi;
1447+
__le32 s_reserved[93]; /* Padding to the end of the block */
14461448
__le32 s_checksum; /* crc32c(superblock) */
14471449
};
14481450

@@ -1812,6 +1814,18 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
18121814
ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count));
18131815
}
18141816

1817+
static inline int ext4_get_resuid(struct ext4_super_block *es)
1818+
{
1819+
return le16_to_cpu(es->s_def_resuid) |
1820+
le16_to_cpu(es->s_def_resuid_hi) << 16;
1821+
}
1822+
1823+
static inline int ext4_get_resgid(struct ext4_super_block *es)
1824+
{
1825+
return le16_to_cpu(es->s_def_resgid) |
1826+
le16_to_cpu(es->s_def_resgid_hi) << 16;
1827+
}
1828+
18151829
/*
18161830
* Returns: sbi->field[index]
18171831
* Used to access an array element from the following sbi fields which require

fs/ext4/super.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2960,11 +2960,11 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
29602960
}
29612961

29622962
if (nodefs || !uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT4_DEF_RESUID)) ||
2963-
le16_to_cpu(es->s_def_resuid) != EXT4_DEF_RESUID)
2963+
ext4_get_resuid(es) != EXT4_DEF_RESUID)
29642964
SEQ_OPTS_PRINT("resuid=%u",
29652965
from_kuid_munged(&init_user_ns, sbi->s_resuid));
29662966
if (nodefs || !gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT4_DEF_RESGID)) ||
2967-
le16_to_cpu(es->s_def_resgid) != EXT4_DEF_RESGID)
2967+
ext4_get_resgid(es) != EXT4_DEF_RESGID)
29682968
SEQ_OPTS_PRINT("resgid=%u",
29692969
from_kgid_munged(&init_user_ns, sbi->s_resgid));
29702970
def_errors = nodefs ? -1 : le16_to_cpu(es->s_errors);
@@ -5279,8 +5279,8 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
52795279

52805280
ext4_set_def_opts(sb, es);
52815281

5282-
sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid));
5283-
sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid));
5282+
sbi->s_resuid = make_kuid(&init_user_ns, ext4_get_resuid(es));
5283+
sbi->s_resgid = make_kgid(&init_user_ns, ext4_get_resuid(es));
52845284
sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ;
52855285
sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME;
52865286
sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME;

0 commit comments

Comments
 (0)