diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-09 21:09:18 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-09 21:09:18 -0500 |
| commit | 86e06008338e5712603613a0f6770500f79e83bd (patch) | |
| tree | 53d8e522e7d876b52c09bcbefac80836b3ceaa5c | |
| parent | be22aece684f5a700e6247b9861c3759d5798a3c (diff) | |
| parent | a175423c831ea582c06784d1e172d2ce1d79923a (diff) | |
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()
| -rw-r--r-- | fs/btrfs/backref.c | 8 | ||||
| -rw-r--r-- | fs/btrfs/reada.c | 2 |
2 files changed, 7 insertions, 3 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 98f6bf10bbd4..0436c12da8c2 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
| @@ -583,7 +583,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, | |||
| 583 | struct btrfs_path *path; | 583 | struct btrfs_path *path; |
| 584 | struct btrfs_key info_key = { 0 }; | 584 | struct btrfs_key info_key = { 0 }; |
| 585 | struct btrfs_delayed_ref_root *delayed_refs = NULL; | 585 | struct btrfs_delayed_ref_root *delayed_refs = NULL; |
| 586 | struct btrfs_delayed_ref_head *head = NULL; | 586 | struct btrfs_delayed_ref_head *head; |
| 587 | int info_level = 0; | 587 | int info_level = 0; |
| 588 | int ret; | 588 | int ret; |
| 589 | struct list_head prefs_delayed; | 589 | struct list_head prefs_delayed; |
| @@ -607,6 +607,8 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans, | |||
| 607 | * at a specified point in time | 607 | * at a specified point in time |
| 608 | */ | 608 | */ |
| 609 | again: | 609 | again: |
| 610 | head = NULL; | ||
| 611 | |||
| 610 | ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); | 612 | ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 0); |
| 611 | if (ret < 0) | 613 | if (ret < 0) |
| 612 | goto out; | 614 | goto out; |
| @@ -635,8 +637,10 @@ again: | |||
| 635 | goto again; | 637 | goto again; |
| 636 | } | 638 | } |
| 637 | ret = __add_delayed_refs(head, seq, &info_key, &prefs_delayed); | 639 | ret = __add_delayed_refs(head, seq, &info_key, &prefs_delayed); |
| 638 | if (ret) | 640 | if (ret) { |
| 641 | spin_unlock(&delayed_refs->lock); | ||
| 639 | goto out; | 642 | goto out; |
| 643 | } | ||
| 640 | } | 644 | } |
| 641 | spin_unlock(&delayed_refs->lock); | 645 | spin_unlock(&delayed_refs->lock); |
| 642 | 646 | ||
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c index 2373b39a132b..22db04550f6a 100644 --- a/fs/btrfs/reada.c +++ b/fs/btrfs/reada.c | |||
| @@ -305,7 +305,7 @@ again: | |||
| 305 | 305 | ||
| 306 | spin_lock(&fs_info->reada_lock); | 306 | spin_lock(&fs_info->reada_lock); |
| 307 | ret = radix_tree_insert(&dev->reada_zones, | 307 | ret = radix_tree_insert(&dev->reada_zones, |
| 308 | (unsigned long)zone->end >> PAGE_CACHE_SHIFT, | 308 | (unsigned long)(zone->end >> PAGE_CACHE_SHIFT), |
| 309 | zone); | 309 | zone); |
| 310 | spin_unlock(&fs_info->reada_lock); | 310 | spin_unlock(&fs_info->reada_lock); |
| 311 | 311 | ||
