diff options
Diffstat (limited to 'fs/btrfs/send.c')
| -rw-r--r-- | fs/btrfs/send.c | 35 | 
1 files changed, 14 insertions, 21 deletions
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 6ac37ae6c811..72f9b865e847 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -1198,7 +1198,7 @@ struct backref_ctx {  static int __clone_root_cmp_bsearch(const void *key, const void *elt)  {  	u64 root = (u64)(uintptr_t)key; -	struct clone_root *cr = (struct clone_root *)elt; +	const struct clone_root *cr = elt;  	if (root < cr->root->root_key.objectid)  		return -1; @@ -1209,8 +1209,8 @@ static int __clone_root_cmp_bsearch(const void *key, const void *elt)  static int __clone_root_cmp_sort(const void *e1, const void *e2)  { -	struct clone_root *cr1 = (struct clone_root *)e1; -	struct clone_root *cr2 = (struct clone_root *)e2; +	const struct clone_root *cr1 = e1; +	const struct clone_root *cr2 = e2;  	if (cr1->root->root_key.objectid < cr2->root->root_key.objectid)  		return -1; @@ -1307,7 +1307,7 @@ static int find_extent_clone(struct send_ctx *sctx,  	u64 flags = 0;  	struct btrfs_file_extent_item *fi;  	struct extent_buffer *eb = path->nodes[0]; -	struct backref_ctx *backref_ctx = NULL; +	struct backref_ctx backref_ctx = {0};  	struct clone_root *cur_clone_root;  	struct btrfs_key found_key;  	struct btrfs_path *tmp_path; @@ -1322,12 +1322,6 @@ static int find_extent_clone(struct send_ctx *sctx,  	/* We only use this path under the commit sem */  	tmp_path->need_commit_sem = 0; -	backref_ctx = kmalloc(sizeof(*backref_ctx), GFP_KERNEL); -	if (!backref_ctx) { -		ret = -ENOMEM; -		goto out; -	} -  	if (data_offset >= ino_size) {  		/*  		 * There may be extents that lie behind the file's size. @@ -1392,12 +1386,12 @@ static int find_extent_clone(struct send_ctx *sctx,  		cur_clone_root->found_refs = 0;  	} -	backref_ctx->sctx = sctx; -	backref_ctx->found = 0; -	backref_ctx->cur_objectid = ino; -	backref_ctx->cur_offset = data_offset; -	backref_ctx->found_itself = 0; -	backref_ctx->extent_len = num_bytes; +	backref_ctx.sctx = sctx; +	backref_ctx.found = 0; +	backref_ctx.cur_objectid = ino; +	backref_ctx.cur_offset = data_offset; +	backref_ctx.found_itself = 0; +	backref_ctx.extent_len = num_bytes;  	/*  	 * The last extent of a file may be too large due to page alignment. @@ -1405,7 +1399,7 @@ static int find_extent_clone(struct send_ctx *sctx,  	 * __iterate_backrefs work.  	 */  	if (data_offset + num_bytes >= ino_size) -		backref_ctx->extent_len = ino_size - data_offset; +		backref_ctx.extent_len = ino_size - data_offset;  	/*  	 * Now collect all backrefs. @@ -1416,12 +1410,12 @@ static int find_extent_clone(struct send_ctx *sctx,  		extent_item_pos = 0;  	ret = iterate_extent_inodes(fs_info, found_key.objectid,  				    extent_item_pos, 1, __iterate_backrefs, -				    backref_ctx, false); +				    &backref_ctx, false);  	if (ret < 0)  		goto out; -	if (!backref_ctx->found_itself) { +	if (!backref_ctx.found_itself) {  		/* found a bug in backref code? */  		ret = -EIO;  		btrfs_err(fs_info, @@ -1434,7 +1428,7 @@ static int find_extent_clone(struct send_ctx *sctx,  		    "find_extent_clone: data_offset=%llu, ino=%llu, num_bytes=%llu, logical=%llu",  		    data_offset, ino, num_bytes, logical); -	if (!backref_ctx->found) +	if (!backref_ctx.found)  		btrfs_debug(fs_info, "no clones found");  	cur_clone_root = NULL; @@ -1458,7 +1452,6 @@ static int find_extent_clone(struct send_ctx *sctx,  out:  	btrfs_free_path(tmp_path); -	kfree(backref_ctx);  	return ret;  }  |