[PATCH v2] repair: handle reading superblock from image on larger sector size filesystem

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

 



Due to xfs_repair uses direct IO, sometimes it can't read superblock
from an image file has smaller sector size than host filesystem.
Especially that superblock doesn't align with host filesystem's
sector size.

Fortunately, xfsprogs already has code to do "isa_file" check in
xfs_repair.c, it turns off O_DIRECT after phase1 if the sector
size is less than the host filesystem's geometry. So move it upward
phase1 directly.

Signed-off-by: Zorro Lang <zlang@xxxxxxxxxx>
---

Hi,

V2 did below changes:
1) remove all changes in V1.
2) move "isa_file" double check over than phase1.

Thanks,
Zorro

 repair/xfs_repair.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
index b07567b..0525c6d 100644
--- a/repair/xfs_repair.c
+++ b/repair/xfs_repair.c
@@ -657,24 +657,6 @@ main(int argc, char **argv)
 	timestamp(PHASE_START, 0, NULL);
 	timestamp(PHASE_END, 0, NULL);
 
-	/* do phase1 to make sure we have a superblock */
-	phase1(temp_mp);
-	timestamp(PHASE_END, 1, NULL);
-
-	if (no_modify && primary_sb_modified)  {
-		do_warn(_("Primary superblock would have been modified.\n"
-			  "Cannot proceed further in no_modify mode.\n"
-			  "Exiting now.\n"));
-		exit(1);
-	}
-
-	rval = get_sb(&psb, 0, XFS_MAX_SECTORSIZE, 0);
-	if (rval != XR_OK) {
-		do_warn(_("Primary superblock bad after phase 1!\n"
-			  "Exiting now.\n"));
-		exit(1);
-	}
-
 	/* -f forces this, but let's be nice and autodetect it, as well. */
 	if (!isa_file) {
 		int		fd = libxfs_device_to_fd(x.ddev);
@@ -717,6 +699,24 @@ main(int argc, char **argv)
 		}
 	}
 
+	/* do phase1 to make sure we have a superblock */
+	phase1(temp_mp);
+	timestamp(PHASE_END, 1, NULL);
+
+	if (no_modify && primary_sb_modified)  {
+		do_warn(_("Primary superblock would have been modified.\n"
+			  "Cannot proceed further in no_modify mode.\n"
+			  "Exiting now.\n"));
+		exit(1);
+	}
+
+	rval = get_sb(&psb, 0, XFS_MAX_SECTORSIZE, 0);
+	if (rval != XR_OK) {
+		do_warn(_("Primary superblock bad after phase 1!\n"
+			  "Exiting now.\n"));
+		exit(1);
+	}
+
 	/*
 	 * Prepare the mount structure. Point the log reference to our local
 	 * copy so it's available to the various phases. The log bits are
-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux