Skip to contentSkip to conversation

xfs_repair: print superblock offsets and denial reasons

PATCH New KELEMEN Peter 3 participants 5 messages Oct 22, 2008 – Nov 21, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xfs_repair: print superblock offsets and denial reasons

Example output (without the scanning dots):

Phase 1 - find and verify superblock. bad primary superblock - bad magic number !!!

attempting to find secondary superblock... found candidate secondary superblock...
offset: 62498275328
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 156246212608
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 249994149888
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 343742087168
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 437490024448
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 531237961728
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 624985899008
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 718733836288
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 812481773568
reason: 16
unable to verify superblock, continuing... found candidate secondary superblock...
offset: 906229710848
reason: 16
unable to verify superblock, continuing... Sorry, could not find valid secondary superblock Exiting now.

Index: xfsprogs/repair/sb.c
===================================================================
RCS file: /cvs/xfs-cmds/xfsprogs/repair/sb.c,v retrieving revision 1.22

repair/sb.c +4 -1
diff -u -r1.22 sb.c
@@ -96,6 +96,7 @@
 	int		dirty;
 	int		retval;
 	int		bsize;
+	int		reason;		/* why sb cannot be verified */
 
 	do_warn(_("\nattempting to find secondary superblock...\n"));
 
@@ -140,6 +141,7 @@
 				continue;
 
 			do_warn(_("found candidate secondary superblock...\n"));
+			do_warn("offset: %Lu\n", off);
 
 			/*
 			 * found one.  now verify it by looking
@@ -149,12 +151,13 @@
 			rsb->sb_inprogress = 0;
 			clear_sunit = 1;
 
-			if (verify_set_primary_sb(rsb, 0, &dirty) == XR_OK)  {
+			if ((reason = verify_set_primary_sb(rsb, 0, &dirty)) == XR_OK)  {
 				do_warn(
 			_("verified secondary superblock...\n"));
 				done = 1;
 				retval = 1;
 			} else  {
+				do_warn("reason: %d\n", reason);
 				do_warn(
 			_("unable to verify superblock, continuing...\n"));
 			}
#1 lore raw

PATCH v2 1/1 xfs_repair: print superblock offsets and why they can't be verified

Eric has pointed out that verify_set_primary_sb() will either return 1 or XR_INSUFF_SEC_SB. Move the check lower into verify_set_primary_sb() by checking the return value of verify_sb(). Example output:

found candidate secondary superblock... verifying sb at 31249334272: bad magic number (1) verifying sb at 62498668544: bad magic number (1) verifying sb at 93748002816: bad magic number (1) verifying sb at 124997337088: bad magic number (1) unable to verify superblock, continuing...

Index: xfsprogs/repair/sb.c
===================================================================
RCS file: /cvs/xfs-cmds/xfsprogs/repair/sb.c,v
retrieving revision 1.22

repair/sb.c +5 -1
diff -u -u -r1.22 sb.c
@@ -683,6 +683,7 @@
 	int		num_ok;
 	int		retval;
 	int		round;
+	int		reason;	/* why the sb check failed */
 
 	/*
 	 * select the number of secondaries to try for
@@ -727,7 +728,7 @@
 				goto out;
 			}
 
-			if (verify_sb(sb, 0) == XR_OK)  {
+			if ((reason = verify_sb(sb, 0)) == XR_OK)  {
 				/*
 				 * save away geometry info.
 				 * don't bother checking the sb
@@ -740,6 +741,9 @@
 				get_sb_geometry(&geo, sb);
 				list = add_geo(list, &geo, agno);
 				num_ok++;
+			} else {
+				do_warn("verifying sb at %Lu: %s (%d)\n",
+					off, err_string(reason), reason);
 			}
 		}
 	}
#2 lore raw

Re: [PATCH V2] xfs_repair: print superblock offsets and why they can't be verified

Quoted 5 lines · KELEMEN Peter

Eric has pointed out that verify_set_primary_sb() will either return 1 or XR_INSUFF_SEC_SB. Move the check lower into verify_set_primary_sb() by checking the return value of verify_sb(). Example output:

Quoted 7 lines

found candidate secondary superblock... verifying sb at 31249334272: bad magic number (1) verifying sb at 62498668544: bad magic number (1) verifying sb at 93748002816: bad magic number (1) verifying sb at 124997337088: bad magic number (1) unable to verify superblock, continuing...

This looks better :) You may want to add even more info...

while it's just searching block by block, if it finds a candidate, I'd print the sector offset for that candidate (your first output line).

And rather than "verifying sb at..." you might do something like "comparing to sb N at offset X":

+ } else {
+ do_warn("comparing with sb %d at sector %Lu failed: %s (%d)\n",
+ agno, off, err_string(reason), reason);

because at this point it's using the geometry of the candidate sb to see if it can be used to find enough other valid sb's....

-Eric

Quoted 38 lines

Index: xfsprogs/repair/sb.c
===================================================================
RCS file: /cvs/xfs-cmds/xfsprogs/repair/sb.c,v
retrieving revision 1.22
diff -u -u -r1.22 sb.c

repair/sb.c +5 -1
@@ -683,6 +683,7 @@
 	int		num_ok;
 	int		retval;
 	int		round;
+	int		reason;	/* why the sb check failed */
 
 	/*
 	 * select the number of secondaries to try for
@@ -727,7 +728,7 @@
 				goto out;
 			}
 
-			if (verify_sb(sb, 0) == XR_OK)  {
+			if ((reason = verify_sb(sb, 0)) == XR_OK)  {
 				/*
 				 * save away geometry info.
 				 * don't bother checking the sb
@@ -740,6 +741,9 @@
 				get_sb_geometry(&geo, sb);
 				list = add_geo(list, &geo, agno);
 				num_ok++;
+			} else {
+				do_warn("verifying sb at %Lu: %s (%d)\n",
+					off, err_string(reason), reason);
 			}
 		}
 	}
#3 lore raw

Re: [PATCH V2] xfs_repair: print superblock offsets and why they can't be verified

Quoted 22 lines · Eric Sandeen
Quoted 5 lines · KELEMEN Peter

Eric has pointed out that verify_set_primary_sb() will either return 1 or XR_INSUFF_SEC_SB. Move the check lower into verify_set_primary_sb() by checking the return value of verify_sb(). Example output:

Quoted 7 lines

found candidate secondary superblock... verifying sb at 31249334272: bad magic number (1) verifying sb at 62498668544: bad magic number (1) verifying sb at 93748002816: bad magic number (1) verifying sb at 124997337088: bad magic number (1) unable to verify superblock, continuing...

This looks better :) You may want to add even more info...

while it's just searching block by block, if it finds a candidate, I'd print the sector offset for that candidate (your first output line).

And rather than "verifying sb at..." you might do something like "comparing to sb N at offset X":

Review

Quoted 3 lines
(quoted diff) +3 -0
+	} else {
+		do_warn("comparing with sb %d at sector %Lu failed: %s (%d)\n",
+			agno, off, err_string(reason), reason);

Sorry, that was a pre-coffee email :) The units are bytes, not sectors, aren't they... in any case, printing the (proper) units for the values would be helpful.

-Eric

#4 lore raw

Re: [PATCH V2] xfs_repair: print superblock offsets and why they can't be verified

In reply to Eric Sandeen
Quoted 26 lines · Eric Sandeen
Quoted 5 lines · KELEMEN Peter

Eric has pointed out that verify_set_primary_sb() will either return 1 or XR_INSUFF_SEC_SB. Move the check lower into verify_set_primary_sb() by checking the return value of verify_sb(). Example output:

Quoted 7 lines

found candidate secondary superblock... verifying sb at 31249334272: bad magic number (1) verifying sb at 62498668544: bad magic number (1) verifying sb at 93748002816: bad magic number (1) verifying sb at 124997337088: bad magic number (1) unable to verify superblock, continuing...

This looks better :) You may want to add even more info...

while it's just searching block by block, if it finds a candidate, I'd print the sector offset for that candidate (your first output line).

And rather than "verifying sb at..." you might do something like "comparing to sb N at offset X":

(quoted diff) +3 -0
+	} else {
+		do_warn("comparing with sb %d at sector %Lu failed: %s (%d)\n",
+			agno, off, err_string(reason), reason);
Quoted 2 lines

because at this point it's using the geometry of the candidate sb to see if it can be used to find enough other valid sb's....

Do I check in the patch as is or will there be an update?

Regards,
Barry.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs