diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 208 | 
1 files changed, 118 insertions, 90 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index f997ec0c1ba4..592396c6dc47 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -333,13 +333,13 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans,  			goto insert;  		if (item_size == 0) { -			btrfs_release_path(root, path); +			btrfs_release_path(path);  			return 0;  		}  		dst_copy = kmalloc(item_size, GFP_NOFS);  		src_copy = kmalloc(item_size, GFP_NOFS);  		if (!dst_copy || !src_copy) { -			btrfs_release_path(root, path); +			btrfs_release_path(path);  			kfree(dst_copy);  			kfree(src_copy);  			return -ENOMEM; @@ -361,13 +361,13 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans,  		 * sync  		 */  		if (ret == 0) { -			btrfs_release_path(root, path); +			btrfs_release_path(path);  			return 0;  		}  	}  insert: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	/* try to insert the key into the destination tree */  	ret = btrfs_insert_empty_item(trans, root, path,  				      key, item_size); @@ -382,7 +382,6 @@ insert:  		} else if (found_size < item_size) {  			ret = btrfs_extend_item(trans, root, path,  						item_size - found_size); -			BUG_ON(ret);  		}  	} else if (ret) {  		return ret; @@ -438,7 +437,7 @@ insert:  	}  no_copy:  	btrfs_mark_buffer_dirty(path->nodes[0]); -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	return 0;  } @@ -519,7 +518,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,  	 * file.  This must be done before the btrfs_drop_extents run  	 * so we don't try to drop this extent.  	 */ -	ret = btrfs_lookup_file_extent(trans, root, path, inode->i_ino, +	ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode),  				       start, 0);  	if (ret == 0 && @@ -544,11 +543,11 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,  		 * we don't have to do anything  		 */  		if (memcmp(&cmp1, &cmp2, sizeof(cmp1)) == 0) { -			btrfs_release_path(root, path); +			btrfs_release_path(path);  			goto out;  		}  	} -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	saved_nbytes = inode_get_bytes(inode);  	/* drop any overlapping extents */ @@ -590,6 +589,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,  						ins.objectid, ins.offset,  						0, root->root_key.objectid,  						key->objectid, offset); +				BUG_ON(ret);  			} else {  				/*  				 * insert the extent pointer in the extent @@ -600,7 +600,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,  						key->objectid, offset, &ins);  				BUG_ON(ret);  			} -			btrfs_release_path(root, path); +			btrfs_release_path(path);  			if (btrfs_file_extent_compression(eb, item)) {  				csum_start = ins.objectid; @@ -614,7 +614,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,  			ret = btrfs_lookup_csums_range(root->log_root,  						csum_start, csum_end - 1, -						&ordered_sums); +						&ordered_sums, 0);  			BUG_ON(ret);  			while (!list_empty(&ordered_sums)) {  				struct btrfs_ordered_sum *sums; @@ -629,7 +629,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,  				kfree(sums);  			}  		} else { -			btrfs_release_path(root, path); +			btrfs_release_path(path);  		}  	} else if (found_type == BTRFS_FILE_EXTENT_INLINE) {  		/* inline extents are easy, we just overwrite them */ @@ -675,10 +675,13 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,  		return -ENOMEM;  	read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len); -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	inode = read_one_inode(root, location.objectid); -	BUG_ON(!inode); +	if (!inode) { +		kfree(name); +		return -EIO; +	}  	ret = link_to_fixup_dir(trans, root, path, location.objectid);  	BUG_ON(ret); @@ -713,7 +716,7 @@ static noinline int inode_in_dir(struct btrfs_root *root,  			goto out;  	} else  		goto out; -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	di = btrfs_lookup_dir_item(NULL, root, path, dirid, name, name_len, 0);  	if (di && !IS_ERR(di)) { @@ -724,7 +727,7 @@ static noinline int inode_in_dir(struct btrfs_root *root,  		goto out;  	match = 1;  out: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	return match;  } @@ -817,7 +820,10 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,  		return -ENOENT;  	inode = read_one_inode(root, key->objectid); -	BUG_ON(!inode); +	if (!inode) { +		iput(dir); +		return -EIO; +	}  	ref_ptr = btrfs_item_ptr_offset(eb, slot);  	ref_end = ref_ptr + btrfs_item_size_nr(eb, slot); @@ -832,7 +838,7 @@ again:  	read_extent_buffer(eb, name, (unsigned long)(ref + 1), namelen);  	/* if we already have a perfect match, we're done */ -	if (inode_in_dir(root, path, dir->i_ino, inode->i_ino, +	if (inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode),  			 btrfs_inode_ref_index(eb, ref),  			 name, namelen)) {  		goto out; @@ -884,7 +890,7 @@ again:  			if (!backref_in_log(log, key, victim_name,  					    victim_name_len)) {  				btrfs_inc_nlink(inode); -				btrfs_release_path(root, path); +				btrfs_release_path(path);  				ret = btrfs_unlink_inode(trans, root, dir,  							 inode, victim_name, @@ -901,7 +907,7 @@ again:  		 */  		search_done = 1;  	} -	btrfs_release_path(root, path); +	btrfs_release_path(path);  insert:  	/* insert our name */ @@ -922,7 +928,7 @@ out:  	BUG_ON(ret);  out_nowrite: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	iput(dir);  	iput(inode);  	return 0; @@ -960,8 +966,9 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,  	unsigned long ptr;  	unsigned long ptr_end;  	int name_len; +	u64 ino = btrfs_ino(inode); -	key.objectid = inode->i_ino; +	key.objectid = ino;  	key.type = BTRFS_INODE_REF_KEY;  	key.offset = (u64)-1; @@ -980,7 +987,7 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,  		}  		btrfs_item_key_to_cpu(path->nodes[0], &key,  				      path->slots[0]); -		if (key.objectid != inode->i_ino || +		if (key.objectid != ino ||  		    key.type != BTRFS_INODE_REF_KEY)  			break;  		ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]); @@ -999,9 +1006,9 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,  		if (key.offset == 0)  			break;  		key.offset--; -		btrfs_release_path(root, path); +		btrfs_release_path(path);  	} -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	if (nlink != inode->i_nlink) {  		inode->i_nlink = nlink;  		btrfs_update_inode(trans, root, inode); @@ -1011,10 +1018,10 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,  	if (inode->i_nlink == 0) {  		if (S_ISDIR(inode->i_mode)) {  			ret = replay_dir_deletes(trans, root, NULL, path, -						 inode->i_ino, 1); +						 ino, 1);  			BUG_ON(ret);  		} -		ret = insert_orphan_item(trans, root, inode->i_ino); +		ret = insert_orphan_item(trans, root, ino);  		BUG_ON(ret);  	}  	btrfs_free_path(path); @@ -1050,11 +1057,13 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,  			break;  		ret = btrfs_del_item(trans, root, path); -		BUG_ON(ret); +		if (ret) +			goto out; -		btrfs_release_path(root, path); +		btrfs_release_path(path);  		inode = read_one_inode(root, key.offset); -		BUG_ON(!inode); +		if (!inode) +			return -EIO;  		ret = fixup_inode_link_count(trans, root, inode);  		BUG_ON(ret); @@ -1068,8 +1077,10 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,  		 */  		key.offset = (u64)-1;  	} -	btrfs_release_path(root, path); -	return 0; +	ret = 0; +out: +	btrfs_release_path(path); +	return ret;  } @@ -1088,7 +1099,8 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,  	struct inode *inode;  	inode = read_one_inode(root, objectid); -	BUG_ON(!inode); +	if (!inode) +		return -EIO;  	key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;  	btrfs_set_key_type(&key, BTRFS_ORPHAN_ITEM_KEY); @@ -1096,7 +1108,7 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,  	ret = btrfs_insert_empty_item(trans, root, path, &key, 0); -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	if (ret == 0) {  		btrfs_inc_nlink(inode);  		btrfs_update_inode(trans, root, inode); @@ -1175,7 +1187,8 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,  	int ret;  	dir = read_one_inode(root, key->objectid); -	BUG_ON(!dir); +	if (!dir) +		return -EIO;  	name_len = btrfs_dir_name_len(eb, di);  	name = kmalloc(name_len, GFP_NOFS); @@ -1192,7 +1205,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,  		exists = 1;  	else  		exists = 0; -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	if (key->type == BTRFS_DIR_ITEM_KEY) {  		dst_di = btrfs_lookup_dir_item(trans, root, path, key->objectid, @@ -1205,7 +1218,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,  	} else {  		BUG();  	} -	if (!dst_di || IS_ERR(dst_di)) { +	if (IS_ERR_OR_NULL(dst_di)) {  		/* we need a sequence number to insert, so we only  		 * do inserts for the BTRFS_DIR_INDEX_KEY types  		 */ @@ -1236,13 +1249,13 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,  	if (key->type == BTRFS_DIR_INDEX_KEY)  		goto insert;  out: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	kfree(name);  	iput(dir);  	return 0;  insert: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	ret = insert_one_name(trans, root, path, key->objectid, key->offset,  			      name, name_len, log_type, &log_key); @@ -1363,7 +1376,7 @@ next:  	*end_ret = found_end;  	ret = 0;  out: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	return ret;  } @@ -1426,12 +1439,15 @@ again:  						     dir_key->offset,  						     name, name_len, 0);  		} -		if (!log_di || IS_ERR(log_di)) { +		if (IS_ERR_OR_NULL(log_di)) {  			btrfs_dir_item_key_to_cpu(eb, di, &location); -			btrfs_release_path(root, path); -			btrfs_release_path(log, log_path); +			btrfs_release_path(path); +			btrfs_release_path(log_path);  			inode = read_one_inode(root, location.objectid); -			BUG_ON(!inode); +			if (!inode) { +				kfree(name); +				return -EIO; +			}  			ret = link_to_fixup_dir(trans, root,  						path, location.objectid); @@ -1453,7 +1469,7 @@ again:  			ret = 0;  			goto out;  		} -		btrfs_release_path(log, log_path); +		btrfs_release_path(log_path);  		kfree(name);  		ptr = (unsigned long)(di + 1); @@ -1461,8 +1477,8 @@ again:  	}  	ret = 0;  out: -	btrfs_release_path(root, path); -	btrfs_release_path(log, log_path); +	btrfs_release_path(path); +	btrfs_release_path(log_path);  	return ret;  } @@ -1550,7 +1566,7 @@ again:  				break;  			dir_key.offset = found_key.offset + 1;  		} -		btrfs_release_path(root, path); +		btrfs_release_path(path);  		if (range_end == (u64)-1)  			break;  		range_start = range_end + 1; @@ -1561,11 +1577,11 @@ next_type:  	if (key_type == BTRFS_DIR_LOG_ITEM_KEY) {  		key_type = BTRFS_DIR_LOG_INDEX_KEY;  		dir_key.type = BTRFS_DIR_INDEX_KEY; -		btrfs_release_path(root, path); +		btrfs_release_path(path);  		goto again;  	}  out: -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	btrfs_free_path(log_path);  	iput(dir);  	return ret; @@ -2093,7 +2109,9 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,  	 * the running transaction open, so a full commit can't hop  	 * in and cause problems either.  	 */ +	btrfs_scrub_pause_super(root);  	write_ctree_super(trans, root->fs_info->tree_root, 1); +	btrfs_scrub_continue_super(root);  	ret = 0;  	mutex_lock(&root->log_mutex); @@ -2197,6 +2215,7 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,  	int ret;  	int err = 0;  	int bytes_del = 0; +	u64 dir_ino = btrfs_ino(dir);  	if (BTRFS_I(dir)->logged_trans < trans->transid)  		return 0; @@ -2214,7 +2233,7 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,  		goto out_unlock;  	} -	di = btrfs_lookup_dir_item(trans, log, path, dir->i_ino, +	di = btrfs_lookup_dir_item(trans, log, path, dir_ino,  				   name, name_len, -1);  	if (IS_ERR(di)) {  		err = PTR_ERR(di); @@ -2225,8 +2244,8 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,  		bytes_del += name_len;  		BUG_ON(ret);  	} -	btrfs_release_path(log, path); -	di = btrfs_lookup_dir_index_item(trans, log, path, dir->i_ino, +	btrfs_release_path(path); +	di = btrfs_lookup_dir_index_item(trans, log, path, dir_ino,  					 index, name, name_len, -1);  	if (IS_ERR(di)) {  		err = PTR_ERR(di); @@ -2244,10 +2263,10 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,  	if (bytes_del) {  		struct btrfs_key key; -		key.objectid = dir->i_ino; +		key.objectid = dir_ino;  		key.offset = 0;  		key.type = BTRFS_INODE_ITEM_KEY; -		btrfs_release_path(log, path); +		btrfs_release_path(path);  		ret = btrfs_search_slot(trans, log, &key, path, 0, 1);  		if (ret < 0) { @@ -2269,7 +2288,7 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,  			btrfs_mark_buffer_dirty(path->nodes[0]);  		} else  			ret = 0; -		btrfs_release_path(log, path); +		btrfs_release_path(path);  	}  fail:  	btrfs_free_path(path); @@ -2303,7 +2322,7 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,  	log = root->log_root;  	mutex_lock(&BTRFS_I(inode)->log_mutex); -	ret = btrfs_del_inode_ref(trans, log, name, name_len, inode->i_ino, +	ret = btrfs_del_inode_ref(trans, log, name, name_len, btrfs_ino(inode),  				  dirid, &index);  	mutex_unlock(&BTRFS_I(inode)->log_mutex);  	if (ret == -ENOSPC) { @@ -2344,7 +2363,7 @@ static noinline int insert_dir_log_key(struct btrfs_trans_handle *trans,  			      struct btrfs_dir_log_item);  	btrfs_set_dir_log_end(path->nodes[0], item, last_offset);  	btrfs_mark_buffer_dirty(path->nodes[0]); -	btrfs_release_path(log, path); +	btrfs_release_path(path);  	return 0;  } @@ -2369,13 +2388,14 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  	int nritems;  	u64 first_offset = min_offset;  	u64 last_offset = (u64)-1; +	u64 ino = btrfs_ino(inode);  	log = root->log_root; -	max_key.objectid = inode->i_ino; +	max_key.objectid = ino;  	max_key.offset = (u64)-1;  	max_key.type = key_type; -	min_key.objectid = inode->i_ino; +	min_key.objectid = ino;  	min_key.type = key_type;  	min_key.offset = min_offset; @@ -2388,18 +2408,17 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  	 * we didn't find anything from this transaction, see if there  	 * is anything at all  	 */ -	if (ret != 0 || min_key.objectid != inode->i_ino || -	    min_key.type != key_type) { -		min_key.objectid = inode->i_ino; +	if (ret != 0 || min_key.objectid != ino || min_key.type != key_type) { +		min_key.objectid = ino;  		min_key.type = key_type;  		min_key.offset = (u64)-1; -		btrfs_release_path(root, path); +		btrfs_release_path(path);  		ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);  		if (ret < 0) { -			btrfs_release_path(root, path); +			btrfs_release_path(path);  			return ret;  		} -		ret = btrfs_previous_item(root, path, inode->i_ino, key_type); +		ret = btrfs_previous_item(root, path, ino, key_type);  		/* if ret == 0 there are items for this type,  		 * create a range to tell us the last key of this type. @@ -2417,7 +2436,7 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  	}  	/* go backward to find any previous key */ -	ret = btrfs_previous_item(root, path, inode->i_ino, key_type); +	ret = btrfs_previous_item(root, path, ino, key_type);  	if (ret == 0) {  		struct btrfs_key tmp;  		btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]); @@ -2432,7 +2451,7 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  			}  		}  	} -	btrfs_release_path(root, path); +	btrfs_release_path(path);  	/* find the first key from this transaction again */  	ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0); @@ -2452,8 +2471,7 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  		for (i = path->slots[0]; i < nritems; i++) {  			btrfs_item_key_to_cpu(src, &min_key, i); -			if (min_key.objectid != inode->i_ino || -			    min_key.type != key_type) +			if (min_key.objectid != ino || min_key.type != key_type)  				goto done;  			ret = overwrite_item(trans, log, dst_path, src, i,  					     &min_key); @@ -2474,7 +2492,7 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  			goto done;  		}  		btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]); -		if (tmp.objectid != inode->i_ino || tmp.type != key_type) { +		if (tmp.objectid != ino || tmp.type != key_type) {  			last_offset = (u64)-1;  			goto done;  		} @@ -2490,8 +2508,8 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,  		}  	}  done: -	btrfs_release_path(root, path); -	btrfs_release_path(log, dst_path); +	btrfs_release_path(path); +	btrfs_release_path(dst_path);  	if (err == 0) {  		*last_offset_ret = last_offset; @@ -2500,8 +2518,7 @@ done:  		 * is valid  		 */  		ret = insert_dir_log_key(trans, log, path, key_type, -					 inode->i_ino, first_offset, -					 last_offset); +					 ino, first_offset, last_offset);  		if (ret)  			err = ret;  	} @@ -2587,10 +2604,11 @@ static int drop_objectid_items(struct btrfs_trans_handle *trans,  			break;  		ret = btrfs_del_item(trans, log, path); -		BUG_ON(ret); -		btrfs_release_path(log, path); +		if (ret) +			break; +		btrfs_release_path(path);  	} -	btrfs_release_path(log, path); +	btrfs_release_path(path);  	return ret;  } @@ -2665,6 +2683,9 @@ static noinline int copy_items(struct btrfs_trans_handle *trans,  			extent = btrfs_item_ptr(src, start_slot + i,  						struct btrfs_file_extent_item); +			if (btrfs_file_extent_generation(src, extent) < trans->transid) +				continue; +  			found_type = btrfs_file_extent_type(src, extent);  			if (found_type == BTRFS_FILE_EXTENT_REG ||  			    found_type == BTRFS_FILE_EXTENT_PREALLOC) { @@ -2689,14 +2710,14 @@ static noinline int copy_items(struct btrfs_trans_handle *trans,  				ret = btrfs_lookup_csums_range(  						log->fs_info->csum_root,  						ds + cs, ds + cs + cl - 1, -						&ordered_sums); +						&ordered_sums, 0);  				BUG_ON(ret);  			}  		}  	}  	btrfs_mark_buffer_dirty(dst_path->nodes[0]); -	btrfs_release_path(log, dst_path); +	btrfs_release_path(dst_path);  	kfree(ins_data);  	/* @@ -2745,6 +2766,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  	int nritems;  	int ins_start_slot = 0;  	int ins_nr; +	u64 ino = btrfs_ino(inode);  	log = root->log_root; @@ -2757,11 +2779,11 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  		return -ENOMEM;  	} -	min_key.objectid = inode->i_ino; +	min_key.objectid = ino;  	min_key.type = BTRFS_INODE_ITEM_KEY;  	min_key.offset = 0; -	max_key.objectid = inode->i_ino; +	max_key.objectid = ino;  	/* today the code can only do partial logging of directories */  	if (!S_ISDIR(inode->i_mode)) @@ -2773,6 +2795,13 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  		max_key.type = (u8)-1;  	max_key.offset = (u64)-1; +	ret = btrfs_commit_inode_delayed_items(trans, inode); +	if (ret) { +		btrfs_free_path(path); +		btrfs_free_path(dst_path); +		return ret; +	} +  	mutex_lock(&BTRFS_I(inode)->log_mutex);  	/* @@ -2784,8 +2813,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  		if (inode_only == LOG_INODE_EXISTS)  			max_key_type = BTRFS_XATTR_ITEM_KEY; -		ret = drop_objectid_items(trans, log, path, -					  inode->i_ino, max_key_type); +		ret = drop_objectid_items(trans, log, path, ino, max_key_type);  	} else {  		ret = btrfs_truncate_inode_items(trans, log, inode, 0, 0);  	} @@ -2803,7 +2831,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  			break;  again:  		/* note, ins_nr might be > 0 here, cleanup outside the loop */ -		if (min_key.objectid != inode->i_ino) +		if (min_key.objectid != ino)  			break;  		if (min_key.type > max_key.type)  			break; @@ -2845,7 +2873,7 @@ next_slot:  			}  			ins_nr = 0;  		} -		btrfs_release_path(root, path); +		btrfs_release_path(path);  		if (min_key.offset < (u64)-1)  			min_key.offset++; @@ -2868,8 +2896,8 @@ next_slot:  	}  	WARN_ON(ins_nr);  	if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->i_mode)) { -		btrfs_release_path(root, path); -		btrfs_release_path(log, dst_path); +		btrfs_release_path(path); +		btrfs_release_path(dst_path);  		ret = log_directory_changes(trans, root, inode, path, dst_path);  		if (ret) {  			err = ret; @@ -3136,7 +3164,7 @@ again:  		}  		btrfs_item_key_to_cpu(path->nodes[0], &found_key,  				      path->slots[0]); -		btrfs_release_path(log_root_tree, path); +		btrfs_release_path(path);  		if (found_key.objectid != BTRFS_TREE_LOG_OBJECTID)  			break; @@ -3171,7 +3199,7 @@ again:  		if (found_key.offset == 0)  			break;  	} -	btrfs_release_path(log_root_tree, path); +	btrfs_release_path(path);  	/* step one is to pin it all, step two is to replay just inodes */  	if (wc.pin) {  |