Blame SOURCES/0002-ext4-Fix-64bit-feature.patch

87e39f
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
0860da
From: Paulo Alcantara <pcacjr@zytor.com>
0860da
Date: Wed, 11 Oct 2017 07:00:31 -0400
0860da
Subject: [PATCH] ext4: Fix 64bit feature
0860da
0860da
As per ext4 specification:
0860da
0860da
> In ext2, ext3, and ext4 (when the 64bit feature is not enabled), the
0860da
> block group descriptor was only 32 bytes long and therefore ends at
0860da
> bg_checksum. On an ext4 filesystem with the 64bit feature enabled, the
0860da
> block group descriptor expands to at least the 64 bytes described below;
0860da
> the size is stored in the superblock.
0860da
0860da
Since block group descriptor has been expanded to 64 bytes long (when 64
0860da
bit feature is enabled), we cannot index ext2_group_desc and return it
0860da
*directly* -- as we did it in ext2_get_group_desc -- it's still 32 bytes
0860da
long.
0860da
0860da
Instead, use s_desc_size field from superblock to correctly index and
0860da
return block group descriptors.
0860da
0860da
Cc: H. Peter Anvin <hpa@zytor.com>
0860da
Cc: Gene Cumm <gene.cumm@gmail.com>
0860da
Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>
0860da
---
0860da
 core/fs/ext2/ext2.c    | 23 ++++++++++++++---------
0860da
 core/fs/ext2/ext2_fs.h |  1 +
0860da
 2 files changed, 15 insertions(+), 9 deletions(-)
0860da
0860da
diff --git a/core/fs/ext2/ext2.c b/core/fs/ext2/ext2.c
87e39f
index 76bd1d5a..4bc0a535 100644
0860da
--- a/core/fs/ext2/ext2.c
0860da
+++ b/core/fs/ext2/ext2.c
0860da
@@ -25,22 +25,17 @@ static enum dirent_type ext2_cvt_type(unsigned int d_file_type)
0860da
 	return inode_type[d_file_type];
0860da
 }
0860da
 
0860da
-/*
0860da
- * get the group's descriptor of group_num
0860da
- */
0860da
-static const struct ext2_group_desc *
0860da
-ext2_get_group_desc(struct fs_info *fs, uint32_t group_num)
0860da
+static const void *__ext2_get_group_desc(struct fs_info *fs, uint32_t group_num)
0860da
 {
0860da
     struct ext2_sb_info *sbi = EXT2_SB(fs);
0860da
     uint32_t desc_block, desc_index;
0860da
-    const struct ext2_group_desc *desc_data_block;
0860da
+    uint8_t *p;
0860da
 
0860da
     if (group_num >= sbi->s_groups_count) {
0860da
 	printf ("ext2_get_group_desc"
0860da
 		"block_group >= groups_count - "
0860da
 		"block_group = %d, groups_count = %d",
0860da
 		group_num, sbi->s_groups_count);
0860da
-
0860da
 	return NULL;
0860da
     }
0860da
 
0860da
@@ -49,8 +44,17 @@ ext2_get_group_desc(struct fs_info *fs, uint32_t group_num)
0860da
 
0860da
     desc_block += sbi->s_first_data_block + 1;
0860da
 
0860da
-    desc_data_block = get_cache(fs->fs_dev, desc_block);
0860da
-    return &desc_data_block[desc_index];
0860da
+    p = get_cache(fs->fs_dev, desc_block);
0860da
+    return p + sbi->s_desc_size * desc_index;
0860da
+}
0860da
+
0860da
+/*
0860da
+ * get the group's descriptor of group_num
0860da
+ */
0860da
+static inline const struct ext2_group_desc *
0860da
+ext2_get_group_desc(struct fs_info *fs, uint32_t group_num)
0860da
+{
0860da
+    return __ext2_get_group_desc(fs, group_num);
0860da
 }
0860da
 
0860da
 /*
0860da
@@ -306,6 +310,7 @@ static int ext2_fs_init(struct fs_info *fs)
0860da
     if (sb.s_desc_size < sizeof(struct ext2_group_desc))
0860da
 	sb.s_desc_size = sizeof(struct ext2_group_desc);
0860da
     sbi->s_desc_per_block   = BLOCK_SIZE(fs) / sb.s_desc_size;
0860da
+    sbi->s_desc_size = sb.s_desc_size;
0860da
     sbi->s_groups_count     = (sb.s_blocks_count - sb.s_first_data_block
0860da
 			       + EXT2_BLOCKS_PER_GROUP(fs) - 1)
0860da
 	                      / EXT2_BLOCKS_PER_GROUP(fs);
0860da
diff --git a/core/fs/ext2/ext2_fs.h b/core/fs/ext2/ext2_fs.h
87e39f
index 803a9954..d8d07ebd 100644
0860da
--- a/core/fs/ext2/ext2_fs.h
0860da
+++ b/core/fs/ext2/ext2_fs.h
0860da
@@ -278,6 +278,7 @@ struct ext2_sb_info {
0860da
     uint32_t s_first_data_block;	/* First Data Block */
0860da
     int      s_inode_size;
0860da
     uint8_t  s_uuid[16];	/* 128-bit uuid for volume */
0860da
+    int      s_desc_size;	/* size of group descriptor */
0860da
 };
0860da
 
0860da
 static inline struct ext2_sb_info *EXT2_SB(struct fs_info *fs)