提交 86e06008 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs

Pull btrfs updates from Chris Mason:
 "I have two additional and btrfs fixes in my for-linus branch.  One is
  a casting error that leads to memory corruption on i386 during scrub,
  and the other fixes a corner case in the backref walking code (also
  triggered by scrub)."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
  Btrfs: fix casting error in scrub reada code
  btrfs: fix locking issues in find_parent_nodes()
...@@ -583,7 +583,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, ...@@ -583,7 +583,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
struct btrfs_path *path; struct btrfs_path *path;
struct btrfs_key info_key = { 0 }; struct btrfs_key info_key = { 0 };
struct btrfs_delayed_ref_root *delayed_refs = NULL; struct btrfs_delayed_ref_root *delayed_refs = NULL;
struct btrfs_delayed_ref_head *head = NULL; struct btrfs_delayed_ref_head *head;
int info_level = 0; int info_level = 0;
int ret; int ret;
struct list_head prefs_delayed; struct list_head prefs_delayed;
...@@ -607,6 +607,8 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, ...@@ -607,6 +607,8 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
* at a specified point in time * at a specified point in time
*/ */
again: again:
head = NULL;
ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0);
if (ret < 0) if (ret < 0)
goto out; goto out;
...@@ -635,9 +637,11 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, ...@@ -635,9 +637,11 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
goto again; goto again;
} }
ret = __add_delayed_refs(head, seq, &info_key, &prefs_delayed); ret = __add_delayed_refs(head, seq, &info_key, &prefs_delayed);
if (ret) if (ret) {
spin_unlock(&delayed_refs->lock);
goto out; goto out;
} }
}
spin_unlock(&delayed_refs->lock); spin_unlock(&delayed_refs->lock);
if (path->slots[0]) { if (path->slots[0]) {
......
...@@ -305,7 +305,7 @@ static struct reada_zone *reada_find_zone(struct btrfs_fs_info *fs_info, ...@@ -305,7 +305,7 @@ static struct reada_zone *reada_find_zone(struct btrfs_fs_info *fs_info,
spin_lock(&fs_info->reada_lock); spin_lock(&fs_info->reada_lock);
ret = radix_tree_insert(&dev->reada_zones, ret = radix_tree_insert(&dev->reada_zones,
(unsigned long)zone->end >> PAGE_CACHE_SHIFT, (unsigned long)(zone->end >> PAGE_CACHE_SHIFT),
zone); zone);
spin_unlock(&fs_info->reada_lock); spin_unlock(&fs_info->reada_lock);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册