From: Tejun Heo <teheo@suse.de>
Subject: block: add genhd.mangle_devt parameter
References: fate#305584

Make block devt mangling a boot time option to ease setting up test
environment.  Enabling CONFIG_DEBUG_BLOCK_EXT_DEVT doesn't
automatically mangle genhd devt.  Mangling can be enabled with
"genhd.mangle_devt=1".

Signed-off-by: Tejun Heo <teheo@suse.de>
---
 block/genhd.c         |    9 +++++++++
 drivers/ide/ide-gd.c  |    9 +++------
 drivers/scsi/sd.c     |    8 ++------
 include/linux/genhd.h |    6 ++++++
 4 files changed, 20 insertions(+), 12 deletions(-)

Index: linux-3.0-tmp-jikos/block/genhd.c
===================================================================
--- linux-3.0-tmp-jikos.orig/block/genhd.c
+++ linux-3.0-tmp-jikos/block/genhd.c
@@ -40,6 +40,12 @@ static void disk_add_events(struct gendi
 static void disk_del_events(struct gendisk *disk);
 static void disk_release_events(struct gendisk *disk);
 
+#ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
+int blk_mangle_devt;
+module_param_named(mangle_devt, blk_mangle_devt, bool, 0444);
+EXPORT_SYMBOL_GPL(blk_mangle_devt);
+#endif
+
 /**
  * disk_get_part - get partition
  * @disk: disk to look partition from
@@ -377,6 +383,9 @@ static int blk_mangle_minor(int minor)
 #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
 	int i;
 
+	if (!blk_mangle_devt)
+		return minor;
+
 	for (i = 0; i < MINORBITS / 2; i++) {
 		int low = minor & (1 << i);
 		int high = minor & (1 << (MINORBITS - 1 - i));
Index: linux-3.0-tmp-jikos/drivers/ide/ide-gd.c
===================================================================
--- linux-3.0-tmp-jikos.orig/drivers/ide/ide-gd.c
+++ linux-3.0-tmp-jikos/drivers/ide/ide-gd.c
@@ -10,11 +10,7 @@
 #include <linux/dmi.h>
 #include <linux/slab.h>
 
-#if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
 #define IDE_DISK_MINORS		(1 << PARTN_BITS)
-#else
-#define IDE_DISK_MINORS		0
-#endif
 
 #include "ide-disk.h"
 #include "ide-floppy.h"
@@ -386,7 +382,8 @@ static int ide_gd_probe(ide_drive_t *dri
 		goto failed;
 	}
 
-	g = alloc_disk_node(IDE_DISK_MINORS, hwif_to_node(drive->hwif));
+	g = alloc_disk_node(blk_mangle_devt ? 0 : IDE_DISK_MINORS,
+			    hwif_to_node(drive->hwif));
 	if (!g)
 		goto out_free_idkp;
 
@@ -413,7 +410,7 @@ static int ide_gd_probe(ide_drive_t *dri
 
 	set_capacity(g, ide_gd_capacity(drive));
 
-	g->minors = IDE_DISK_MINORS;
+	g->minors = blk_mangle_devt ? 0 : IDE_DISK_MINORS;
 	g->driverfs_dev = &drive->gendev;
 	g->flags |= GENHD_FL_EXT_DEVT;
 	if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
Index: linux-3.0-tmp-jikos/drivers/scsi/sd.c
===================================================================
--- linux-3.0-tmp-jikos.orig/drivers/scsi/sd.c
+++ linux-3.0-tmp-jikos/drivers/scsi/sd.c
@@ -90,11 +90,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_DISK);
 MODULE_ALIAS_SCSI_DEVICE(TYPE_MOD);
 MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC);
 
-#if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
 #define SD_MINORS	16
-#else
-#define SD_MINORS	0
-#endif
 
 static void sd_config_discard(struct scsi_disk *, unsigned int);
 static int  sd_revalidate_disk(struct gendisk *);
@@ -2499,7 +2495,7 @@ static void sd_probe_async(void *data, a
 
 	gd->major = sd_major((index & 0xf0) >> 4);
 	gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00);
-	gd->minors = SD_MINORS;
+	gd->minors = blk_mangle_devt ? 0 : SD_MINORS;
 
 	gd->fops = &sd_fops;
 	gd->private_data = &sdkp->driver;
@@ -2576,7 +2572,7 @@ static int sd_probe(struct device *dev)
 	if (!sdkp)
 		goto out;
 
-	gd = alloc_disk(SD_MINORS);
+	gd = alloc_disk(blk_mangle_devt ? 0 : SD_MINORS);
 	if (!gd)
 		goto out_free;
 
Index: linux-3.0-tmp-jikos/include/linux/genhd.h
===================================================================
--- linux-3.0-tmp-jikos.orig/include/linux/genhd.h
+++ linux-3.0-tmp-jikos/include/linux/genhd.h
@@ -26,6 +26,12 @@ extern struct device_type part_type;
 extern struct kobject *block_depr;
 extern struct class block_class;
 
+#ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
+extern int blk_mangle_devt;
+#else
+#define blk_mangle_devt		0
+#endif
+
 enum {
 /* These three have identical behaviour; use the second one if DOS FDISK gets
    confused about extended/logical partitions starting past cylinder 1023. */
