summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Katz <katzj@redhat.com>2004-10-04 18:32:57 +0000
committerJeremy Katz <katzj@redhat.com>2004-10-04 18:32:57 +0000
commit8319da56c64823a150e13b49fae079268f0bae1c (patch)
treed958168b3f5e741ecbfede1a3156c0824e03b689
parent3bddc7c4fa6d3dfb6e2bef3242c1c372b1236fb9 (diff)
downloadanaconda-8319da56c64823a150e13b49fae079268f0bae1c.tar.gz
anaconda-8319da56c64823a150e13b49fae079268f0bae1c.tar.xz
anaconda-8319da56c64823a150e13b49fae079268f0bae1c.zip
2004-10-04 Jeremy Katz <katzj@redhat.com>
* isys/devnodes.c: Add support more than 128 SCSI disks (#134575).
-rw-r--r--ChangeLog3
-rw-r--r--isys/devnodes.c31
2 files changed, 26 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 09939aee6..03acb05f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2004-10-04 Jeremy Katz <katzj@redhat.com>
+ * isys/devnodes.c: Add support more than 128 SCSI disks
+ (#134575).
+
* dispatch.py (installSteps): Remove my new typo.
* partRequests.py (LogicalVolumeRequestSpec.getDevice): Fix
diff --git a/isys/devnodes.c b/isys/devnodes.c
index 97bc5e02a..5926af409 100644
--- a/isys/devnodes.c
+++ b/isys/devnodes.c
@@ -63,9 +63,25 @@ static struct devnum devices[] = {
int numDevices = sizeof(devices) / sizeof(struct devnum);
+#include <linux/major.h>
+/* from linux/drivers/scsi/sd.c */
+static int sd_major(int major_idx) {
+ switch (major_idx) {
+ case 0:
+ return SCSI_DISK0_MAJOR;
+ case 1 ... 7:
+ return SCSI_DISK1_MAJOR + major_idx - 1;
+ case 8 ... 15:
+ return SCSI_DISK8_MAJOR + major_idx - 8;
+ default:
+ /* this shouldn't happen... but if it does, return -1 */
+ return -1;
+ }
+}
+
int devMakeInode(char * devName, char * path) {
int i;
- int major, minor;
+ unsigned int major, minor;
int type;
char *ptr;
char *dir;
@@ -77,6 +93,7 @@ int devMakeInode(char * devName, char * path) {
if (devName[0] == 's' && devName[1] == 'd') {
int drive = 0;
char *num = NULL;
+ int maj;
type = S_IFBLK;
if (devName[3] && isdigit(devName[3])) {
@@ -87,13 +104,11 @@ int devMakeInode(char * devName, char * path) {
num = devName + 4;
} else
drive = devName[2] - 'a';
- /* only 128 SCSI drives, sorry */
- if (drive > 128)
- return -1;
- else if (drive < 16)
- major = 8;
- else
- major = 64 + (drive) / 16;
+
+ maj = sd_major(drive & 0xf0);
+ if (maj < 0)
+ return maj;
+ major = maj >> 4;
minor = (drive * 16) % 256;
if (num && num[0] && num[1])
minor += (num[0] - '0') * 10 + (num[1] - '0');