[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Cluster-devel] [Patch 20/44] fsck.gfs2: Add duplicate reference processing for leaf blocks



>From 3183f07e29fdc7c8af817ea97740b472f4767fc3 Mon Sep 17 00:00:00 2001
From: Bob Peterson <rpeterso redhat com>
Date: Tue, 9 Aug 2011 09:33:08 -0500
Subject: [PATCH 20/44] fsck.gfs2: Add duplicate reference processing for leaf
 blocks

This patch adds checks for duplicate block references to the leaf block
processing.

rhbz#675723
---
 gfs2/fsck/pass1.c |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index 8e6bec3..4ea9f69 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -330,7 +330,27 @@ static int check_num_ptrs(struct gfs2_inode *ip, uint64_t leafno,
 static int check_leaf(struct gfs2_inode *ip, uint64_t block, void *private)
 {
 	struct block_count *bc = (struct block_count *) private;
+	uint8_t q;
 
+	/* Note if we've gotten this far, the block has already passed the
+	   check in metawalk: gfs2_check_meta(lbh, GFS2_METATYPE_LF).
+	   So we know it's a leaf block. */
+	q = block_type(block);
+	if (q != gfs2_block_free) {
+		log_err( _("Found duplicate block %llu (0x%llx) referenced "
+			   "as a directory leaf in dinode "
+			   "%llu (0x%llx) - was marked %d (%s)\n"),
+			 (unsigned long long)block,
+			 (unsigned long long)block,
+			 (unsigned long long)ip->i_di.di_num.no_addr,
+			 (unsigned long long)ip->i_di.di_num.no_addr, q,
+			 block_type_string(q));
+		add_duplicate_ref(ip, block, ref_as_meta, 0, INODE_VALID);
+		if (q == gfs2_leaf_blk) /* If the previous reference also saw
+					   this as a leaf, it was already
+					   checked, so don't check again. */
+			return -EEXIST;
+	}
 	fsck_blockmap_set(ip, block, _("directory leaf"), gfs2_leaf_blk);
 	bc->indir_count++;
 	return 0;
-- 
1.7.4.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]