ataraid-hpt370: multiple raid volumes
PATCH 1/1 ataraid-hpt370: multiple raid volumes
Hi!
Appended is a short patch that allows you to have more than one raid volume. The same thing should probably be also done to the promise code. I had no time to check. :(
I just needed this for moveing my data from the wracky IBM DLTA disks to the new ones. It is a quick hack, but appears to work.
greetings,
Wilfried
drivers/ide/hptraid.c +59 -24
@@ -58,6 +58,25 @@unsigned int cutoff_disks[8 ]; }; +struct hptraid_dev { +int major; +int minor; +int device; +}; + +static struct hptraid_dev devlist[]= +{ + + {IDE0_MAJOR ,0 ,-1 }, + {IDE0_MAJOR ,64 ,-1 }, + {IDE1_MAJOR ,0 ,-1 }, + {IDE1_MAJOR ,64 ,-1 }, + {IDE2_MAJOR ,0 ,-1 }, + {IDE2_MAJOR ,64 ,-1 }, + {IDE3_MAJOR ,0 ,-1 }, + {IDE3_MAJOR ,64 ,-1 } +}; +static struct raid_device_operations hptraid_ops = { open: hptraid_open, release: hptraid_release,
@@ -274,16 +293,23 @@return lba; } -static void __init probedisk (int major,int minor,int device) +static u_int32_t magiccookie; +static char magicpresent; +static void __init probedisk (struct hptraid_dev *disk,int device) {int i;struct highpoint_raid_conf *prom;static unsigned char block[4096 ]; + +if (disk->device !=-1 )/* disk is occupied? */ +return ; + +printk (KERN_INFO "probeing 0x%.2X%.2X...\n" , disk->major, disk->minor); -if (maxsectors (major,minor)==0 ) +if (maxsectors (disk->major,disk->minor)==0 )return ; -if (read_disk_sb (major,minor,(unsigned char *)&block,sizeof (block))) +if (read_disk_sb (disk->major,disk->minor,(unsigned char *)&block,sizeof (block)))return ; prom = (struct highpoint_raid_conf *)&block[512 ];
@@ -295,25 +321,30 @@return ; } +/* disk from another array */ +if (magicpresent && prom->magic_0 != magiccookie) +return ; + i = prom->disk_number;if (i<0 )return ;if (i>8 )return ; - raid[device].disk[i].bdev =bdget (MKDEV (major,minor)); + raid[device].disk[i].bdev =bdget (MKDEV (disk->major,disk->minor));if (raid[device].disk[i].bdev !=NULL ) {int j=0 ;struct gendisk *gd;/* This is supposed to prevent others from stealing our underlying disks */ blkdev_get (raid[device].disk[i].bdev,FMODE_READ |FMODE_WRITE ,0 ,BDEV_RAW ); +/* now blank the /proc/partitions table for the wrong partition table, so that scripts don't accidentally mount it and crash the kernel */ lock_kernel (); gd=gendisk_head;while (gd!=NULL ) { -if (gd->major==major) { -for (j=1 +(minor<<gd->minor_shift);j<((minor+1 )<<gd->minor_shift);j++) { +if (gd->major==disk->major) { +for (j=1 +(disk->minor<<gd->minor_shift);j<((disk->minor+1 )<<gd->minor_shift);j++) { gd->part[j].nr_sects=0 ; } }
@@ -322,11 +353,14 @@ }unlock_kernel (); } - raid[device].disk[i].device =MKDEV (major,minor); - raid[device].disk[i].sectors =maxsectors (major,minor); + raid[device].disk[i].device =MKDEV (disk->major,disk->minor); + raid[device].disk[i].sectors =maxsectors (disk->major,disk->minor); raid[device].stride = (1 <<prom->raid0_shift); raid[device].disks = prom->raid_disks; raid[device].sectors = prom->total_secs; + magicpresent=1 ; + magiccookie=prom->magic_0; + disk->device=device; }
@@ -361,14 +395,10 @@ {int i,count; -probedisk (IDE0_MAJOR ,0 , device); -probedisk (IDE0_MAJOR ,64 , device); -probedisk (IDE1_MAJOR ,0 , device); -probedisk (IDE1_MAJOR ,64 , device); -probedisk (IDE2_MAJOR ,0 , device); -probedisk (IDE2_MAJOR ,64 , device); -probedisk (IDE3_MAJOR ,0 , device); -probedisk (IDE3_MAJOR ,64 , device); + magicpresent=0 ; +for (i=0 ; i <8 ; i++) { +probedisk (devlist+i, device); + }fill_cutoff (device);
@@ -398,15 +428,20 @@static __init int hptraid_init (void ) { -int retval,device; +int retval,device,count=0 ; - device=ataraid_get_device (&hptraid_ops); -if (device<0 ) -return -ENODEV ; - retval =hptraid_init_one (device); -if (retval) -ataraid_release_device (device); -return retval; +do + { + device=ataraid_get_device (&hptraid_ops); +if (device<0 ) +return (count?0 :-ENODEV ); + retval =hptraid_init_one (device); +if (retval) +ataraid_release_device (device); +else + count++; + }while (!retval); +return (count?0 :retval); } static void __exit hptraid_exit (void)