diff options
Diffstat (limited to 'fs/btrfs/send.c')
-rw-r--r-- | fs/btrfs/send.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 730dce395858..9dde9717c1b9 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
@@ -24,12 +24,12 @@ | |||
24 | #include <linux/xattr.h> | 24 | #include <linux/xattr.h> |
25 | #include <linux/posix_acl_xattr.h> | 25 | #include <linux/posix_acl_xattr.h> |
26 | #include <linux/radix-tree.h> | 26 | #include <linux/radix-tree.h> |
27 | #include <linux/crc32c.h> | ||
28 | #include <linux/vmalloc.h> | 27 | #include <linux/vmalloc.h> |
29 | #include <linux/string.h> | 28 | #include <linux/string.h> |
30 | 29 | ||
31 | #include "send.h" | 30 | #include "send.h" |
32 | #include "backref.h" | 31 | #include "backref.h" |
32 | #include "hash.h" | ||
33 | #include "locking.h" | 33 | #include "locking.h" |
34 | #include "disk-io.h" | 34 | #include "disk-io.h" |
35 | #include "btrfs_inode.h" | 35 | #include "btrfs_inode.h" |
@@ -620,7 +620,7 @@ static int send_cmd(struct send_ctx *sctx) | |||
620 | hdr->len = cpu_to_le32(sctx->send_size - sizeof(*hdr)); | 620 | hdr->len = cpu_to_le32(sctx->send_size - sizeof(*hdr)); |
621 | hdr->crc = 0; | 621 | hdr->crc = 0; |
622 | 622 | ||
623 | crc = crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size); | 623 | crc = btrfs_crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size); |
624 | hdr->crc = cpu_to_le32(crc); | 624 | hdr->crc = cpu_to_le32(crc); |
625 | 625 | ||
626 | ret = write_buf(sctx->send_filp, sctx->send_buf, sctx->send_size, | 626 | ret = write_buf(sctx->send_filp, sctx->send_buf, sctx->send_size, |
@@ -1332,6 +1332,16 @@ verbose_printk(KERN_DEBUG "btrfs: find_extent_clone: data_offset=%llu, " | |||
1332 | } | 1332 | } |
1333 | 1333 | ||
1334 | if (cur_clone_root) { | 1334 | if (cur_clone_root) { |
1335 | if (compressed != BTRFS_COMPRESS_NONE) { | ||
1336 | /* | ||
1337 | * Offsets given by iterate_extent_inodes() are relative | ||
1338 | * to the start of the extent, we need to add logical | ||
1339 | * offset from the file extent item. | ||
1340 | * (See why at backref.c:check_extent_in_eb()) | ||
1341 | */ | ||
1342 | cur_clone_root->offset += btrfs_file_extent_offset(eb, | ||
1343 | fi); | ||
1344 | } | ||
1335 | *found = cur_clone_root; | 1345 | *found = cur_clone_root; |
1336 | ret = 0; | 1346 | ret = 0; |
1337 | } else { | 1347 | } else { |
@@ -2774,8 +2784,6 @@ static int add_waiting_dir_move(struct send_ctx *sctx, u64 ino) | |||
2774 | return 0; | 2784 | return 0; |
2775 | } | 2785 | } |
2776 | 2786 | ||
2777 | #ifdef CONFIG_BTRFS_ASSERT | ||
2778 | |||
2779 | static int del_waiting_dir_move(struct send_ctx *sctx, u64 ino) | 2787 | static int del_waiting_dir_move(struct send_ctx *sctx, u64 ino) |
2780 | { | 2788 | { |
2781 | struct rb_node *n = sctx->waiting_dir_moves.rb_node; | 2789 | struct rb_node *n = sctx->waiting_dir_moves.rb_node; |
@@ -2796,8 +2804,6 @@ static int del_waiting_dir_move(struct send_ctx *sctx, u64 ino) | |||
2796 | return -ENOENT; | 2804 | return -ENOENT; |
2797 | } | 2805 | } |
2798 | 2806 | ||
2799 | #endif | ||
2800 | |||
2801 | static int add_pending_dir_move(struct send_ctx *sctx, u64 parent_ino) | 2807 | static int add_pending_dir_move(struct send_ctx *sctx, u64 parent_ino) |
2802 | { | 2808 | { |
2803 | struct rb_node **p = &sctx->pending_dir_moves.rb_node; | 2809 | struct rb_node **p = &sctx->pending_dir_moves.rb_node; |
@@ -2902,7 +2908,9 @@ static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm) | |||
2902 | } | 2908 | } |
2903 | 2909 | ||
2904 | sctx->send_progress = sctx->cur_ino + 1; | 2910 | sctx->send_progress = sctx->cur_ino + 1; |
2905 | ASSERT(del_waiting_dir_move(sctx, pm->ino) == 0); | 2911 | ret = del_waiting_dir_move(sctx, pm->ino); |
2912 | ASSERT(ret == 0); | ||
2913 | |||
2906 | ret = get_cur_path(sctx, pm->ino, pm->gen, to_path); | 2914 | ret = get_cur_path(sctx, pm->ino, pm->gen, to_path); |
2907 | if (ret < 0) | 2915 | if (ret < 0) |
2908 | goto out; | 2916 | goto out; |