diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 83186c7e45d4..9027bb1e7466 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -3357,6 +3357,11 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
| 3357 | if (skip_csum) | 3357 | if (skip_csum) |
| 3358 | return 0; | 3358 | return 0; |
| 3359 | 3359 | ||
| 3360 | if (em->compress_type) { | ||
| 3361 | csum_offset = 0; | ||
| 3362 | csum_len = block_len; | ||
| 3363 | } | ||
| 3364 | |||
| 3360 | /* block start is already adjusted for the file extent offset. */ | 3365 | /* block start is already adjusted for the file extent offset. */ |
| 3361 | ret = btrfs_lookup_csums_range(log->fs_info->csum_root, | 3366 | ret = btrfs_lookup_csums_range(log->fs_info->csum_root, |
| 3362 | em->block_start + csum_offset, | 3367 | em->block_start + csum_offset, |
| @@ -3410,13 +3415,13 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans, | |||
| 3410 | em = list_entry(extents.next, struct extent_map, list); | 3415 | em = list_entry(extents.next, struct extent_map, list); |
| 3411 | 3416 | ||
| 3412 | list_del_init(&em->list); | 3417 | list_del_init(&em->list); |
| 3413 | clear_bit(EXTENT_FLAG_LOGGING, &em->flags); | ||
| 3414 | 3418 | ||
| 3415 | /* | 3419 | /* |
| 3416 | * If we had an error we just need to delete everybody from our | 3420 | * If we had an error we just need to delete everybody from our |
| 3417 | * private list. | 3421 | * private list. |
| 3418 | */ | 3422 | */ |
| 3419 | if (ret) { | 3423 | if (ret) { |
| 3424 | clear_em_logging(tree, em); | ||
| 3420 | free_extent_map(em); | 3425 | free_extent_map(em); |
| 3421 | continue; | 3426 | continue; |
| 3422 | } | 3427 | } |
| @@ -3424,8 +3429,9 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans, | |||
| 3424 | write_unlock(&tree->lock); | 3429 | write_unlock(&tree->lock); |
| 3425 | 3430 | ||
| 3426 | ret = log_one_extent(trans, inode, root, em, path); | 3431 | ret = log_one_extent(trans, inode, root, em, path); |
| 3427 | free_extent_map(em); | ||
| 3428 | write_lock(&tree->lock); | 3432 | write_lock(&tree->lock); |
| 3433 | clear_em_logging(tree, em); | ||
| 3434 | free_extent_map(em); | ||
| 3429 | } | 3435 | } |
| 3430 | WARN_ON(!list_empty(&extents)); | 3436 | WARN_ON(!list_empty(&extents)); |
| 3431 | write_unlock(&tree->lock); | 3437 | write_unlock(&tree->lock); |
