diff options
Diffstat (limited to 'fs/btrfs/compression.c')
| -rw-r--r-- | fs/btrfs/compression.c | 30 | 
1 files changed, 14 insertions, 16 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index c6e648603f85..1ab56a734e70 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -172,18 +172,17 @@ static inline int compressed_bio_size(struct btrfs_fs_info *fs_info,  		(DIV_ROUND_UP(disk_size, fs_info->sectorsize)) * csum_size;  } -static int check_compressed_csum(struct btrfs_inode *inode, -				 struct compressed_bio *cb, +static int check_compressed_csum(struct btrfs_inode *inode, struct bio *bio,  				 u64 disk_start)  {  	struct btrfs_fs_info *fs_info = inode->root->fs_info;  	SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);  	const u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); -	int ret;  	struct page *page;  	unsigned long i;  	char *kaddr;  	u8 csum[BTRFS_CSUM_SIZE]; +	struct compressed_bio *cb = bio->bi_private;  	u8 *cb_sum = cb->sums;  	if (inode->flags & BTRFS_INODE_NODATASUM) @@ -201,15 +200,15 @@ static int check_compressed_csum(struct btrfs_inode *inode,  		if (memcmp(&csum, cb_sum, csum_size)) {  			btrfs_print_data_csum_error(inode, disk_start,  					csum, cb_sum, cb->mirror_num); -			ret = -EIO; -			goto fail; +			if (btrfs_io_bio(bio)->device) +				btrfs_dev_stat_inc_and_print( +					btrfs_io_bio(bio)->device, +					BTRFS_DEV_STAT_CORRUPTION_ERRS); +			return -EIO;  		}  		cb_sum += csum_size; -  	} -	ret = 0; -fail: -	return ret; +	return 0;  }  /* when we finish reading compressed pages from the disk, we @@ -244,7 +243,6 @@ static void end_compressed_bio_read(struct bio *bio)  	 * Record the correct mirror_num in cb->orig_bio so that  	 * read-repair can work properly.  	 */ -	ASSERT(btrfs_io_bio(cb->orig_bio));  	btrfs_io_bio(cb->orig_bio)->mirror_num = mirror;  	cb->mirror_num = mirror; @@ -256,7 +254,7 @@ static void end_compressed_bio_read(struct bio *bio)  		goto csum_failed;  	inode = cb->inode; -	ret = check_compressed_csum(BTRFS_I(inode), cb, +	ret = check_compressed_csum(BTRFS_I(inode), bio,  				    (u64)bio->bi_iter.bi_sector << 9);  	if (ret)  		goto csum_failed; @@ -405,7 +403,7 @@ out:   * This also checksums the file bytes and gets things ready for   * the end io hooks.   */ -blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start, +blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,  				 unsigned long len, u64 disk_start,  				 unsigned long compressed_len,  				 struct page **compressed_pages, @@ -413,7 +411,7 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,  				 unsigned int write_flags,  				 struct cgroup_subsys_state *blkcg_css)  { -	struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); +	struct btrfs_fs_info *fs_info = inode->root->fs_info;  	struct bio *bio = NULL;  	struct compressed_bio *cb;  	unsigned long bytes_left; @@ -421,7 +419,7 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,  	struct page *page;  	u64 first_byte = disk_start;  	blk_status_t ret; -	int skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; +	int skip_sum = inode->flags & BTRFS_INODE_NODATASUM;  	WARN_ON(!PAGE_ALIGNED(start));  	cb = kmalloc(compressed_bio_size(fs_info, compressed_len), GFP_NOFS); @@ -429,7 +427,7 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,  		return BLK_STS_RESOURCE;  	refcount_set(&cb->pending_bios, 0);  	cb->errors = 0; -	cb->inode = inode; +	cb->inode = &inode->vfs_inode;  	cb->start = start;  	cb->len = len;  	cb->mirror_num = 0; @@ -455,7 +453,7 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,  		int submit = 0;  		page = compressed_pages[pg_index]; -		page->mapping = inode->i_mapping; +		page->mapping = inode->vfs_inode.i_mapping;  		if (bio->bi_iter.bi_size)  			submit = btrfs_bio_fits_in_stripe(page, PAGE_SIZE, bio,  							  0);  |