--- linux-2.6.1/drivers/md/md.c 2004-01-08 23:59:19.000000000 -0700 +++ md/linux-2.6.1/drivers/md/md.c 2004-01-12 14:46:33.818544376 -0700 @@ -1446,6 +1446,9 @@ return 1; } +/* MD Partition definitions */ +#define MDP_MINOR_COUNT 16 +#define MDP_MINOR_SHIFT 4 static struct kobject *md_probe(dev_t dev, int *part, void *data) { @@ -1453,6 +1456,7 @@ int unit = *part; mddev_t *mddev = mddev_find(unit); struct gendisk *disk; + int index; if (!mddev) return NULL; @@ -1463,15 +1467,22 @@ mddev_put(mddev); return NULL; } - disk = alloc_disk(1); + disk = alloc_disk(MDP_MINOR_COUNT); if (!disk) { up(&disks_sem); mddev_put(mddev); return NULL; } + index = mdidx(mddev); disk->major = MD_MAJOR; - disk->first_minor = mdidx(mddev); - sprintf(disk->disk_name, "md%d", mdidx(mddev)); + disk->first_minor = index << MDP_MINOR_SHIFT; + disk->minors = MDP_MINOR_COUNT; + if (index >= 26) { + sprintf(disk->disk_name, "md%c%c", + 'a' + index/26-1,'a' + index % 26); + } else { + sprintf(disk->disk_name, "md%c", 'a' + index % 26); + } disk->fops = &md_fops; disk->private_data = mddev; disk->queue = mddev->queue; @@ -2512,18 +2523,21 @@ * 4 sectors (with a BIG number of cylinders...). This drives * dosfs just mad... ;-) */ +#define MD_HEADS 254 +#define MD_SECTORS 60 case HDIO_GETGEO: if (!loc) { err = -EINVAL; goto abort_unlock; } - err = put_user (2, (char *) &loc->heads); + err = put_user (MD_HEADS, (char *) &loc->heads); if (err) goto abort_unlock; - err = put_user (4, (char *) &loc->sectors); + err = put_user (MD_SECTORS, (char *) &loc->sectors); if (err) goto abort_unlock; - err = put_user(get_capacity(disks[mdidx(mddev)])/8, + err = put_user(get_capacity(disks[mdidx(mddev)]) / + (MD_HEADS * MD_SECTORS), (short *) &loc->cylinders); if (err) goto abort_unlock;