btrfs: Fix busyloop in transaction_kthread()
When a filesystem got aborted due do error, transaction_kthread() will busyloop. Fix it by going to sleep in that case as well. Maybe we should just stop transaction_kthread() when filesystem is aborted but that would be more complex. Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
79787eaab4
commit
914b20070b
1 changed files with 7 additions and 2 deletions
|
@ -1640,8 +1640,10 @@ static int transaction_kthread(void *arg)
|
||||||
u64 transid;
|
u64 transid;
|
||||||
unsigned long now;
|
unsigned long now;
|
||||||
unsigned long delay;
|
unsigned long delay;
|
||||||
|
bool cannot_commit;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
cannot_commit = false;
|
||||||
delay = HZ * 30;
|
delay = HZ * 30;
|
||||||
vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
|
vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
|
||||||
mutex_lock(&root->fs_info->transaction_kthread_mutex);
|
mutex_lock(&root->fs_info->transaction_kthread_mutex);
|
||||||
|
@ -1665,8 +1667,10 @@ static int transaction_kthread(void *arg)
|
||||||
|
|
||||||
/* If the file system is aborted, this will always fail. */
|
/* If the file system is aborted, this will always fail. */
|
||||||
trans = btrfs_join_transaction(root);
|
trans = btrfs_join_transaction(root);
|
||||||
if (IS_ERR(trans))
|
if (IS_ERR(trans)) {
|
||||||
|
cannot_commit = true;
|
||||||
goto sleep;
|
goto sleep;
|
||||||
|
}
|
||||||
if (transid == trans->transid) {
|
if (transid == trans->transid) {
|
||||||
btrfs_commit_transaction(trans, root);
|
btrfs_commit_transaction(trans, root);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1679,7 +1683,8 @@ static int transaction_kthread(void *arg)
|
||||||
if (!try_to_freeze()) {
|
if (!try_to_freeze()) {
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
set_current_state(TASK_INTERRUPTIBLE);
|
||||||
if (!kthread_should_stop() &&
|
if (!kthread_should_stop() &&
|
||||||
!btrfs_transaction_blocked(root->fs_info))
|
(!btrfs_transaction_blocked(root->fs_info) ||
|
||||||
|
cannot_commit))
|
||||||
schedule_timeout(delay);
|
schedule_timeout(delay);
|
||||||
__set_current_state(TASK_RUNNING);
|
__set_current_state(TASK_RUNNING);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue