[PATCH] 2.6.2, Partition support for SCSI CDROM...

From: Steven J. Hill
Date: Sun Feb 22 2004 - 21:12:15 EST


Greetings.

This patch enables support for CDROMs that have partitions on
them, like say SGI and SUN media. It was sent to me by Christoph
Hellwig and then I cleaned it up a bit. I am posting it more
for flamebait^Wcomments to see if people are comfortable with it.
Thanks.

-Steve diff -urN linux-2.6.2/drivers/scsi/Kconfig linux-2.6.2-patched/drivers/scsi/Kconfig
--- linux-2.6.2/drivers/scsi/Kconfig 2004-02-22 20:15:07.000000000 -0500
+++ linux-2.6.2-patched/drivers/scsi/Kconfig 2004-02-08 20:29:04.000000000 -0500
@@ -112,6 +112,48 @@
drives (and HP Writers). If you have such a drive and get the first
session only, try saying Y here; everybody else says N.

+config BLK_DEV_SR_PARTITIONS
+ bool "Enable partitions (for SCSI CDROM)"
+ depends on BLK_DEV_SR
+ help
+ This enables the utilisation of partitions on CDs, usually
+ media from SGI or Sun. You must enable "SGI partition support"
+ and/or "Sun partition tables support" to be able to see their
+ respective CD partitions. Also make sure to say Y or M to
+ "EFS file system support" and "UFS file system support" to
+ support reading of SGI and Sun filesystems.
+
+ If you want to this feature, say Y here; everybody else will
+ most likely say N.
+
+config BLK_DEV_SR_PARTITIONS_PER_DEVICE
+ int "Number of paritions supported per SCSI CDROM device"
+ depends on BLK_DEV_SR_PARTITIONS
+ default "0"
+ help
+ The number of partitions supported per SCSI CDROM device. If
+ the value chosen was 7, you will have the following device
+ node mappings:
+
+ sr0 - first CDROM, whole disk
+ sr1 - first CDROM, first partition
+
+ [...]
+
+ sr7 - first CDROM, seventh partition
+ sr8 - second CDROM, whole disk
+ sr9 - second CDROM, first partition
+
+ [...]
+
+ You made need to create additional device nodes depending on
+ the number of partitions and SCSI CDROM devices you have in
+ your system.
+
+ If SCSI CDROM support is compiled as a module, you can specify
+ how many partitions you want when you insert the module which
+ will override this default value.
+
config CHR_DEV_SG
tristate "SCSI generic support"
depends on SCSI
diff -urN linux-2.6.2/drivers/scsi/sr.c linux-2.6.2-patched/drivers/scsi/sr.c
--- linux-2.6.2/drivers/scsi/sr.c 2004-02-22 20:15:08.000000000 -0500
+++ linux-2.6.2-patched/drivers/scsi/sr.c 2004-02-08 20:31:52.000000000 -0500
@@ -55,6 +55,13 @@
#include "scsi_logging.h"
#include "sr.h"

+#ifdef CONFIG_BLK_DEV_SR_PARTITIONS
+static int partitions = CONFIG_BLK_DEV_SR_PARTITIONS_PER_DEVICE;
+MODULE_PARM(partitions, "i");
+MODULE_PARM_DESC(partitions, "number of SCSI CDROM partitions to support");
+#else
+static int partitions = 0;
+#endif

MODULE_PARM(xa_test, "i"); /* see sr_ioctl.c */

@@ -518,7 +525,7 @@
goto fail;
memset(cd, 0, sizeof(*cd));

- disk = alloc_disk(1);
+ disk = alloc_disk(partitions + 1);
if (!disk)
goto fail_free;

@@ -533,7 +540,7 @@
spin_unlock(&sr_index_lock);

disk->major = SCSI_CDROM_MAJOR;
- disk->first_minor = minor;
+ disk->first_minor = minor * (partitions + 1);
sprintf(disk->disk_name, "sr%d", minor);
disk->fops = &sr_bdops;
disk->flags = GENHD_FL_CD;
@@ -868,6 +875,12 @@
{
int rc;

+#ifdef MODULE
+ /* Check number of partitions specified. */
+ if (partitions < 0)
+ partitions = 0;
+#endif
+
rc = register_blkdev(SCSI_CDROM_MAJOR, "sr");
if (rc)
return rc;