提交 a1ecaabb 编写于 作者: W Wang Shilong 提交者: Chris Mason

Btrfs: fix unlock in __start_delalloc_inodes()

This patch fix a regression caused by the following patch:
Btrfs: don't flush all delalloc inodes when we doesn't get s_umount lock

break while loop will make us call @spin_unlock() without
calling @spin_lock() before, fix it.
Signed-off-by: NWang Shilong <wangsl.fnst@cn.fujitsu.com>
Reviewed-by: NDavid Sterba <dsterba@suse.cz>
Signed-off-by: NChris Mason <clm@fb.com>
上级 3b080b25
...@@ -8500,19 +8500,20 @@ static int __start_delalloc_inodes(struct btrfs_root *root, int delay_iput, ...@@ -8500,19 +8500,20 @@ static int __start_delalloc_inodes(struct btrfs_root *root, int delay_iput,
else else
iput(inode); iput(inode);
ret = -ENOMEM; ret = -ENOMEM;
break; goto out;
} }
list_add_tail(&work->list, &works); list_add_tail(&work->list, &works);
btrfs_queue_work(root->fs_info->flush_workers, btrfs_queue_work(root->fs_info->flush_workers,
&work->work); &work->work);
ret++; ret++;
if (nr != -1 && ret >= nr) if (nr != -1 && ret >= nr)
break; goto out;
cond_resched(); cond_resched();
spin_lock(&root->delalloc_lock); spin_lock(&root->delalloc_lock);
} }
spin_unlock(&root->delalloc_lock); spin_unlock(&root->delalloc_lock);
out:
list_for_each_entry_safe(work, next, &works, list) { list_for_each_entry_safe(work, next, &works, list) {
list_del_init(&work->list); list_del_init(&work->list);
btrfs_wait_and_free_delalloc_work(work); btrfs_wait_and_free_delalloc_work(work);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册