diff options
author | Neil Brown <neilb@suse.de> | 2007-05-21 14:25:37 +1000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-05-21 14:25:37 +1000 |
commit | f752781f81a68588d0225cf8e3d96eeb6867b245 (patch) | |
tree | 5ab20970f51fdc52017a6fcb95fe5f05d720fbb5 /Grow.c | |
parent | 68754bd17c81377091e509367e8d0cf9c80369a5 (diff) | |
download | mdadm-f752781f81a68588d0225cf8e3d96eeb6867b245.tar.gz mdadm-f752781f81a68588d0225cf8e3d96eeb6867b245.tar.xz mdadm-f752781f81a68588d0225cf8e3d96eeb6867b245.zip |
Fix --grow --add for linear arrays.
The new superblock needs to have a new disk.number. This is a bit of a hack...
Fix handling of negative bitmap offsets on 64bit hosts.
The bitmap offset is a signed 32bit number, so casting to (long)
isn't sufficient. We must cast to (int32_t).
Fix various problems with --grow --add for linear.
The code to add a drive to a live linear array had never
been tested properly and so was buggy. This tidies it up
and means that the new regression-test passes.
Diffstat (limited to 'Grow.c')
-rw-r--r-- | Grow.c | 15 |
1 files changed, 7 insertions, 8 deletions
@@ -121,10 +121,12 @@ int Grow_Add_device(char *devname, int fd, char *newdev) info.disk.minor = minor(stb.st_rdev); info.disk.raid_disk = d; info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE); - st->ss->update_super(&info, super, "grow", newdev, 0, 0, NULL); + st->ss->update_super(&info, super, "linear-grow-new", newdev, + 0, 0, NULL); if (st->ss->store_super(st, nfd, super)) { - fprintf(stderr, Name ": Cannot store new superblock on %s\n", newdev); + fprintf(stderr, Name ": Cannot store new superblock on %s\n", + newdev); close(nfd); return 1; } @@ -174,12 +176,9 @@ int Grow_Add_device(char *devname, int fd, char *newdev) info.array.nr_disks = nd+1; info.array.active_disks = nd+1; info.array.working_disks = nd+1; - info.disk.number = nd; - info.disk.major = major(stb.st_rdev); - info.disk.minor = minor(stb.st_rdev); - info.disk.raid_disk = nd; - info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE); - st->ss->update_super(&info, super, "grow", dv, 0, 0, NULL); + + st->ss->update_super(&info, super, "linear-grow-update", dv, + 0, 0, NULL); if (st->ss->store_super(st, fd2, super)) { fprintf(stderr, Name ": Cannot store new superblock on %s\n", dv); |