diff options
| author | Tony Lindgren <tony@atomide.com> | 2016-04-08 09:18:00 -0700 | 
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2016-04-08 09:18:00 -0700 | 
| commit | 19e831b272e6db5884be085be66e44da975c73a9 (patch) | |
| tree | 8812543bc66dc531e4720f5119107e7de3447a46 /fs/btrfs/disk-io.c | |
| parent | 6f40fed1c911f218e1e189a404b26ef19effabb5 (diff) | |
| parent | 571afb4c8a4bbe88541364e7f6827340562f2736 (diff) | |
Merge branch 'fixes-rc2' into omap-for-v4.6/fixes
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 45 | 
1 files changed, 25 insertions, 20 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 4b02591b0301..d01f89d130e0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -25,7 +25,6 @@  #include <linux/buffer_head.h>  #include <linux/workqueue.h>  #include <linux/kthread.h> -#include <linux/freezer.h>  #include <linux/slab.h>  #include <linux/migrate.h>  #include <linux/ratelimit.h> @@ -303,7 +302,7 @@ static int csum_tree_block(struct btrfs_fs_info *fs_info,  		err = map_private_extent_buffer(buf, offset, 32,  					&kaddr, &map_start, &map_len);  		if (err) -			return 1; +			return err;  		cur_len = min(len, map_len - (offset - map_start));  		crc = btrfs_csum_data(kaddr + offset - map_start,  				      crc, cur_len); @@ -313,7 +312,7 @@ static int csum_tree_block(struct btrfs_fs_info *fs_info,  	if (csum_size > sizeof(inline_result)) {  		result = kzalloc(csum_size, GFP_NOFS);  		if (!result) -			return 1; +			return -ENOMEM;  	} else {  		result = (char *)&inline_result;  	} @@ -334,7 +333,7 @@ static int csum_tree_block(struct btrfs_fs_info *fs_info,  				val, found, btrfs_header_level(buf));  			if (result != (char *)&inline_result)  				kfree(result); -			return 1; +			return -EUCLEAN;  		}  	} else {  		write_extent_buffer(buf, result, 0, csum_size); @@ -513,11 +512,21 @@ static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct page *page)  	eb = (struct extent_buffer *)page->private;  	if (page != eb->pages[0])  		return 0; +  	found_start = btrfs_header_bytenr(eb); -	if (WARN_ON(found_start != start || !PageUptodate(page))) -		return 0; -	csum_tree_block(fs_info, eb, 0); -	return 0; +	/* +	 * Please do not consolidate these warnings into a single if. +	 * It is useful to know what went wrong. +	 */ +	if (WARN_ON(found_start != start)) +		return -EUCLEAN; +	if (WARN_ON(!PageUptodate(page))) +		return -EUCLEAN; + +	ASSERT(memcmp_extent_buffer(eb, fs_info->fsid, +			btrfs_header_fsid(), BTRFS_FSID_SIZE) == 0); + +	return csum_tree_block(fs_info, eb, 0);  }  static int check_tree_block_fsid(struct btrfs_fs_info *fs_info, @@ -661,10 +670,8 @@ static int btree_readpage_end_io_hook(struct btrfs_io_bio *io_bio,  				       eb, found_level);  	ret = csum_tree_block(fs_info, eb, 1); -	if (ret) { -		ret = -EIO; +	if (ret)  		goto err; -	}  	/*  	 * If this is a leaf block and it is corrupt, set the corrupt bit so @@ -1831,7 +1838,7 @@ static int cleaner_kthread(void *arg)  		 */  		btrfs_delete_unused_bgs(root->fs_info);  sleep: -		if (!try_to_freeze() && !again) { +		if (!again) {  			set_current_state(TASK_INTERRUPTIBLE);  			if (!kthread_should_stop())  				schedule(); @@ -1921,14 +1928,12 @@ sleep:  		if (unlikely(test_bit(BTRFS_FS_STATE_ERROR,  				      &root->fs_info->fs_state)))  			btrfs_cleanup_transaction(root); -		if (!try_to_freeze()) { -			set_current_state(TASK_INTERRUPTIBLE); -			if (!kthread_should_stop() && -			    (!btrfs_transaction_blocked(root->fs_info) || -			     cannot_commit)) -				schedule_timeout(delay); -			__set_current_state(TASK_RUNNING); -		} +		set_current_state(TASK_INTERRUPTIBLE); +		if (!kthread_should_stop() && +				(!btrfs_transaction_blocked(root->fs_info) || +				 cannot_commit)) +			schedule_timeout(delay); +		__set_current_state(TASK_RUNNING);  	} while (!kthread_should_stop());  	return 0;  }  | 
