diff options
Diffstat (limited to 'fs/btrfs/compression.c')
| -rw-r--r-- | fs/btrfs/compression.c | 54 | 
1 files changed, 27 insertions, 27 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 6aad98cb343..1daea0b4718 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -32,7 +32,6 @@  #include <linux/writeback.h>  #include <linux/bit_spinlock.h>  #include <linux/slab.h> -#include "compat.h"  #include "ctree.h"  #include "disk-io.h"  #include "transaction.h" @@ -129,11 +128,10 @@ static int check_compressed_csum(struct inode *inode,  		kunmap_atomic(kaddr);  		if (csum != *cb_sum) { -			printk(KERN_INFO "btrfs csum failed ino %llu " -			       "extent %llu csum %u " -			       "wanted %u mirror %d\n", -			       btrfs_ino(inode), disk_start, csum, *cb_sum, -			       cb->mirror_num); +			btrfs_info(BTRFS_I(inode)->root->fs_info, +			   "csum failed ino %llu extent %llu csum %u wanted %u mirror %d", +			   btrfs_ino(inode), disk_start, csum, *cb_sum, +			   cb->mirror_num);  			ret = -EIO;  			goto fail;  		} @@ -173,7 +171,8 @@ static void end_compressed_bio_read(struct bio *bio, int err)  		goto out;  	inode = cb->inode; -	ret = check_compressed_csum(inode, cb, (u64)bio->bi_sector << 9); +	ret = check_compressed_csum(inode, cb, +				    (u64)bio->bi_iter.bi_sector << 9);  	if (ret)  		goto csum_failed; @@ -202,18 +201,16 @@ csum_failed:  	if (cb->errors) {  		bio_io_error(cb->orig_bio);  	} else { -		int bio_index = 0; -		struct bio_vec *bvec = cb->orig_bio->bi_io_vec; +		int i; +		struct bio_vec *bvec;  		/*  		 * we have verified the checksum already, set page  		 * checked so the end_io handlers know about it  		 */ -		while (bio_index < cb->orig_bio->bi_vcnt) { +		bio_for_each_segment_all(bvec, cb->orig_bio, i)  			SetPageChecked(bvec->bv_page); -			bvec++; -			bio_index++; -		} +  		bio_endio(cb->orig_bio, 0);  	} @@ -360,7 +357,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,  	bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;  	bio = compressed_bio_alloc(bdev, first_byte, GFP_NOFS); -	if(!bio) { +	if (!bio) {  		kfree(cb);  		return -ENOMEM;  	} @@ -373,7 +370,7 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,  	for (pg_index = 0; pg_index < cb->nr_pages; pg_index++) {  		page = compressed_pages[pg_index];  		page->mapping = inode->i_mapping; -		if (bio->bi_size) +		if (bio->bi_iter.bi_size)  			ret = io_tree->ops->merge_bio_hook(WRITE, page, 0,  							   PAGE_CACHE_SIZE,  							   bio, 0); @@ -413,7 +410,8 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start,  			bio_add_page(bio, page, PAGE_CACHE_SIZE, 0);  		}  		if (bytes_left < PAGE_CACHE_SIZE) { -			printk("bytes left %lu compress len %lu nr %lu\n", +			btrfs_info(BTRFS_I(inode)->root->fs_info, +					"bytes left %lu compress len %lu nr %lu",  			       bytes_left, cb->compressed_len, cb->nr_pages);  		}  		bytes_left -= PAGE_CACHE_SIZE; @@ -474,7 +472,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,  		rcu_read_lock();  		page = radix_tree_lookup(&mapping->page_tree, pg_index);  		rcu_read_unlock(); -		if (page) { +		if (page && !radix_tree_exceptional_entry(page)) {  			misses++;  			if (misses > 4)  				break; @@ -507,7 +505,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,  		if (!em || last_offset < em->start ||  		    (last_offset + PAGE_CACHE_SIZE > extent_map_end(em)) || -		    (em->block_start >> 9) != cb->orig_bio->bi_sector) { +		    (em->block_start >> 9) != cb->orig_bio->bi_iter.bi_sector) {  			free_extent_map(em);  			unlock_extent(tree, last_offset, end);  			unlock_page(page); @@ -553,7 +551,7 @@ next:   * in it.  We don't actually do IO on those pages but allocate new ones   * to hold the compressed pages on disk.   * - * bio->bi_sector points to the compressed extent on disk + * bio->bi_iter.bi_sector points to the compressed extent on disk   * bio->bi_io_vec points to all of the inode pages   * bio->bi_vcnt is a count of pages   * @@ -574,7 +572,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,  	struct page *page;  	struct block_device *bdev;  	struct bio *comp_bio; -	u64 cur_disk_byte = (u64)bio->bi_sector << 9; +	u64 cur_disk_byte = (u64)bio->bi_iter.bi_sector << 9;  	u64 em_len;  	u64 em_start;  	struct extent_map *em; @@ -660,7 +658,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,  		page->mapping = inode->i_mapping;  		page->index = em_start >> PAGE_CACHE_SHIFT; -		if (comp_bio->bi_size) +		if (comp_bio->bi_iter.bi_size)  			ret = tree->ops->merge_bio_hook(READ, page, 0,  							PAGE_CACHE_SIZE,  							comp_bio, 0); @@ -688,8 +686,8 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,  							comp_bio, sums);  				BUG_ON(ret); /* -ENOMEM */  			} -			sums += (comp_bio->bi_size + root->sectorsize - 1) / -				root->sectorsize; +			sums += (comp_bio->bi_iter.bi_size + +				 root->sectorsize - 1) / root->sectorsize;  			ret = btrfs_map_bio(root, READ, comp_bio,  					    mirror_num, 0); @@ -823,7 +821,7 @@ static void free_workspace(int type, struct list_head *workspace)  	spin_lock(workspace_lock);  	if (*num_workspace < num_online_cpus()) { -		list_add_tail(workspace, idle_workspace); +		list_add(workspace, idle_workspace);  		(*num_workspace)++;  		spin_unlock(workspace_lock);  		goto wake; @@ -889,7 +887,7 @@ int btrfs_compress_pages(int type, struct address_space *mapping,  	workspace = find_workspace(type);  	if (IS_ERR(workspace)) -		return -1; +		return PTR_ERR(workspace);  	ret = btrfs_compress_op[type-1]->compress_pages(workspace, mapping,  						      start, len, pages, @@ -925,7 +923,7 @@ static int btrfs_decompress_biovec(int type, struct page **pages_in,  	workspace = find_workspace(type);  	if (IS_ERR(workspace)) -		return -ENOMEM; +		return PTR_ERR(workspace);  	ret = btrfs_compress_op[type-1]->decompress_biovec(workspace, pages_in,  							 disk_start, @@ -947,7 +945,7 @@ int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page,  	workspace = find_workspace(type);  	if (IS_ERR(workspace)) -		return -ENOMEM; +		return PTR_ERR(workspace);  	ret = btrfs_compress_op[type-1]->decompress(workspace, data_in,  						  dest_page, start_byte, @@ -1012,6 +1010,8 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,  		bytes = min(bytes, working_bytes);  		kaddr = kmap_atomic(page_out);  		memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); +		if (*pg_index == (vcnt - 1) && *pg_offset == 0) +			memset(kaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);  		kunmap_atomic(kaddr);  		flush_dcache_page(page_out);  | 
