At 12:12 23.01.99 +0000, you wrote:
>> Doesn't work for new raid tool - all you get is an error message stating
>> that the device is already used.
>>
>> Currently, I'm experimenting with a hack to raid1.c which will allow the
>> creation of a single-disk mirror (easy) and expand this to a normal mirror
>> when hotadding a second disk (not quite so easy, but getting closer)
>
>Wish List for Development
>
>This sort of thing needs to be supported so that it is not too
>painful to move and EXISTING hosts OS and files to raid.
I've just thrown together a patch for raid1.c which will allow you to
1) mkraid a raid-1 device with just one device (thanks to mingo for the
patch).
2) change this single-disk mirror to a normal 2-disk mirror by adding
another device using raidhotadd. While it does work (at least for me) I'm
not at all sure this does the Right Thing.
I wonder if it wouldn't be a better solution to allow building of degraded
raid devices, say, by omitting disk definitions from /etc/raidtab. That
way, you'd create a raid device with the right number of raid disks in the
superblock, so no fiddling around with raidhotadd requests would be necessary.
Bye, Martin
--- linux/drivers/block/raid1.c Sat Jan 23 17:04:47 1999
+++ linux-2.0.36-mb/drivers/block/raid1.c Sat Jan 23 21:30:39 1999
@@ -575,11 +575,12 @@
{
int err = 0;
int i, failed_disk=-1, spare_disk=-1, removed_disk=-1, added_disk=-1;
+ int added_disk_test=0;
raid1_conf_t *conf = mddev->private;
struct mirror_info *tmp, *sdisk, *fdisk, *rdisk, *adisk;
unsigned long flags;
mdp_super_t *sb = mddev->sb;
- mdp_disk_t *failed_desc, *spare_desc, *added_desc;
+ mdp_disk_t *failed_desc, *spare_desc, *added_desc, *fake_desc;
save_flags(flags);
cli();
@@ -660,7 +661,12 @@
for (i = conf->raid_disks; i < MD_SB_DISKS; i++) {
tmp = conf->mirrors + i;
- if (!tmp->used_slot) {
+ /* if adding to mirror with just one disk,
+ leave free slot so we can make it a real mirror */
+ if (!tmp->used_slot && !added_disk_test)
+ added_disk_test = i;
+ if (!tmp->used_slot &&
+ (conf->raid_disks > 1 || i > conf->raid_disks)) {
added_disk = i;
break;
}
@@ -792,7 +798,7 @@
adisk = conf->mirrors + added_disk;
added_desc = *d;
- if (added_disk != added_desc->number) {
+ if (added_disk_test != added_desc->number) {
MD_BUG();
err = 1;
goto abort;
@@ -808,6 +814,27 @@
adisk->used_slot = 1;
conf->nr_disks++;
+ /* If raid device is mirror with just one disk,
+ add new disk as 2nd mirror */
+ if (conf->raid_disks==1) {
+ conf->raid_disks++;
+ sb->raid_disks++;
+ adisk->number = added_disk;
+ adisk->raid_disk = added_disk;
+ adisk = conf->mirrors + added_disk_test;
+ adisk->number = added_desc->number;
+ adisk->raid_disk = added_desc->raid_disk;
+ adisk->operational = 0;
+ adisk->spare = 0;
+ adisk->write_only = 0;
+ adisk->used_slot = 1;
+ fake_desc = mddev->sb->disks + added_disk;
+ fake_desc->number = added_disk;
+ fake_desc->raid_disk = added_disk;
+ xchg_values (added_desc->major, fake_desc->major);
+ xchg_values (added_desc->minor, fake_desc->minor);
+ }
+
break;
default:
@@ -1170,7 +1197,9 @@
}
}
- if (!start_recovery && !(sb->state & (1 << MD_SB_CLEAN))) {
+ if ((conf->raid_disks > 1) && !start_recovery &&
+ !(sb->state & (1 << MD_SB_CLEAN))) {
+
const char * name = "raid1syncd";
conf->resync_thread = md_register_thread(raid1syncd, conf,name);
--------------------------------------------------
Martin Bene vox: +43-664-3251047
simon media fax: +43-316-813824-6
Andreas-Hofer-Platz 9 e-mail: [EMAIL PROTECTED]
8010 Graz, Austria
--------------------------------------------------
finger [EMAIL PROTECTED] for PGP public key