Source-Changes-HG archive

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

[src/trunk]: src/sbin/newfs_msdos When we end up with too few clusters for th...



details:   https://anonhg.NetBSD.org/src/rev/0850e4157003
branches:  trunk
changeset: 845687:0850e4157003
user:      martin <martin%NetBSD.org@localhost>
date:      Sat Oct 12 09:42:38 2019 +0000

description:
When we end up with too few clusters for the requested FAT type after
configuring default values, retry with a smaller cluster size.
This makes the typical invocation to create a spec conformant EFI boot
partition work out of the box.

diffstat:

 sbin/newfs_msdos/mkfs_msdos.c |  13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diffs (49 lines):

diff -r f10f6a47d092 -r 0850e4157003 sbin/newfs_msdos/mkfs_msdos.c
--- a/sbin/newfs_msdos/mkfs_msdos.c     Sat Oct 12 09:22:36 2019 +0000
+++ b/sbin/newfs_msdos/mkfs_msdos.c     Sat Oct 12 09:42:38 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: mkfs_msdos.c,v 1.14 2018/02/04 09:03:23 mrg Exp $      */
+/*     $NetBSD: mkfs_msdos.c,v 1.15 2019/10/12 09:42:38 martin Exp $   */
 
 /*
  * Copyright (c) 1998 Robert Nordier
@@ -37,7 +37,7 @@
 static const char rcsid[] =
   "$FreeBSD: src/sbin/newfs_msdos/newfs_msdos.c,v 1.15 2000/10/10 01:49:37 wollman Exp $";
 #else
-__RCSID("$NetBSD: mkfs_msdos.c,v 1.14 2018/02/04 09:03:23 mrg Exp $");
+__RCSID("$NetBSD: mkfs_msdos.c,v 1.15 2019/10/12 09:42:38 martin Exp $");
 #endif
 #endif /* not lint */
 
@@ -264,7 +264,10 @@
     int ch, fd, fd1;
     struct msdos_options o = *op;
     int oflags = O_RDWR | O_CREAT;
+    bool bspf_is_calculated;
 
+again:
+    bspf_is_calculated = false;
     if (o.block_size && o.sectors_per_cluster) {
        warnx("Cannot specify both block size and sectors per cluster");
        return -1;
@@ -556,6 +559,7 @@
     x2 = howmany((RESFTE + MIN(x, maxcls(o.fat_type))) * (o.fat_type / BPN),
                 bpb.bps * NPB);
     if (!bpb.bspf) {
+       bspf_is_calculated = true;
        bpb.bspf = x2;
        x1 += (bpb.bspf - 1) * bpb.nft;
     }
@@ -569,6 +573,11 @@
        return -1;
     }
     if (cls < mincls(o.fat_type)) {
+       if (bspf_is_calculated && o.sectors_per_cluster == 0 && bpb.spc > 2) {
+               /* retry with smaller cluster size */
+               o.sectors_per_cluster = 2;
+               goto again;
+       }
        warnx("%u clusters too few clusters for FAT%u, need %u", cls,
            o.fat_type, mincls(o.fat_type));
        return -1;



Home | Main Index | Thread Index | Old Index