[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-ext4
Subject:    [Ext2-devel] [PATCH] ext3: Properly report backup blocks present in a group
From:       glommer () br ! ibm ! com (Glauber de Oliveira Costa)
Date:       2006-01-20 18:37:21
Message-ID: 20060120183721.GB25386 () br ! ibm ! com
[Download RAW message or body]

In filesystems with the meta block group flag on, ext3_bg_num_gdb()
fails to report the correct number of blocks used to store the group
descriptor backups in a given group. It happens because meta_bg
follows a different logic from the original ext3 backup placement
in groups multiples of 3, 5 and 7.

Signed-off-by: Glauber de Oliveira Costa <glommer@br.ibm.com>

---

 fs/ext3/balloc.c |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

1164cfd9b1b413f6c4b86bac11006ba2b933ccb1
diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c
index 6250fcd..8bf87b0 100644
--- a/fs/ext3/balloc.c
+++ b/fs/ext3/balloc.c
@@ -1499,6 +1499,25 @@ int ext3_bg_has_super(struct super_block
 	return 1;
 }
 
+static unsigned long ext3_bg_num_gdb_meta(struct super_block *sb, int group)
+{
+	unsigned long metagroup = group / EXT3_DESC_PER_BLOCK(sb);
+	unsigned long first = metagroup * EXT3_DESC_PER_BLOCK(sb);
+	unsigned long last = first + EXT3_DESC_PER_BLOCK(sb) - 1;
+
+	if (group == first || group == first + 1 || group == last)
+		return 1;
+	return 0;
+}
+
+static unsigned long ext3_bg_num_gdb_nometa(struct super_block *sb, int group)
+{
+	if (EXT3_HAS_RO_COMPAT_FEATURE(sb,EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
+	    !ext3_group_sparse(group))
+		return 0;
+	return EXT3_SB(sb)->s_gdb_count;
+}
+
 /**
  *	ext3_bg_num_gdb - number of blocks used by the group table in group
  *	@sb: superblock for filesystem
@@ -1510,9 +1529,15 @@ int ext3_bg_has_super(struct super_block
  */
 unsigned long ext3_bg_num_gdb(struct super_block *sb, int group)
 {
-	if (EXT3_HAS_RO_COMPAT_FEATURE(sb,EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
-	    !ext3_group_sparse(group))
-		return 0;
-	return EXT3_SB(sb)->s_gdb_count;
+	unsigned long first_meta_bg = 
+		cpu_to_le32(EXT3_SB(sb)->s_es->s_first_meta_bg);
+	unsigned long metagroup = group / EXT3_DESC_PER_BLOCK(sb);
+
+	if (!EXT3_HAS_INCOMPAT_FEATURE(sb,EXT3_FEATURE_INCOMPAT_META_BG)
+			|| metagroup < first_meta_bg)
+		return ext3_bg_num_gdb_nometa(sb,group);
+	
+	return ext3_bg_num_gdb_meta(sb,group);
+
 }
 
-- 
1.0.4


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
Ext2-devel mailing list
Ext2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ext2-devel
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic