Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 35adedb8830cf948b43b86231991124b > files > 34

gfs2-utils-0.1.62-39.el5.src.rpm

commit 3f47f6f9b2dc9f8e1dbfc27158d6bc1f64ad5cac
Author: Bob Peterson <bob@ganesha.peterson>
Date:   Wed Nov 25 14:32:56 2009 -0600

    Eliminate bad_block linked block list
    
    This patch eliminates the special linked list designated for bad
    blocks in fsck.gfs2 in lieu of a bad block designation in the
    block list bitmap.
    
    rhbz#455300

diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 395ca2c..05e73b9 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -259,7 +259,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 		return -1;
 	}
 	/* Get the status of the directory inode */
-	if(q.bad_block) {
+	if(q.block_type == gfs2_bad_block) {
 		/* This entry's inode has bad blocks in it */
 
 		/* Handle bad blocks */
@@ -604,7 +604,7 @@ int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
 		}
 	}
 	pass2_fxns.private = (void *) &ds;
-	if(ds.q.bad_block) {
+	if(ds.q.block_type == gfs2_bad_block) {
 		/* First check that the directory's metatree is valid */
 		if(check_metatree(sysinode, &pass2_fxns)) {
 			stack;
@@ -764,7 +764,7 @@ int pass2(struct gfs2_sbd *sbp)
 
 		memset(&ds, 0, sizeof(ds));
 		pass2_fxns.private = (void *) &ds;
-		if(ds.q.bad_block) {
+		if(ds.q.block_type == gfs2_bad_block) {
 			/* First check that the directory's metatree
 			 * is valid */
 			ip = fsck_load_inode(sbp, i);
diff --git a/gfs2/fsck/pass3.c b/gfs2/fsck/pass3.c
index 48f6135..bb71e47 100644
--- a/gfs2/fsck/pass3.c
+++ b/gfs2/fsck/pass3.c
@@ -230,7 +230,7 @@ int pass3(struct gfs2_sbd *sbp)
 					stack;
 					return FSCK_ERROR;
 				}
-				if(q.bad_block) {
+				if(q.block_type == gfs2_bad_block) {
 					log_err( _("Found unlinked directory containing bad block\n"));
 					errors_found++;
 					if(query(&opts,
diff --git a/gfs2/fsck/pass4.c b/gfs2/fsck/pass4.c
index fd0ac0e..b5ea674 100644
--- a/gfs2/fsck/pass4.c
+++ b/gfs2/fsck/pass4.c
@@ -77,7 +77,7 @@ static int scan_inode_list(struct gfs2_sbd *sbp, osi_list_t *list) {
 				stack;
 				return -1;
 			}
-			if(q.bad_block) {
+			if(q.block_type == gfs2_bad_block) {
 				log_err( _("Unlinked inode %llu (0x%llx) contains"
 					"bad blocks\n"),
 					(unsigned long long)ii->inode,
diff --git a/gfs2/libgfs2/block_list.c b/gfs2/libgfs2/block_list.c
index 5d1851b..c67c5a4 100644
--- a/gfs2/libgfs2/block_list.c
+++ b/gfs2/libgfs2/block_list.c
@@ -45,7 +45,6 @@ struct gfs2_block_list *gfs2_block_list_create(struct gfs2_sbd *sdp,
 		free(il);
 		il = NULL;
 	}
-	osi_list_init(&sdp->bad_blocks.list);
 	osi_list_init(&sdp->dup_blocks.list);
 	osi_list_init(&sdp->eattr_blocks.list);
 	return il;
@@ -162,9 +161,7 @@ int gfs2_block_mark(struct gfs2_sbd *sdp, struct gfs2_block_list *il,
 {
 	int err = 0;
 
-	if(mark == gfs2_bad_block)
-		gfs2_special_set(&sdp->bad_blocks, block);
-	else if(mark == gfs2_dup_block)
+	if(mark == gfs2_dup_block)
 		gfs2_dup_set(&sdp->dup_blocks, block);
 	else if(mark == gfs2_eattr_block)
 		gfs2_special_set(&sdp->eattr_blocks, block);
@@ -184,9 +181,6 @@ int gfs2_block_unmark(struct gfs2_sbd *sdp, struct gfs2_block_list *il,
 	case gfs2_dup_block:
 		gfs2_dup_clear(&sdp->dup_blocks, block);
 		break;
-	case gfs2_bad_block:
-		gfs2_special_clear(&sdp->bad_blocks, block);
-		break;
 	case gfs2_eattr_block:
 		gfs2_special_clear(&sdp->eattr_blocks, block);
 		break;
@@ -205,7 +199,6 @@ int gfs2_block_clear(struct gfs2_sbd *sdp, struct gfs2_block_list *il,
 	int err = 0;
 
 	gfs2_dup_clear(&sdp->dup_blocks, block);
-	gfs2_special_clear(&sdp->bad_blocks, block);
 	gfs2_special_clear(&sdp->eattr_blocks, block);
 	err = gfs2_bitmap_clear(&il->list.gbmap, block);
 	return err;
@@ -227,11 +220,8 @@ int gfs2_block_check(struct gfs2_sbd *sdp, struct gfs2_block_list *il,
 {
 	int err = 0;
 
-	val->bad_block = 0;
 	val->dup_block = 0;
 	val->eattr_block = 0;
-	if (blockfind(&sdp->bad_blocks, block))
-		val->bad_block = 1;
 	if (dupfind(&sdp->dup_blocks, block))
 		val->dup_block = 1;
 	if (blockfind(&sdp->eattr_blocks, block))
@@ -248,7 +238,6 @@ void *gfs2_block_list_destroy(struct gfs2_sbd *sdp, struct gfs2_block_list *il)
 		free(il);
 		il = NULL;
 	}
-	gfs2_special_free(&sdp->bad_blocks);
 	gfs2_dup_free(&sdp->dup_blocks);
 	gfs2_special_free(&sdp->eattr_blocks);
 	return il;
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 70cf6cf..a9aeb2a 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -255,7 +255,6 @@ struct gfs2_sbd {
 	unsigned int writes;
 	int metafs_fd;
 	char metafs_path[PATH_MAX]; /* where metafs is mounted */
-	struct special_blocks bad_blocks;
 	struct dup_blocks dup_blocks;
 	struct special_blocks eattr_blocks;
 };
@@ -324,7 +323,7 @@ uint64_t gfs2_bitmap_size(struct gfs2_bmap *bmap);
 #define JOURNAL_BLK     (0xB)  /*   1011 */
 #define OTHER_META      (0xC)  /*   1100 */
 #define EATTR_META      (0xD)  /*   1101 */
-#define UNUSED1         (0xE)  /*   1110 */
+#define BAD_BLOCK       (0xE)  /*   1110 */
 #define INVALID_META    (0xF)  /*   1111 */
 
 /* Must be kept in sync with mark_to_bitmap array in block_list.c */
@@ -343,16 +342,14 @@ enum gfs2_mark_block {
 	gfs2_journal_blk = JOURNAL_BLK,
 	gfs2_meta_other = OTHER_META,
 	gfs2_meta_eattr = EATTR_META,
-	gfs2_meta_unused = UNUSED1,
+	gfs2_bad_block = BAD_BLOCK, /* Contains at least one bad block */
 	gfs2_meta_inval = INVALID_META,
-	gfs2_bad_block,      /* Contains at least one bad block */
 	gfs2_dup_block,      /* Contains at least one duplicate block */
 	gfs2_eattr_block,    /* Contains an eattr */
 };
 
 struct gfs2_block_query {
         uint8_t block_type;
-        uint8_t bad_block;
         uint8_t dup_block;
         uint8_t eattr_block;
 };