diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 346 |
1 files changed, 205 insertions, 141 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index cb20d0b0555a..c148b6302154 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/blkdev.h> | 36 | #include <linux/blkdev.h> |
| 37 | #include <linux/sysctl.h> | 37 | #include <linux/sysctl.h> |
| 38 | #include <linux/seq_file.h> | 38 | #include <linux/seq_file.h> |
| 39 | #include <linux/smp_lock.h> | ||
| 39 | #include <linux/buffer_head.h> /* for invalidate_bdev */ | 40 | #include <linux/buffer_head.h> /* for invalidate_bdev */ |
| 40 | #include <linux/poll.h> | 41 | #include <linux/poll.h> |
| 41 | #include <linux/ctype.h> | 42 | #include <linux/ctype.h> |
| @@ -261,7 +262,7 @@ static int md_make_request(struct request_queue *q, struct bio *bio) | |||
| 261 | * Once ->stop is called and completes, the module will be completely | 262 | * Once ->stop is called and completes, the module will be completely |
| 262 | * unused. | 263 | * unused. |
| 263 | */ | 264 | */ |
| 264 | static void mddev_suspend(mddev_t *mddev) | 265 | void mddev_suspend(mddev_t *mddev) |
| 265 | { | 266 | { |
| 266 | BUG_ON(mddev->suspended); | 267 | BUG_ON(mddev->suspended); |
| 267 | mddev->suspended = 1; | 268 | mddev->suspended = 1; |
| @@ -269,13 +270,15 @@ static void mddev_suspend(mddev_t *mddev) | |||
| 269 | wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); | 270 | wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0); |
| 270 | mddev->pers->quiesce(mddev, 1); | 271 | mddev->pers->quiesce(mddev, 1); |
| 271 | } | 272 | } |
| 273 | EXPORT_SYMBOL_GPL(mddev_suspend); | ||
| 272 | 274 | ||
| 273 | static void mddev_resume(mddev_t *mddev) | 275 | void mddev_resume(mddev_t *mddev) |
| 274 | { | 276 | { |
| 275 | mddev->suspended = 0; | 277 | mddev->suspended = 0; |
| 276 | wake_up(&mddev->sb_wait); | 278 | wake_up(&mddev->sb_wait); |
| 277 | mddev->pers->quiesce(mddev, 0); | 279 | mddev->pers->quiesce(mddev, 0); |
| 278 | } | 280 | } |
| 281 | EXPORT_SYMBOL_GPL(mddev_resume); | ||
| 279 | 282 | ||
| 280 | int mddev_congested(mddev_t *mddev, int bits) | 283 | int mddev_congested(mddev_t *mddev, int bits) |
| 281 | { | 284 | { |
| @@ -353,7 +356,7 @@ static void md_submit_barrier(struct work_struct *ws) | |||
| 353 | /* an empty barrier - all done */ | 356 | /* an empty barrier - all done */ |
| 354 | bio_endio(bio, 0); | 357 | bio_endio(bio, 0); |
| 355 | else { | 358 | else { |
| 356 | bio->bi_rw &= ~(1<<BIO_RW_BARRIER); | 359 | bio->bi_rw &= ~REQ_HARDBARRIER; |
| 357 | if (mddev->pers->make_request(mddev, bio)) | 360 | if (mddev->pers->make_request(mddev, bio)) |
| 358 | generic_make_request(bio); | 361 | generic_make_request(bio); |
| 359 | mddev->barrier = POST_REQUEST_BARRIER; | 362 | mddev->barrier = POST_REQUEST_BARRIER; |
| @@ -384,6 +387,51 @@ void md_barrier_request(mddev_t *mddev, struct bio *bio) | |||
| 384 | } | 387 | } |
| 385 | EXPORT_SYMBOL(md_barrier_request); | 388 | EXPORT_SYMBOL(md_barrier_request); |
| 386 | 389 | ||
| 390 | /* Support for plugging. | ||
| 391 | * This mirrors the plugging support in request_queue, but does not | ||
| 392 | * require having a whole queue | ||
| 393 | */ | ||
| 394 | static void plugger_work(struct work_struct *work) | ||
| 395 | { | ||
| 396 | struct plug_handle *plug = | ||
| 397 | container_of(work, struct plug_handle, unplug_work); | ||
| 398 | plug->unplug_fn(plug); | ||
| 399 | } | ||
| 400 | static void plugger_timeout(unsigned long data) | ||
| 401 | { | ||
| 402 | struct plug_handle *plug = (void *)data; | ||
| 403 | kblockd_schedule_work(NULL, &plug->unplug_work); | ||
| 404 | } | ||
| 405 | void plugger_init(struct plug_handle *plug, | ||
| 406 | void (*unplug_fn)(struct plug_handle *)) | ||
| 407 | { | ||
| 408 | plug->unplug_flag = 0; | ||
| 409 | plug->unplug_fn = unplug_fn; | ||
| 410 | init_timer(&plug->unplug_timer); | ||
| 411 | plug->unplug_timer.function = plugger_timeout; | ||
| 412 | plug->unplug_timer.data = (unsigned long)plug; | ||
| 413 | INIT_WORK(&plug->unplug_work, plugger_work); | ||
| 414 | } | ||
| 415 | EXPORT_SYMBOL_GPL(plugger_init); | ||
| 416 | |||
| 417 | void plugger_set_plug(struct plug_handle *plug) | ||
| 418 | { | ||
| 419 | if (!test_and_set_bit(PLUGGED_FLAG, &plug->unplug_flag)) | ||
| 420 | mod_timer(&plug->unplug_timer, jiffies + msecs_to_jiffies(3)+1); | ||
| 421 | } | ||
| 422 | EXPORT_SYMBOL_GPL(plugger_set_plug); | ||
| 423 | |||
| 424 | int plugger_remove_plug(struct plug_handle *plug) | ||
| 425 | { | ||
| 426 | if (test_and_clear_bit(PLUGGED_FLAG, &plug->unplug_flag)) { | ||
| 427 | del_timer(&plug->unplug_timer); | ||
| 428 | return 1; | ||
| 429 | } else | ||
| 430 | return 0; | ||
| 431 | } | ||
| 432 | EXPORT_SYMBOL_GPL(plugger_remove_plug); | ||
| 433 | |||
| 434 | |||
| 387 | static inline mddev_t *mddev_get(mddev_t *mddev) | 435 | static inline mddev_t *mddev_get(mddev_t *mddev) |
| 388 | { | 436 | { |
| 389 | atomic_inc(&mddev->active); | 437 | atomic_inc(&mddev->active); |
| @@ -416,7 +464,7 @@ static void mddev_put(mddev_t *mddev) | |||
| 416 | spin_unlock(&all_mddevs_lock); | 464 | spin_unlock(&all_mddevs_lock); |
| 417 | } | 465 | } |
| 418 | 466 | ||
| 419 | static void mddev_init(mddev_t *mddev) | 467 | void mddev_init(mddev_t *mddev) |
| 420 | { | 468 | { |
| 421 | mutex_init(&mddev->open_mutex); | 469 | mutex_init(&mddev->open_mutex); |
| 422 | mutex_init(&mddev->reconfig_mutex); | 470 | mutex_init(&mddev->reconfig_mutex); |
| @@ -436,6 +484,7 @@ static void mddev_init(mddev_t *mddev) | |||
| 436 | mddev->resync_max = MaxSector; | 484 | mddev->resync_max = MaxSector; |
| 437 | mddev->level = LEVEL_NONE; | 485 | mddev->level = LEVEL_NONE; |
| 438 | } | 486 | } |
| 487 | EXPORT_SYMBOL_GPL(mddev_init); | ||
| 439 | 488 | ||
| 440 | static mddev_t * mddev_find(dev_t unit) | 489 | static mddev_t * mddev_find(dev_t unit) |
| 441 | { | 490 | { |
| @@ -532,25 +581,31 @@ static void mddev_unlock(mddev_t * mddev) | |||
| 532 | * an access to the files will try to take reconfig_mutex | 581 | * an access to the files will try to take reconfig_mutex |
| 533 | * while holding the file unremovable, which leads to | 582 | * while holding the file unremovable, which leads to |
| 534 | * a deadlock. | 583 | * a deadlock. |
| 535 | * So hold open_mutex instead - we are allowed to take | 584 | * So hold set sysfs_active while the remove in happeing, |
| 536 | * it while holding reconfig_mutex, and md_run can | 585 | * and anything else which might set ->to_remove or my |
| 537 | * use it to wait for the remove to complete. | 586 | * otherwise change the sysfs namespace will fail with |
| 587 | * -EBUSY if sysfs_active is still set. | ||
| 588 | * We set sysfs_active under reconfig_mutex and elsewhere | ||
| 589 | * test it under the same mutex to ensure its correct value | ||
| 590 | * is seen. | ||
| 538 | */ | 591 | */ |
| 539 | struct attribute_group *to_remove = mddev->to_remove; | 592 | struct attribute_group *to_remove = mddev->to_remove; |
| 540 | mddev->to_remove = NULL; | 593 | mddev->to_remove = NULL; |
| 541 | mutex_lock(&mddev->open_mutex); | 594 | mddev->sysfs_active = 1; |
| 542 | mutex_unlock(&mddev->reconfig_mutex); | 595 | mutex_unlock(&mddev->reconfig_mutex); |
| 543 | 596 | ||
| 544 | if (to_remove != &md_redundancy_group) | 597 | if (mddev->kobj.sd) { |
| 545 | sysfs_remove_group(&mddev->kobj, to_remove); | 598 | if (to_remove != &md_redundancy_group) |
| 546 | if (mddev->pers == NULL || | 599 | sysfs_remove_group(&mddev->kobj, to_remove); |
| 547 | mddev->pers->sync_request == NULL) { | 600 | if (mddev->pers == NULL || |
| 548 | sysfs_remove_group(&mddev->kobj, &md_redundancy_group); | 601 | mddev->pers->sync_request == NULL) { |
| 549 | if (mddev->sysfs_action) | 602 | sysfs_remove_group(&mddev->kobj, &md_redundancy_group); |
| 550 | sysfs_put(mddev->sysfs_action); | 603 | if (mddev->sysfs_action) |
| 551 | mddev->sysfs_action = NULL; | 604 | sysfs_put(mddev->sysfs_action); |
| 605 | mddev->sysfs_action = NULL; | ||
| 606 | } | ||
| 552 | } | 607 | } |
| 553 | mutex_unlock(&mddev->open_mutex); | 608 | mddev->sysfs_active = 0; |
| 554 | } else | 609 | } else |
| 555 | mutex_unlock(&mddev->reconfig_mutex); | 610 | mutex_unlock(&mddev->reconfig_mutex); |
| 556 | 611 | ||
| @@ -675,11 +730,11 @@ void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | |||
| 675 | * if zero is reached. | 730 | * if zero is reached. |
| 676 | * If an error occurred, call md_error | 731 | * If an error occurred, call md_error |
| 677 | * | 732 | * |
| 678 | * As we might need to resubmit the request if BIO_RW_BARRIER | 733 | * As we might need to resubmit the request if REQ_HARDBARRIER |
| 679 | * causes ENOTSUPP, we allocate a spare bio... | 734 | * causes ENOTSUPP, we allocate a spare bio... |
| 680 | */ | 735 | */ |
| 681 | struct bio *bio = bio_alloc(GFP_NOIO, 1); | 736 | struct bio *bio = bio_alloc(GFP_NOIO, 1); |
| 682 | int rw = (1<<BIO_RW) | (1<<BIO_RW_SYNCIO) | (1<<BIO_RW_UNPLUG); | 737 | int rw = REQ_WRITE | REQ_SYNC | REQ_UNPLUG; |
| 683 | 738 | ||
| 684 | bio->bi_bdev = rdev->bdev; | 739 | bio->bi_bdev = rdev->bdev; |
| 685 | bio->bi_sector = sector; | 740 | bio->bi_sector = sector; |
| @@ -691,7 +746,7 @@ void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | |||
| 691 | atomic_inc(&mddev->pending_writes); | 746 | atomic_inc(&mddev->pending_writes); |
| 692 | if (!test_bit(BarriersNotsupp, &rdev->flags)) { | 747 | if (!test_bit(BarriersNotsupp, &rdev->flags)) { |
| 693 | struct bio *rbio; | 748 | struct bio *rbio; |
| 694 | rw |= (1<<BIO_RW_BARRIER); | 749 | rw |= REQ_HARDBARRIER; |
| 695 | rbio = bio_clone(bio, GFP_NOIO); | 750 | rbio = bio_clone(bio, GFP_NOIO); |
| 696 | rbio->bi_private = bio; | 751 | rbio->bi_private = bio; |
| 697 | rbio->bi_end_io = super_written_barrier; | 752 | rbio->bi_end_io = super_written_barrier; |
| @@ -736,7 +791,7 @@ int sync_page_io(struct block_device *bdev, sector_t sector, int size, | |||
| 736 | struct completion event; | 791 | struct completion event; |
| 737 | int ret; | 792 | int ret; |
| 738 | 793 | ||
| 739 | rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG); | 794 | rw |= REQ_SYNC | REQ_UNPLUG; |
| 740 | 795 | ||
| 741 | bio->bi_bdev = bdev; | 796 | bio->bi_bdev = bdev; |
| 742 | bio->bi_sector = sector; | 797 | bio->bi_sector = sector; |
| @@ -1811,11 +1866,9 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | |||
| 1811 | goto fail; | 1866 | goto fail; |
| 1812 | 1867 | ||
| 1813 | ko = &part_to_dev(rdev->bdev->bd_part)->kobj; | 1868 | ko = &part_to_dev(rdev->bdev->bd_part)->kobj; |
| 1814 | if ((err = sysfs_create_link(&rdev->kobj, ko, "block"))) { | 1869 | if (sysfs_create_link(&rdev->kobj, ko, "block")) |
| 1815 | kobject_del(&rdev->kobj); | 1870 | /* failure here is OK */; |
| 1816 | goto fail; | 1871 | rdev->sysfs_state = sysfs_get_dirent_safe(rdev->kobj.sd, "state"); |
| 1817 | } | ||
| 1818 | rdev->sysfs_state = sysfs_get_dirent(rdev->kobj.sd, NULL, "state"); | ||
| 1819 | 1872 | ||
| 1820 | list_add_rcu(&rdev->same_set, &mddev->disks); | 1873 | list_add_rcu(&rdev->same_set, &mddev->disks); |
| 1821 | bd_claim_by_disk(rdev->bdev, rdev->bdev->bd_holder, mddev->gendisk); | 1874 | bd_claim_by_disk(rdev->bdev, rdev->bdev->bd_holder, mddev->gendisk); |
| @@ -2083,16 +2136,6 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
| 2083 | * with the rest of the array) | 2136 | * with the rest of the array) |
| 2084 | */ | 2137 | */ |
| 2085 | mdk_rdev_t *rdev; | 2138 | mdk_rdev_t *rdev; |
| 2086 | |||
| 2087 | /* First make sure individual recovery_offsets are correct */ | ||
| 2088 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 2089 | if (rdev->raid_disk >= 0 && | ||
| 2090 | mddev->delta_disks >= 0 && | ||
| 2091 | !test_bit(In_sync, &rdev->flags) && | ||
| 2092 | mddev->curr_resync_completed > rdev->recovery_offset) | ||
| 2093 | rdev->recovery_offset = mddev->curr_resync_completed; | ||
| 2094 | |||
| 2095 | } | ||
| 2096 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2139 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 2097 | if (rdev->sb_events == mddev->events || | 2140 | if (rdev->sb_events == mddev->events || |
| 2098 | (nospares && | 2141 | (nospares && |
| @@ -2114,12 +2157,27 @@ static void md_update_sb(mddev_t * mddev, int force_change) | |||
| 2114 | int sync_req; | 2157 | int sync_req; |
| 2115 | int nospares = 0; | 2158 | int nospares = 0; |
| 2116 | 2159 | ||
| 2117 | mddev->utime = get_seconds(); | ||
| 2118 | if (mddev->external) | ||
| 2119 | return; | ||
| 2120 | repeat: | 2160 | repeat: |
| 2161 | /* First make sure individual recovery_offsets are correct */ | ||
| 2162 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 2163 | if (rdev->raid_disk >= 0 && | ||
| 2164 | mddev->delta_disks >= 0 && | ||
| 2165 | !test_bit(In_sync, &rdev->flags) && | ||
| 2166 | mddev->curr_resync_completed > rdev->recovery_offset) | ||
| 2167 | rdev->recovery_offset = mddev->curr_resync_completed; | ||
| 2168 | |||
| 2169 | } | ||
| 2170 | if (mddev->external || !mddev->persistent) { | ||
| 2171 | clear_bit(MD_CHANGE_DEVS, &mddev->flags); | ||
| 2172 | clear_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 2173 | wake_up(&mddev->sb_wait); | ||
| 2174 | return; | ||
| 2175 | } | ||
| 2176 | |||
| 2121 | spin_lock_irq(&mddev->write_lock); | 2177 | spin_lock_irq(&mddev->write_lock); |
| 2122 | 2178 | ||
| 2179 | mddev->utime = get_seconds(); | ||
| 2180 | |||
| 2123 | set_bit(MD_CHANGE_PENDING, &mddev->flags); | 2181 | set_bit(MD_CHANGE_PENDING, &mddev->flags); |
| 2124 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) | 2182 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) |
| 2125 | force_change = 1; | 2183 | force_change = 1; |
| @@ -2168,19 +2226,6 @@ repeat: | |||
| 2168 | MD_BUG(); | 2226 | MD_BUG(); |
| 2169 | mddev->events --; | 2227 | mddev->events --; |
| 2170 | } | 2228 | } |
| 2171 | |||
| 2172 | /* | ||
| 2173 | * do not write anything to disk if using | ||
| 2174 | * nonpersistent superblocks | ||
| 2175 | */ | ||
| 2176 | if (!mddev->persistent) { | ||
| 2177 | if (!mddev->external) | ||
| 2178 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); | ||
| 2179 | |||
| 2180 | spin_unlock_irq(&mddev->write_lock); | ||
| 2181 | wake_up(&mddev->sb_wait); | ||
| 2182 | return; | ||
| 2183 | } | ||
| 2184 | sync_sbs(mddev, nospares); | 2229 | sync_sbs(mddev, nospares); |
| 2185 | spin_unlock_irq(&mddev->write_lock); | 2230 | spin_unlock_irq(&mddev->write_lock); |
| 2186 | 2231 | ||
| @@ -2334,8 +2379,8 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
| 2334 | set_bit(In_sync, &rdev->flags); | 2379 | set_bit(In_sync, &rdev->flags); |
| 2335 | err = 0; | 2380 | err = 0; |
| 2336 | } | 2381 | } |
| 2337 | if (!err && rdev->sysfs_state) | 2382 | if (!err) |
| 2338 | sysfs_notify_dirent(rdev->sysfs_state); | 2383 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 2339 | return err ? err : len; | 2384 | return err ? err : len; |
| 2340 | } | 2385 | } |
| 2341 | static struct rdev_sysfs_entry rdev_state = | 2386 | static struct rdev_sysfs_entry rdev_state = |
| @@ -2430,14 +2475,10 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
| 2430 | rdev->raid_disk = -1; | 2475 | rdev->raid_disk = -1; |
| 2431 | return err; | 2476 | return err; |
| 2432 | } else | 2477 | } else |
| 2433 | sysfs_notify_dirent(rdev->sysfs_state); | 2478 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 2434 | sprintf(nm, "rd%d", rdev->raid_disk); | 2479 | sprintf(nm, "rd%d", rdev->raid_disk); |
| 2435 | if (sysfs_create_link(&rdev->mddev->kobj, &rdev->kobj, nm)) | 2480 | if (sysfs_create_link(&rdev->mddev->kobj, &rdev->kobj, nm)) |
| 2436 | printk(KERN_WARNING | 2481 | /* failure here is OK */; |
| 2437 | "md: cannot register " | ||
| 2438 | "%s for %s\n", | ||
| 2439 | nm, mdname(rdev->mddev)); | ||
| 2440 | |||
| 2441 | /* don't wakeup anyone, leave that to userspace. */ | 2482 | /* don't wakeup anyone, leave that to userspace. */ |
| 2442 | } else { | 2483 | } else { |
| 2443 | if (slot >= rdev->mddev->raid_disks) | 2484 | if (slot >= rdev->mddev->raid_disks) |
| @@ -2447,7 +2488,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
| 2447 | clear_bit(Faulty, &rdev->flags); | 2488 | clear_bit(Faulty, &rdev->flags); |
| 2448 | clear_bit(WriteMostly, &rdev->flags); | 2489 | clear_bit(WriteMostly, &rdev->flags); |
| 2449 | set_bit(In_sync, &rdev->flags); | 2490 | set_bit(In_sync, &rdev->flags); |
| 2450 | sysfs_notify_dirent(rdev->sysfs_state); | 2491 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 2451 | } | 2492 | } |
| 2452 | return len; | 2493 | return len; |
| 2453 | } | 2494 | } |
| @@ -2695,6 +2736,24 @@ static struct kobj_type rdev_ktype = { | |||
| 2695 | .default_attrs = rdev_default_attrs, | 2736 | .default_attrs = rdev_default_attrs, |
| 2696 | }; | 2737 | }; |
| 2697 | 2738 | ||
| 2739 | void md_rdev_init(mdk_rdev_t *rdev) | ||
| 2740 | { | ||
| 2741 | rdev->desc_nr = -1; | ||
| 2742 | rdev->saved_raid_disk = -1; | ||
| 2743 | rdev->raid_disk = -1; | ||
| 2744 | rdev->flags = 0; | ||
| 2745 | rdev->data_offset = 0; | ||
| 2746 | rdev->sb_events = 0; | ||
| 2747 | rdev->last_read_error.tv_sec = 0; | ||
| 2748 | rdev->last_read_error.tv_nsec = 0; | ||
| 2749 | atomic_set(&rdev->nr_pending, 0); | ||
| 2750 | atomic_set(&rdev->read_errors, 0); | ||
| 2751 | atomic_set(&rdev->corrected_errors, 0); | ||
| 2752 | |||
| 2753 | INIT_LIST_HEAD(&rdev->same_set); | ||
| 2754 | init_waitqueue_head(&rdev->blocked_wait); | ||
| 2755 | } | ||
| 2756 | EXPORT_SYMBOL_GPL(md_rdev_init); | ||
| 2698 | /* | 2757 | /* |
| 2699 | * Import a device. If 'super_format' >= 0, then sanity check the superblock | 2758 | * Import a device. If 'super_format' >= 0, then sanity check the superblock |
| 2700 | * | 2759 | * |
| @@ -2718,6 +2777,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi | |||
| 2718 | return ERR_PTR(-ENOMEM); | 2777 | return ERR_PTR(-ENOMEM); |
| 2719 | } | 2778 | } |
| 2720 | 2779 | ||
| 2780 | md_rdev_init(rdev); | ||
| 2721 | if ((err = alloc_disk_sb(rdev))) | 2781 | if ((err = alloc_disk_sb(rdev))) |
| 2722 | goto abort_free; | 2782 | goto abort_free; |
| 2723 | 2783 | ||
| @@ -2727,18 +2787,6 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi | |||
| 2727 | 2787 | ||
| 2728 | kobject_init(&rdev->kobj, &rdev_ktype); | 2788 | kobject_init(&rdev->kobj, &rdev_ktype); |
| 2729 | 2789 | ||
| 2730 | rdev->desc_nr = -1; | ||
| 2731 | rdev->saved_raid_disk = -1; | ||
| 2732 | rdev->raid_disk = -1; | ||
| 2733 | rdev->flags = 0; | ||
| 2734 | rdev->data_offset = 0; | ||
| 2735 | rdev->sb_events = 0; | ||
| 2736 | rdev->last_read_error.tv_sec = 0; | ||
| 2737 | rdev->last_read_error.tv_nsec = 0; | ||
| 2738 | atomic_set(&rdev->nr_pending, 0); | ||
| 2739 | atomic_set(&rdev->read_errors, 0); | ||
| 2740 | atomic_set(&rdev->corrected_errors, 0); | ||
| 2741 | |||
| 2742 | size = rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; | 2790 | size = rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; |
| 2743 | if (!size) { | 2791 | if (!size) { |
| 2744 | printk(KERN_WARNING | 2792 | printk(KERN_WARNING |
| @@ -2767,9 +2815,6 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi | |||
| 2767 | } | 2815 | } |
| 2768 | } | 2816 | } |
| 2769 | 2817 | ||
| 2770 | INIT_LIST_HEAD(&rdev->same_set); | ||
| 2771 | init_waitqueue_head(&rdev->blocked_wait); | ||
| 2772 | |||
| 2773 | return rdev; | 2818 | return rdev; |
| 2774 | 2819 | ||
| 2775 | abort_free: | 2820 | abort_free: |
| @@ -2960,7 +3005,9 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 2960 | * - new personality will access other array. | 3005 | * - new personality will access other array. |
| 2961 | */ | 3006 | */ |
| 2962 | 3007 | ||
| 2963 | if (mddev->sync_thread || mddev->reshape_position != MaxSector) | 3008 | if (mddev->sync_thread || |
| 3009 | mddev->reshape_position != MaxSector || | ||
| 3010 | mddev->sysfs_active) | ||
| 2964 | return -EBUSY; | 3011 | return -EBUSY; |
| 2965 | 3012 | ||
| 2966 | if (!mddev->pers->quiesce) { | 3013 | if (!mddev->pers->quiesce) { |
| @@ -3437,7 +3484,7 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3437 | if (err) | 3484 | if (err) |
| 3438 | return err; | 3485 | return err; |
| 3439 | else { | 3486 | else { |
| 3440 | sysfs_notify_dirent(mddev->sysfs_state); | 3487 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 3441 | return len; | 3488 | return len; |
| 3442 | } | 3489 | } |
| 3443 | } | 3490 | } |
| @@ -3735,7 +3782,7 @@ action_store(mddev_t *mddev, const char *page, size_t len) | |||
| 3735 | } | 3782 | } |
| 3736 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 3783 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| 3737 | md_wakeup_thread(mddev->thread); | 3784 | md_wakeup_thread(mddev->thread); |
| 3738 | sysfs_notify_dirent(mddev->sysfs_action); | 3785 | sysfs_notify_dirent_safe(mddev->sysfs_action); |
| 3739 | return len; | 3786 | return len; |
| 3740 | } | 3787 | } |
| 3741 | 3788 | ||
| @@ -4281,13 +4328,14 @@ static int md_alloc(dev_t dev, char *name) | |||
| 4281 | disk->disk_name); | 4328 | disk->disk_name); |
| 4282 | error = 0; | 4329 | error = 0; |
| 4283 | } | 4330 | } |
| 4284 | if (sysfs_create_group(&mddev->kobj, &md_bitmap_group)) | 4331 | if (mddev->kobj.sd && |
| 4332 | sysfs_create_group(&mddev->kobj, &md_bitmap_group)) | ||
| 4285 | printk(KERN_DEBUG "pointless warning\n"); | 4333 | printk(KERN_DEBUG "pointless warning\n"); |
| 4286 | abort: | 4334 | abort: |
| 4287 | mutex_unlock(&disks_mutex); | 4335 | mutex_unlock(&disks_mutex); |
| 4288 | if (!error) { | 4336 | if (!error && mddev->kobj.sd) { |
| 4289 | kobject_uevent(&mddev->kobj, KOBJ_ADD); | 4337 | kobject_uevent(&mddev->kobj, KOBJ_ADD); |
| 4290 | mddev->sysfs_state = sysfs_get_dirent(mddev->kobj.sd, NULL, "array_state"); | 4338 | mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state"); |
| 4291 | } | 4339 | } |
| 4292 | mddev_put(mddev); | 4340 | mddev_put(mddev); |
| 4293 | return error; | 4341 | return error; |
| @@ -4325,14 +4373,14 @@ static void md_safemode_timeout(unsigned long data) | |||
| 4325 | if (!atomic_read(&mddev->writes_pending)) { | 4373 | if (!atomic_read(&mddev->writes_pending)) { |
| 4326 | mddev->safemode = 1; | 4374 | mddev->safemode = 1; |
| 4327 | if (mddev->external) | 4375 | if (mddev->external) |
| 4328 | sysfs_notify_dirent(mddev->sysfs_state); | 4376 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 4329 | } | 4377 | } |
| 4330 | md_wakeup_thread(mddev->thread); | 4378 | md_wakeup_thread(mddev->thread); |
| 4331 | } | 4379 | } |
| 4332 | 4380 | ||
| 4333 | static int start_dirty_degraded; | 4381 | static int start_dirty_degraded; |
| 4334 | 4382 | ||
| 4335 | static int md_run(mddev_t *mddev) | 4383 | int md_run(mddev_t *mddev) |
| 4336 | { | 4384 | { |
| 4337 | int err; | 4385 | int err; |
| 4338 | mdk_rdev_t *rdev; | 4386 | mdk_rdev_t *rdev; |
| @@ -4344,13 +4392,9 @@ static int md_run(mddev_t *mddev) | |||
| 4344 | 4392 | ||
| 4345 | if (mddev->pers) | 4393 | if (mddev->pers) |
| 4346 | return -EBUSY; | 4394 | return -EBUSY; |
| 4347 | 4395 | /* Cannot run until previous stop completes properly */ | |
| 4348 | /* These two calls synchronise us with the | 4396 | if (mddev->sysfs_active) |
| 4349 | * sysfs_remove_group calls in mddev_unlock, | 4397 | return -EBUSY; |
| 4350 | * so they must have completed. | ||
| 4351 | */ | ||
| 4352 | mutex_lock(&mddev->open_mutex); | ||
| 4353 | mutex_unlock(&mddev->open_mutex); | ||
| 4354 | 4398 | ||
| 4355 | /* | 4399 | /* |
| 4356 | * Analyze all RAID superblock(s) | 4400 | * Analyze all RAID superblock(s) |
| @@ -4397,7 +4441,7 @@ static int md_run(mddev_t *mddev) | |||
| 4397 | return -EINVAL; | 4441 | return -EINVAL; |
| 4398 | } | 4442 | } |
| 4399 | } | 4443 | } |
| 4400 | sysfs_notify_dirent(rdev->sysfs_state); | 4444 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 4401 | } | 4445 | } |
| 4402 | 4446 | ||
| 4403 | spin_lock(&pers_lock); | 4447 | spin_lock(&pers_lock); |
| @@ -4496,11 +4540,12 @@ static int md_run(mddev_t *mddev) | |||
| 4496 | return err; | 4540 | return err; |
| 4497 | } | 4541 | } |
| 4498 | if (mddev->pers->sync_request) { | 4542 | if (mddev->pers->sync_request) { |
| 4499 | if (sysfs_create_group(&mddev->kobj, &md_redundancy_group)) | 4543 | if (mddev->kobj.sd && |
| 4544 | sysfs_create_group(&mddev->kobj, &md_redundancy_group)) | ||
| 4500 | printk(KERN_WARNING | 4545 | printk(KERN_WARNING |
| 4501 | "md: cannot register extra attributes for %s\n", | 4546 | "md: cannot register extra attributes for %s\n", |
| 4502 | mdname(mddev)); | 4547 | mdname(mddev)); |
| 4503 | mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, NULL, "sync_action"); | 4548 | mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action"); |
| 4504 | } else if (mddev->ro == 2) /* auto-readonly not meaningful */ | 4549 | } else if (mddev->ro == 2) /* auto-readonly not meaningful */ |
| 4505 | mddev->ro = 0; | 4550 | mddev->ro = 0; |
| 4506 | 4551 | ||
| @@ -4518,8 +4563,7 @@ static int md_run(mddev_t *mddev) | |||
| 4518 | char nm[20]; | 4563 | char nm[20]; |
| 4519 | sprintf(nm, "rd%d", rdev->raid_disk); | 4564 | sprintf(nm, "rd%d", rdev->raid_disk); |
| 4520 | if (sysfs_create_link(&mddev->kobj, &rdev->kobj, nm)) | 4565 | if (sysfs_create_link(&mddev->kobj, &rdev->kobj, nm)) |
| 4521 | printk("md: cannot register %s for %s\n", | 4566 | /* failure here is OK */; |
| 4522 | nm, mdname(mddev)); | ||
| 4523 | } | 4567 | } |
| 4524 | 4568 | ||
| 4525 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 4569 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| @@ -4531,12 +4575,12 @@ static int md_run(mddev_t *mddev) | |||
| 4531 | md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ | 4575 | md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */ |
| 4532 | 4576 | ||
| 4533 | md_new_event(mddev); | 4577 | md_new_event(mddev); |
| 4534 | sysfs_notify_dirent(mddev->sysfs_state); | 4578 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 4535 | if (mddev->sysfs_action) | 4579 | sysfs_notify_dirent_safe(mddev->sysfs_action); |
| 4536 | sysfs_notify_dirent(mddev->sysfs_action); | ||
| 4537 | sysfs_notify(&mddev->kobj, NULL, "degraded"); | 4580 | sysfs_notify(&mddev->kobj, NULL, "degraded"); |
| 4538 | return 0; | 4581 | return 0; |
| 4539 | } | 4582 | } |
| 4583 | EXPORT_SYMBOL_GPL(md_run); | ||
| 4540 | 4584 | ||
| 4541 | static int do_md_run(mddev_t *mddev) | 4585 | static int do_md_run(mddev_t *mddev) |
| 4542 | { | 4586 | { |
| @@ -4545,7 +4589,11 @@ static int do_md_run(mddev_t *mddev) | |||
| 4545 | err = md_run(mddev); | 4589 | err = md_run(mddev); |
| 4546 | if (err) | 4590 | if (err) |
| 4547 | goto out; | 4591 | goto out; |
| 4548 | 4592 | err = bitmap_load(mddev); | |
| 4593 | if (err) { | ||
| 4594 | bitmap_destroy(mddev); | ||
| 4595 | goto out; | ||
| 4596 | } | ||
| 4549 | set_capacity(mddev->gendisk, mddev->array_sectors); | 4597 | set_capacity(mddev->gendisk, mddev->array_sectors); |
| 4550 | revalidate_disk(mddev->gendisk); | 4598 | revalidate_disk(mddev->gendisk); |
| 4551 | kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); | 4599 | kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); |
| @@ -4573,7 +4621,7 @@ static int restart_array(mddev_t *mddev) | |||
| 4573 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 4621 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| 4574 | md_wakeup_thread(mddev->thread); | 4622 | md_wakeup_thread(mddev->thread); |
| 4575 | md_wakeup_thread(mddev->sync_thread); | 4623 | md_wakeup_thread(mddev->sync_thread); |
| 4576 | sysfs_notify_dirent(mddev->sysfs_state); | 4624 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 4577 | return 0; | 4625 | return 0; |
| 4578 | } | 4626 | } |
| 4579 | 4627 | ||
| @@ -4644,9 +4692,10 @@ static void md_clean(mddev_t *mddev) | |||
| 4644 | mddev->bitmap_info.chunksize = 0; | 4692 | mddev->bitmap_info.chunksize = 0; |
| 4645 | mddev->bitmap_info.daemon_sleep = 0; | 4693 | mddev->bitmap_info.daemon_sleep = 0; |
| 4646 | mddev->bitmap_info.max_write_behind = 0; | 4694 | mddev->bitmap_info.max_write_behind = 0; |
| 4695 | mddev->plug = NULL; | ||
| 4647 | } | 4696 | } |
| 4648 | 4697 | ||
| 4649 | static void md_stop_writes(mddev_t *mddev) | 4698 | void md_stop_writes(mddev_t *mddev) |
| 4650 | { | 4699 | { |
| 4651 | if (mddev->sync_thread) { | 4700 | if (mddev->sync_thread) { |
| 4652 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 4701 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| @@ -4666,11 +4715,10 @@ static void md_stop_writes(mddev_t *mddev) | |||
| 4666 | md_update_sb(mddev, 1); | 4715 | md_update_sb(mddev, 1); |
| 4667 | } | 4716 | } |
| 4668 | } | 4717 | } |
| 4718 | EXPORT_SYMBOL_GPL(md_stop_writes); | ||
| 4669 | 4719 | ||
| 4670 | static void md_stop(mddev_t *mddev) | 4720 | void md_stop(mddev_t *mddev) |
| 4671 | { | 4721 | { |
| 4672 | md_stop_writes(mddev); | ||
| 4673 | |||
| 4674 | mddev->pers->stop(mddev); | 4722 | mddev->pers->stop(mddev); |
| 4675 | if (mddev->pers->sync_request && mddev->to_remove == NULL) | 4723 | if (mddev->pers->sync_request && mddev->to_remove == NULL) |
| 4676 | mddev->to_remove = &md_redundancy_group; | 4724 | mddev->to_remove = &md_redundancy_group; |
| @@ -4678,6 +4726,7 @@ static void md_stop(mddev_t *mddev) | |||
| 4678 | mddev->pers = NULL; | 4726 | mddev->pers = NULL; |
| 4679 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 4727 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 4680 | } | 4728 | } |
| 4729 | EXPORT_SYMBOL_GPL(md_stop); | ||
| 4681 | 4730 | ||
| 4682 | static int md_set_readonly(mddev_t *mddev, int is_open) | 4731 | static int md_set_readonly(mddev_t *mddev, int is_open) |
| 4683 | { | 4732 | { |
| @@ -4697,7 +4746,7 @@ static int md_set_readonly(mddev_t *mddev, int is_open) | |||
| 4697 | mddev->ro = 1; | 4746 | mddev->ro = 1; |
| 4698 | set_disk_ro(mddev->gendisk, 1); | 4747 | set_disk_ro(mddev->gendisk, 1); |
| 4699 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 4748 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 4700 | sysfs_notify_dirent(mddev->sysfs_state); | 4749 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 4701 | err = 0; | 4750 | err = 0; |
| 4702 | } | 4751 | } |
| 4703 | out: | 4752 | out: |
| @@ -4711,26 +4760,29 @@ out: | |||
| 4711 | */ | 4760 | */ |
| 4712 | static int do_md_stop(mddev_t * mddev, int mode, int is_open) | 4761 | static int do_md_stop(mddev_t * mddev, int mode, int is_open) |
| 4713 | { | 4762 | { |
| 4714 | int err = 0; | ||
| 4715 | struct gendisk *disk = mddev->gendisk; | 4763 | struct gendisk *disk = mddev->gendisk; |
| 4716 | mdk_rdev_t *rdev; | 4764 | mdk_rdev_t *rdev; |
| 4717 | 4765 | ||
| 4718 | mutex_lock(&mddev->open_mutex); | 4766 | mutex_lock(&mddev->open_mutex); |
| 4719 | if (atomic_read(&mddev->openers) > is_open) { | 4767 | if (atomic_read(&mddev->openers) > is_open || |
| 4768 | mddev->sysfs_active) { | ||
| 4720 | printk("md: %s still in use.\n",mdname(mddev)); | 4769 | printk("md: %s still in use.\n",mdname(mddev)); |
| 4721 | err = -EBUSY; | 4770 | mutex_unlock(&mddev->open_mutex); |
| 4722 | } else if (mddev->pers) { | 4771 | return -EBUSY; |
| 4772 | } | ||
| 4723 | 4773 | ||
| 4774 | if (mddev->pers) { | ||
| 4724 | if (mddev->ro) | 4775 | if (mddev->ro) |
| 4725 | set_disk_ro(disk, 0); | 4776 | set_disk_ro(disk, 0); |
| 4726 | 4777 | ||
| 4778 | md_stop_writes(mddev); | ||
| 4727 | md_stop(mddev); | 4779 | md_stop(mddev); |
| 4728 | mddev->queue->merge_bvec_fn = NULL; | 4780 | mddev->queue->merge_bvec_fn = NULL; |
| 4729 | mddev->queue->unplug_fn = NULL; | 4781 | mddev->queue->unplug_fn = NULL; |
| 4730 | mddev->queue->backing_dev_info.congested_fn = NULL; | 4782 | mddev->queue->backing_dev_info.congested_fn = NULL; |
| 4731 | 4783 | ||
| 4732 | /* tell userspace to handle 'inactive' */ | 4784 | /* tell userspace to handle 'inactive' */ |
| 4733 | sysfs_notify_dirent(mddev->sysfs_state); | 4785 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 4734 | 4786 | ||
| 4735 | list_for_each_entry(rdev, &mddev->disks, same_set) | 4787 | list_for_each_entry(rdev, &mddev->disks, same_set) |
| 4736 | if (rdev->raid_disk >= 0) { | 4788 | if (rdev->raid_disk >= 0) { |
| @@ -4740,21 +4792,17 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4740 | } | 4792 | } |
| 4741 | 4793 | ||
| 4742 | set_capacity(disk, 0); | 4794 | set_capacity(disk, 0); |
| 4795 | mutex_unlock(&mddev->open_mutex); | ||
| 4743 | revalidate_disk(disk); | 4796 | revalidate_disk(disk); |
| 4744 | 4797 | ||
| 4745 | if (mddev->ro) | 4798 | if (mddev->ro) |
| 4746 | mddev->ro = 0; | 4799 | mddev->ro = 0; |
| 4747 | 4800 | } else | |
| 4748 | err = 0; | 4801 | mutex_unlock(&mddev->open_mutex); |
| 4749 | } | ||
| 4750 | mutex_unlock(&mddev->open_mutex); | ||
| 4751 | if (err) | ||
| 4752 | return err; | ||
| 4753 | /* | 4802 | /* |
| 4754 | * Free resources if final stop | 4803 | * Free resources if final stop |
| 4755 | */ | 4804 | */ |
| 4756 | if (mode == 0) { | 4805 | if (mode == 0) { |
| 4757 | |||
| 4758 | printk(KERN_INFO "md: %s stopped.\n", mdname(mddev)); | 4806 | printk(KERN_INFO "md: %s stopped.\n", mdname(mddev)); |
| 4759 | 4807 | ||
| 4760 | bitmap_destroy(mddev); | 4808 | bitmap_destroy(mddev); |
| @@ -4771,13 +4819,11 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
| 4771 | kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); | 4819 | kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); |
| 4772 | if (mddev->hold_active == UNTIL_STOP) | 4820 | if (mddev->hold_active == UNTIL_STOP) |
| 4773 | mddev->hold_active = 0; | 4821 | mddev->hold_active = 0; |
| 4774 | |||
| 4775 | } | 4822 | } |
| 4776 | err = 0; | ||
| 4777 | blk_integrity_unregister(disk); | 4823 | blk_integrity_unregister(disk); |
| 4778 | md_new_event(mddev); | 4824 | md_new_event(mddev); |
| 4779 | sysfs_notify_dirent(mddev->sysfs_state); | 4825 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 4780 | return err; | 4826 | return 0; |
| 4781 | } | 4827 | } |
| 4782 | 4828 | ||
| 4783 | #ifndef MODULE | 4829 | #ifndef MODULE |
| @@ -5138,7 +5184,7 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) | |||
| 5138 | if (err) | 5184 | if (err) |
| 5139 | export_rdev(rdev); | 5185 | export_rdev(rdev); |
| 5140 | else | 5186 | else |
| 5141 | sysfs_notify_dirent(rdev->sysfs_state); | 5187 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 5142 | 5188 | ||
| 5143 | md_update_sb(mddev, 1); | 5189 | md_update_sb(mddev, 1); |
| 5144 | if (mddev->degraded) | 5190 | if (mddev->degraded) |
| @@ -5331,8 +5377,11 @@ static int set_bitmap_file(mddev_t *mddev, int fd) | |||
| 5331 | err = 0; | 5377 | err = 0; |
| 5332 | if (mddev->pers) { | 5378 | if (mddev->pers) { |
| 5333 | mddev->pers->quiesce(mddev, 1); | 5379 | mddev->pers->quiesce(mddev, 1); |
| 5334 | if (fd >= 0) | 5380 | if (fd >= 0) { |
| 5335 | err = bitmap_create(mddev); | 5381 | err = bitmap_create(mddev); |
| 5382 | if (!err) | ||
| 5383 | err = bitmap_load(mddev); | ||
| 5384 | } | ||
| 5336 | if (fd < 0 || err) { | 5385 | if (fd < 0 || err) { |
| 5337 | bitmap_destroy(mddev); | 5386 | bitmap_destroy(mddev); |
| 5338 | fd = -1; /* make sure to put the file */ | 5387 | fd = -1; /* make sure to put the file */ |
| @@ -5581,6 +5630,8 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info) | |||
| 5581 | mddev->bitmap_info.default_offset; | 5630 | mddev->bitmap_info.default_offset; |
| 5582 | mddev->pers->quiesce(mddev, 1); | 5631 | mddev->pers->quiesce(mddev, 1); |
| 5583 | rv = bitmap_create(mddev); | 5632 | rv = bitmap_create(mddev); |
| 5633 | if (!rv) | ||
| 5634 | rv = bitmap_load(mddev); | ||
| 5584 | if (rv) | 5635 | if (rv) |
| 5585 | bitmap_destroy(mddev); | 5636 | bitmap_destroy(mddev); |
| 5586 | mddev->pers->quiesce(mddev, 0); | 5637 | mddev->pers->quiesce(mddev, 0); |
| @@ -5813,7 +5864,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 5813 | if (_IOC_TYPE(cmd) == MD_MAJOR && mddev->ro && mddev->pers) { | 5864 | if (_IOC_TYPE(cmd) == MD_MAJOR && mddev->ro && mddev->pers) { |
| 5814 | if (mddev->ro == 2) { | 5865 | if (mddev->ro == 2) { |
| 5815 | mddev->ro = 0; | 5866 | mddev->ro = 0; |
| 5816 | sysfs_notify_dirent(mddev->sysfs_state); | 5867 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 5817 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 5868 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| 5818 | md_wakeup_thread(mddev->thread); | 5869 | md_wakeup_thread(mddev->thread); |
| 5819 | } else { | 5870 | } else { |
| @@ -5902,6 +5953,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
| 5902 | mddev_t *mddev = mddev_find(bdev->bd_dev); | 5953 | mddev_t *mddev = mddev_find(bdev->bd_dev); |
| 5903 | int err; | 5954 | int err; |
| 5904 | 5955 | ||
| 5956 | lock_kernel(); | ||
| 5905 | if (mddev->gendisk != bdev->bd_disk) { | 5957 | if (mddev->gendisk != bdev->bd_disk) { |
| 5906 | /* we are racing with mddev_put which is discarding this | 5958 | /* we are racing with mddev_put which is discarding this |
| 5907 | * bd_disk. | 5959 | * bd_disk. |
| @@ -5910,6 +5962,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
| 5910 | /* Wait until bdev->bd_disk is definitely gone */ | 5962 | /* Wait until bdev->bd_disk is definitely gone */ |
| 5911 | flush_scheduled_work(); | 5963 | flush_scheduled_work(); |
| 5912 | /* Then retry the open from the top */ | 5964 | /* Then retry the open from the top */ |
| 5965 | unlock_kernel(); | ||
| 5913 | return -ERESTARTSYS; | 5966 | return -ERESTARTSYS; |
| 5914 | } | 5967 | } |
| 5915 | BUG_ON(mddev != bdev->bd_disk->private_data); | 5968 | BUG_ON(mddev != bdev->bd_disk->private_data); |
| @@ -5923,6 +5976,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
| 5923 | 5976 | ||
| 5924 | check_disk_size_change(mddev->gendisk, bdev); | 5977 | check_disk_size_change(mddev->gendisk, bdev); |
| 5925 | out: | 5978 | out: |
| 5979 | unlock_kernel(); | ||
| 5926 | return err; | 5980 | return err; |
| 5927 | } | 5981 | } |
| 5928 | 5982 | ||
| @@ -5931,8 +5985,10 @@ static int md_release(struct gendisk *disk, fmode_t mode) | |||
| 5931 | mddev_t *mddev = disk->private_data; | 5985 | mddev_t *mddev = disk->private_data; |
| 5932 | 5986 | ||
| 5933 | BUG_ON(!mddev); | 5987 | BUG_ON(!mddev); |
| 5988 | lock_kernel(); | ||
| 5934 | atomic_dec(&mddev->openers); | 5989 | atomic_dec(&mddev->openers); |
| 5935 | mddev_put(mddev); | 5990 | mddev_put(mddev); |
| 5991 | unlock_kernel(); | ||
| 5936 | 5992 | ||
| 5937 | return 0; | 5993 | return 0; |
| 5938 | } | 5994 | } |
| @@ -6059,10 +6115,12 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
| 6059 | mddev->pers->error_handler(mddev,rdev); | 6115 | mddev->pers->error_handler(mddev,rdev); |
| 6060 | if (mddev->degraded) | 6116 | if (mddev->degraded) |
| 6061 | set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); | 6117 | set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); |
| 6062 | sysfs_notify_dirent(rdev->sysfs_state); | 6118 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 6063 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); | 6119 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
| 6064 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 6120 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| 6065 | md_wakeup_thread(mddev->thread); | 6121 | md_wakeup_thread(mddev->thread); |
| 6122 | if (mddev->event_work.func) | ||
| 6123 | schedule_work(&mddev->event_work); | ||
| 6066 | md_new_event_inintr(mddev); | 6124 | md_new_event_inintr(mddev); |
| 6067 | } | 6125 | } |
| 6068 | 6126 | ||
| @@ -6520,7 +6578,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
| 6520 | spin_unlock_irq(&mddev->write_lock); | 6578 | spin_unlock_irq(&mddev->write_lock); |
| 6521 | } | 6579 | } |
| 6522 | if (did_change) | 6580 | if (did_change) |
| 6523 | sysfs_notify_dirent(mddev->sysfs_state); | 6581 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 6524 | wait_event(mddev->sb_wait, | 6582 | wait_event(mddev->sb_wait, |
| 6525 | !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && | 6583 | !test_bit(MD_CHANGE_CLEAN, &mddev->flags) && |
| 6526 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); | 6584 | !test_bit(MD_CHANGE_PENDING, &mddev->flags)); |
| @@ -6563,7 +6621,7 @@ int md_allow_write(mddev_t *mddev) | |||
| 6563 | mddev->safemode = 1; | 6621 | mddev->safemode = 1; |
| 6564 | spin_unlock_irq(&mddev->write_lock); | 6622 | spin_unlock_irq(&mddev->write_lock); |
| 6565 | md_update_sb(mddev, 0); | 6623 | md_update_sb(mddev, 0); |
| 6566 | sysfs_notify_dirent(mddev->sysfs_state); | 6624 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 6567 | } else | 6625 | } else |
| 6568 | spin_unlock_irq(&mddev->write_lock); | 6626 | spin_unlock_irq(&mddev->write_lock); |
| 6569 | 6627 | ||
| @@ -6574,6 +6632,14 @@ int md_allow_write(mddev_t *mddev) | |||
| 6574 | } | 6632 | } |
| 6575 | EXPORT_SYMBOL_GPL(md_allow_write); | 6633 | EXPORT_SYMBOL_GPL(md_allow_write); |
| 6576 | 6634 | ||
| 6635 | void md_unplug(mddev_t *mddev) | ||
| 6636 | { | ||
| 6637 | if (mddev->queue) | ||
| 6638 | blk_unplug(mddev->queue); | ||
| 6639 | if (mddev->plug) | ||
| 6640 | mddev->plug->unplug_fn(mddev->plug); | ||
| 6641 | } | ||
| 6642 | |||
| 6577 | #define SYNC_MARKS 10 | 6643 | #define SYNC_MARKS 10 |
| 6578 | #define SYNC_MARK_STEP (3*HZ) | 6644 | #define SYNC_MARK_STEP (3*HZ) |
| 6579 | void md_do_sync(mddev_t *mddev) | 6645 | void md_do_sync(mddev_t *mddev) |
| @@ -6752,12 +6818,13 @@ void md_do_sync(mddev_t *mddev) | |||
| 6752 | >= mddev->resync_max - mddev->curr_resync_completed | 6818 | >= mddev->resync_max - mddev->curr_resync_completed |
| 6753 | )) { | 6819 | )) { |
| 6754 | /* time to update curr_resync_completed */ | 6820 | /* time to update curr_resync_completed */ |
| 6755 | blk_unplug(mddev->queue); | 6821 | md_unplug(mddev); |
| 6756 | wait_event(mddev->recovery_wait, | 6822 | wait_event(mddev->recovery_wait, |
| 6757 | atomic_read(&mddev->recovery_active) == 0); | 6823 | atomic_read(&mddev->recovery_active) == 0); |
| 6758 | mddev->curr_resync_completed = | 6824 | mddev->curr_resync_completed = |
| 6759 | mddev->curr_resync; | 6825 | mddev->curr_resync; |
| 6760 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | 6826 | if (mddev->persistent) |
| 6827 | set_bit(MD_CHANGE_CLEAN, &mddev->flags); | ||
| 6761 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); | 6828 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); |
| 6762 | } | 6829 | } |
| 6763 | 6830 | ||
| @@ -6829,7 +6896,7 @@ void md_do_sync(mddev_t *mddev) | |||
| 6829 | * about not overloading the IO subsystem. (things like an | 6896 | * about not overloading the IO subsystem. (things like an |
| 6830 | * e2fsck being done on the RAID array should execute fast) | 6897 | * e2fsck being done on the RAID array should execute fast) |
| 6831 | */ | 6898 | */ |
| 6832 | blk_unplug(mddev->queue); | 6899 | md_unplug(mddev); |
| 6833 | cond_resched(); | 6900 | cond_resched(); |
| 6834 | 6901 | ||
| 6835 | currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2 | 6902 | currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2 |
| @@ -6848,7 +6915,7 @@ void md_do_sync(mddev_t *mddev) | |||
| 6848 | * this also signals 'finished resyncing' to md_stop | 6915 | * this also signals 'finished resyncing' to md_stop |
| 6849 | */ | 6916 | */ |
| 6850 | out: | 6917 | out: |
| 6851 | blk_unplug(mddev->queue); | 6918 | md_unplug(mddev); |
| 6852 | 6919 | ||
| 6853 | wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); | 6920 | wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); |
| 6854 | 6921 | ||
| @@ -6950,10 +7017,7 @@ static int remove_and_add_spares(mddev_t *mddev) | |||
| 6950 | sprintf(nm, "rd%d", rdev->raid_disk); | 7017 | sprintf(nm, "rd%d", rdev->raid_disk); |
| 6951 | if (sysfs_create_link(&mddev->kobj, | 7018 | if (sysfs_create_link(&mddev->kobj, |
| 6952 | &rdev->kobj, nm)) | 7019 | &rdev->kobj, nm)) |
| 6953 | printk(KERN_WARNING | 7020 | /* failure here is OK */; |
| 6954 | "md: cannot register " | ||
| 6955 | "%s for %s\n", | ||
| 6956 | nm, mdname(mddev)); | ||
| 6957 | spares++; | 7021 | spares++; |
| 6958 | md_new_event(mddev); | 7022 | md_new_event(mddev); |
| 6959 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 7023 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
| @@ -7046,7 +7110,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7046 | mddev->safemode = 0; | 7110 | mddev->safemode = 0; |
| 7047 | spin_unlock_irq(&mddev->write_lock); | 7111 | spin_unlock_irq(&mddev->write_lock); |
| 7048 | if (did_change) | 7112 | if (did_change) |
| 7049 | sysfs_notify_dirent(mddev->sysfs_state); | 7113 | sysfs_notify_dirent_safe(mddev->sysfs_state); |
| 7050 | } | 7114 | } |
| 7051 | 7115 | ||
| 7052 | if (mddev->flags) | 7116 | if (mddev->flags) |
| @@ -7085,7 +7149,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7085 | mddev->recovery = 0; | 7149 | mddev->recovery = 0; |
| 7086 | /* flag recovery needed just to double check */ | 7150 | /* flag recovery needed just to double check */ |
| 7087 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 7151 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
| 7088 | sysfs_notify_dirent(mddev->sysfs_action); | 7152 | sysfs_notify_dirent_safe(mddev->sysfs_action); |
| 7089 | md_new_event(mddev); | 7153 | md_new_event(mddev); |
| 7090 | goto unlock; | 7154 | goto unlock; |
| 7091 | } | 7155 | } |
| @@ -7147,7 +7211,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7147 | mddev->recovery = 0; | 7211 | mddev->recovery = 0; |
| 7148 | } else | 7212 | } else |
| 7149 | md_wakeup_thread(mddev->sync_thread); | 7213 | md_wakeup_thread(mddev->sync_thread); |
| 7150 | sysfs_notify_dirent(mddev->sysfs_action); | 7214 | sysfs_notify_dirent_safe(mddev->sysfs_action); |
| 7151 | md_new_event(mddev); | 7215 | md_new_event(mddev); |
| 7152 | } | 7216 | } |
| 7153 | unlock: | 7217 | unlock: |
| @@ -7156,7 +7220,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7156 | if (test_and_clear_bit(MD_RECOVERY_RECOVER, | 7220 | if (test_and_clear_bit(MD_RECOVERY_RECOVER, |
| 7157 | &mddev->recovery)) | 7221 | &mddev->recovery)) |
| 7158 | if (mddev->sysfs_action) | 7222 | if (mddev->sysfs_action) |
| 7159 | sysfs_notify_dirent(mddev->sysfs_action); | 7223 | sysfs_notify_dirent_safe(mddev->sysfs_action); |
| 7160 | } | 7224 | } |
| 7161 | mddev_unlock(mddev); | 7225 | mddev_unlock(mddev); |
| 7162 | } | 7226 | } |
| @@ -7164,7 +7228,7 @@ void md_check_recovery(mddev_t *mddev) | |||
| 7164 | 7228 | ||
| 7165 | void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev) | 7229 | void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev) |
| 7166 | { | 7230 | { |
| 7167 | sysfs_notify_dirent(rdev->sysfs_state); | 7231 | sysfs_notify_dirent_safe(rdev->sysfs_state); |
| 7168 | wait_event_timeout(rdev->blocked_wait, | 7232 | wait_event_timeout(rdev->blocked_wait, |
| 7169 | !test_bit(Blocked, &rdev->flags), | 7233 | !test_bit(Blocked, &rdev->flags), |
| 7170 | msecs_to_jiffies(5000)); | 7234 | msecs_to_jiffies(5000)); |
