Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

btrfs: Fix bugs in zlib workspace

- Fix a race that can result in alloc_workspace > cpus.
- Fix to check num_workspace after wakeup.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>

Li Zefan 8844355d 83a50de9

+5 -2
+5 -2
fs/btrfs/zlib.c
··· 75 75 return workspace; 76 76 77 77 } 78 - spin_unlock(&workspace_lock); 79 78 if (atomic_read(&alloc_workspace) > cpus) { 80 79 DEFINE_WAIT(wait); 80 + 81 + spin_unlock(&workspace_lock); 81 82 prepare_to_wait(&workspace_wait, &wait, TASK_UNINTERRUPTIBLE); 82 - if (atomic_read(&alloc_workspace) > cpus) 83 + if (atomic_read(&alloc_workspace) > cpus && !num_workspace) 83 84 schedule(); 84 85 finish_wait(&workspace_wait, &wait); 85 86 goto again; 86 87 } 87 88 atomic_inc(&alloc_workspace); 89 + spin_unlock(&workspace_lock); 90 + 88 91 workspace = kzalloc(sizeof(*workspace), GFP_NOFS); 89 92 if (!workspace) { 90 93 ret = -ENOMEM;