Loading fs/btrfs/async-thread.c +19 −6 Original line number Diff line number Diff line Loading @@ -107,7 +107,8 @@ static void check_idle_worker(struct btrfs_worker_thread *worker) worker->idle = 1; /* the list may be empty if the worker is just starting */ if (!list_empty(&worker->worker_list)) { if (!list_empty(&worker->worker_list) && !worker->workers->stopping) { list_move(&worker->worker_list, &worker->workers->idle_list); } Loading @@ -127,7 +128,8 @@ static void check_busy_worker(struct btrfs_worker_thread *worker) spin_lock_irqsave(&worker->workers->lock, flags); worker->idle = 0; if (!list_empty(&worker->worker_list)) { if (!list_empty(&worker->worker_list) && !worker->workers->stopping) { list_move_tail(&worker->worker_list, &worker->workers->worker_list); } Loading Loading @@ -412,6 +414,7 @@ void btrfs_stop_workers(struct btrfs_workers *workers) int can_stop; spin_lock_irq(&workers->lock); workers->stopping = 1; list_splice_init(&workers->idle_list, &workers->worker_list); while (!list_empty(&workers->worker_list)) { cur = workers->worker_list.next; Loading Loading @@ -455,6 +458,7 @@ void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max, workers->ordered = 0; workers->atomic_start_pending = 0; workers->atomic_worker_start = async_helper; workers->stopping = 0; } /* Loading @@ -480,15 +484,19 @@ static int __btrfs_start_workers(struct btrfs_workers *workers) atomic_set(&worker->num_pending, 0); atomic_set(&worker->refs, 1); worker->workers = workers; worker->task = kthread_run(worker_loop, worker, worker->task = kthread_create(worker_loop, worker, "btrfs-%s-%d", workers->name, workers->num_workers + 1); if (IS_ERR(worker->task)) { ret = PTR_ERR(worker->task); kfree(worker); goto fail; } spin_lock_irq(&workers->lock); if (workers->stopping) { spin_unlock_irq(&workers->lock); goto fail_kthread; } list_add_tail(&worker->worker_list, &workers->idle_list); worker->idle = 1; workers->num_workers++; Loading @@ -496,8 +504,13 @@ static int __btrfs_start_workers(struct btrfs_workers *workers) WARN_ON(workers->num_workers_starting < 0); spin_unlock_irq(&workers->lock); wake_up_process(worker->task); return 0; fail_kthread: kthread_stop(worker->task); fail: kfree(worker); spin_lock_irq(&workers->lock); workers->num_workers_starting--; spin_unlock_irq(&workers->lock); Loading fs/btrfs/async-thread.h +2 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,8 @@ struct btrfs_workers { /* extra name for this worker, used for current->name */ char *name; int stopping; }; void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work); Loading fs/btrfs/dev-replace.c +1 −4 Original line number Diff line number Diff line Loading @@ -535,10 +535,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list); btrfs_rm_dev_replace_srcdev(fs_info, src_device); if (src_device->bdev) { /* zero out the old super */ btrfs_scratch_superblock(src_device); } /* * this is again a consistent state where no dev_replace procedure * is running, the target device is part of the filesystem, the Loading fs/btrfs/extent_io.c +1 −1 Original line number Diff line number Diff line Loading @@ -1614,7 +1614,7 @@ static noinline u64 find_lock_delalloc_range(struct inode *inode, *start = delalloc_start; *end = delalloc_end; free_extent_state(cached_state); return found; return 0; } /* Loading fs/btrfs/transaction.c +2 −5 Original line number Diff line number Diff line Loading @@ -1838,11 +1838,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, assert_qgroups_uptodate(trans); update_super_roots(root); if (!root->fs_info->log_root_recovering) { btrfs_set_super_log_root(root->fs_info->super_copy, 0); btrfs_set_super_log_root_level(root->fs_info->super_copy, 0); } memcpy(root->fs_info->super_for_commit, root->fs_info->super_copy, sizeof(*root->fs_info->super_copy)); Loading Loading
fs/btrfs/async-thread.c +19 −6 Original line number Diff line number Diff line Loading @@ -107,7 +107,8 @@ static void check_idle_worker(struct btrfs_worker_thread *worker) worker->idle = 1; /* the list may be empty if the worker is just starting */ if (!list_empty(&worker->worker_list)) { if (!list_empty(&worker->worker_list) && !worker->workers->stopping) { list_move(&worker->worker_list, &worker->workers->idle_list); } Loading @@ -127,7 +128,8 @@ static void check_busy_worker(struct btrfs_worker_thread *worker) spin_lock_irqsave(&worker->workers->lock, flags); worker->idle = 0; if (!list_empty(&worker->worker_list)) { if (!list_empty(&worker->worker_list) && !worker->workers->stopping) { list_move_tail(&worker->worker_list, &worker->workers->worker_list); } Loading Loading @@ -412,6 +414,7 @@ void btrfs_stop_workers(struct btrfs_workers *workers) int can_stop; spin_lock_irq(&workers->lock); workers->stopping = 1; list_splice_init(&workers->idle_list, &workers->worker_list); while (!list_empty(&workers->worker_list)) { cur = workers->worker_list.next; Loading Loading @@ -455,6 +458,7 @@ void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max, workers->ordered = 0; workers->atomic_start_pending = 0; workers->atomic_worker_start = async_helper; workers->stopping = 0; } /* Loading @@ -480,15 +484,19 @@ static int __btrfs_start_workers(struct btrfs_workers *workers) atomic_set(&worker->num_pending, 0); atomic_set(&worker->refs, 1); worker->workers = workers; worker->task = kthread_run(worker_loop, worker, worker->task = kthread_create(worker_loop, worker, "btrfs-%s-%d", workers->name, workers->num_workers + 1); if (IS_ERR(worker->task)) { ret = PTR_ERR(worker->task); kfree(worker); goto fail; } spin_lock_irq(&workers->lock); if (workers->stopping) { spin_unlock_irq(&workers->lock); goto fail_kthread; } list_add_tail(&worker->worker_list, &workers->idle_list); worker->idle = 1; workers->num_workers++; Loading @@ -496,8 +504,13 @@ static int __btrfs_start_workers(struct btrfs_workers *workers) WARN_ON(workers->num_workers_starting < 0); spin_unlock_irq(&workers->lock); wake_up_process(worker->task); return 0; fail_kthread: kthread_stop(worker->task); fail: kfree(worker); spin_lock_irq(&workers->lock); workers->num_workers_starting--; spin_unlock_irq(&workers->lock); Loading
fs/btrfs/async-thread.h +2 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,8 @@ struct btrfs_workers { /* extra name for this worker, used for current->name */ char *name; int stopping; }; void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work); Loading
fs/btrfs/dev-replace.c +1 −4 Original line number Diff line number Diff line Loading @@ -535,10 +535,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list); btrfs_rm_dev_replace_srcdev(fs_info, src_device); if (src_device->bdev) { /* zero out the old super */ btrfs_scratch_superblock(src_device); } /* * this is again a consistent state where no dev_replace procedure * is running, the target device is part of the filesystem, the Loading
fs/btrfs/extent_io.c +1 −1 Original line number Diff line number Diff line Loading @@ -1614,7 +1614,7 @@ static noinline u64 find_lock_delalloc_range(struct inode *inode, *start = delalloc_start; *end = delalloc_end; free_extent_state(cached_state); return found; return 0; } /* Loading
fs/btrfs/transaction.c +2 −5 Original line number Diff line number Diff line Loading @@ -1838,11 +1838,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, assert_qgroups_uptodate(trans); update_super_roots(root); if (!root->fs_info->log_root_recovering) { btrfs_set_super_log_root(root->fs_info->super_copy, 0); btrfs_set_super_log_root_level(root->fs_info->super_copy, 0); } memcpy(root->fs_info->super_for_commit, root->fs_info->super_copy, sizeof(*root->fs_info->super_copy)); Loading