aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-01-14 09:13:53 +1100
committerNeilBrown <neilb@suse.de>2011-01-14 09:13:53 +1100
commit6c9879101442b08581e8a0e3ae6b7f643a78fd63 (patch)
treebfe780d4e09896988fe367aa329a94daf55163c9 /drivers
parentbf572541ab44240163eaa2d486b06f306a31d45a (diff)
downloadkernel_samsung_smdk4412-6c9879101442b08581e8a0e3ae6b7f643a78fd63.zip
kernel_samsung_smdk4412-6c9879101442b08581e8a0e3ae6b7f643a78fd63.tar.gz
kernel_samsung_smdk4412-6c9879101442b08581e8a0e3ae6b7f643a78fd63.tar.bz2
md: fix regression resulting in delays in clearing bits in a bitmap
commit 589a594be1fb (2.6.37-rc4) fixed a problem were md_thread would sometimes call the ->run function at a bad time. If an error is detected during array start up after the md_thread has been started, the md_thread is killed. This resulted in the ->run function being called once. However the array may not be in a state that it is safe to call ->run. However the fix imposed meant that ->run was not called on a timeout. This means that when an array goes idle, bitmap bits do not get cleared promptly. While the array is busy the bits will still be cleared when appropriate so this is not very serious. There is no risk to data. Change the test so that we only avoid calling ->run when the thread is being stopped. This more explicitly addresses the problem situation. This is suitable for 2.6.37-stable and any -stable kernel to which 589a594be1fb was applied. Cc: stable@kernel.org Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/md.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 0da25da..a301912 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -6042,7 +6042,8 @@ static int md_thread(void * arg)
|| kthread_should_stop(),
thread->timeout);
- if (test_and_clear_bit(THREAD_WAKEUP, &thread->flags))
+ clear_bit(THREAD_WAKEUP, &thread->flags);
+ if (!kthread_should_stop())
thread->run(thread->mddev);
}