btrfs-progs: minor source sync with kernel 6.8

Sync a few more file on the source level with kernel 6.8.

- type cleanups
- defines and enums
- comments
- parameter updates
- error handling

Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2024-03-12 20:40:05 +01:00
parent 60cc6f3fd8
commit a80d717db2
10 changed files with 82 additions and 63 deletions

View File

@ -7,8 +7,10 @@
#define BTRFS_COMPRESSION_H #define BTRFS_COMPRESSION_H
#include "kerncompat.h" #include "kerncompat.h"
#include "kernel-lib/sizes.h"
struct btrfs_inode; struct btrfs_inode;
struct btrfs_ordered_extent;
struct address_space; struct address_space;
struct inode; struct inode;
struct bio; struct bio;
@ -27,12 +29,16 @@ struct btrfs_bio { };
/* Maximum length of compressed data stored on disk */ /* Maximum length of compressed data stored on disk */
#define BTRFS_MAX_COMPRESSED (SZ_128K) #define BTRFS_MAX_COMPRESSED (SZ_128K)
#define BTRFS_MAX_COMPRESSED_PAGES (BTRFS_MAX_COMPRESSED / PAGE_SIZE)
_static_assert((BTRFS_MAX_COMPRESSED % PAGE_SIZE) == 0);
/* Maximum size of data before compression */ /* Maximum size of data before compression */
#define BTRFS_MAX_UNCOMPRESSED (SZ_128K) #define BTRFS_MAX_UNCOMPRESSED (SZ_128K)
#define BTRFS_ZLIB_DEFAULT_LEVEL 3 #define BTRFS_ZLIB_DEFAULT_LEVEL 3
struct page;
struct compressed_bio { struct compressed_bio {
/* Number of compressed pages in the array */ /* Number of compressed pages in the array */
unsigned int nr_pages; unsigned int nr_pages;
@ -88,17 +94,18 @@ int btrfs_decompress(int type, const u8 *data_in, struct page *dest_page,
int btrfs_decompress_buf2page(const char *buf, u32 buf_len, int btrfs_decompress_buf2page(const char *buf, u32 buf_len,
struct compressed_bio *cb, u32 decompressed); struct compressed_bio *cb, u32 decompressed);
void btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start, void btrfs_submit_compressed_write(struct btrfs_ordered_extent *ordered,
unsigned int len, u64 disk_start,
unsigned int compressed_len,
struct page **compressed_pages, struct page **compressed_pages,
unsigned int nr_pages, unsigned int nr_pages,
blk_opf_t write_flags, blk_opf_t write_flags,
bool writeback); bool writeback);
void btrfs_submit_compressed_read(struct btrfs_bio *bbio, int mirror_num); void btrfs_submit_compressed_read(struct btrfs_bio *bbio);
unsigned int btrfs_compress_str2level(unsigned int type, const char *str); unsigned int btrfs_compress_str2level(unsigned int type, const char *str);
struct page *btrfs_alloc_compr_page(void);
void btrfs_free_compr_page(struct page *page);
enum btrfs_compression_type { enum btrfs_compression_type {
BTRFS_COMPRESS_NONE = 0, BTRFS_COMPRESS_NONE = 0,
BTRFS_COMPRESS_ZLIB = 1, BTRFS_COMPRESS_ZLIB = 1,
@ -146,7 +153,7 @@ int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
unsigned long *total_in, unsigned long *total_out); unsigned long *total_in, unsigned long *total_out);
int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb); int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb);
int zlib_decompress(struct list_head *ws, const u8 *data_in, int zlib_decompress(struct list_head *ws, const u8 *data_in,
struct page *dest_page, unsigned long start_byte, size_t srclen, struct page *dest_page, unsigned long dest_pgoff, size_t srclen,
size_t destlen); size_t destlen);
struct list_head *zlib_alloc_workspace(unsigned int level); struct list_head *zlib_alloc_workspace(unsigned int level);
void zlib_free_workspace(struct list_head *ws); void zlib_free_workspace(struct list_head *ws);
@ -157,7 +164,7 @@ int lzo_compress_pages(struct list_head *ws, struct address_space *mapping,
unsigned long *total_in, unsigned long *total_out); unsigned long *total_in, unsigned long *total_out);
int lzo_decompress_bio(struct list_head *ws, struct compressed_bio *cb); int lzo_decompress_bio(struct list_head *ws, struct compressed_bio *cb);
int lzo_decompress(struct list_head *ws, const u8 *data_in, int lzo_decompress(struct list_head *ws, const u8 *data_in,
struct page *dest_page, unsigned long start_byte, size_t srclen, struct page *dest_page, unsigned long dest_pgoff, size_t srclen,
size_t destlen); size_t destlen);
struct list_head *lzo_alloc_workspace(unsigned int level); struct list_head *lzo_alloc_workspace(unsigned int level);
void lzo_free_workspace(struct list_head *ws); void lzo_free_workspace(struct list_head *ws);

View File

@ -1219,7 +1219,7 @@ static inline int is_fstree(u64 rootid)
return 0; return 0;
} }
void btrfs_uuid_to_key(const u8 *uuid, struct btrfs_key *key); void btrfs_uuid_to_key(const u8 *uuid, u8 type, struct btrfs_key *key);
/* inode.c */ /* inode.c */
int check_dir_conflict(struct btrfs_root *root, char *name, int namelen, int check_dir_conflict(struct btrfs_root *root, char *name, int namelen,

View File

@ -32,10 +32,16 @@ struct btrfs_trans_handle;
struct btrfs_block_rsv; struct btrfs_block_rsv;
/* these are the possible values of struct btrfs_delayed_ref_node->action */ /* these are the possible values of struct btrfs_delayed_ref_node->action */
#define BTRFS_ADD_DELAYED_REF 1 /* add one backref to the tree */ enum btrfs_delayed_ref_action {
#define BTRFS_DROP_DELAYED_REF 2 /* delete one backref from the tree */ /* Add one backref to the tree */
#define BTRFS_ADD_DELAYED_EXTENT 3 /* record a full extent allocation */ BTRFS_ADD_DELAYED_REF = 1,
#define BTRFS_UPDATE_DELAYED_HEAD 4 /* not changing ref count on head ref */ /* Delete one backref from the tree */
BTRFS_DROP_DELAYED_REF,
/* Record a full extent allocation */
BTRFS_ADD_DELAYED_EXTENT,
/* Not changing ref count on head ref */
BTRFS_UPDATE_DELAYED_HEAD,
} __attribute__ ((__packed__));
struct btrfs_delayed_ref_node { struct btrfs_delayed_ref_node {
struct rb_node ref_node; struct rb_node ref_node;
@ -210,7 +216,7 @@ enum btrfs_ref_type {
BTRFS_REF_DATA, BTRFS_REF_DATA,
BTRFS_REF_METADATA, BTRFS_REF_METADATA,
BTRFS_REF_LAST, BTRFS_REF_LAST,
}; } __attribute__((__packed__));
struct btrfs_data_ref { struct btrfs_data_ref {
/* For EXTENT_DATA_REF */ /* For EXTENT_DATA_REF */
@ -250,7 +256,7 @@ struct btrfs_tree_ref {
struct btrfs_ref { struct btrfs_ref {
enum btrfs_ref_type type; enum btrfs_ref_type type;
int action; enum btrfs_delayed_ref_action action;
/* /*
* Whether this extent should go through qgroup record. * Whether this extent should go through qgroup record.

View File

@ -178,9 +178,10 @@ out:
return ret; return ret;
} }
static inline u32 free_space_bitmap_size(u64 size, u32 sectorsize) static inline u32 free_space_bitmap_size(const struct btrfs_fs_info *fs_info,
u64 size)
{ {
return DIV_ROUND_UP((u32)div_u64(size, sectorsize), BITS_PER_BYTE); return DIV_ROUND_UP((u32)div_u64(size, fs_info->sectorsize), BITS_PER_BYTE);
} }
static unsigned long *alloc_bitmap(u32 bitmap_size) static unsigned long *alloc_bitmap(u32 bitmap_size)
@ -241,8 +242,7 @@ static int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,
int done = 0, nr; int done = 0, nr;
int ret; int ret;
bitmap_size = free_space_bitmap_size(block_group->length, bitmap_size = free_space_bitmap_size(fs_info, block_group->length);
fs_info->sectorsize);
bitmap = alloc_bitmap(bitmap_size); bitmap = alloc_bitmap(bitmap_size);
if (!bitmap) { if (!bitmap) {
ret = -ENOMEM; ret = -ENOMEM;
@ -331,8 +331,7 @@ static int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,
u32 data_size; u32 data_size;
extent_size = min(end - i, bitmap_range); extent_size = min(end - i, bitmap_range);
data_size = free_space_bitmap_size(extent_size, data_size = free_space_bitmap_size(fs_info, extent_size);
fs_info->sectorsize);
key.objectid = i; key.objectid = i;
key.type = BTRFS_FREE_SPACE_BITMAP_KEY; key.type = BTRFS_FREE_SPACE_BITMAP_KEY;
@ -379,8 +378,7 @@ static int convert_free_space_to_extents(struct btrfs_trans_handle *trans,
int done = 0, nr; int done = 0, nr;
int ret; int ret;
bitmap_size = free_space_bitmap_size(block_group->start, bitmap_size = free_space_bitmap_size(fs_info, block_group->length);
fs_info->sectorsize);
bitmap = alloc_bitmap(bitmap_size); bitmap = alloc_bitmap(bitmap_size);
if (!bitmap) { if (!bitmap) {
ret = -ENOMEM; ret = -ENOMEM;
@ -423,8 +421,8 @@ static int convert_free_space_to_extents(struct btrfs_trans_handle *trans,
fs_info->sectorsize * fs_info->sectorsize *
BITS_PER_BYTE); BITS_PER_BYTE);
bitmap_cursor = ((char *)bitmap) + bitmap_pos; bitmap_cursor = ((char *)bitmap) + bitmap_pos;
data_size = free_space_bitmap_size(found_key.offset, data_size = free_space_bitmap_size(fs_info,
fs_info->sectorsize); found_key.offset);
ptr = btrfs_item_ptr_offset(leaf, path->slots[0] - 1); ptr = btrfs_item_ptr_offset(leaf, path->slots[0] - 1);
read_extent_buffer(leaf, bitmap_cursor, ptr, read_extent_buffer(leaf, bitmap_cursor, ptr,

View File

@ -26,6 +26,11 @@ struct btrfs_block_group;
struct btrfs_fs_info; struct btrfs_fs_info;
struct btrfs_trans_handle; struct btrfs_trans_handle;
/*
* The default size for new free space bitmap items. The last bitmap in a block
* group may be truncated, and none of the free space tree code assumes that
* existing bitmaps are this size.
*/
#define BTRFS_FREE_SPACE_BITMAP_SIZE 256 #define BTRFS_FREE_SPACE_BITMAP_SIZE 256
#define BTRFS_FREE_SPACE_BITMAP_BITS (BTRFS_FREE_SPACE_BITMAP_SIZE * BITS_PER_BYTE) #define BTRFS_FREE_SPACE_BITMAP_BITS (BTRFS_FREE_SPACE_BITMAP_SIZE * BITS_PER_BYTE)

View File

@ -29,10 +29,9 @@
struct btrfs_trans_handle; struct btrfs_trans_handle;
static int find_name_in_backref(struct btrfs_path *path, const char * name, static int find_name_in_backref(struct extent_buffer *leaf, int slot, const char * name,
int name_len, struct btrfs_inode_ref **ref_ret) int name_len, struct btrfs_inode_ref **ref_ret)
{ {
struct extent_buffer *leaf;
struct btrfs_inode_ref *ref; struct btrfs_inode_ref *ref;
unsigned long ptr; unsigned long ptr;
unsigned long name_ptr; unsigned long name_ptr;
@ -40,9 +39,8 @@ static int find_name_in_backref(struct btrfs_path *path, const char * name,
u32 cur_offset = 0; u32 cur_offset = 0;
int len; int len;
leaf = path->nodes[0]; item_size = btrfs_item_size(leaf, slot);
item_size = btrfs_item_size(leaf, path->slots[0]); ptr = btrfs_item_ptr_offset(leaf, slot);
ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
while (cur_offset < item_size) { while (cur_offset < item_size) {
ref = (struct btrfs_inode_ref *)(ptr + cur_offset); ref = (struct btrfs_inode_ref *)(ptr + cur_offset);
len = btrfs_inode_ref_name_len(leaf, ref); len = btrfs_inode_ref_name_len(leaf, ref);
@ -83,7 +81,7 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
if (ret == -EEXIST) { if (ret == -EEXIST) {
u32 old_size; u32 old_size;
if (find_name_in_backref(path, name, name_len, &ref)) if (find_name_in_backref(path->nodes[0], path->slots[0], name, name_len, &ref))
goto out; goto out;
old_size = btrfs_item_size(path->nodes[0], path->slots[0]); old_size = btrfs_item_size(path->nodes[0], path->slots[0]);
@ -182,7 +180,7 @@ struct btrfs_inode_ref *btrfs_lookup_inode_ref(struct btrfs_trans_handle *trans,
if (ret) if (ret)
goto out; goto out;
find_name_in_backref(path, name, namelen, &ret_inode_ref); find_name_in_backref(path->nodes[0], path->slots[0], name, namelen, &ret_inode_ref);
out: out:
if (ret < 0) if (ret < 0)
return ERR_PTR(ret); return ERR_PTR(ret);
@ -190,23 +188,20 @@ out:
return ret_inode_ref; return ret_inode_ref;
} }
static int btrfs_find_name_in_ext_backref(struct btrfs_path *path, static int btrfs_find_name_in_ext_backref(struct extent_buffer *leaf,
u64 parent_ino, const char *name, int namelen, int slot, u64 parent_ino,
struct btrfs_inode_extref **extref_ret) const char *name, int namelen,
struct btrfs_inode_extref **extref_ret)
{ {
struct extent_buffer *node;
struct btrfs_inode_extref *extref; struct btrfs_inode_extref *extref;
unsigned long ptr; unsigned long ptr;
unsigned long name_ptr; unsigned long name_ptr;
u32 item_size; u32 item_size;
u32 cur_offset = 0; u32 cur_offset = 0;
int ref_name_len; int ref_name_len;
int slot;
node = path->nodes[0]; item_size = btrfs_item_size(leaf, slot);
slot = path->slots[0]; ptr = btrfs_item_ptr_offset(leaf, slot);
item_size = btrfs_item_size(node, slot);
ptr = btrfs_item_ptr_offset(node, slot);
/* /*
* Search all extended backrefs in this item. We're only looking * Search all extended backrefs in this item. We're only looking
@ -217,11 +212,11 @@ static int btrfs_find_name_in_ext_backref(struct btrfs_path *path,
while (cur_offset < item_size) { while (cur_offset < item_size) {
extref = (struct btrfs_inode_extref *) (ptr + cur_offset); extref = (struct btrfs_inode_extref *) (ptr + cur_offset);
name_ptr = (unsigned long)(&extref->name); name_ptr = (unsigned long)(&extref->name);
ref_name_len = btrfs_inode_extref_name_len(node, extref); ref_name_len = btrfs_inode_extref_name_len(leaf, extref);
if (ref_name_len == namelen && if (ref_name_len == namelen &&
btrfs_inode_extref_parent(node, extref) == parent_ino && btrfs_inode_extref_parent(leaf, extref) == parent_ino &&
(memcmp_extent_buffer(node, name, name_ptr, namelen) == 0)) (memcmp_extent_buffer(leaf, name, name_ptr, namelen) == 0))
{ {
if (extref_ret) if (extref_ret)
*extref_ret = extref; *extref_ret = extref;
@ -253,7 +248,8 @@ struct btrfs_inode_extref *btrfs_lookup_inode_extref(struct btrfs_trans_handle
return ERR_PTR(ret); return ERR_PTR(ret);
if (ret > 0) if (ret > 0)
return NULL; return NULL;
if (!btrfs_find_name_in_ext_backref(path, parent_ino, name, if (!btrfs_find_name_in_ext_backref(path->nodes[0], path->slots[0],
parent_ino, name,
namelen, &extref)) namelen, &extref))
return NULL; return NULL;
@ -294,7 +290,7 @@ int btrfs_del_inode_extref(struct btrfs_trans_handle *trans,
* Sanity check - did we find the right item for this name? This * Sanity check - did we find the right item for this name? This
* should always succeed so error here will make the FS readonly. * should always succeed so error here will make the FS readonly.
*/ */
if (!btrfs_find_name_in_ext_backref(path, ref_objectid, if (!btrfs_find_name_in_ext_backref(path->nodes[0], path->slots[0], ref_objectid,
name, name_len, &extref)) { name, name_len, &extref)) {
ret = -ENOENT; ret = -ENOENT;
goto out; goto out;
@ -356,14 +352,14 @@ int btrfs_insert_inode_extref(struct btrfs_trans_handle *trans,
ret = btrfs_insert_empty_item(trans, root, path, &key, ret = btrfs_insert_empty_item(trans, root, path, &key,
ins_len); ins_len);
if (ret == -EEXIST) { if (ret == -EEXIST) {
if (btrfs_find_name_in_ext_backref(path, ref_objectid, if (btrfs_find_name_in_ext_backref(path->nodes[0], path->slots[0],
ref_objectid,
name, name_len, NULL)) name, name_len, NULL))
goto out; goto out;
btrfs_extend_item(path, ins_len); btrfs_extend_item(path, ins_len);
ret = 0; ret = 0;
} }
if (ret < 0) if (ret < 0)
goto out; goto out;
@ -382,7 +378,6 @@ int btrfs_insert_inode_extref(struct btrfs_trans_handle *trans,
out: out:
btrfs_free_path(path); btrfs_free_path(path);
return ret; return ret;
} }
@ -418,7 +413,7 @@ int btrfs_del_inode_ref(struct btrfs_trans_handle *trans,
} else if (ret < 0) { } else if (ret < 0) {
goto out; goto out;
} }
if (!find_name_in_backref(path, name, name_len, &ref)) { if (!find_name_in_backref(path->nodes[0], path->slots[0], name, name_len, &ref)) {
ret = -ENOENT; ret = -ENOENT;
search_ext_refs = 1; search_ext_refs = 1;
goto out; goto out;

View File

@ -269,12 +269,6 @@ void __cold btrfs_assertfail(const char *expr, const char *file, int line)
} }
#endif #endif
void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info)
{
btrfs_err(fs_info,
"Unsupported V0 extent filesystem detected. Aborting. Please re-create your filesystem with a newer kernel");
}
#if BITS_PER_LONG == 32 && defined(__KERNEL__) #if BITS_PER_LONG == 32 && defined(__KERNEL__)
void __cold btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info) void __cold btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info)
{ {

View File

@ -21,10 +21,12 @@
#include <string.h> #include <string.h>
#include "kernel-lib/bitops.h" #include "kernel-lib/bitops.h"
#include "kernel-shared/accessors.h" #include "kernel-shared/accessors.h"
#include "kernel-shared/messages.h"
#include "kernel-shared/extent_io.h" #include "kernel-shared/extent_io.h"
#include "kernel-shared/uapi/btrfs_tree.h" #include "kernel-shared/uapi/btrfs_tree.h"
#include "kernel-shared/ctree.h" #include "kernel-shared/ctree.h"
#include "kernel-shared/disk-io.h" #include "kernel-shared/disk-io.h"
#include "kernel-shared/transaction.h"
int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
struct btrfs_root_item *item, struct btrfs_key *key) struct btrfs_root_item *item, struct btrfs_key *key)
@ -74,6 +76,7 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
*root, struct btrfs_key *key, struct btrfs_root_item *root, struct btrfs_key *key, struct btrfs_root_item
*item) *item)
{ {
struct btrfs_fs_info *fs_info = root->fs_info;
struct btrfs_path *path; struct btrfs_path *path;
struct extent_buffer *l; struct extent_buffer *l;
int ret; int ret;
@ -88,7 +91,17 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
ret = btrfs_search_slot(trans, root, key, path, 0, 1); ret = btrfs_search_slot(trans, root, key, path, 0, 1);
if (ret < 0) if (ret < 0)
goto out; goto out;
BUG_ON(ret != 0);
if (ret > 0) {
btrfs_crit(fs_info,
"unable to find root key (%llu %u %llu) in tree %llu",
key->objectid, key->type, key->offset,
root->root_key.objectid);
ret = -EUCLEAN;
btrfs_abort_transaction(trans, ret);
goto out;
}
l = path->nodes[0]; l = path->nodes[0];
slot = path->slots[0]; slot = path->slots[0];
ptr = btrfs_item_ptr_offset(l, slot); ptr = btrfs_item_ptr_offset(l, slot);
@ -104,17 +117,20 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
ret = btrfs_search_slot(trans, root, key, path, ret = btrfs_search_slot(trans, root, key, path,
-1, 1); -1, 1);
if (ret < 0) { if (ret < 0) {
btrfs_abort_transaction(trans, ret);
goto out; goto out;
} }
ret = btrfs_del_item(trans, root, path); ret = btrfs_del_item(trans, root, path);
if (ret < 0) { if (ret < 0) {
btrfs_abort_transaction(trans, ret);
goto out; goto out;
} }
btrfs_release_path(path); btrfs_release_path(path);
ret = btrfs_insert_empty_item(trans, root, path, ret = btrfs_insert_empty_item(trans, root, path,
key, sizeof(*item)); key, sizeof(*item));
if (ret < 0) { if (ret < 0) {
btrfs_abort_transaction(trans, ret);
goto out; goto out;
} }
l = path->nodes[0]; l = path->nodes[0];

View File

@ -32,12 +32,13 @@
#include "common/messages.h" #include "common/messages.h"
#include "common/utils.h" #include "common/utils.h"
void btrfs_uuid_to_key(const u8 *uuid, struct btrfs_key *key) void btrfs_uuid_to_key(const u8 *uuid, u8 type, struct btrfs_key *key)
{ {
u64 tmp; u64 tmp;
tmp = get_unaligned_le64(uuid); tmp = get_unaligned_le64(uuid);
put_unaligned_64(tmp, &key->objectid); put_unaligned_64(tmp, &key->objectid);
key->type = type;
tmp = get_unaligned_le64(uuid + sizeof(u64)); tmp = get_unaligned_le64(uuid + sizeof(u64));
put_unaligned_64(tmp, &key->offset); put_unaligned_64(tmp, &key->offset);
} }
@ -57,8 +58,7 @@ static int btrfs_uuid_tree_lookup_any(int fd, const u8 *uuid, u8 type,
__le64 lesubid; __le64 lesubid;
struct btrfs_key key; struct btrfs_key key;
key.type = type; btrfs_uuid_to_key(uuid, type, &key);
btrfs_uuid_to_key(uuid, &key);
memset(&search_arg, 0, sizeof(search_arg)); memset(&search_arg, 0, sizeof(search_arg));
search_arg.key.tree_id = BTRFS_UUID_TREE_OBJECTID; search_arg.key.tree_id = BTRFS_UUID_TREE_OBJECTID;
@ -138,8 +138,7 @@ int btrfs_uuid_tree_remove(struct btrfs_trans_handle *trans, u8 *uuid, u8 type,
goto out; goto out;
} }
btrfs_uuid_to_key(uuid, &key); btrfs_uuid_to_key(uuid, type, &key);
key.type = type;
path = btrfs_alloc_path(); path = btrfs_alloc_path();
if (!path) { if (!path) {

View File

@ -807,8 +807,7 @@ static int btrfs_uuid_tree_add(struct btrfs_trans_handle *trans, u8 *uuid,
unsigned long offset; unsigned long offset;
__le64 subvol_id_le; __le64 subvol_id_le;
key.type = type; btrfs_uuid_to_key(uuid, type, &key);
btrfs_uuid_to_key(uuid, &key);
path = btrfs_alloc_path(); path = btrfs_alloc_path();
if (!path) { if (!path) {