diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 25f2bbfe6a2b..097ae1b5484b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -3424,21 +3424,17 @@ static int md_thread(void * arg) | |||
3424 | */ | 3424 | */ |
3425 | 3425 | ||
3426 | allow_signal(SIGKILL); | 3426 | allow_signal(SIGKILL); |
3427 | complete(thread->event); | ||
3428 | while (!kthread_should_stop()) { | 3427 | while (!kthread_should_stop()) { |
3429 | void (*run)(mddev_t *); | ||
3430 | 3428 | ||
3431 | wait_event_interruptible_timeout(thread->wqueue, | 3429 | wait_event_timeout(thread->wqueue, |
3432 | test_bit(THREAD_WAKEUP, &thread->flags) | 3430 | test_bit(THREAD_WAKEUP, &thread->flags) |
3433 | || kthread_should_stop(), | 3431 | || kthread_should_stop(), |
3434 | thread->timeout); | 3432 | thread->timeout); |
3435 | try_to_freeze(); | 3433 | try_to_freeze(); |
3436 | 3434 | ||
3437 | clear_bit(THREAD_WAKEUP, &thread->flags); | 3435 | clear_bit(THREAD_WAKEUP, &thread->flags); |
3438 | 3436 | ||
3439 | run = thread->run; | 3437 | thread->run(thread->mddev); |
3440 | if (run) | ||
3441 | run(thread->mddev); | ||
3442 | } | 3438 | } |
3443 | 3439 | ||
3444 | return 0; | 3440 | return 0; |
@@ -3457,7 +3453,6 @@ mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev, | |||
3457 | const char *name) | 3453 | const char *name) |
3458 | { | 3454 | { |
3459 | mdk_thread_t *thread; | 3455 | mdk_thread_t *thread; |
3460 | struct completion event; | ||
3461 | 3456 | ||
3462 | thread = kmalloc(sizeof(mdk_thread_t), GFP_KERNEL); | 3457 | thread = kmalloc(sizeof(mdk_thread_t), GFP_KERNEL); |
3463 | if (!thread) | 3458 | if (!thread) |
@@ -3466,18 +3461,14 @@ mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev, | |||
3466 | memset(thread, 0, sizeof(mdk_thread_t)); | 3461 | memset(thread, 0, sizeof(mdk_thread_t)); |
3467 | init_waitqueue_head(&thread->wqueue); | 3462 | init_waitqueue_head(&thread->wqueue); |
3468 | 3463 | ||
3469 | init_completion(&event); | ||
3470 | thread->event = &event; | ||
3471 | thread->run = run; | 3464 | thread->run = run; |
3472 | thread->mddev = mddev; | 3465 | thread->mddev = mddev; |
3473 | thread->name = name; | ||
3474 | thread->timeout = MAX_SCHEDULE_TIMEOUT; | 3466 | thread->timeout = MAX_SCHEDULE_TIMEOUT; |
3475 | thread->tsk = kthread_run(md_thread, thread, name, mdname(thread->mddev)); | 3467 | thread->tsk = kthread_run(md_thread, thread, name, mdname(thread->mddev)); |
3476 | if (IS_ERR(thread->tsk)) { | 3468 | if (IS_ERR(thread->tsk)) { |
3477 | kfree(thread); | 3469 | kfree(thread); |
3478 | return NULL; | 3470 | return NULL; |
3479 | } | 3471 | } |
3480 | wait_for_completion(&event); | ||
3481 | return thread; | 3472 | return thread; |
3482 | } | 3473 | } |
3483 | 3474 | ||
@@ -3941,9 +3932,7 @@ static void md_do_sync(mddev_t *mddev) | |||
3941 | mddev->curr_resync = 2; | 3932 | mddev->curr_resync = 2; |
3942 | 3933 | ||
3943 | try_again: | 3934 | try_again: |
3944 | if (signal_pending(current) || | 3935 | if (kthread_should_stop()) { |
3945 | kthread_should_stop()) { | ||
3946 | flush_signals(current); | ||
3947 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); | 3936 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
3948 | goto skip; | 3937 | goto skip; |
3949 | } | 3938 | } |
@@ -3963,9 +3952,8 @@ static void md_do_sync(mddev_t *mddev) | |||
3963 | * time 'round when curr_resync == 2 | 3952 | * time 'round when curr_resync == 2 |
3964 | */ | 3953 | */ |
3965 | continue; | 3954 | continue; |
3966 | prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE); | 3955 | prepare_to_wait(&resync_wait, &wq, TASK_UNINTERRUPTIBLE); |
3967 | if (!signal_pending(current) && | 3956 | if (!kthread_should_stop() && |
3968 | !kthread_should_stop() && | ||
3969 | mddev2->curr_resync >= mddev->curr_resync) { | 3957 | mddev2->curr_resync >= mddev->curr_resync) { |
3970 | printk(KERN_INFO "md: delaying resync of %s" | 3958 | printk(KERN_INFO "md: delaying resync of %s" |
3971 | " until %s has finished resync (they" | 3959 | " until %s has finished resync (they" |
@@ -4074,13 +4062,12 @@ static void md_do_sync(mddev_t *mddev) | |||
4074 | } | 4062 | } |
4075 | 4063 | ||
4076 | 4064 | ||
4077 | if (signal_pending(current) || kthread_should_stop()) { | 4065 | if (kthread_should_stop()) { |
4078 | /* | 4066 | /* |
4079 | * got a signal, exit. | 4067 | * got a signal, exit. |
4080 | */ | 4068 | */ |
4081 | printk(KERN_INFO | 4069 | printk(KERN_INFO |
4082 | "md: md_do_sync() got signal ... exiting\n"); | 4070 | "md: md_do_sync() got signal ... exiting\n"); |
4083 | flush_signals(current); | ||
4084 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); | 4071 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
4085 | goto out; | 4072 | goto out; |
4086 | } | 4073 | } |
@@ -4102,7 +4089,7 @@ static void md_do_sync(mddev_t *mddev) | |||
4102 | if (currspeed > sysctl_speed_limit_min) { | 4089 | if (currspeed > sysctl_speed_limit_min) { |
4103 | if ((currspeed > sysctl_speed_limit_max) || | 4090 | if ((currspeed > sysctl_speed_limit_max) || |
4104 | !is_mddev_idle(mddev)) { | 4091 | !is_mddev_idle(mddev)) { |
4105 | msleep_interruptible(250); | 4092 | msleep(250); |
4106 | goto repeat; | 4093 | goto repeat; |
4107 | } | 4094 | } |
4108 | } | 4095 | } |