Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce421581 authored by Jose R. Santos's avatar Jose R. Santos Committed by Theodore Ts'o
Browse files

ext4: FLEX_BG Kernel support v2.



This feature relaxes check restrictions on where each block groups meta
data is located within the storage media.  This allows for the allocation
of bitmaps or inode tables outside the block group boundaries in cases
where bad blocks forces us to look for new blocks which the owning block
group can not satisfy.  This will also allow for new meta-data allocation
schemes to improve performance and scalability.

Signed-off-by: default avatarJose R. Santos <jrs@us.ibm.com>
Cc: <linux-ext4@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent c1bddad9
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -1358,13 +1358,17 @@ static int ext4_check_descriptors (struct super_block * sb)
	ext4_fsblk_t inode_table;
	ext4_fsblk_t inode_table;
	struct ext4_group_desc * gdp = NULL;
	struct ext4_group_desc * gdp = NULL;
	int desc_block = 0;
	int desc_block = 0;
	int flexbg_flag = 0;
	int i;
	int i;


	if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG))
		flexbg_flag = 1;

	ext4_debug ("Checking group descriptors");
	ext4_debug ("Checking group descriptors");


	for (i = 0; i < sbi->s_groups_count; i++)
	for (i = 0; i < sbi->s_groups_count; i++)
	{
	{
		if (i == sbi->s_groups_count - 1)
		if (i == sbi->s_groups_count - 1 || flexbg_flag)
			last_block = ext4_blocks_count(sbi->s_es) - 1;
			last_block = ext4_blocks_count(sbi->s_es) - 1;
		else
		else
			last_block = first_block +
			last_block = first_block +
@@ -1409,6 +1413,7 @@ static int ext4_check_descriptors (struct super_block * sb)
				   le16_to_cpu(gdp->bg_checksum));
				   le16_to_cpu(gdp->bg_checksum));
			return 0;
			return 0;
		}
		}
		if (!flexbg_flag)
			first_block += EXT4_BLOCKS_PER_GROUP(sb);
			first_block += EXT4_BLOCKS_PER_GROUP(sb);
		gdp = (struct ext4_group_desc *)
		gdp = (struct ext4_group_desc *)
			((__u8 *)gdp + EXT4_DESC_SIZE(sb));
			((__u8 *)gdp + EXT4_DESC_SIZE(sb));
+3 −1
Original line number Original line Diff line number Diff line
@@ -682,13 +682,15 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
#define EXT4_FEATURE_INCOMPAT_META_BG		0x0010
#define EXT4_FEATURE_INCOMPAT_META_BG		0x0010
#define EXT4_FEATURE_INCOMPAT_EXTENTS		0x0040 /* extents support */
#define EXT4_FEATURE_INCOMPAT_EXTENTS		0x0040 /* extents support */
#define EXT4_FEATURE_INCOMPAT_64BIT		0x0080
#define EXT4_FEATURE_INCOMPAT_64BIT		0x0080
#define EXT4_FEATURE_INCOMPAT_FLEX_BG		0x0200


#define EXT4_FEATURE_COMPAT_SUPP	EXT2_FEATURE_COMPAT_EXT_ATTR
#define EXT4_FEATURE_COMPAT_SUPP	EXT2_FEATURE_COMPAT_EXT_ATTR
#define EXT4_FEATURE_INCOMPAT_SUPP	(EXT4_FEATURE_INCOMPAT_FILETYPE| \
#define EXT4_FEATURE_INCOMPAT_SUPP	(EXT4_FEATURE_INCOMPAT_FILETYPE| \
					 EXT4_FEATURE_INCOMPAT_RECOVER| \
					 EXT4_FEATURE_INCOMPAT_RECOVER| \
					 EXT4_FEATURE_INCOMPAT_META_BG| \
					 EXT4_FEATURE_INCOMPAT_META_BG| \
					 EXT4_FEATURE_INCOMPAT_EXTENTS| \
					 EXT4_FEATURE_INCOMPAT_EXTENTS| \
					 EXT4_FEATURE_INCOMPAT_64BIT)
					 EXT4_FEATURE_INCOMPAT_64BIT| \
					 EXT4_FEATURE_INCOMPAT_FLEX_BG)
#define EXT4_FEATURE_RO_COMPAT_SUPP	(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
#define EXT4_FEATURE_RO_COMPAT_SUPP	(EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \
					 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
					 EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \
					 EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \
					 EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \