Module Name: src Committed By: perseant Date: Thu Jul 25 23:46:10 UTC 2024
Modified Files: src/sbin/newfs_exfatfs [perseant-exfatfs]: make_exfatfs.c newfs.c newfs_exfatfs.8 Log Message: Actually use the partition offset alignment option. Document all flags both in the man page and in usage(). To generate a diff of this commit: cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sbin/newfs_exfatfs/make_exfatfs.c cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sbin/newfs_exfatfs/newfs.c cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sbin/newfs_exfatfs/newfs_exfatfs.8 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/newfs_exfatfs/make_exfatfs.c diff -u src/sbin/newfs_exfatfs/make_exfatfs.c:1.1.2.4 src/sbin/newfs_exfatfs/make_exfatfs.c:1.1.2.5 --- src/sbin/newfs_exfatfs/make_exfatfs.c:1.1.2.4 Wed Jul 24 00:46:18 2024 +++ src/sbin/newfs_exfatfs/make_exfatfs.c Thu Jul 25 23:46:10 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: make_exfatfs.c,v 1.1.2.4 2024/07/24 00:46:18 perseant Exp $ */ +/* $NetBSD: make_exfatfs.c,v 1.1.2.5 2024/07/25 23:46:10 perseant Exp $ */ /*- * Copyright (c) 2022 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #if 0 static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95"; #else -__RCSID("$NetBSD: make_exfatfs.c,v 1.1.2.4 2024/07/24 00:46:18 perseant Exp $"); +__RCSID("$NetBSD: make_exfatfs.c,v 1.1.2.5 2024/07/25 23:46:10 perseant Exp $"); #endif #endif /* not lint */ @@ -475,9 +475,10 @@ uint16_t exfatfs_recommended_upcase_tabl extern int Nflag; /* Don't write anything */ extern int Vflag; /* Verbose */ -extern uint32_t align; +extern uint32_t fatalign; extern uint32_t heapalign; extern uint32_t fatlength; +extern uint32_t partition_offset; void pwarn(const char *, ...); @@ -520,10 +521,10 @@ make_exfatfs(int devfd, uint secsize, st ++scshift; /* Convert align and heapalign into sectors */ - align /= secsize; + fatalign /= secsize; heapalign /= secsize; if (heapalign == 0) - heapalign = align; + heapalign = fatalign; /* If no table given, use recommendation */ if (uctable == NULL || uctablesize == 0) { @@ -556,11 +557,16 @@ make_exfatfs(int devfd, uint secsize, st memcpy(fs->xf_JumpBoot, EXFAT_JUMPBOOT, sizeof(EXFAT_JUMPBOOT)); memcpy(fs->xf_FileSystemName, EXFAT_FSNAME, sizeof(EXFAT_FSNAME)); /* memset(fs->xf_MustBeZero, 0, sizeof(fs->xf_MustBeZero); */ - fs->xf_PartitionOffset = dkw->dkw_offset; + fs->xf_PartitionOffset = partition_offset; fs->xf_VolumeLength = dkw->dkw_size; - fs->xf_FatOffset = 24; /* Immediately following boot blocks */ - if (align) - fs->xf_FatOffset = roundup(fs->xf_FatOffset, align); + + /* The FAT immediately follows the boot blocks */ + fs->xf_FatOffset = 24; + /* and some optional alignment padding */ + if (fatalign) { + uint32_t falignoff = partition_offset % fatalign; + fs->xf_FatOffset = roundup(fs->xf_FatOffset + falignoff, fatalign); + } /* Find the total number of "blocks" (clusters) on this volume */ /* This is an overestimate, not accounting for the FAT itself */ @@ -572,9 +578,11 @@ make_exfatfs(int devfd, uint secsize, st nclust = fatlength * secsize / sizeof(uint32_t) - 2; fs->xf_FatLength = fatlength; fs->xf_ClusterHeapOffset = fs->xf_FatOffset + fs->xf_FatLength; - if (heapalign) - fs->xf_ClusterHeapOffset = roundup(fs->xf_ClusterHeapOffset, - heapalign); + if (heapalign) { + uint32_t halignoff = partition_offset % heapalign; + fs->xf_ClusterHeapOffset = roundup(fs->xf_ClusterHeapOffset + + halignoff, heapalign); + } /* Recalculate to take FATs into account */ nclust = (dkw->dkw_size - fs->xf_ClusterHeapOffset) Index: src/sbin/newfs_exfatfs/newfs.c diff -u src/sbin/newfs_exfatfs/newfs.c:1.1.2.2 src/sbin/newfs_exfatfs/newfs.c:1.1.2.3 --- src/sbin/newfs_exfatfs/newfs.c:1.1.2.2 Wed Jul 24 00:46:18 2024 +++ src/sbin/newfs_exfatfs/newfs.c Thu Jul 25 23:46:10 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: newfs.c,v 1.1.2.2 2024/07/24 00:46:18 perseant Exp $ */ +/* $NetBSD: newfs.c,v 1.1.2.3 2024/07/25 23:46: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: newfs.c,v 1.1.2.2 2024/07/24 00:46:18 perseant Exp $"); +__RCSID("$NetBSD: newfs.c,v 1.1.2.3 2024/07/25 23:46:10 perseant Exp $"); #endif #endif /* not lint */ @@ -80,9 +80,9 @@ int Nflag = 0; /* run without writing f int Vflag = 0; /* verbose */ uint64_t fssize; /* file system size */ uint32_t sectorsize; /* bytes/sector */ -uint32_t align = 0; /* fat alignment (bytes) */ +uint32_t fatalign = 0; /* fat alignment (sectors) */ uint32_t csize = 0; /* block size */ -uint32_t heapalign = 0; /* cluster heap alignment (bytes) */ +uint32_t heapalign = 0; /* cluster heap alignment (sectors) */ uint32_t serial = 0; uint32_t partition_offset = 0; uint32_t fatlength = 0; @@ -134,59 +134,59 @@ main(int argc, char **argv) memset(&dkw, 0, sizeof(dkw)); while ((ch = getopt(argc, argv, "a:b:c:Dh:FL:l:No:S:s:T:u:v#:")) != -1) switch(ch) { - case 'D': + case 'D': /* debug */ debug = 1; break; - case 'F': + case 'F': /* force create filesystem even on non disk */ force = 1; break; - case 'L': + case 'L': /* specify label */ label = optarg; break; - case 'N': + case 'N': /* dry run */ Nflag++; break; - case 'S': + case 'S': /* size in sectors */ secsize = strsuftoi64("sector size", optarg, 1, INT64_MAX, NULL); if (secsize <= 0 || (secsize & (secsize - 1))) fatal("%s: bad sector size", optarg); break; - case 'T': + case 'T': /* specify disk type XXX */ disktype = optarg; break; - case 'a': - align = strsuftoi64("alignment", optarg, - MINBLOCKSIZE, INT64_MAX, NULL); + case 'a': /* FAT alignment */ + fatalign = strsuftoi64("alignment", optarg, + MINBLOCKSIZE, INT64_MAX, NULL); break; - case 'b': + case 'b': /* take bootcode from file */ bootcodefile = optarg; break; - case 'c': + case 'c': /* cluster (block) size */ csize = strsuftoi64("cluster size", optarg, MINBLOCKSIZE, INT64_MAX, NULL); break; - case 'h': + case 'h': /* cluster heap alignment */ heapalign = strsuftoi64("heap alignment", optarg, MINBLOCKSIZE, INT64_MAX, NULL); break; - case 'l': + case 'l': /* FAT length in sectors */ fatlength = strtoul(optarg, NULL, 10); break; - case 'o': - dkw.dkw_offset = strtoul(optarg, NULL, 10); + case 'o': /* partition offset */ + partition_offset = strtoul(optarg, NULL, 10); break; - case 's': + case 's': /* size in DEV_BSIZE units */ fssize = strsuftoi64("file system size", optarg, 0, INT64_MAX, &byte_sized); break; - case 'u': + case 'u': /* take uctable from file */ uctablefile = optarg; break; - case 'v': + case 'v': /* verbose */ Vflag++; break; - case '#': + case '#': /* specify serial number */ serial = strtoul(optarg, NULL, 10); break; case '?': @@ -271,6 +271,10 @@ main(int argc, char **argv) fssize /= secsize; } + /* If not specified, use partition offset from wedge */ + if (partition_offset <= 0) + partition_offset = dkw.dkw_offset; + /* If force, make the partition look like EXFAT */ if (force) { (void)strcpy(dkw.dkw_ptype, DKW_PTYPE_EXFAT); @@ -300,7 +304,7 @@ main(int argc, char **argv) printf("Using Windows default cluster size %d" " for filesystem size %lld\n", (int)csize, (unsigned long long)diskbytes); -#else /* SD Card Association recommendations */ +#else /* SD Association recommendations */ if (diskbytes <= 8 * MEGABYTE) csize = 8 * KILOBYTE; else if (diskbytes <= 1 * GIGABYTE) @@ -314,7 +318,7 @@ main(int argc, char **argv) else csize = 512 * KILOBYTE; if (Vflag) - printf("Using SD Card Association recommended" + printf("Using SD Association recommended" " cluster size %d" " for filesystem size %lld\n", (int)csize, (unsigned long long)diskbytes); @@ -324,28 +328,31 @@ main(int argc, char **argv) printf("Using specified cluster size %d", (int)csize); } - if (align <= 0) { + if (fatalign <= 0) { #ifdef USE_WINDOWS_DEFAULTS - align = 0; -#else /* SD Card Association recommendations */ + fatalign = 0; +#else /* SD Association recommendations */ if (diskbytes <= 8 * MEGABYTE) - align = 8 * KILOBYTE; + fatalign = 8 * KILOBYTE; else if (diskbytes <= 64 * MEGABYTE) - align = 16 * KILOBYTE; + fatalign = 16 * KILOBYTE; else if (diskbytes <= 256 * MEGABYTE) - align = 32 * KILOBYTE; + fatalign = 32 * KILOBYTE; else if (diskbytes <= 2 * GIGABYTE) - align = 64 * KILOBYTE; + fatalign = 64 * KILOBYTE; else if (diskbytes <= 32 * GIGABYTE) - align = 4 * MEGABYTE; + fatalign = 4 * MEGABYTE; else if (diskbytes <= 128 * GIGABYTE) - align = 16 * MEGABYTE; + fatalign = 16 * MEGABYTE; else if (diskbytes <= 512 * GIGABYTE) - align = 32 * MEGABYTE; + fatalign = 32 * MEGABYTE; else - align = 64 * MEGABYTE; + fatalign = 64 * MEGABYTE; #endif } + /* Convert to sectors */ + fatalign /= secsize; + heapalign /= secsize; /* Convert given label from UTF8 into UCS2 */ uclabellen = exfatfs_utf8ucs2str((const uint8_t *)label, @@ -439,13 +446,22 @@ usage(void) { fprintf(stderr, "usage: newfs_exfatfs [ -fsoptions ] special-device\n"); fprintf(stderr, "where fsoptions are:\n"); + fprintf(stderr, "\t-# serial number\n"); fprintf(stderr, "\t-D (debug)\n"); fprintf(stderr, "\t-F (force)\n"); + fprintf(stderr, "\t-L label\n"); fprintf(stderr, "\t-N (do not create file system, just print out parameters)\n"); fprintf(stderr, "\t-S sector size\n"); - fprintf(stderr, "\t-a alignment in bytes\n"); + fprintf(stderr, "\t-T disk type\n"); + fprintf(stderr, "\t-a FAT alignment in bytes\n"); + fprintf(stderr, "\t-b bootcode file\n"); fprintf(stderr, "\t-c cluster size in bytes\n"); + fprintf(stderr, "\t-h cluster heap alignment in bytes\n"); + fprintf(stderr, "\t-l FAT length in sectors\n"); + fprintf(stderr, "\t-o partition offset in sectors\n"); fprintf(stderr, "\t-s file system size in sectors\n"); + fprintf(stderr, "\t-u upcase table file\n"); + fprintf(stderr, "\t-v (verbose)\n"); exit(1); } Index: src/sbin/newfs_exfatfs/newfs_exfatfs.8 diff -u src/sbin/newfs_exfatfs/newfs_exfatfs.8:1.1.2.1 src/sbin/newfs_exfatfs/newfs_exfatfs.8:1.1.2.2 --- src/sbin/newfs_exfatfs/newfs_exfatfs.8:1.1.2.1 Sat Jun 29 19:43:25 2024 +++ src/sbin/newfs_exfatfs/newfs_exfatfs.8 Thu Jul 25 23:46:10 2024 @@ -1,4 +1,4 @@ -.\" $NetBSD: newfs_exfatfs.8,v 1.1.2.1 2024/06/29 19:43:25 perseant Exp $ +.\" $NetBSD: newfs_exfatfs.8,v 1.1.2.2 2024/07/25 23:46:10 perseant Exp $ .\" .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. @@ -46,20 +46,38 @@ device basing its defaults on the inform Before running .Nm the disk must be labeled using -.Xr disklabel 8 , -the proper fstype is exFAT. +.Xr disklabel 8 . +The proper fstype is exFAT. .Pp The following options define the general layout policies. .Bl -tag -width Fl -.It Fl b Ar cluster-size +.It Fl # Ar serial-number +Use the given serial number, rather than generating one at random. +.It Fl a Ar fat-alignment +The alignment of the File Allocation Table in bytes. +If not specified, the alignment is made according to XXX. +.It Fl b Ar bootcode-file +Use the bootcode contained in the given file. +If not specified, the bootcode field will be filled with NUL (0x00). +.It Fl c Ar cluster-size The cluster size of the file system in bytes. If not specified, the block size is generated based on the file system size. +.It Fl D +Print debugging information to stdout. .It Fl F Force creation of a file system even on a partition labeled as another type. +.It Fl h Ar heap-alignment +The alignment of the cluster heap, in bytes. +If not specified, the FAT alignment will be used. .It Fl L Ar label Specify the file system label. The default label is "NONE GIVEN". +.It Fl l Ar fat-length +The length of the File Allocation Table, in sectors. .It Fl N Do not actually create the filesystem. +.It Fl o Ar partition-offset +The offset of this partition from the beginning of the disk, in sectors. +The default value is taken from the disklabel. .It Fl S Ar sector-size Use this as the size of filesystem sectors, in bytes. The default is to use the sector size from the disk label. @@ -67,6 +85,12 @@ use the sector size from the disk label. The size of the file system in sectors. .It Fl T Ar type Use the given disk type when there is no disk label. +.It Fl u Ar upcase-file +Use the given file for the filesystem's upcase table. +The default is to use the recommended upcase table from +section 7.2.5.1 of the specification. +.It Fl v +Be more verbose about what is being done. .El .Sh SEE ALSO .Xr disktab 5 ,