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 @@  #include <linux/xattr.h>  #include <linux/posix_acl_xattr.h>  #include <linux/radix-tree.h> -#include <linux/crc32c.h>  #include <linux/vmalloc.h>  #include <linux/string.h>  #include "send.h"  #include "backref.h" +#include "hash.h"  #include "locking.h"  #include "disk-io.h"  #include "btrfs_inode.h" @@ -620,7 +620,7 @@ static int send_cmd(struct send_ctx *sctx)  	hdr->len = cpu_to_le32(sctx->send_size - sizeof(*hdr));  	hdr->crc = 0; -	crc = crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size); +	crc = btrfs_crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size);  	hdr->crc = cpu_to_le32(crc);  	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, "  	}  	if (cur_clone_root) { +		if (compressed != BTRFS_COMPRESS_NONE) { +			/* +			 * Offsets given by iterate_extent_inodes() are relative +			 * to the start of the extent, we need to add logical +			 * offset from the file extent item. +			 * (See why at backref.c:check_extent_in_eb()) +			 */ +			cur_clone_root->offset += btrfs_file_extent_offset(eb, +									   fi); +		}  		*found = cur_clone_root;  		ret = 0;  	} else { @@ -2774,8 +2784,6 @@ static int add_waiting_dir_move(struct send_ctx *sctx, u64 ino)  	return 0;  } -#ifdef CONFIG_BTRFS_ASSERT -  static int del_waiting_dir_move(struct send_ctx *sctx, u64 ino)  {  	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)  	return -ENOENT;  } -#endif -  static int add_pending_dir_move(struct send_ctx *sctx, u64 parent_ino)  {  	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)  	}  	sctx->send_progress = sctx->cur_ino + 1; -	ASSERT(del_waiting_dir_move(sctx, pm->ino) == 0); +	ret = del_waiting_dir_move(sctx, pm->ino); +	ASSERT(ret == 0); +  	ret = get_cur_path(sctx, pm->ino, pm->gen, to_path);  	if (ret < 0)  		goto out; |