Commit 12c84dd4 authored by Theodore Ts'o's avatar Theodore Ts'o
Browse files

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: default avatarTheodore Ts'o <tytso@mit.edu>
Message-ID: <20250916-tune2fs-v2-2-d594dc7486f0@mit.edu>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 8ecb790e
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -1442,7 +1442,9 @@ struct ext4_super_block {
	__le16  s_encoding;		/* Filename charset encoding */
	__le16  s_encoding_flags;	/* Filename charset encoding flags */
	__le32  s_orphan_file_inum;	/* Inode for tracking orphan inodes */
	__le32	s_reserved[94];		/* Padding to the end of the block */
	__le16	s_def_resuid_hi;
	__le16	s_def_resgid_hi;
	__le32	s_reserved[93];		/* Padding to the end of the block */
	__le32	s_checksum;		/* crc32c(superblock) */
};

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

static inline int ext4_get_resuid(struct ext4_super_block *es)
{
	return le16_to_cpu(es->s_def_resuid) |
		le16_to_cpu(es->s_def_resuid_hi) << 16;
}

static inline int ext4_get_resgid(struct ext4_super_block *es)
{
	return le16_to_cpu(es->s_def_resgid) |
		le16_to_cpu(es->s_def_resgid_hi) << 16;
}

/*
 * Returns: sbi->field[index]
 * Used to access an array element from the following sbi fields which require
+4 −4
Original line number Diff line number Diff line
@@ -2960,11 +2960,11 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
	}

	if (nodefs || !uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT4_DEF_RESUID)) ||
	    le16_to_cpu(es->s_def_resuid) != EXT4_DEF_RESUID)
	    ext4_get_resuid(es) != EXT4_DEF_RESUID)
		SEQ_OPTS_PRINT("resuid=%u",
				from_kuid_munged(&init_user_ns, sbi->s_resuid));
	if (nodefs || !gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT4_DEF_RESGID)) ||
	    le16_to_cpu(es->s_def_resgid) != EXT4_DEF_RESGID)
	    ext4_get_resgid(es) != EXT4_DEF_RESGID)
		SEQ_OPTS_PRINT("resgid=%u",
				from_kgid_munged(&init_user_ns, sbi->s_resgid));
	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)

	ext4_set_def_opts(sb, es);

	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));
	sbi->s_resuid = make_kuid(&init_user_ns, ext4_get_resuid(es));
	sbi->s_resgid = make_kgid(&init_user_ns, ext4_get_resuid(es));
	sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ;
	sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME;
	sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME;