Blame SOURCES/e2fsprogs-1.42.9-libext2fs-detect-correct-superblock-adjustments-when.patch

252946
From 35da59eaf201d5935d7047657355f129f3791d9a Mon Sep 17 00:00:00 2001
252946
From: "Darrick J. Wong" <darrick.wong@oracle.com>
252946
Date: Sat, 11 Jan 2014 13:54:57 -0500
252946
Subject: [PATCH 1/2] libext2fs: detect correct superblock adjustments when
252946
 loading backup groups
252946
252946
If ext2fs_descriptor_block_loc2() is called with a meta_bg filesystem
252946
and group_block is not the normal value, the function will return the
252946
location of the backup group descriptor block in the next block group.
252946
Unfortunately, it fails to account for the possibility that the backup
252946
group contains a backup superblock but the regular superblock does
252946
not.  This is the case with block groups 48-49 on a meta_bg fs with 1k
252946
blocks; in this case, libext2fs will fail to open the filesystem.
252946
252946
Therefore, teach the function to adjust for superblocks in the backup
252946
group, if necessary.
252946
252946
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
252946
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
252946
---
252946
 lib/ext2fs/openfs.c | 19 +++++++++++++++----
252946
 1 file changed, 15 insertions(+), 4 deletions(-)
252946
252946
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c
252946
index 2c6e10e..b27bf19 100644
252946
--- a/lib/ext2fs/openfs.c
252946
+++ b/lib/ext2fs/openfs.c
252946
@@ -47,7 +47,7 @@ blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs, blk64_t group_block,
252946
 	bg = EXT2_DESC_PER_BLOCK(fs->super) * i;
252946
 	if (ext2fs_bg_has_super(fs, bg))
252946
 		has_super = 1;
252946
-	ret_blk = ext2fs_group_first_block2(fs, bg) + has_super;
252946
+	ret_blk = ext2fs_group_first_block2(fs, bg);
252946
 	/*
252946
 	 * If group_block is not the normal value, we're trying to use
252946
 	 * the backup group descriptors and superblock --- so use the
252946
@@ -57,10 +57,21 @@ blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs, blk64_t group_block,
252946
 	 * have the infrastructure in place to do that.
252946
 	 */
252946
 	if (group_block != fs->super->s_first_data_block &&
252946
-	    ((ret_blk + fs->super->s_blocks_per_group) <
252946
-	     ext2fs_blocks_count(fs->super)))
252946
+	    ((ret_blk + has_super + fs->super->s_blocks_per_group) <
252946
+	     ext2fs_blocks_count(fs->super))) {
252946
 		ret_blk += fs->super->s_blocks_per_group;
252946
-	return ret_blk;
252946
+
252946
+		/*
252946
+		 * If we're going to jump forward a block group, make sure
252946
+		 * that we adjust has_super to account for the next group's
252946
+		 * backup superblock (or lack thereof).
252946
+		 */
252946
+		if (ext2fs_bg_has_super(fs, bg + 1))
252946
+			has_super = 1;
252946
+		else
252946
+			has_super = 0;
252946
+	}
252946
+	return ret_blk + has_super;
252946
 }
252946
 
252946
 blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block, dgrp_t i)
252946
-- 
252946
2.17.1
252946