diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 22 | 
1 files changed, 13 insertions, 9 deletions
| diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index efce9a2fa9be..a8ecccfc36de 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -610,7 +610,7 @@ static int btree_readpage_end_io_hook(struct btrfs_io_bio *io_bio,  	 * that we don't try and read the other copies of this block, just  	 * return -EIO.  	 */ -	if (found_level == 0 && btrfs_check_leaf(root, eb)) { +	if (found_level == 0 && btrfs_check_leaf_full(root, eb)) {  		set_bit(EXTENT_BUFFER_CORRUPT, &eb->bflags);  		ret = -EIO;  	} @@ -3231,6 +3231,7 @@ static int write_dev_supers(struct btrfs_device *device,  	int errors = 0;  	u32 crc;  	u64 bytenr; +	int op_flags;  	if (max_mirrors == 0)  		max_mirrors = BTRFS_SUPER_MIRROR_MAX; @@ -3273,13 +3274,10 @@ static int write_dev_supers(struct btrfs_device *device,  		 * we fua the first super.  The others we allow  		 * to go down lazy.  		 */ -		if (i == 0) { -			ret = btrfsic_submit_bh(REQ_OP_WRITE, -				REQ_SYNC | REQ_FUA | REQ_META | REQ_PRIO, bh); -		} else { -			ret = btrfsic_submit_bh(REQ_OP_WRITE, -				REQ_SYNC | REQ_META | REQ_PRIO, bh); -		} +		op_flags = REQ_SYNC | REQ_META | REQ_PRIO; +		if (i == 0 && !btrfs_test_opt(device->fs_info, NOBARRIER)) +			op_flags |= REQ_FUA; +		ret = btrfsic_submit_bh(REQ_OP_WRITE, op_flags, bh);  		if (ret)  			errors++;  	} @@ -3848,7 +3846,13 @@ void btrfs_mark_buffer_dirty(struct extent_buffer *buf)  					 buf->len,  					 fs_info->dirty_metadata_batch);  #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY -	if (btrfs_header_level(buf) == 0 && btrfs_check_leaf(root, buf)) { +	/* +	 * Since btrfs_mark_buffer_dirty() can be called with item pointer set +	 * but item data not updated. +	 * So here we should only check item pointers, not item data. +	 */ +	if (btrfs_header_level(buf) == 0 && +	    btrfs_check_leaf_relaxed(root, buf)) {  		btrfs_print_leaf(buf);  		ASSERT(0);  	} |