diff options
-rw-r--r-- | fs/btrfs/file-item.c | 15 |
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; |
388 | fail: | 392 | fail: |
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 | } |