From: Pete Zaitcev <zaitcev@redhat.com>
To: linux-scsi@vger.kernel.org
Cc: zaitcev@redhat.com
Subject: Patch for 256 disks in 2.4
Date: Sat, 20 Jul 2002 19:57:29 -0400 [thread overview]
Message-ID: <20020720195729.C20953@devserv.devel.redhat.com> (raw)
For those who do not follow, John Cagle allocated 8 more SCSI
disk majors. Here's a patch to make use of them. I am not sure
if we want a 2.5 version; it's going to be all devicefs anyhow...
It really is strange how many places know major assignments.
I hope I found all of them which matter. Also, I think nobody
uses min_major/max_major, do you guys know if that's right?
More comments?
-- Pete
diff -ur -X dontdiff linux-2.4.19-rc1/drivers/char/sysrq.c linux-2.4.19-rc1-p3/drivers/char/sysrq.c
--- linux-2.4.19-rc1/drivers/char/sysrq.c Mon Jul 1 12:58:54 2002
+++ linux-2.4.19-rc1-p3/drivers/char/sysrq.c Sat Jul 20 16:55:25 2002
@@ -107,6 +107,8 @@
unsigned int major;
major = MAJOR(dev);
+ if (SCSI_DISK_MAJOR(major))
+ return 1;
switch (major) {
case IDE0_MAJOR:
case IDE1_MAJOR:
@@ -118,14 +120,6 @@
case IDE7_MAJOR:
case IDE8_MAJOR:
case IDE9_MAJOR:
- case SCSI_DISK0_MAJOR:
- case SCSI_DISK1_MAJOR:
- case SCSI_DISK2_MAJOR:
- case SCSI_DISK3_MAJOR:
- case SCSI_DISK4_MAJOR:
- case SCSI_DISK5_MAJOR:
- case SCSI_DISK6_MAJOR:
- case SCSI_DISK7_MAJOR:
case XT_DISK_MAJOR:
return 1;
default:
diff -ur -X dontdiff linux-2.4.19-rc1/drivers/scsi/hosts.h linux-2.4.19-rc1-p3/drivers/scsi/hosts.h
--- linux-2.4.19-rc1/drivers/scsi/hosts.h Thu Jul 18 14:40:14 2002
+++ linux-2.4.19-rc1-p3/drivers/scsi/hosts.h Sat Jul 20 16:55:25 2002
@@ -507,8 +507,8 @@
struct module * module; /* Used for loadable modules */
unsigned char scsi_type;
unsigned int major;
- unsigned int min_major; /* Minimum major in range. */
- unsigned int max_major; /* Maximum major in range. */
+ unsigned int _min_major_dontuse;
+ unsigned int _max_major_dontuse;
unsigned int nr_dev; /* Number currently attached */
unsigned int dev_noticed; /* Number of devices detected. */
unsigned int dev_max; /* Current size of arrays */
diff -ur -X dontdiff linux-2.4.19-rc1/drivers/scsi/scsi_lib.c linux-2.4.19-rc1-p3/drivers/scsi/scsi_lib.c
--- linux-2.4.19-rc1/drivers/scsi/scsi_lib.c Mon Jul 1 12:59:15 2002
+++ linux-2.4.19-rc1-p3/drivers/scsi/scsi_lib.c Sat Jul 20 16:55:25 2002
@@ -776,8 +776,9 @@
*
* Lock status: No locks assumed to be held, but as it happens the
* io_request_lock is held when this is called.
+ * We traverse scis_devicelist, so protect that.
*
- * Returns: Nothing
+ * Returns: Pointer to a Scsi_Device_Template.
*
* Notes: The requests in the request queue may have originated
* from any block device driver. We need to find out which
@@ -791,6 +792,9 @@
ASSERT_LOCK(&io_request_lock, 1);
+ if (SCSI_DISK_MAJOR(major))
+ major = SCSI_DISK0_MAJOR;
+
for (spnt = scsi_devicelist; spnt; spnt = spnt->next) {
/*
* Search for a block device driver that supports this
@@ -799,22 +803,6 @@
if (spnt->blk && spnt->major == major) {
return spnt;
}
- /*
- * I am still not entirely satisfied with this solution,
- * but it is good enough for now. Disks have a number of
- * major numbers associated with them, the primary
- * 8, which we test above, and a secondary range of 7
- * different consecutive major numbers. If this ever
- * becomes insufficient, then we could add another function
- * to the structure, and generalize this completely.
- */
- if( spnt->min_major != 0
- && spnt->max_major != 0
- && major >= spnt->min_major
- && major <= spnt->max_major )
- {
- return spnt;
- }
}
return NULL;
}
diff -ur -X dontdiff linux-2.4.19-rc1/drivers/scsi/sd.c linux-2.4.19-rc1-p3/drivers/scsi/sd.c
--- linux-2.4.19-rc1/drivers/scsi/sd.c Mon Jul 1 12:59:15 2002
+++ linux-2.4.19-rc1-p3/drivers/scsi/sd.c Sat Jul 20 16:55:25 2002
@@ -65,10 +65,10 @@
* static const char RCSid[] = "$Header:";
*/
-/* system major --> sd_gendisks index */
-#define SD_MAJOR_IDX(i) (MAJOR(i) & SD_MAJOR_MASK)
+/* device number --> sd_gendisks index */
+#define SD_MAJOR_IDX(i) ( ((MAJOR(i) & 0x80) >> 4) + (MAJOR(i) & 7) )
/* sd_gendisks index --> system major */
-#define SD_MAJOR(i) (!(i) ? SCSI_DISK0_MAJOR : SCSI_DISK1_MAJOR-1+(i))
+#define SD_MAJOR(i) (sd_major[i])
#define SD_PARTITION(dev) ((SD_MAJOR_IDX(dev) << 8) | (MINOR(dev) & 255))
@@ -96,6 +96,25 @@
static int *sd_hardsizes; /* Hardware sector size */
static int *sd_max_sectors;
+static const unsigned int sd_major[N_SD_MAJORS] = {
+ SCSI_DISK0_MAJOR, /* 0x08 */
+ SCSI_DISK1_MAJOR, /* 0x41 */
+ SCSI_DISK2_MAJOR, /* 0x42 */
+ SCSI_DISK3_MAJOR, /* 0x43 */
+ SCSI_DISK4_MAJOR, /* 0x44 */
+ SCSI_DISK5_MAJOR, /* 0x45 */
+ SCSI_DISK6_MAJOR, /* 0x46 */
+ SCSI_DISK7_MAJOR, /* 0x47 */
+ SCSI_DISK10_MAJOR, /* 0x80 */
+ SCSI_DISK11_MAJOR, /* 0x81 */
+ SCSI_DISK12_MAJOR, /* 0x82 */
+ SCSI_DISK13_MAJOR, /* 0x83 */
+ SCSI_DISK14_MAJOR, /* 0x84 */
+ SCSI_DISK15_MAJOR, /* 0x85 */
+ SCSI_DISK16_MAJOR, /* 0x86 */
+ SCSI_DISK17_MAJOR, /* 0x87 */
+};
+
static int check_scsidisk_media_change(kdev_t);
static int fop_revalidate_scsidisk(kdev_t);
@@ -114,11 +133,6 @@
tag:"sd",
scsi_type:TYPE_DISK,
major:SCSI_DISK0_MAJOR,
- /*
- * Secondary range of majors that this driver handles.
- */
- min_major:SCSI_DISK1_MAJOR,
- max_major:SCSI_DISK7_MAJOR,
blk:1,
detect:sd_detect,
init:sd_init,
diff -ur -X dontdiff linux-2.4.19-rc1/drivers/scsi/sd.h linux-2.4.19-rc1-p3/drivers/scsi/sd.h
--- linux-2.4.19-rc1/drivers/scsi/sd.h Mon Jul 1 12:59:15 2002
+++ linux-2.4.19-rc1-p3/drivers/scsi/sd.h Sat Jul 20 16:55:25 2002
@@ -40,9 +40,7 @@
*/
extern kdev_t sd_find_target(void *host, int tgt);
-#define N_SD_MAJORS 8
-
-#define SD_MAJOR_MASK (N_SD_MAJORS - 1)
+#define N_SD_MAJORS 16
#endif
diff -ur -X dontdiff linux-2.4.19-rc1/fs/partitions/check.c linux-2.4.19-rc1-p3/fs/partitions/check.c
--- linux-2.4.19-rc1/fs/partitions/check.c Mon Jul 1 12:59:29 2002
+++ linux-2.4.19-rc1-p3/fs/partitions/check.c Sat Jul 20 16:55:25 2002
@@ -97,6 +97,10 @@
* a pointer to that same buffer (for convenience).
*/
+/* The major calculation part duplicates SD_MAJOR_INDEX verbatim. */
+#define SCSI_DEVICE_NR(M,m) \
+ (( ( (((M) & 0x80) >> 4) + ((M) & 7) ) << (8 - 4)) + ((m) >> 4))
+
char *disk_name (struct gendisk *hd, int minor, char *buf)
{
const char *maj = hd->major_name;
@@ -147,8 +151,8 @@
sprintf(buf, "%s%d", maj, unit);
return buf;
}
- if (hd->major >= SCSI_DISK1_MAJOR && hd->major <= SCSI_DISK7_MAJOR) {
- unit = unit + (hd->major - SCSI_DISK1_MAJOR + 1) * 16;
+ if (SCSI_DISK_MAJOR(hd->major)) {
+ unit = SCSI_DEVICE_NR(hd->major, minor);
if (unit+'a' > 'z') {
unit -= 26;
sprintf(buf, "sd%c%c", 'a' + unit / 26, 'a' + unit % 26);
diff -ur -X dontdiff linux-2.4.19-rc1/include/linux/blk.h linux-2.4.19-rc1-p3/include/linux/blk.h
--- linux-2.4.19-rc1/include/linux/blk.h Mon Jul 1 12:59:39 2002
+++ linux-2.4.19-rc1-p3/include/linux/blk.h Sat Jul 20 16:55:26 2002
@@ -143,7 +143,10 @@
#define DEVICE_NAME "scsidisk"
#define TIMEOUT_VALUE (2*HZ)
-#define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4))
+/* The major calculation part duplicates SD_MAJOR_INDEX verbatim. */
+#define DEVICE_NR(device) \
+ (( ( ((MAJOR(device) & 0x80) >> 4) + (MAJOR(device) & 7) ) << (8 - 4)) + \
+ (MINOR(device) >> 4))
/* Kludge to use the same number for both char and block major numbers */
#elif (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)
diff -ur -X dontdiff linux-2.4.19-rc1/include/linux/major.h linux-2.4.19-rc1-p3/include/linux/major.h
--- linux-2.4.19-rc1/include/linux/major.h Mon Jul 1 12:59:40 2002
+++ linux-2.4.19-rc1-p3/include/linux/major.h Sat Jul 20 16:55:26 2002
@@ -119,6 +119,15 @@
#define ATARAID_MAJOR 114
+#define SCSI_DISK10_MAJOR 128
+#define SCSI_DISK11_MAJOR 129
+#define SCSI_DISK12_MAJOR 130
+#define SCSI_DISK13_MAJOR 131
+#define SCSI_DISK14_MAJOR 132
+#define SCSI_DISK15_MAJOR 133
+#define SCSI_DISK16_MAJOR 134
+#define SCSI_DISK17_MAJOR 135
+
#define DASD_MAJOR 94 /* Official assignations from Peter */
#define MDISK_MAJOR 95 /* Official assignations from Peter */
@@ -170,7 +179,8 @@
*/
#define SCSI_DISK_MAJOR(M) ((M) == SCSI_DISK0_MAJOR || \
- ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR))
+ ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR) || \
+ ((M) >= SCSI_DISK10_MAJOR && (M) <= SCSI_DISK17_MAJOR))
#define SCSI_BLK_MAJOR(M) \
(SCSI_DISK_MAJOR(M) \
next reply other threads:[~2002-07-20 23:57 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-20 23:57 Pete Zaitcev [this message]
2002-07-22 17:08 ` Patch for 256 disks in 2.4 Kurt Garloff
2002-07-22 20:48 ` Pete Zaitcev
2002-07-22 20:57 ` Christoph Hellwig
2002-07-22 20:57 ` Christoph Hellwig
2002-07-22 21:12 ` Kurt Garloff
2002-07-22 21:12 ` Kurt Garloff
2002-07-22 21:11 ` Kurt Garloff
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020720195729.C20953@devserv.devel.redhat.com \
--to=zaitcev@redhat.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.