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

* 'for-linus' of git://neil.brown.name/md:
md: fix some lockdep issues between md and sysfs.
md: fix 'degraded' calculation when starting a reshape.

+13 -15
+5 -9
drivers/md/md.c
··· 4075 4075 { 4076 4076 mddev_t *mddev = container_of(ws, mddev_t, del_work); 4077 4077 4078 - if (mddev->private == &md_redundancy_group) { 4078 + if (mddev->private) { 4079 4079 sysfs_remove_group(&mddev->kobj, &md_redundancy_group); 4080 + if (mddev->private != (void*)1) 4081 + sysfs_remove_group(&mddev->kobj, mddev->private); 4080 4082 if (mddev->sysfs_action) 4081 4083 sysfs_put(mddev->sysfs_action); 4082 4084 mddev->sysfs_action = NULL; ··· 4289 4287 sysfs_notify_dirent(rdev->sysfs_state); 4290 4288 } 4291 4289 4292 - md_probe(mddev->unit, NULL, NULL); 4293 4290 disk = mddev->gendisk; 4294 - if (!disk) 4295 - return -ENOMEM; 4296 4291 4297 4292 spin_lock(&pers_lock); 4298 4293 pers = find_pers(mddev->level, mddev->clevel); ··· 4529 4530 mddev->queue->unplug_fn = NULL; 4530 4531 mddev->queue->backing_dev_info.congested_fn = NULL; 4531 4532 module_put(mddev->pers->owner); 4532 - if (mddev->pers->sync_request) 4533 - mddev->private = &md_redundancy_group; 4533 + if (mddev->pers->sync_request && mddev->private == NULL) 4534 + mddev->private = (void*)1; 4534 4535 mddev->pers = NULL; 4535 4536 /* tell userspace to handle 'inactive' */ 4536 4537 sysfs_notify_dirent(mddev->sysfs_state); ··· 4576 4577 mddev->bitmap_info.file = NULL; 4577 4578 } 4578 4579 mddev->bitmap_info.offset = 0; 4579 - 4580 - /* make sure all md_delayed_delete calls have finished */ 4581 - flush_scheduled_work(); 4582 4580 4583 4581 export_array(mddev); 4584 4582
+8 -6
drivers/md/raid5.c
··· 5136 5136 mddev->thread = NULL; 5137 5137 mddev->queue->backing_dev_info.congested_fn = NULL; 5138 5138 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ 5139 - sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); 5140 5139 free_conf(conf); 5141 - mddev->private = NULL; 5140 + mddev->private = &raid5_attrs_group; 5142 5141 return 0; 5143 5142 } 5144 5143 ··· 5463 5464 !test_bit(Faulty, &rdev->flags)) { 5464 5465 if (raid5_add_disk(mddev, rdev) == 0) { 5465 5466 char nm[20]; 5466 - if (rdev->raid_disk >= conf->previous_raid_disks) 5467 + if (rdev->raid_disk >= conf->previous_raid_disks) { 5467 5468 set_bit(In_sync, &rdev->flags); 5468 - else 5469 + added_devices++; 5470 + } else 5469 5471 rdev->recovery_offset = 0; 5470 - added_devices++; 5471 5472 sprintf(nm, "rd%d", rdev->raid_disk); 5472 5473 if (sysfs_create_link(&mddev->kobj, 5473 5474 &rdev->kobj, nm)) ··· 5479 5480 break; 5480 5481 } 5481 5482 5483 + /* When a reshape changes the number of devices, ->degraded 5484 + * is measured against the large of the pre and post number of 5485 + * devices.*/ 5482 5486 if (mddev->delta_disks > 0) { 5483 5487 spin_lock_irqsave(&conf->device_lock, flags); 5484 - mddev->degraded = (conf->raid_disks - conf->previous_raid_disks) 5488 + mddev->degraded += (conf->raid_disks - conf->previous_raid_disks) 5485 5489 - added_devices; 5486 5490 spin_unlock_irqrestore(&conf->device_lock, flags); 5487 5491 }