Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8844355d authored by Li Zefan's avatar Li Zefan
Browse files

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: default avatarLi Zefan <lizf@cn.fujitsu.com>
parent 83a50de9
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -75,16 +75,19 @@ again:
		return workspace;

	}
	spin_unlock(&workspace_lock);
	if (atomic_read(&alloc_workspace) > cpus) {
		DEFINE_WAIT(wait);

		spin_unlock(&workspace_lock);
		prepare_to_wait(&workspace_wait, &wait, TASK_UNINTERRUPTIBLE);
		if (atomic_read(&alloc_workspace) > cpus)
		if (atomic_read(&alloc_workspace) > cpus && !num_workspace)
			schedule();
		finish_wait(&workspace_wait, &wait);
		goto again;
	}
	atomic_inc(&alloc_workspace);
	spin_unlock(&workspace_lock);

	workspace = kzalloc(sizeof(*workspace), GFP_NOFS);
	if (!workspace) {
		ret = -ENOMEM;