diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 35 | 
1 files changed, 16 insertions, 19 deletions
| diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index eb1ae908582..2017d0ff511 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -1628,7 +1628,9 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,  	int i;  	int ret; -	btrfs_read_buffer(eb, gen); +	ret = btrfs_read_buffer(eb, gen); +	if (ret) +		return ret;  	level = btrfs_header_level(eb); @@ -1749,7 +1751,11 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,  			path->slots[*level]++;  			if (wc->free) { -				btrfs_read_buffer(next, ptr_gen); +				ret = btrfs_read_buffer(next, ptr_gen); +				if (ret) { +					free_extent_buffer(next); +					return ret; +				}  				btrfs_tree_lock(next);  				btrfs_set_lock_blocking(next); @@ -1766,7 +1772,11 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,  			free_extent_buffer(next);  			continue;  		} -		btrfs_read_buffer(next, ptr_gen); +		ret = btrfs_read_buffer(next, ptr_gen); +		if (ret) { +			free_extent_buffer(next); +			return ret; +		}  		WARN_ON(*level <= 0);  		if (path->nodes[*level-1]) @@ -2657,6 +2667,8 @@ static int drop_objectid_items(struct btrfs_trans_handle *trans,  		btrfs_release_path(path);  	}  	btrfs_release_path(path); +	if (ret > 0) +		ret = 0;  	return ret;  } @@ -3028,21 +3040,6 @@ out:  	return ret;  } -static int inode_in_log(struct btrfs_trans_handle *trans, -		 struct inode *inode) -{ -	struct btrfs_root *root = BTRFS_I(inode)->root; -	int ret = 0; - -	mutex_lock(&root->log_mutex); -	if (BTRFS_I(inode)->logged_trans == trans->transid && -	    BTRFS_I(inode)->last_sub_trans <= root->last_log_commit) -		ret = 1; -	mutex_unlock(&root->log_mutex); -	return ret; -} - -  /*   * helper function around btrfs_log_inode to make sure newly created   * parent directories also end up in the log.  A minimal inode and backref @@ -3083,7 +3080,7 @@ int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,  	if (ret)  		goto end_no_trans; -	if (inode_in_log(trans, inode)) { +	if (btrfs_inode_in_log(inode, trans->transid)) {  		ret = BTRFS_NO_LOG_SYNC;  		goto end_no_trans;  	} | 
