aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/file-item.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index edb69b4d5335..89af104c7569 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -284,6 +284,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
284 struct btrfs_ordered_sum *sums; 284 struct btrfs_ordered_sum *sums;
285 struct btrfs_sector_sum *sector_sum; 285 struct btrfs_sector_sum *sector_sum;
286 struct btrfs_csum_item *item; 286 struct btrfs_csum_item *item;
287 LIST_HEAD(tmplist);
287 unsigned long offset; 288 unsigned long offset;
288 int ret; 289 int ret;
289 size_t size; 290 size_t size;
@@ -358,7 +359,10 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
358 MAX_ORDERED_SUM_BYTES(root)); 359 MAX_ORDERED_SUM_BYTES(root));
359 sums = kzalloc(btrfs_ordered_sum_size(root, size), 360 sums = kzalloc(btrfs_ordered_sum_size(root, size),
360 GFP_NOFS); 361 GFP_NOFS);
361 BUG_ON(!sums); 362 if (!sums) {
363 ret = -ENOMEM;
364 goto fail;
365 }
362 366
363 sector_sum = sums->sums; 367 sector_sum = sums->sums;
364 sums->bytenr = start; 368 sums->bytenr = start;
@@ -380,12 +384,19 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
380 offset += csum_size; 384 offset += csum_size;
381 sector_sum++; 385 sector_sum++;
382 } 386 }
383 list_add_tail(&sums->list, list); 387 list_add_tail(&sums->list, &tmplist);
384 } 388 }
385 path->slots[0]++; 389 path->slots[0]++;
386 } 390 }
387 ret = 0; 391 ret = 0;
388fail: 392fail:
393 while (ret < 0 && !list_empty(&tmplist)) {
394 sums = list_entry(&tmplist, struct btrfs_ordered_sum, list);
395 list_del(&sums->list);
396 kfree(sums);
397 }
398 list_splice_tail(&tmplist, list);
399
389 btrfs_free_path(path); 400 btrfs_free_path(path);
390 return ret; 401 return ret;
391} 402}