From 8f2779c767a08c22cc8af47567c20a0d98b4a382 Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Fri, 5 Aug 2011 15:46:16 -0700 Subject: [PATCH] --- yaml --- r: 297877 b: refs/heads/master c: 0678b61851b510ba68341dff59cd9b47e1712e91 h: refs/heads/master i: 297875: 2b52378c4dcf4b89b57536f4733018e06b30a3a6 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/file-item.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 94c5662da532..85e9b506ab60 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: be1a5564fd39fa2ca6adbb41c75fb08f96a1ffcb +refs/heads/master: 0678b61851b510ba68341dff59cd9b47e1712e91 diff --git a/trunk/fs/btrfs/file-item.c b/trunk/fs/btrfs/file-item.c index edb69b4d5335..89af104c7569 100644 --- a/trunk/fs/btrfs/file-item.c +++ b/trunk/fs/btrfs/file-item.c @@ -284,6 +284,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, struct btrfs_ordered_sum *sums; struct btrfs_sector_sum *sector_sum; struct btrfs_csum_item *item; + LIST_HEAD(tmplist); unsigned long offset; int ret; size_t size; @@ -358,7 +359,10 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, MAX_ORDERED_SUM_BYTES(root)); sums = kzalloc(btrfs_ordered_sum_size(root, size), GFP_NOFS); - BUG_ON(!sums); + if (!sums) { + ret = -ENOMEM; + goto fail; + } sector_sum = sums->sums; sums->bytenr = start; @@ -380,12 +384,19 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, offset += csum_size; sector_sum++; } - list_add_tail(&sums->list, list); + list_add_tail(&sums->list, &tmplist); } path->slots[0]++; } ret = 0; fail: + while (ret < 0 && !list_empty(&tmplist)) { + sums = list_entry(&tmplist, struct btrfs_ordered_sum, list); + list_del(&sums->list); + kfree(sums); + } + list_splice_tail(&tmplist, list); + btrfs_free_path(path); return ret; }