[PATCH] floppy: hide invalid floppy disk types

From: Moritz MÃller
Date: Sun Dec 08 2019 - 12:00:20 EST

In some cases floppy disks are recognised even though no such device
exists. In our case this has been caused by the CMOS-RAM having a few
wrong bits. This caused a non-existent floppy disk with the type 13
(for example) to be registered as an available device, even though it
could not be mounted by any user.

We believe this to be an instance of this bug:


This patch adds the option FLOPPY_ALLOW_UNKNOWN_TYPES to prevent the
additional check that fixed the issue on our reference system, and
increases the startup time of affected systems by over a minute.

Co-developed-by: Philip K. <philip@xxxxxxxxxxxx>
Signed-off-by: Philip K. <philip@xxxxxxxxxxxx>
Signed-off-by: Moritz MÃller <moritzm.mueller@xxxxxxxxx>
drivers/block/Kconfig | 10 ++++++++++
drivers/block/floppy.c | 6 ++++++
2 files changed, 16 insertions(+)

diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index 1bb8ec575352..9e6b32c50b67 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -72,6 +72,16 @@ config AMIGA_Z2RAM
To compile this driver as a module, choose M here: the
module will be called z2ram.

+ bool "Allow floppy disks of unknown type to be registered."
+ default n
+ help
+ Select this option if you want the Kernel to register floppy
+ disks of an unknown type.
+ This should usually not be enabled, because of cases where the
+ system falsely recongizes a non-existent floppy disk as mountable.
config CDROM
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 485865fd0412..9439444d46d0 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -3949,7 +3949,9 @@ static void __init config_types(void)
} else
allowed_drive_mask &= ~(1 << drive);
} else {
params = &default_drive_params[0].params;
snprintf(temparea, sizeof(temparea),
"unknown type %d (usb?)", type);
name = temparea;
@@ -4518,6 +4520,10 @@ static bool floppy_available(int drive)
return false;
if (fdc_state[FDC(drive)].version == FDC_NONE)
return false;
+ if (type >= ARRAY_SIZE(default_drive_params))
+ return false;
return true;