| From: Nikolay Borisov <nborisov@suse.com> |
| Date: Thu, 5 Apr 2018 10:40:15 +0300 |
| Subject: btrfs: Fix possible softlock on single core machines |
| |
| commit 1e1c50a929bc9e49bc3f9935b92450d9e69f8158 upstream. |
| |
| do_chunk_alloc implements a loop checking whether there is a pending |
| chunk allocation and if so causes the caller do loop. Generally this |
| loop is executed only once, however testing with btrfs/072 on a single |
| core vm machines uncovered an extreme case where the system could loop |
| indefinitely. This is due to a missing cond_resched when loop which |
| doesn't give a chance to the previous chunk allocator finish its job. |
| |
| The fix is to simply add the missing cond_resched. |
| |
| Fixes: 6d74119f1a3e ("Btrfs: avoid taking the chunk_mutex in do_chunk_alloc") |
| Signed-off-by: Nikolay Borisov <nborisov@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| fs/btrfs/extent-tree.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/fs/btrfs/extent-tree.c |
| +++ b/fs/btrfs/extent-tree.c |
| @@ -3969,6 +3969,7 @@ again: |
| if (wait_for_alloc) { |
| mutex_unlock(&fs_info->chunk_mutex); |
| wait_for_alloc = 0; |
| + cond_resched(); |
| goto again; |
| } |
| |