--- linux/drivers/scsi/sd.c Thu Mar 20 15:06:00 2003 +++ linux.new/drivers/scsi/sd.c Fri Mar 21 11:50:54 2003 @@ -56,7 +56,9 @@ * Remaining dev_t-handling stuff */ #define SD_MAJORS 16 -#define SD_DISKS (SD_MAJORS << 4) +#define SD_DISKS_PER_MAJOR_SHIFT (KDEV_MINOR_BITS - 4) +#define SD_DISKS_PER_MAJOR (1 << SD_DISKS_PER_MAJOR_SHIFT) +#define SD_DISKS (SD_MAJORS << SD_DISKS_PER_MAJOR_SHIFT) /* * Time out in seconds for disks and Magneto-opticals (which are slower). @@ -1328,17 +1330,23 @@ static int sd_attach(struct scsi_device sdkp->index = index; gd->de = sdp->de; - gd->major = sd_major(index >> 4); - gd->first_minor = (index & 15) << 4; + gd->major = sd_major(index >> SD_DISKS_PER_MAJOR_SHIFT); + gd->first_minor = (index & (SD_DISKS_PER_MAJOR - 1)) << 4; gd->minors = 16; gd->fops = &sd_fops; - if (index >= 26) { + if (index < 26) { + sprintf(gd->disk_name, "sd%c", 'a' + index % 26); + } else if (index < (26*27)) { sprintf(gd->disk_name, "sd%c%c", 'a' + index/26-1,'a' + index % 26); } else { - sprintf(gd->disk_name, "sd%c", 'a' + index % 26); - } + const unsigned int m1 = (index/ 26 - 1) / 26 - 1; + const unsigned int m2 = (index / 26 - 1) % 26; + const unsigned int m3 = index % 26; + sprintf(gd->disk_name, "sd%c%c%c", + 'a' + m1, 'a' + m2, 'a' + m3); + } sd_init_onedisk(sdkp, gd);