diff options
Diffstat (limited to 'fs/btrfs/async-thread.c')
-rw-r--r-- | fs/btrfs/async-thread.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index d5f4e94f2ca2..f2e80f3768ec 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c | |||
@@ -349,6 +349,7 @@ int btrfs_requeue_work(struct btrfs_work *work) | |||
349 | { | 349 | { |
350 | struct btrfs_worker_thread *worker = work->worker; | 350 | struct btrfs_worker_thread *worker = work->worker; |
351 | unsigned long flags; | 351 | unsigned long flags; |
352 | int wake = 0; | ||
352 | 353 | ||
353 | if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags)) | 354 | if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags)) |
354 | goto out; | 355 | goto out; |
@@ -367,10 +368,16 @@ int btrfs_requeue_work(struct btrfs_work *work) | |||
367 | &worker->workers->worker_list); | 368 | &worker->workers->worker_list); |
368 | spin_unlock_irqrestore(&worker->workers->lock, flags); | 369 | spin_unlock_irqrestore(&worker->workers->lock, flags); |
369 | } | 370 | } |
371 | if (!worker->working) { | ||
372 | wake = 1; | ||
373 | worker->working = 1; | ||
374 | } | ||
370 | 375 | ||
371 | spin_unlock_irqrestore(&worker->lock, flags); | 376 | spin_unlock_irqrestore(&worker->lock, flags); |
372 | 377 | if (wake) | |
378 | wake_up_process(worker->task); | ||
373 | out: | 379 | out: |
380 | |||
374 | return 0; | 381 | return 0; |
375 | } | 382 | } |
376 | 383 | ||
@@ -397,6 +404,7 @@ int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work) | |||
397 | } | 404 | } |
398 | 405 | ||
399 | spin_lock_irqsave(&worker->lock, flags); | 406 | spin_lock_irqsave(&worker->lock, flags); |
407 | |||
400 | atomic_inc(&worker->num_pending); | 408 | atomic_inc(&worker->num_pending); |
401 | check_busy_worker(worker); | 409 | check_busy_worker(worker); |
402 | list_add_tail(&work->list, &worker->pending); | 410 | list_add_tail(&work->list, &worker->pending); |