Btrfs: fix worker lock misuse in find_worker
Dan Carpenter noticed that we were doing a double unlock on the worker lock, and sometimes picking a worker thread without the lock held. This fixes both errors. Signed-off-by: Chris Mason <chris.mason@oracle.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
This commit is contained in:
@@ -563,8 +563,8 @@ static struct btrfs_worker_thread *find_worker(struct btrfs_workers *workers)
|
|||||||
struct list_head *fallback;
|
struct list_head *fallback;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
again:
|
|
||||||
spin_lock_irqsave(&workers->lock, flags);
|
spin_lock_irqsave(&workers->lock, flags);
|
||||||
|
again:
|
||||||
worker = next_worker(workers);
|
worker = next_worker(workers);
|
||||||
|
|
||||||
if (!worker) {
|
if (!worker) {
|
||||||
@@ -579,6 +579,7 @@ again:
|
|||||||
spin_unlock_irqrestore(&workers->lock, flags);
|
spin_unlock_irqrestore(&workers->lock, flags);
|
||||||
/* we're below the limit, start another worker */
|
/* we're below the limit, start another worker */
|
||||||
ret = __btrfs_start_workers(workers);
|
ret = __btrfs_start_workers(workers);
|
||||||
|
spin_lock_irqsave(&workers->lock, flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fallback;
|
goto fallback;
|
||||||
goto again;
|
goto again;
|
||||||
|
Reference in New Issue
Block a user