Re: [PATCH] SCSI disk minor number cleaning

From: Andrzej Krzysztofowicz (ankry@green.mif.pg.gda.pl)
Date: Tue May 15 2001 - 16:42:31 EST


> Hi,
> The following patch cleans up a bit usage of parameters related to
> number of minors per disk in the SCSI subsystem. This is a preliminary
> patch and it seems to not contain any problematic changes. The full version
> of the patch (that allows to succesfully change SCSI_MINOR_SHIFT and use
> more/less partitions per disk) is available at
>
> ftp://rudy.mif.pg.gda.pl/pub/People/ankry/patches/scsi-minor/
>
> Both are against 2.4.4-ac9, but the "shorter" one can be applied to
> 2.4.5-pre series as well.

Oops. The previous putch was buggy (broken #include).
The enclosed in corrected...

> Any comments are welcome.

     Andrzej
******************************************************************
diff -ur linux-2.4.4-ac9/drivers/scsi/sd.c linux-scsi/drivers/scsi/sd.c
--- linux-2.4.4-ac9/drivers/scsi/sd.c Thu May 3 19:29:16 2001
+++ linux-scsi/drivers/scsi/sd.c Tue May 15 23:39:12 2001
@@ -67,11 +67,12 @@
 
 #define SD_MAJOR(i) (!(i) ? SCSI_DISK0_MAJOR : SCSI_DISK1_MAJOR-1+(i))
 
-#define SCSI_DISKS_PER_MAJOR 16
+#define SCSI_MINOR_SHIFT 4
+#define SCSI_DISKS_PER_MAJOR (1 << (8 - SCSI_MINOR_SHIFT))
 #define SD_MAJOR_NUMBER(i) SD_MAJOR((i) >> 8)
 #define SD_MINOR_NUMBER(i) ((i) & 255)
 #define MKDEV_SD_PARTITION(i) MKDEV(SD_MAJOR_NUMBER(i), (i) & 255)
-#define MKDEV_SD(index) MKDEV_SD_PARTITION((index) << 4)
+#define MKDEV_SD(index) MKDEV_SD_PARTITION((index) << SCSI_MINOR_SHIFT)
 #define N_USED_SCSI_DISKS (sd_template.dev_max + SCSI_DISKS_PER_MAJOR - 1)
 #define N_USED_SD_MAJORS (N_USED_SCSI_DISKS / SCSI_DISKS_PER_MAJOR)
 
@@ -298,7 +299,7 @@
         SCSI_LOG_HLQUEUE(1, printk("Doing sd request, dev = %d, block = %d\n", devm, block));
 
         dpnt = &rscsi_disks[dev];
- if (devm >= (sd_template.dev_max << 4) ||
+ if (devm >= (sd_template.dev_max << SCSI_MINOR_SHIFT) ||
             !dpnt ||
             !dpnt->device->online ||
              block + SCpnt->request.nr_sectors > sd[devm].nr_sects) {
@@ -563,8 +564,8 @@
 {
         SCSI_DISK0_MAJOR, /* Major number */
         "sd", /* Major name */
- 4, /* Bits to shift to get real from partition */
- 1 << 4, /* Number of partitions per real */
+ SCSI_MINOR_SHIFT, /* Bits to shift to get real from partition */
+ 1 << SCSI_MINOR_SHIFT, /* Number of partitions per real */
         NULL, /* hd struct */
         NULL, /* block sizes */
         0, /* number */
@@ -951,7 +952,7 @@
                          * The disk reading code does not allow for reading
                          * of partial sectors.
                          */
- for (m = i << 4; m < ((i + 1) << 4); m++) {
+ for (m = i << SCSI_MINOR_SHIFT; m < ((i + 1) << SCSI_MINOR_SHIFT); m++) {
                                 sd_blocksizes[m] = sector_size;
                         }
                 } {
@@ -964,8 +965,11 @@
                         int hard_sector = sector_size;
                         int sz = rscsi_disks[i].capacity * (hard_sector/256);
 
- /* There are 16 minors allocated for each major device */
- for (m = i << 4; m < ((i + 1) << 4); m++) {
+ /*
+ * There are 1<<SCSI_MINOR_SHIFT minors allocated
+ * for each major device
+ */
+ for (m = i << SCSI_MINOR_SHIFT; m < ((i + 1) << SCSI_MINOR_SHIFT); m++) {
                                 sd_hardsizes[m] = hard_sector;
                         }
 
@@ -1083,34 +1087,34 @@
         memset(rscsi_disks, 0, sd_template.dev_max * sizeof(Scsi_Disk));
 
         /* for every (necessary) major: */
- sd_sizes = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+ sd_sizes = kmalloc((sd_template.dev_max << SCSI_MINOR_SHIFT) * sizeof(int), GFP_ATOMIC);
         if (!sd_sizes)
                 goto cleanup_disks;
- memset(sd_sizes, 0, (sd_template.dev_max << 4) * sizeof(int));
+ memset(sd_sizes, 0, (sd_template.dev_max << SCSI_MINOR_SHIFT) * sizeof(int));
 
- sd_blocksizes = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+ sd_blocksizes = kmalloc((sd_template.dev_max << SCSI_MINOR_SHIFT) * sizeof(int), GFP_ATOMIC);
         if (!sd_blocksizes)
                 goto cleanup_sizes;
         
- sd_hardsizes = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+ sd_hardsizes = kmalloc((sd_template.dev_max << SCSI_MINOR_SHIFT) * sizeof(int), GFP_ATOMIC);
         if (!sd_hardsizes)
                 goto cleanup_blocksizes;
 
- for (i = 0; i < sd_template.dev_max << 4; i++) {
+ for (i = 0; i < sd_template.dev_max << SCSI_MINOR_SHIFT; i++) {
                 sd_blocksizes[i] = 1024;
                 sd_hardsizes[i] = 512;
         }
 
         for (i = 0; i < N_USED_SD_MAJORS; i++) {
- blksize_size[SD_MAJOR(i)] = sd_blocksizes + i * (SCSI_DISKS_PER_MAJOR << 4);
- hardsect_size[SD_MAJOR(i)] = sd_hardsizes + i * (SCSI_DISKS_PER_MAJOR << 4);
+ blksize_size[SD_MAJOR(i)] = sd_blocksizes + i * (SCSI_DISKS_PER_MAJOR << SCSI_MINOR_SHIFT);
+ hardsect_size[SD_MAJOR(i)] = sd_hardsizes + i * (SCSI_DISKS_PER_MAJOR << SCSI_MINOR_SHIFT);
         }
- sd = kmalloc((sd_template.dev_max << 4) *
+ sd = kmalloc((sd_template.dev_max << SCSI_MINOR_SHIFT) *
                                           sizeof(struct hd_struct),
                                           GFP_ATOMIC);
         if (!sd)
                 goto cleanup_sd;
- memset(sd, 0, (sd_template.dev_max << 4) * sizeof(struct hd_struct));
+ memset(sd, 0, (sd_template.dev_max << SCSI_MINOR_SHIFT) * sizeof(struct hd_struct));
 
         if (N_USED_SD_MAJORS > 1)
                 sd_gendisks = kmalloc(N_USED_SD_MAJORS * sizeof(struct gendisk), GFP_ATOMIC);
@@ -1132,10 +1136,10 @@
                         SCSI_DISKS_PER_MAJOR * sizeof *sd_gendisks[i].flags);
                 sd_gendisks[i].major = SD_MAJOR(i);
                 sd_gendisks[i].major_name = "sd";
- sd_gendisks[i].minor_shift = 4;
- sd_gendisks[i].max_p = 1 << 4;
- sd_gendisks[i].part = sd + (i * SCSI_DISKS_PER_MAJOR << 4);
- sd_gendisks[i].sizes = sd_sizes + (i * SCSI_DISKS_PER_MAJOR << 4);
+ sd_gendisks[i].minor_shift = SCSI_MINOR_SHIFT;
+ sd_gendisks[i].max_p = 1 << SCSI_MINOR_SHIFT;
+ sd_gendisks[i].part = sd + (i * SCSI_DISKS_PER_MAJOR << SCSI_MINOR_SHIFT);
+ sd_gendisks[i].sizes = sd_sizes + (i * SCSI_DISKS_PER_MAJOR << SCSI_MINOR_SHIFT);
                 sd_gendisks[i].nr_real = 0;
                 sd_gendisks[i].next = sd_gendisks + i + 1;
                 sd_gendisks[i].real_devices =
@@ -1191,9 +1195,9 @@
                 if (!rscsi_disks[i].capacity && rscsi_disks[i].device) {
                         sd_init_onedisk(i);
                         if (!rscsi_disks[i].has_part_table) {
- sd_sizes[i << 4] = rscsi_disks[i].capacity;
+ sd_sizes[i << SCSI_MINOR_SHIFT] = rscsi_disks[i].capacity;
                                 register_disk(&SD_GENDISK(i), MKDEV_SD(i),
- 1<<4, &sd_fops,
+ 1 << SCSI_MINOR_SHIFT, &sd_fops,
                                                 rscsi_disks[i].capacity);
                                 rscsi_disks[i].has_part_table = 1;
                         }
@@ -1312,7 +1316,7 @@
 #endif
 
         grok_partitions(&SD_GENDISK(target), target % SCSI_DISKS_PER_MAJOR,
- 1<<4, CAPACITY);
+ 1 << SCSI_MINOR_SHIFT, CAPACITY);
 
         DEVICE_BUSY = 0;
         return 0;

-- 
=======================================================================
  Andrzej M. Krzysztofowicz               ankry@mif.pg.gda.pl
  phone (48)(58) 347 14 61
Faculty of Applied Phys. & Math.,   Technical University of Gdansk
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue May 15 2001 - 21:00:45 EST