upstream commit 2ad49887150894b9ed6a87a76b409adceee6b074
Motivated from the commit,
I found that cleaner_kthread() and transaction_kthread()
can result similar error since these two function can exit
even though kthread_should_stop() is not true.
In order to resolve the bug, break statements are changed
into continue statements in order to wait until kthread_should_stop()
becomes true.
--- a/fs/btrfs/async-thread.c
+++ b/fs/btrfs/async-thread.c
--- a/fs/btrfs/disk-io.c 2009-08-17 06:19:38.000000000 +0900
+++ a/fs/btrfs/disk-io.c 2009-09-03 19:09:14.640625000 +0900
@@ -1435,7 +1435,7 @@
do {
smp_mb();
if (root->fs_info->closing)
- break;
+ continue;
vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
mutex_lock(&root->fs_info->cleaner_mutex);
@@ -1447,7 +1447,7 @@
} else {
smp_mb();
if (root->fs_info->closing)
- break;
+ continue;
set_current_state(TASK_INTERRUPTIBLE);
schedule();
__set_current_state(TASK_RUNNING);
@@ -1468,7 +1468,7 @@
do {
smp_mb();
if (root->fs_info->closing)
- break;
+ continue;
delay = HZ * 30;
vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
@@ -1499,7 +1499,7 @@
refrigerator();
} else {
if (root->fs_info->closing)
- break;
+ continue;
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(delay);
__set_current_state(TASK_RUNNING);
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html