Three one-liners in md.c
A message that is not in the archive (sent off-list or not yet received): 20051018103524.2617.patches@notabene
PATCH 1/1 Three one-liners in md.c
This patch against anything since 2.6.14-rc1 (I think) fixes three md bugs. If there is to be another 2.6.14-rc, it would be nice for it to go in that, but if not, it isn't critial.
The main problem fixes is that in certain situations stopping md arrays may take longer than you expect, or may require multiple attempts. This would only happen when resync/recovery is happening.
### Comments for Changeset
This patch fixes three vaguely related bugs.
1/ The recent change to use kthreads got the setting of the
process name wrong. This fixes it.
2/ The recent change to use kthreads lost the ability for
md threads to be signalled with SIG_KILL. This restores that.
3/ There is a long standing bug in that if:
- An array needs recovery (onto a hot-spare) and
- The recovery is being blocked because some other array being recovered shares a physical device and
- The recovery thread is killed with SIG_KILL
Then the recovery will appear to have completed with no IO being done, which can cause data corruption.
This patch makes sure that incomplete recovery will be treated as incomplete.
Note that any kernel affected by bug 2 will not suffer the problem of
bug 3, as the signal can never be delivered. Thus the current
2.6.14-rc kernels are not susceptible to data corruption.
Note also that if arrays are shutdown (with "mdadm -S" or "raidstop")
then the problem doesn't occur. It only happens if a SIGKILL is
independently delivered as done by 'init' when shutting down.Signed-off-by: Neil Brown <[email protected]>
### Diffstat output
./drivers/md/md.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/md/md.c renamed from drivers/md/md.c~current~ +3 -1
@@ -3420,6 +3420,7 @@ static int md_thread(void * arg)* many dirty RAID5 blocks. */ +allow_signal (SIGKILL );complete (thread->event);while (!kthread_should_stop ()) {void (*run)(mddev_t *);
@@ -3468,7 +3469,7 @@ mdk_thread_t *md_register_thread(void (* thread->mddev = mddev; thread->name = name; thread->timeout =MAX_SCHEDULE_TIMEOUT ; - thread->tsk =kthread_run (md_thread, thread,mdname (thread->mddev)); + thread->tsk =kthread_run (md_thread, thread, name,mdname (thread->mddev));if (IS_ERR (thread->tsk)) {kfree (thread);return NULL ;
@@ -3926,6 +3927,7 @@ static void md_do_sync(mddev_t *mddev) try_again:if (signal_pending (current)) {flush_signals (current); +set_bit (MD_RECOVERY_INTR , &mddev->recovery); goto skip; } ITERATE_MDDEV(mddev2,tmp) {