diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/backref.c | 13 | ||||
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 8 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 12 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/scrub.c | 2 | 
5 files changed, 28 insertions, 11 deletions
| diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 2d3e32ebfd15..8729cf68d2fe 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1552,7 +1552,6 @@ int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,  {  	int ret;  	int type; -	struct btrfs_tree_block_info *info;  	struct btrfs_extent_inline_ref *eiref;  	if (*ptr == (unsigned long)-1) @@ -1573,9 +1572,17 @@ int tree_backref_for_extent(unsigned long *ptr, struct extent_buffer *eb,  	}  	/* we can treat both ref types equally here */ -	info = (struct btrfs_tree_block_info *)(ei + 1);  	*out_root = btrfs_extent_inline_ref_offset(eb, eiref); -	*out_level = btrfs_tree_block_level(eb, info); + +	if (key->type == BTRFS_EXTENT_ITEM_KEY) { +		struct btrfs_tree_block_info *info; + +		info = (struct btrfs_tree_block_info *)(ei + 1); +		*out_level = btrfs_tree_block_level(eb, info); +	} else { +		ASSERT(key->type == BTRFS_METADATA_ITEM_KEY); +		*out_level = (u8)key->offset; +	}  	if (ret == 1)  		*ptr = (unsigned long)-1; diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 054577bddaf2..de4e70fb3cbb 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -1857,6 +1857,14 @@ int btrfs_delayed_delete_inode_ref(struct inode *inode)  {  	struct btrfs_delayed_node *delayed_node; +	/* +	 * we don't do delayed inode updates during log recovery because it +	 * leads to enospc problems.  This means we also can't do +	 * delayed inode refs +	 */ +	if (BTRFS_I(inode)->root->fs_info->log_root_recovering) +		return -EAGAIN; +  	delayed_node = btrfs_get_or_create_delayed_node(inode);  	if (IS_ERR(delayed_node))  		return PTR_ERR(delayed_node); diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a80b97100d90..15116585e714 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -3139,9 +3139,11 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans,  	struct extent_buffer *leaf;  	ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); -	if (ret < 0) +	if (ret) { +		if (ret > 0) +			ret = -ENOENT;  		goto fail; -	BUG_ON(ret); /* Corruption */ +	}  	leaf = path->nodes[0];  	bi = btrfs_item_ptr_offset(leaf, path->slots[0]); @@ -3149,11 +3151,9 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans,  	btrfs_mark_buffer_dirty(leaf);  	btrfs_release_path(path);  fail: -	if (ret) { +	if (ret)  		btrfs_abort_transaction(trans, root, ret); -		return ret; -	} -	return 0; +	return ret;  } diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index e687bb0dc73a..8bf326affb94 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6255,8 +6255,10 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)  out_fail:  	btrfs_end_transaction(trans, root); -	if (drop_on_err) +	if (drop_on_err) { +		inode_dec_link_count(inode);  		iput(inode); +	}  	btrfs_balance_delayed_items(root);  	btrfs_btree_balance_dirty(root);  	return err; diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index f2bb13a23f86..9e1569ffbf6e 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -2607,9 +2607,9 @@ static int scrub_extent_for_parity(struct scrub_parity *sparity,  		ret = scrub_pages_for_parity(sparity, logical, l, physical, dev,  					     flags, gen, mirror_num,  					     have_csum ? csum : NULL); -skip:  		if (ret)  			return ret; +skip:  		len -= l;  		logical += l;  		physical += l; | 
