Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
80ea96b1
Commit
80ea96b1
authored
Feb 01, 2008
by
Chris Mason
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Btrfs: Add a lookup cache to the extent state tree
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
4529ba49
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
41 additions
and
17 deletions
+41
-17
fs/btrfs/extent_io.c
fs/btrfs/extent_io.c
+40
-17
fs/btrfs/extent_io.h
fs/btrfs/extent_io.h
+1
-0
No files found.
fs/btrfs/extent_io.c
View file @
80ea96b1
...
@@ -90,6 +90,7 @@ void extent_io_tree_init(struct extent_io_tree *tree,
...
@@ -90,6 +90,7 @@ void extent_io_tree_init(struct extent_io_tree *tree,
tree
->
mapping
=
mapping
;
tree
->
mapping
=
mapping
;
INIT_LIST_HEAD
(
&
tree
->
buffer_lru
);
INIT_LIST_HEAD
(
&
tree
->
buffer_lru
);
tree
->
lru_size
=
0
;
tree
->
lru_size
=
0
;
tree
->
last
=
NULL
;
}
}
EXPORT_SYMBOL
(
extent_io_tree_init
);
EXPORT_SYMBOL
(
extent_io_tree_init
);
...
@@ -158,16 +159,23 @@ static struct rb_node *tree_insert(struct rb_root *root, u64 offset,
...
@@ -158,16 +159,23 @@ static struct rb_node *tree_insert(struct rb_root *root, u64 offset,
return
NULL
;
return
NULL
;
}
}
static
struct
rb_node
*
__
tree_search
(
struct
rb_root
*
root
,
u64
offset
,
static
struct
rb_node
*
__
etree_search
(
struct
extent_io_tree
*
tree
,
u64
offset
,
struct
rb_node
**
prev_ret
,
struct
rb_node
**
prev_ret
,
struct
rb_node
**
next_ret
)
struct
rb_node
**
next_ret
)
{
{
struct
rb_root
*
root
=
&
tree
->
state
;
struct
rb_node
*
n
=
root
->
rb_node
;
struct
rb_node
*
n
=
root
->
rb_node
;
struct
rb_node
*
prev
=
NULL
;
struct
rb_node
*
prev
=
NULL
;
struct
rb_node
*
orig_prev
=
NULL
;
struct
rb_node
*
orig_prev
=
NULL
;
struct
tree_entry
*
entry
;
struct
tree_entry
*
entry
;
struct
tree_entry
*
prev_entry
=
NULL
;
struct
tree_entry
*
prev_entry
=
NULL
;
if
(
tree
->
last
)
{
struct
extent_state
*
state
;
state
=
tree
->
last
;
if
(
state
->
start
<=
offset
&&
offset
<=
state
->
end
)
return
&
tree
->
last
->
rb_node
;
}
while
(
n
)
{
while
(
n
)
{
entry
=
rb_entry
(
n
,
struct
tree_entry
,
rb_node
);
entry
=
rb_entry
(
n
,
struct
tree_entry
,
rb_node
);
prev
=
n
;
prev
=
n
;
...
@@ -177,9 +185,11 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
...
@@ -177,9 +185,11 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
n
=
n
->
rb_left
;
n
=
n
->
rb_left
;
else
if
(
offset
>
entry
->
end
)
else
if
(
offset
>
entry
->
end
)
n
=
n
->
rb_right
;
n
=
n
->
rb_right
;
else
else
{
tree
->
last
=
rb_entry
(
n
,
struct
extent_state
,
rb_node
);
return
n
;
return
n
;
}
}
}
if
(
prev_ret
)
{
if
(
prev_ret
)
{
orig_prev
=
prev
;
orig_prev
=
prev
;
...
@@ -202,14 +212,20 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
...
@@ -202,14 +212,20 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 offset,
return
NULL
;
return
NULL
;
}
}
static
inline
struct
rb_node
*
tree_search
(
struct
rb_root
*
root
,
u64
offset
)
static
inline
struct
rb_node
*
tree_search
(
struct
extent_io_tree
*
tree
,
u64
offset
)
{
{
struct
rb_node
*
prev
=
NULL
;
struct
rb_node
*
prev
=
NULL
;
struct
rb_node
*
ret
;
struct
rb_node
*
ret
;
ret
=
__tree_search
(
root
,
offset
,
&
prev
,
NULL
);
ret
=
__etree_search
(
tree
,
offset
,
&
prev
,
NULL
);
if
(
!
ret
)
if
(
!
ret
)
{
if
(
prev
)
{
tree
->
last
=
rb_entry
(
prev
,
struct
extent_state
,
rb_node
);
}
return
prev
;
return
prev
;
}
return
ret
;
return
ret
;
}
}
...
@@ -238,6 +254,8 @@ static int merge_state(struct extent_io_tree *tree,
...
@@ -238,6 +254,8 @@ static int merge_state(struct extent_io_tree *tree,
other
->
state
==
state
->
state
)
{
other
->
state
==
state
->
state
)
{
state
->
start
=
other
->
start
;
state
->
start
=
other
->
start
;
other
->
tree
=
NULL
;
other
->
tree
=
NULL
;
if
(
tree
->
last
==
other
)
tree
->
last
=
NULL
;
rb_erase
(
&
other
->
rb_node
,
&
tree
->
state
);
rb_erase
(
&
other
->
rb_node
,
&
tree
->
state
);
free_extent_state
(
other
);
free_extent_state
(
other
);
}
}
...
@@ -249,6 +267,8 @@ static int merge_state(struct extent_io_tree *tree,
...
@@ -249,6 +267,8 @@ static int merge_state(struct extent_io_tree *tree,
other
->
state
==
state
->
state
)
{
other
->
state
==
state
->
state
)
{
other
->
start
=
state
->
start
;
other
->
start
=
state
->
start
;
state
->
tree
=
NULL
;
state
->
tree
=
NULL
;
if
(
tree
->
last
==
state
)
tree
->
last
=
NULL
;
rb_erase
(
&
state
->
rb_node
,
&
tree
->
state
);
rb_erase
(
&
state
->
rb_node
,
&
tree
->
state
);
free_extent_state
(
state
);
free_extent_state
(
state
);
}
}
...
@@ -311,6 +331,7 @@ static int insert_state(struct extent_io_tree *tree,
...
@@ -311,6 +331,7 @@ static int insert_state(struct extent_io_tree *tree,
return
-
EEXIST
;
return
-
EEXIST
;
}
}
state
->
tree
=
tree
;
state
->
tree
=
tree
;
tree
->
last
=
state
;
merge_state
(
tree
,
state
);
merge_state
(
tree
,
state
);
return
0
;
return
0
;
}
}
...
@@ -375,6 +396,8 @@ static int clear_state_bit(struct extent_io_tree *tree,
...
@@ -375,6 +396,8 @@ static int clear_state_bit(struct extent_io_tree *tree,
wake_up
(
&
state
->
wq
);
wake_up
(
&
state
->
wq
);
if
(
delete
||
state
->
state
==
0
)
{
if
(
delete
||
state
->
state
==
0
)
{
if
(
state
->
tree
)
{
if
(
state
->
tree
)
{
if
(
tree
->
last
==
state
)
tree
->
last
=
NULL
;
rb_erase
(
&
state
->
rb_node
,
&
tree
->
state
);
rb_erase
(
&
state
->
rb_node
,
&
tree
->
state
);
state
->
tree
=
NULL
;
state
->
tree
=
NULL
;
free_extent_state
(
state
);
free_extent_state
(
state
);
...
@@ -422,7 +445,7 @@ again:
...
@@ -422,7 +445,7 @@ again:
* this search will find the extents that end after
* this search will find the extents that end after
* our range starts
* our range starts
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
if
(
!
node
)
if
(
!
node
)
goto
out
;
goto
out
;
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
...
@@ -533,7 +556,7 @@ again:
...
@@ -533,7 +556,7 @@ again:
* this search will find all the extents that end after
* this search will find all the extents that end after
* our range starts
* our range starts
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
if
(
!
node
)
if
(
!
node
)
break
;
break
;
...
@@ -612,7 +635,7 @@ again:
...
@@ -612,7 +635,7 @@ again:
* this search will find all the extents that end after
* this search will find all the extents that end after
* our range starts.
* our range starts.
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
if
(
!
node
)
{
if
(
!
node
)
{
err
=
insert_state
(
tree
,
prealloc
,
start
,
end
,
bits
);
err
=
insert_state
(
tree
,
prealloc
,
start
,
end
,
bits
);
prealloc
=
NULL
;
prealloc
=
NULL
;
...
@@ -915,7 +938,7 @@ int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
...
@@ -915,7 +938,7 @@ int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
* this search will find all the extents that end after
* this search will find all the extents that end after
* our range starts.
* our range starts.
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
if
(
!
node
||
IS_ERR
(
node
))
{
if
(
!
node
||
IS_ERR
(
node
))
{
goto
out
;
goto
out
;
}
}
...
@@ -953,7 +976,7 @@ u64 find_lock_delalloc_range(struct extent_io_tree *tree,
...
@@ -953,7 +976,7 @@ u64 find_lock_delalloc_range(struct extent_io_tree *tree,
* our range starts.
* our range starts.
*/
*/
search_again:
search_again:
node
=
tree_search
(
&
tree
->
stat
e
,
cur_start
);
node
=
tree_search
(
tre
e
,
cur_start
);
if
(
!
node
||
IS_ERR
(
node
))
{
if
(
!
node
||
IS_ERR
(
node
))
{
*
end
=
(
u64
)
-
1
;
*
end
=
(
u64
)
-
1
;
goto
out
;
goto
out
;
...
@@ -1041,7 +1064,7 @@ u64 count_range_bits(struct extent_io_tree *tree,
...
@@ -1041,7 +1064,7 @@ u64 count_range_bits(struct extent_io_tree *tree,
* this search will find all the extents that end after
* this search will find all the extents that end after
* our range starts.
* our range starts.
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
cur_start
);
node
=
tree_search
(
tre
e
,
cur_start
);
if
(
!
node
||
IS_ERR
(
node
))
{
if
(
!
node
||
IS_ERR
(
node
))
{
goto
out
;
goto
out
;
}
}
...
@@ -1142,7 +1165,7 @@ int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
...
@@ -1142,7 +1165,7 @@ int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
* this search will find all the extents that end after
* this search will find all the extents that end after
* our range starts.
* our range starts.
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
if
(
!
node
||
IS_ERR
(
node
))
{
if
(
!
node
||
IS_ERR
(
node
))
{
ret
=
-
ENOENT
;
ret
=
-
ENOENT
;
goto
out
;
goto
out
;
...
@@ -1169,7 +1192,7 @@ int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private)
...
@@ -1169,7 +1192,7 @@ int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private)
* this search will find all the extents that end after
* this search will find all the extents that end after
* our range starts.
* our range starts.
*/
*/
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
if
(
!
node
||
IS_ERR
(
node
))
{
if
(
!
node
||
IS_ERR
(
node
))
{
ret
=
-
ENOENT
;
ret
=
-
ENOENT
;
goto
out
;
goto
out
;
...
@@ -1200,7 +1223,7 @@ int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
...
@@ -1200,7 +1223,7 @@ int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
unsigned
long
flags
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
tree
->
lock
,
flags
);
spin_lock_irqsave
(
&
tree
->
lock
,
flags
);
node
=
tree_search
(
&
tree
->
stat
e
,
start
);
node
=
tree_search
(
tre
e
,
start
);
while
(
node
&&
start
<=
end
)
{
while
(
node
&&
start
<=
end
)
{
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
...
@@ -1348,7 +1371,7 @@ static int end_bio_extent_writepage(struct bio *bio,
...
@@ -1348,7 +1371,7 @@ static int end_bio_extent_writepage(struct bio *bio,
spin_lock_irqsave
(
&
tree
->
lock
,
flags
);
spin_lock_irqsave
(
&
tree
->
lock
,
flags
);
if
(
!
state
||
state
->
end
!=
end
)
{
if
(
!
state
||
state
->
end
!=
end
)
{
state
=
NULL
;
state
=
NULL
;
node
=
__
tree_search
(
&
tree
->
stat
e
,
start
,
NULL
,
NULL
);
node
=
__
etree_search
(
tre
e
,
start
,
NULL
,
NULL
);
if
(
node
)
{
if
(
node
)
{
state
=
rb_entry
(
node
,
struct
extent_state
,
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
rb_node
);
...
@@ -1468,7 +1491,7 @@ static int end_bio_extent_readpage(struct bio *bio,
...
@@ -1468,7 +1491,7 @@ static int end_bio_extent_readpage(struct bio *bio,
spin_lock_irqsave
(
&
tree
->
lock
,
flags
);
spin_lock_irqsave
(
&
tree
->
lock
,
flags
);
if
(
!
state
||
state
->
end
!=
end
)
{
if
(
!
state
||
state
->
end
!=
end
)
{
state
=
NULL
;
state
=
NULL
;
node
=
__
tree_search
(
&
tree
->
stat
e
,
start
,
NULL
,
NULL
);
node
=
__
etree_search
(
tre
e
,
start
,
NULL
,
NULL
);
if
(
node
)
{
if
(
node
)
{
state
=
rb_entry
(
node
,
struct
extent_state
,
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
rb_node
);
...
@@ -1631,7 +1654,7 @@ static int submit_one_bio(int rw, struct bio *bio)
...
@@ -1631,7 +1654,7 @@ static int submit_one_bio(int rw, struct bio *bio)
end
=
start
+
bvec
->
bv_len
-
1
;
end
=
start
+
bvec
->
bv_len
-
1
;
spin_lock_irq
(
&
tree
->
lock
);
spin_lock_irq
(
&
tree
->
lock
);
node
=
__
tree_search
(
&
tree
->
stat
e
,
start
,
NULL
,
NULL
);
node
=
__
etree_search
(
tre
e
,
start
,
NULL
,
NULL
);
BUG_ON
(
!
node
);
BUG_ON
(
!
node
);
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
state
=
rb_entry
(
node
,
struct
extent_state
,
rb_node
);
while
(
state
->
end
<
end
)
{
while
(
state
->
end
<
end
)
{
...
...
fs/btrfs/extent_io.h
View file @
80ea96b1
...
@@ -48,6 +48,7 @@ struct extent_io_tree {
...
@@ -48,6 +48,7 @@ struct extent_io_tree {
spinlock_t
lru_lock
;
spinlock_t
lru_lock
;
struct
list_head
buffer_lru
;
struct
list_head
buffer_lru
;
int
lru_size
;
int
lru_size
;
struct
extent_state
*
last
;
};
};
struct
extent_state
{
struct
extent_state
{
...
...
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