Module Name:    src
Committed By:   perseant
Date:           Wed Jul 24 00:42:11 UTC 2024

Modified Files:
        src/sbin/fsck_exfatfs [perseant-exfatfs]: fsck_exfatfs.c

Log Message:
Write the superblocks if we make changes to the filesystem.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sbin/fsck_exfatfs/fsck_exfatfs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/fsck_exfatfs/fsck_exfatfs.c
diff -u src/sbin/fsck_exfatfs/fsck_exfatfs.c:1.1.2.2 src/sbin/fsck_exfatfs/fsck_exfatfs.c:1.1.2.3
--- src/sbin/fsck_exfatfs/fsck_exfatfs.c:1.1.2.2	Fri Jul 19 16:19:16 2024
+++ src/sbin/fsck_exfatfs/fsck_exfatfs.c	Wed Jul 24 00:42:10 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: fsck_exfatfs.c,v 1.1.2.2 2024/07/19 16:19:16 perseant Exp $	*/
+/*	$NetBSD: fsck_exfatfs.c,v 1.1.2.3 2024/07/24 00:42:10 perseant Exp $	*/
 
 /*-
  * Copyright (c) 1989, 1992, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 19
 #if 0
 static char sccsid[] = "@(#)newfs.c	8.5 (Berkeley) 5/24/95";
 #else
-__RCSID("$NetBSD: fsck_exfatfs.c,v 1.1.2.2 2024/07/19 16:19:16 perseant Exp $");
+__RCSID("$NetBSD: fsck_exfatfs.c,v 1.1.2.3 2024/07/24 00:42:10 perseant Exp $");
 #endif
 #endif /* not lint */
 
@@ -69,6 +69,7 @@ __RCSID("$NetBSD: fsck_exfatfs.c,v 1.1.2
 #define vnode uvnode
 #define buf ubuf
 #include <fs/exfatfs/exfatfs.h>
+#include <fs/exfatfs/exfatfs_cksum.h>
 #include <fs/exfatfs/exfatfs_conv.h>
 #include <fs/exfatfs/exfatfs_extern.h>
 #include <fs/exfatfs/exfatfs_inode.h>
@@ -447,12 +448,47 @@ main(int argc, char **argv)
 		pass2(fs, bitmap);
 		
 		/* Mark filesystem clean */
-		
-		/* Report file count and cluster usage */
+		if (fsdirty) {
+			daddr_t base;
+			int i;
+			size_t j;
+			uint32_t cksum;
+			uint8_t boot_ignore[3] = { 106, 107, 112 };
+
+			pwarn("WRITING SUPERBLOCKS\n");
+			for (base = 0; base < 24; base += 12) {
+				/* Write superblock to disk */
+				bp = getblk(devvp, base + 0, BSSIZE(fs));
+				memcpy(bp->b_data, &fs->xf_exfatdfs,
+				       sizeof(fs->xf_exfatdfs));
+				cksum = exfatfs_cksum32(0,
+						(uint8_t *)bp->b_data,
+						BSSIZE(fs), boot_ignore,
+						sizeof(boot_ignore));
+				bwrite(bp);
+			
+				/* Checksum but do not write other sectors */
+				for (i = 1; i < 11; i++) {
+					bread(devvp, base + i, BSSIZE(fs), 0, &bp);
+					cksum = exfatfs_cksum32(cksum,
+								(uint8_t *)bp->b_data,
+								BSSIZE(fs),
+								NULL, 0);
+					brelse(bp, 0);
+				}
+
+				/* Populate checksum block and write it */
+				bp = getblk(devvp, base + i, BSSIZE(fs));
+				for (j = 0; j < BSSIZE(fs) / sizeof(uint32_t); j++)
+					((uint32_t *)bp->b_data)[j] = cksum;
+				bwrite(bp);
+			}
+		}
 		
 		close(devfd);
 	}
 
+	/* Report file count and cluster usage */
 	printf("%llu files, %u/%u clusters allocated, %0.1f%% fragmentation\n",
 	       total_files, clusters_used, fs->xf_ClusterCount,
 	       (frag_files * 100.0) / total_files);

Reply via email to