diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index d1b9bd5fd4f6..e07ce2e033a9 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -64,7 +64,7 @@ static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data) | |||
64 | 64 | ||
65 | /* allocate a r1bio with room for raid_disks entries in the bios array */ | 65 | /* allocate a r1bio with room for raid_disks entries in the bios array */ |
66 | r1_bio = kzalloc(size, gfp_flags); | 66 | r1_bio = kzalloc(size, gfp_flags); |
67 | if (!r1_bio) | 67 | if (!r1_bio && pi->mddev) |
68 | unplug_slaves(pi->mddev); | 68 | unplug_slaves(pi->mddev); |
69 | 69 | ||
70 | return r1_bio; | 70 | return r1_bio; |
@@ -1650,11 +1650,12 @@ static void raid1d(mddev_t *mddev) | |||
1650 | r1_bio->sector, | 1650 | r1_bio->sector, |
1651 | r1_bio->sectors); | 1651 | r1_bio->sectors); |
1652 | unfreeze_array(conf); | 1652 | unfreeze_array(conf); |
1653 | } | 1653 | } else |
1654 | md_error(mddev, | ||
1655 | conf->mirrors[r1_bio->read_disk].rdev); | ||
1654 | 1656 | ||
1655 | bio = r1_bio->bios[r1_bio->read_disk]; | 1657 | bio = r1_bio->bios[r1_bio->read_disk]; |
1656 | if ((disk=read_balance(conf, r1_bio)) == -1 || | 1658 | if ((disk=read_balance(conf, r1_bio)) == -1) { |
1657 | disk == r1_bio->read_disk) { | ||
1658 | printk(KERN_ALERT "raid1: %s: unrecoverable I/O" | 1659 | printk(KERN_ALERT "raid1: %s: unrecoverable I/O" |
1659 | " read error for block %llu\n", | 1660 | " read error for block %llu\n", |
1660 | bdevname(bio->bi_bdev,b), | 1661 | bdevname(bio->bi_bdev,b), |
@@ -1683,6 +1684,7 @@ static void raid1d(mddev_t *mddev) | |||
1683 | generic_make_request(bio); | 1684 | generic_make_request(bio); |
1684 | } | 1685 | } |
1685 | } | 1686 | } |
1687 | cond_resched(); | ||
1686 | } | 1688 | } |
1687 | if (unplug) | 1689 | if (unplug) |
1688 | unplug_slaves(mddev); | 1690 | unplug_slaves(mddev); |
@@ -1978,13 +1980,14 @@ static int run(mddev_t *mddev) | |||
1978 | conf->poolinfo = kmalloc(sizeof(*conf->poolinfo), GFP_KERNEL); | 1980 | conf->poolinfo = kmalloc(sizeof(*conf->poolinfo), GFP_KERNEL); |
1979 | if (!conf->poolinfo) | 1981 | if (!conf->poolinfo) |
1980 | goto out_no_mem; | 1982 | goto out_no_mem; |
1981 | conf->poolinfo->mddev = mddev; | 1983 | conf->poolinfo->mddev = NULL; |
1982 | conf->poolinfo->raid_disks = mddev->raid_disks; | 1984 | conf->poolinfo->raid_disks = mddev->raid_disks; |
1983 | conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, | 1985 | conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, |
1984 | r1bio_pool_free, | 1986 | r1bio_pool_free, |
1985 | conf->poolinfo); | 1987 | conf->poolinfo); |
1986 | if (!conf->r1bio_pool) | 1988 | if (!conf->r1bio_pool) |
1987 | goto out_no_mem; | 1989 | goto out_no_mem; |
1990 | conf->poolinfo->mddev = mddev; | ||
1988 | 1991 | ||
1989 | spin_lock_init(&conf->device_lock); | 1992 | spin_lock_init(&conf->device_lock); |
1990 | mddev->queue->queue_lock = &conf->device_lock; | 1993 | mddev->queue->queue_lock = &conf->device_lock; |