|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
#include "btrfs.h"
|
|
#include "btrfs.h"
|
|
#include <malloc.h>
|
|
#include <malloc.h>
|
|
|
|
+#include <memalign.h>
|
|
|
|
|
|
int btrfs_comp_keys(struct btrfs_key *a, struct btrfs_key *b)
|
|
int btrfs_comp_keys(struct btrfs_key *a, struct btrfs_key *b)
|
|
{
|
|
{
|
|
@@ -105,23 +106,24 @@ void btrfs_free_path(struct btrfs_path *p)
|
|
|
|
|
|
static int read_tree_node(u64 physical, union btrfs_tree_node **buf)
|
|
static int read_tree_node(u64 physical, union btrfs_tree_node **buf)
|
|
{
|
|
{
|
|
- struct btrfs_header hdr;
|
|
|
|
- unsigned long size, offset = sizeof(hdr);
|
|
|
|
|
|
+ ALLOC_CACHE_ALIGN_BUFFER(struct btrfs_header, hdr,
|
|
|
|
+ sizeof(struct btrfs_header));
|
|
|
|
+ unsigned long size, offset = sizeof(*hdr);
|
|
union btrfs_tree_node *res;
|
|
union btrfs_tree_node *res;
|
|
u32 i;
|
|
u32 i;
|
|
|
|
|
|
- if (!btrfs_devread(physical, sizeof(hdr), &hdr))
|
|
|
|
|
|
+ if (!btrfs_devread(physical, sizeof(*hdr), hdr))
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
- btrfs_header_to_cpu(&hdr);
|
|
|
|
|
|
+ btrfs_header_to_cpu(hdr);
|
|
|
|
|
|
- if (hdr.level)
|
|
|
|
|
|
+ if (hdr->level)
|
|
size = sizeof(struct btrfs_node)
|
|
size = sizeof(struct btrfs_node)
|
|
- + hdr.nritems * sizeof(struct btrfs_key_ptr);
|
|
|
|
|
|
+ + hdr->nritems * sizeof(struct btrfs_key_ptr);
|
|
else
|
|
else
|
|
size = btrfs_info.sb.nodesize;
|
|
size = btrfs_info.sb.nodesize;
|
|
|
|
|
|
- res = malloc(size);
|
|
|
|
|
|
+ res = malloc_cache_aligned(size);
|
|
if (!res) {
|
|
if (!res) {
|
|
debug("%s: malloc failed\n", __func__);
|
|
debug("%s: malloc failed\n", __func__);
|
|
return -1;
|
|
return -1;
|
|
@@ -133,12 +135,12 @@ static int read_tree_node(u64 physical, union btrfs_tree_node **buf)
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
- res->header = hdr;
|
|
|
|
- if (hdr.level)
|
|
|
|
- for (i = 0; i < hdr.nritems; ++i)
|
|
|
|
|
|
+ memcpy(&res->header, hdr, sizeof(*hdr));
|
|
|
|
+ if (hdr->level)
|
|
|
|
+ for (i = 0; i < hdr->nritems; ++i)
|
|
btrfs_key_ptr_to_cpu(&res->node.ptrs[i]);
|
|
btrfs_key_ptr_to_cpu(&res->node.ptrs[i]);
|
|
else
|
|
else
|
|
- for (i = 0; i < hdr.nritems; ++i)
|
|
|
|
|
|
+ for (i = 0; i < hdr->nritems; ++i)
|
|
btrfs_item_to_cpu(&res->leaf.items[i]);
|
|
btrfs_item_to_cpu(&res->leaf.items[i]);
|
|
|
|
|
|
*buf = res;
|
|
*buf = res;
|