From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Tue, 15 May 2001 16:36:38 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Tue, 15 May 2001 16:36:29 -0400 Received: from green.mif.pg.gda.pl ([153.19.42.8]:51719 "EHLO green.mif.pg.gda.pl") by vger.kernel.org with ESMTP id ; Tue, 15 May 2001 16:36:13 -0400 From: Andrzej Krzysztofowicz Message-Id: <200105152035.WAA23563@green.mif.pg.gda.pl> Subject: [PATCH] SCSI disk minor number cleaning To: alan@lxorguk.ukuu.org.uk (Alan Cox), torvalds@transmeta.com (Linus Torvalds) Date: Tue, 15 May 2001 22:35:57 +0200 (CEST) Cc: linux-kernel@vger.kernel.org (kernel list) X-Mailer: ELM [version 2.5 PL0pre8] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org 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. Any comments are welcome. Andrzej ****************************************************************** diff -uNr 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 22:21:01 2001 @@ -50,6 +50,7 @@ #include #define MAJOR_NR SCSI_DISK0_MAJOR +#include #include #include #include "scsi.h" @@ -67,11 +68,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 +300,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 +565,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 +953,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 +966,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< 1) sd_gendisks = kmalloc(N_USED_SD_MAJORS * sizeof(struct gendisk), GFP_ATOMIC); @@ -1132,10 +1137,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 +1196,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 +1317,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