diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
| -rw-r--r-- | fs/btrfs/ioctl.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index c2837a32d689..b077544b5232 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3327,11 +3327,13 @@ static void btrfs_cmp_data_free(struct cmp_pages *cmp)  		if (pg) {  			unlock_page(pg);  			put_page(pg); +			cmp->src_pages[i] = NULL;  		}  		pg = cmp->dst_pages[i];  		if (pg) {  			unlock_page(pg);  			put_page(pg); +			cmp->dst_pages[i] = NULL;  		}  	}  } @@ -3577,7 +3579,7 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,  		ret = btrfs_extent_same_range(src, loff, BTRFS_MAX_DEDUPE_LEN,  					      dst, dst_loff, &cmp);  		if (ret) -			goto out_unlock; +			goto out_free;  		loff += BTRFS_MAX_DEDUPE_LEN;  		dst_loff += BTRFS_MAX_DEDUPE_LEN; @@ -3587,16 +3589,16 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,  		ret = btrfs_extent_same_range(src, loff, tail_len, dst,  					      dst_loff, &cmp); +out_free: +	kvfree(cmp.src_pages); +	kvfree(cmp.dst_pages); +  out_unlock:  	if (same_inode)  		inode_unlock(src);  	else  		btrfs_double_inode_unlock(src, dst); -out_free: -	kvfree(cmp.src_pages); -	kvfree(cmp.dst_pages); -  	return ret;  }  | 
