git: be639cc8eef0 - main - Update standard superblock when successful using an alternate superblock.

From: Kirk McKusick <mckusick_at_FreeBSD.org>
Date: Wed, 24 Aug 2022 06:29:42 UTC
The branch main has been updated by mckusick:

URL: https://cgit.FreeBSD.org/src/commit/?id=be639cc8eef01a2b8849939eb07cfde476146794

commit be639cc8eef01a2b8849939eb07cfde476146794
Author:     Kirk McKusick <mckusick@FreeBSD.org>
AuthorDate: 2022-08-24 06:28:30 +0000
Commit:     Kirk McKusick <mckusick@FreeBSD.org>
CommitDate: 2022-08-24 06:29:17 +0000

    Update standard superblock when successful using an alternate superblock.
    
    Historically fsck_ffs(8) would only use alternate superblocks when
    running in manual mode. When the standard superblock fails, it now
    tries to find and use a backup superblocks even when running in `preen'
    mode. If an alternate superblock is found and the filesystem is
    successfully cleaned up using it, write the alternate superblock
    back to the standard superblock so that the filesystem can be
    subsequently mounted and used.
    
    Reported by:  Peter Holm
    Tested by:    Peter Holm
    Sponsored by: The FreeBSD Foundation
---
 sbin/fsck_ffs/fsutil.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c
index 424f8d9794f6..57853abe5442 100644
--- a/sbin/fsck_ffs/fsutil.c
+++ b/sbin/fsck_ffs/fsutil.c
@@ -682,14 +682,17 @@ ckfini(int markclean)
 	if (debug)
 		printf("Flush the superblock\n");
 	flush(fswritefd, &sblk);
-	if (havesb && cursnapshot == 0 && sblock.fs_magic == FS_UFS2_MAGIC &&
-	    sblk.b_bno != sblock.fs_sblockloc / dev_bsize &&
-	    !preen && reply("UPDATE STANDARD SUPERBLOCK")) {
-		/* Change the write destination to standard superblock */
-		sblock.fs_sblockactualloc = sblock.fs_sblockloc;
-		sblk.b_bno = sblock.fs_sblockloc / dev_bsize;
-		sbdirty();
-		flush(fswritefd, &sblk);
+	if (havesb && cursnapshot == 0 &&
+	    sblk.b_bno != sblock.fs_sblockloc / dev_bsize) {
+		if (preen || reply("UPDATE STANDARD SUPERBLOCK")) {
+			/* Change write destination to standard superblock */
+			sblock.fs_sblockactualloc = sblock.fs_sblockloc;
+			sblk.b_bno = sblock.fs_sblockloc / dev_bsize;
+			sbdirty();
+			flush(fswritefd, &sblk);
+		} else {
+			markclean = 0;
+		}
 	}
 	if (cursnapshot == 0 && sblock.fs_clean != markclean) {
 		if ((sblock.fs_clean = markclean) != 0) {