* [PATCH 001 of 4] md: Fix bug where spares don't always get rebuilt properly when they become live.
2006-10-23 7:07 [PATCH 000 of 4] md: assorted bugfixes - one serious NeilBrown
@ 2006-10-23 7:07 ` NeilBrown
2006-10-23 7:07 ` [PATCH 002 of 4] md: Simplify checking of available size when resizing an array NeilBrown
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: NeilBrown @ 2006-10-23 7:07 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-raid, linux-kernel, stable
If save_raid_disk is >= 0, then the device could be a device that is
already in sync that is being re-added. So we need to default this
value to -1.
Signed-off-by: Neil Brown <neilb@suse.de>
### Diffstat output
./drivers/md/md.c | 1 +
1 file changed, 1 insertion(+)
diff .prev/drivers/md/md.c ./drivers/md/md.c
--- .prev/drivers/md/md.c 2006-10-23 16:34:55.000000000 +1000
+++ ./drivers/md/md.c 2006-10-23 16:35:05.000000000 +1000
@@ -2003,6 +2003,7 @@ static mdk_rdev_t *md_import_device(dev_
kobject_init(&rdev->kobj);
rdev->desc_nr = -1;
+ rdev->saved_raid_disk = -1;
rdev->flags = 0;
rdev->data_offset = 0;
rdev->sb_events = 0;
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 002 of 4] md: Simplify checking of available size when resizing an array
2006-10-23 7:07 [PATCH 000 of 4] md: assorted bugfixes - one serious NeilBrown
2006-10-23 7:07 ` [PATCH 001 of 4] md: Fix bug where spares don't always get rebuilt properly when they become live NeilBrown
@ 2006-10-23 7:07 ` NeilBrown
2006-10-23 7:08 ` [PATCH 003 of 4] md: Fix up maintenance of ->degraded in multipath NeilBrown
2006-10-23 7:08 ` [PATCH 004 of 4] md: Fix printk format warnings, seen on powerpc64: NeilBrown
3 siblings, 0 replies; 5+ messages in thread
From: NeilBrown @ 2006-10-23 7:07 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-raid, linux-kernel
When "mdadm --grow --size=xxx" is used to resize an array (use more or
less of each device), we check the new siza against the available
space in each device.
The already have that number recorded in rdev->size, so calculating it
is pointless (and wrong in one obscure case).
Signed-off-by: Neil Brown <neilb@suse.de>
### Diffstat output
./drivers/md/md.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff .prev/drivers/md/md.c ./drivers/md/md.c
--- .prev/drivers/md/md.c 2006-10-23 16:35:05.000000000 +1000
+++ ./drivers/md/md.c 2006-10-23 16:35:21.000000000 +1000
@@ -4047,11 +4047,8 @@ static int update_size(mddev_t *mddev, u
return -EBUSY;
ITERATE_RDEV(mddev,rdev,tmp) {
sector_t avail;
- if (rdev->sb_offset > rdev->data_offset)
- avail = (rdev->sb_offset*2) - rdev->data_offset;
- else
- avail = get_capacity(rdev->bdev->bd_disk)
- - rdev->data_offset;
+ avail = rdev->size * 2;
+
if (fit && (size == 0 || size > avail/2))
size = avail/2;
if (avail < ((sector_t)size << 1))
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 003 of 4] md: Fix up maintenance of ->degraded in multipath.
2006-10-23 7:07 [PATCH 000 of 4] md: assorted bugfixes - one serious NeilBrown
2006-10-23 7:07 ` [PATCH 001 of 4] md: Fix bug where spares don't always get rebuilt properly when they become live NeilBrown
2006-10-23 7:07 ` [PATCH 002 of 4] md: Simplify checking of available size when resizing an array NeilBrown
@ 2006-10-23 7:08 ` NeilBrown
2006-10-23 7:08 ` [PATCH 004 of 4] md: Fix printk format warnings, seen on powerpc64: NeilBrown
3 siblings, 0 replies; 5+ messages in thread
From: NeilBrown @ 2006-10-23 7:08 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-raid, linux-kernel
A recent fix which made sure ->degraded was initialised properly
exposed a second bug - ->degraded wasn't been updated when drives
failed or were hot-added.
Signed-off-by: Neil Brown <neilb@suse.de>
### Diffstat output
./drivers/md/multipath.c | 2 ++
1 file changed, 2 insertions(+)
diff .prev/drivers/md/multipath.c ./drivers/md/multipath.c
--- .prev/drivers/md/multipath.c 2006-10-23 16:34:54.000000000 +1000
+++ ./drivers/md/multipath.c 2006-10-23 16:35:38.000000000 +1000
@@ -277,6 +277,7 @@ static void multipath_error (mddev_t *md
set_bit(Faulty, &rdev->flags);
set_bit(MD_CHANGE_DEVS, &mddev->flags);
conf->working_disks--;
+ mddev->degraded++;
printk(KERN_ALERT "multipath: IO failure on %s,"
" disabling IO path. \n Operation continuing"
" on %d IO paths.\n",
@@ -336,6 +337,7 @@ static int multipath_add_disk(mddev_t *m
blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);
conf->working_disks++;
+ mddev->degraded--;
rdev->raid_disk = path;
set_bit(In_sync, &rdev->flags);
rcu_assign_pointer(p->rdev, rdev);
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 004 of 4] md: Fix printk format warnings, seen on powerpc64:
2006-10-23 7:07 [PATCH 000 of 4] md: assorted bugfixes - one serious NeilBrown
` (2 preceding siblings ...)
2006-10-23 7:08 ` [PATCH 003 of 4] md: Fix up maintenance of ->degraded in multipath NeilBrown
@ 2006-10-23 7:08 ` NeilBrown
3 siblings, 0 replies; 5+ messages in thread
From: NeilBrown @ 2006-10-23 7:08 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-raid, linux-kernel
From: Randy Dunlap <randy.dunlap@oracle.com>
drivers/md/raid1.c:1479: warning: long long unsigned int format, long unsigned int arg (arg 4)
drivers/md/raid10.c:1475: warning: long long unsigned int format, long unsigned int arg (arg 4)
Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
### Diffstat output
./drivers/md/raid1.c | 4 ++--
./drivers/md/raid10.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff .prev/drivers/md/raid1.c ./drivers/md/raid1.c
--- .prev/drivers/md/raid1.c 2006-10-23 16:36:08.000000000 +1000
+++ ./drivers/md/raid1.c 2006-10-23 16:36:08.000000000 +1000
@@ -1474,8 +1474,8 @@ static void fix_read_error(conf_t *conf,
"raid1:%s: read error corrected "
"(%d sectors at %llu on %s)\n",
mdname(mddev), s,
- (unsigned long long)sect +
- rdev->data_offset,
+ (unsigned long long)(sect +
+ rdev->data_offset),
bdevname(rdev->bdev, b));
}
}
diff .prev/drivers/md/raid10.c ./drivers/md/raid10.c
--- .prev/drivers/md/raid10.c 2006-10-23 16:34:54.000000000 +1000
+++ ./drivers/md/raid10.c 2006-10-23 16:36:08.000000000 +1000
@@ -1470,8 +1470,8 @@ static void fix_read_error(conf_t *conf,
"raid10:%s: read error corrected"
" (%d sectors at %llu on %s)\n",
mdname(mddev), s,
- (unsigned long long)sect+
- rdev->data_offset,
+ (unsigned long long)(sect+
+ rdev->data_offset),
bdevname(rdev->bdev, b));
rdev_dec_pending(rdev, mddev);
^ permalink raw reply [flat|nested] 5+ messages in thread