Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
1d4f8a0c
Commit
1d4f8a0c
authored
Mar 13, 2007
by
Chris Mason
Committed by
David Woodhouse
Mar 13, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Btrfs: node->blockptrs endian fixes
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
0783fcfc
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
33 additions
and
18 deletions
+33
-18
fs/btrfs/ctree.c
fs/btrfs/ctree.c
+18
-13
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+11
-1
fs/btrfs/extent-tree.c
fs/btrfs/extent-tree.c
+2
-2
fs/btrfs/print-tree.c
fs/btrfs/print-tree.c
+2
-2
No files found.
fs/btrfs/ctree.c
View file @
1d4f8a0c
...
...
@@ -58,7 +58,8 @@ int btrfs_cow_block(struct ctree_root *root,
free_extent
(
root
,
buf
->
blocknr
,
1
);
tree_block_release
(
root
,
buf
);
}
else
{
parent
->
node
.
blockptrs
[
parent_slot
]
=
cow
->
blocknr
;
btrfs_set_node_blockptr
(
&
parent
->
node
,
parent_slot
,
cow
->
blocknr
);
BUG_ON
(
list_empty
(
&
parent
->
dirty
));
free_extent
(
root
,
buf
->
blocknr
,
1
);
}
...
...
@@ -133,7 +134,7 @@ int check_node(struct ctree_path *path, int level)
parent_key
=
&
parent
->
keys
[
parent_slot
];
BUG_ON
(
memcmp
(
parent_key
,
node
->
keys
,
sizeof
(
struct
btrfs_disk_key
)));
BUG_ON
(
parent
->
blockptrs
[
parent_slot
]
!=
BUG_ON
(
btrfs_node_blockptr
(
parent
,
parent_slot
)
!=
btrfs_header_blocknr
(
&
node
->
header
));
}
BUG_ON
(
nritems
>
NODEPTRS_PER_BLOCK
);
...
...
@@ -166,7 +167,7 @@ int check_leaf(struct ctree_path *path, int level)
parent_key
=
&
parent
->
keys
[
parent_slot
];
BUG_ON
(
memcmp
(
parent_key
,
&
leaf
->
items
[
0
].
key
,
sizeof
(
struct
btrfs_disk_key
)));
BUG_ON
(
parent
->
blockptrs
[
parent_slot
]
!=
BUG_ON
(
btrfs_node_blockptr
(
parent
,
parent_slot
)
!=
btrfs_header_blocknr
(
&
leaf
->
header
));
}
for
(
i
=
0
;
nritems
>
1
&&
i
<
nritems
-
2
;
i
++
)
{
...
...
@@ -258,7 +259,7 @@ struct tree_buffer *read_node_slot(struct ctree_root *root,
return
NULL
;
if
(
slot
>=
btrfs_header_nritems
(
&
node
->
header
))
return
NULL
;
return
read_tree_block
(
root
,
node
->
blockptrs
[
slot
]
);
return
read_tree_block
(
root
,
btrfs_node_blockptr
(
node
,
slot
)
);
}
static
int
balance_level
(
struct
ctree_root
*
root
,
struct
ctree_path
*
path
,
...
...
@@ -283,7 +284,7 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path,
mid_buf
=
path
->
nodes
[
level
];
mid
=
&
mid_buf
->
node
;
orig_ptr
=
mid
->
blockptrs
[
orig_slot
]
;
orig_ptr
=
btrfs_node_blockptr
(
mid
,
orig_slot
)
;
if
(
level
<
MAX_LEVEL
-
1
)
parent_buf
=
path
->
nodes
[
level
+
1
];
...
...
@@ -407,7 +408,8 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path,
}
/* double check we haven't messed things up */
check_block
(
path
,
level
);
if
(
orig_ptr
!=
path
->
nodes
[
level
]
->
node
.
blockptrs
[
path
->
slots
[
level
]])
if
(
orig_ptr
!=
btrfs_node_blockptr
(
&
path
->
nodes
[
level
]
->
node
,
path
->
slots
[
level
]))
BUG
();
if
(
right_buf
)
...
...
@@ -482,7 +484,7 @@ int search_slot(struct ctree_root *root, struct btrfs_key *key,
slot
=
p
->
slots
[
level
];
BUG_ON
(
btrfs_header_nritems
(
&
c
->
header
)
==
1
);
}
b
=
read_tree_block
(
root
,
c
->
blockptrs
[
slot
]
);
b
=
read_tree_block
(
root
,
btrfs_node_blockptr
(
c
,
slot
)
);
}
else
{
struct
leaf
*
l
=
(
struct
leaf
*
)
c
;
p
->
slots
[
level
]
=
slot
;
...
...
@@ -660,7 +662,7 @@ static int insert_new_root(struct ctree_root *root,
else
lower_key
=
lower
->
keys
;
memcpy
(
c
->
keys
,
lower_key
,
sizeof
(
struct
btrfs_disk_key
));
c
->
blockptrs
[
0
]
=
path
->
nodes
[
level
-
1
]
->
blocknr
;
btrfs_set_node_blockptr
(
c
,
0
,
path
->
nodes
[
level
-
1
]
->
blocknr
)
;
/* the super has an extra ref to root->node */
tree_block_release
(
root
,
root
->
node
);
root
->
node
=
t
;
...
...
@@ -700,7 +702,7 @@ static int insert_ptr(struct ctree_root *root,
(
nritems
-
slot
)
*
sizeof
(
u64
));
}
memcpy
(
lower
->
keys
+
slot
,
key
,
sizeof
(
struct
btrfs_disk_key
));
lower
->
blockptrs
[
slot
]
=
blocknr
;
btrfs_set_node_blockptr
(
lower
,
slot
,
blocknr
)
;
btrfs_set_header_nritems
(
&
lower
->
header
,
nritems
+
1
);
if
(
lower
->
keys
[
1
].
objectid
==
0
)
BUG
();
...
...
@@ -820,7 +822,8 @@ static int push_leaf_right(struct ctree_root *root, struct ctree_path *path,
if
(
slot
>=
btrfs_header_nritems
(
&
upper
->
node
.
header
)
-
1
)
{
return
1
;
}
right_buf
=
read_tree_block
(
root
,
upper
->
node
.
blockptrs
[
slot
+
1
]);
right_buf
=
read_tree_block
(
root
,
btrfs_node_blockptr
(
&
upper
->
node
,
slot
+
1
));
right
=
&
right_buf
->
leaf
;
free_space
=
leaf_free_space
(
right
);
if
(
free_space
<
data_size
+
sizeof
(
struct
btrfs_item
))
{
...
...
@@ -926,7 +929,8 @@ static int push_leaf_left(struct ctree_root *root, struct ctree_path *path,
if
(
!
path
->
nodes
[
1
])
{
return
1
;
}
t
=
read_tree_block
(
root
,
path
->
nodes
[
1
]
->
node
.
blockptrs
[
slot
-
1
]);
t
=
read_tree_block
(
root
,
btrfs_node_blockptr
(
&
path
->
nodes
[
1
]
->
node
,
slot
-
1
));
left
=
&
t
->
leaf
;
free_space
=
leaf_free_space
(
left
);
if
(
free_space
<
data_size
+
sizeof
(
struct
btrfs_item
))
{
...
...
@@ -1353,7 +1357,7 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path)
level
++
;
continue
;
}
blocknr
=
c
->
node
.
blockptrs
[
slot
]
;
blocknr
=
btrfs_node_blockptr
(
&
c
->
node
,
slot
)
;
if
(
next
)
tree_block_release
(
root
,
next
);
next
=
read_tree_block
(
root
,
blocknr
);
...
...
@@ -1368,7 +1372,8 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path)
path
->
slots
[
level
]
=
0
;
if
(
!
level
)
break
;
next
=
read_tree_block
(
root
,
next
->
node
.
blockptrs
[
0
]);
next
=
read_tree_block
(
root
,
btrfs_node_blockptr
(
&
next
->
node
,
0
));
}
return
0
;
}
...
...
fs/btrfs/ctree.h
View file @
1d4f8a0c
...
...
@@ -128,7 +128,7 @@ struct leaf {
struct
node
{
struct
btrfs_header
header
;
struct
btrfs_disk_key
keys
[
NODEPTRS_PER_BLOCK
];
u
64
blockptrs
[
NODEPTRS_PER_BLOCK
];
__le
64
blockptrs
[
NODEPTRS_PER_BLOCK
];
}
__attribute__
((
__packed__
));
/*
...
...
@@ -153,6 +153,16 @@ struct ctree_path {
int
slots
[
MAX_LEVEL
];
};
static
inline
u64
btrfs_node_blockptr
(
struct
node
*
n
,
int
nr
)
{
return
le64_to_cpu
(
n
->
blockptrs
[
nr
]);
}
static
inline
void
btrfs_set_node_blockptr
(
struct
node
*
n
,
int
nr
,
u64
val
)
{
n
->
blockptrs
[
nr
]
=
cpu_to_le64
(
val
);
}
static
inline
u16
btrfs_item_offset
(
struct
btrfs_item
*
item
)
{
return
le16_to_cpu
(
item
->
offset
);
...
...
fs/btrfs/extent-tree.c
View file @
1d4f8a0c
...
...
@@ -85,7 +85,7 @@ int btrfs_inc_ref(struct ctree_root *root, struct tree_buffer *buf)
return
0
;
for
(
i
=
0
;
i
<
btrfs_header_nritems
(
&
buf
->
node
.
header
);
i
++
)
{
blocknr
=
b
uf
->
node
.
blockptrs
[
i
]
;
blocknr
=
b
trfs_node_blockptr
(
&
buf
->
node
,
i
)
;
inc_block_ref
(
root
,
blocknr
);
}
return
0
;
...
...
@@ -437,7 +437,7 @@ int walk_down_tree(struct ctree_root *root, struct ctree_path *path, int *level)
if
(
path
->
slots
[
*
level
]
>=
btrfs_header_nritems
(
&
cur
->
node
.
header
))
break
;
blocknr
=
cur
->
node
.
blockptrs
[
path
->
slots
[
*
level
]]
;
blocknr
=
btrfs_node_blockptr
(
&
cur
->
node
,
path
->
slots
[
*
level
])
;
ret
=
lookup_block_ref
(
root
,
blocknr
,
&
refs
);
if
(
refs
!=
1
||
*
level
==
1
)
{
path
->
slots
[
*
level
]
++
;
...
...
fs/btrfs/print-tree.c
View file @
1d4f8a0c
...
...
@@ -54,12 +54,12 @@ void print_tree(struct ctree_root *root, struct tree_buffer *t)
printf
(
"
\t
key %d (%Lu %u %Lu) block %Lu
\n
"
,
i
,
c
->
keys
[
i
].
objectid
,
c
->
keys
[
i
].
flags
,
c
->
keys
[
i
].
offset
,
c
->
blockptrs
[
i
]
);
btrfs_node_blockptr
(
c
,
i
)
);
fflush
(
stdout
);
}
for
(
i
=
0
;
i
<
nr
;
i
++
)
{
struct
tree_buffer
*
next_buf
=
read_tree_block
(
root
,
c
->
blockptrs
[
i
]
);
btrfs_node_blockptr
(
c
,
i
)
);
struct
node
*
next
=
&
next_buf
->
node
;
if
(
btrfs_is_leaf
(
next
)
&&
btrfs_header_level
(
&
c
->
header
)
!=
1
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment