Merge branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md:
md: Ensure an md array never has too many devices.
md: Fix a bug in linear.c causing which_dev() to return the wrong device.
md: Allow read error in a single drive raid1 to be passed up.

+19 -14
+3 -3
drivers/md/linear.c
··· 25 { 26 dev_info_t *hash; 27 linear_conf_t *conf = mddev_to_conf(mddev); 28 29 /* 30 * sector_div(a,b) returns the remainer and sets a to a/b 31 */ 32 - sector >>= conf->sector_shift; 33 - (void)sector_div(sector, conf->spacing); 34 - hash = conf->hash_table[sector]; 35 36 while (sector >= hash->num_sectors + hash->start_sector) 37 hash++;
··· 25 { 26 dev_info_t *hash; 27 linear_conf_t *conf = mddev_to_conf(mddev); 28 + sector_t idx = sector >> conf->sector_shift; 29 30 /* 31 * sector_div(a,b) returns the remainer and sets a to a/b 32 */ 33 + (void)sector_div(idx, conf->spacing); 34 + hash = conf->hash_table[idx]; 35 36 while (sector >= hash->num_sectors + hash->start_sector) 37 hash++;
+14 -10
drivers/md/md.c
··· 1481 if (find_rdev_nr(mddev, rdev->desc_nr)) 1482 return -EBUSY; 1483 } 1484 bdevname(rdev->bdev,b); 1485 while ( (s=strchr(b, '/')) != NULL) 1486 *s = '!'; ··· 2446 2447 i = 0; 2448 rdev_for_each(rdev, tmp, mddev) { 2449 if (rdev != freshest) 2450 if (super_types[mddev->major_version]. 2451 validate_super(mddev, rdev)) { ··· 4628 * noticed in interrupt contexts ... 4629 */ 4630 4631 - if (rdev->desc_nr == mddev->max_disks) { 4632 - printk(KERN_WARNING "%s: can not hot-add to full array!\n", 4633 - mdname(mddev)); 4634 - err = -EBUSY; 4635 - goto abort_unbind_export; 4636 - } 4637 - 4638 rdev->raid_disk = -1; 4639 4640 md_update_sb(mddev, 1); ··· 4640 md_wakeup_thread(mddev->thread); 4641 md_new_event(mddev); 4642 return 0; 4643 - 4644 - abort_unbind_export: 4645 - unbind_rdev_from_array(rdev); 4646 4647 abort_export: 4648 export_rdev(rdev);
··· 1481 if (find_rdev_nr(mddev, rdev->desc_nr)) 1482 return -EBUSY; 1483 } 1484 + if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { 1485 + printk(KERN_WARNING "md: %s: array is limited to %d devices\n", 1486 + mdname(mddev), mddev->max_disks); 1487 + return -EBUSY; 1488 + } 1489 bdevname(rdev->bdev,b); 1490 while ( (s=strchr(b, '/')) != NULL) 1491 *s = '!'; ··· 2441 2442 i = 0; 2443 rdev_for_each(rdev, tmp, mddev) { 2444 + if (rdev->desc_nr >= mddev->max_disks || 2445 + i > mddev->max_disks) { 2446 + printk(KERN_WARNING 2447 + "md: %s: %s: only %d devices permitted\n", 2448 + mdname(mddev), bdevname(rdev->bdev, b), 2449 + mddev->max_disks); 2450 + kick_rdev_from_array(rdev); 2451 + continue; 2452 + } 2453 if (rdev != freshest) 2454 if (super_types[mddev->major_version]. 2455 validate_super(mddev, rdev)) { ··· 4614 * noticed in interrupt contexts ... 4615 */ 4616 4617 rdev->raid_disk = -1; 4618 4619 md_update_sb(mddev, 1); ··· 4633 md_wakeup_thread(mddev->thread); 4634 md_new_event(mddev); 4635 return 0; 4636 4637 abort_export: 4638 export_rdev(rdev);
+2 -1
drivers/md/raid1.c
··· 1640 } 1641 1642 bio = r1_bio->bios[r1_bio->read_disk]; 1643 - if ((disk=read_balance(conf, r1_bio)) == -1) { 1644 printk(KERN_ALERT "raid1: %s: unrecoverable I/O" 1645 " read error for block %llu\n", 1646 bdevname(bio->bi_bdev,b),
··· 1640 } 1641 1642 bio = r1_bio->bios[r1_bio->read_disk]; 1643 + if ((disk=read_balance(conf, r1_bio)) == -1 || 1644 + disk == r1_bio->read_disk) { 1645 printk(KERN_ALERT "raid1: %s: unrecoverable I/O" 1646 " read error for block %llu\n", 1647 bdevname(bio->bi_bdev,b),