Subject: [PATCH 0/2] loop: fix regression from max_loop default value change

Apparently, there's an unintended consequence of the improvement for max_loop=0
in commit 85c50197716c ("loop: Fix the max_loop commandline argument treatment
when it is set to 0") which might break programs that handle /dev/loop devices.

The (deprecated) autoloading path fails (ENXIO) if the requested minor number
is greater than or equal to the (new) default (CONFIG_BLK_DEV_LOOP_MIN_COUNT),
when [loop.]max_loop is not specified. This behavior used to work previously.

Patch 1/2 just notes the loop driver's autoloading path is deprecated/legacy.
Patch 2/2 detects whether or not max_loop is set to restore default behavior
as before the regression (and keeps the improvement done by the commit above).

More details in the commit message. This does not seem to be urgent, as the
impact is to very specific/custom applications, and most users (eg, losetup)
should not be impacted, as the dynamic add ioctl() is used.

Thanks,
Mauricio

Mauricio Faria de Oliveira (2):
loop: deprecate autoloading callback loop_probe()
loop: do not enforce max_loop hard limit by (new) default

drivers/block/loop.c | 43 ++++++++++++++++++++++++++++++++++++++++---
1 file changed, 40 insertions(+), 3 deletions(-)

--
2.39.2



Subject: [PATCH 1/2] loop: deprecate autoloading callback loop_probe()

The 'probe' callback in __register_blkdev() is only used
under the CONFIG_BLOCK_LEGACY_AUTOLOAD deprecation guard.

The loop_probe() function is only used for that callback,
so guard it too, accordingly.

See commit fbdee71bb5d8 ("block: deprecate autoloading based on dev_t").

Signed-off-by: Mauricio Faria de Oliveira <[email protected]>
---
drivers/block/loop.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index bc31bb7072a2..21bcd6ffe241 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -2095,6 +2095,7 @@ static void loop_remove(struct loop_device *lo)
put_disk(lo->lo_disk);
}

+#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD
static void loop_probe(dev_t dev)
{
int idx = MINOR(dev) >> part_shift;
@@ -2103,6 +2104,7 @@ static void loop_probe(dev_t dev)
return;
loop_add(idx);
}
+#endif

static int loop_control_remove(int idx)
{
@@ -2237,8 +2239,11 @@ static int __init loop_init(void)
if (err < 0)
goto err_out;

-
+#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD
if (__register_blkdev(LOOP_MAJOR, "loop", loop_probe)) {
+#else
+ if (register_blkdev(LOOP_MAJOR, "loop")) {
+#endif
err = -EIO;
goto misc_out;
}
--
2.39.2