Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
fbdc762b
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
162
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fbdc762b
编写于
17年前
作者:
C
Chris Mason
提交者:
David Woodhouse
17年前
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Btrfs: use a separate flag for search_start vs a hint in find_free_extent
Signed-off-by:
N
Chris Mason
<
chris.mason@oracle.com
>
上级
1e2677e0
master
alk-4.19.24
alk-4.19.30
alk-4.19.34
alk-4.19.36
alk-4.19.43
alk-4.19.48
alk-4.19.57
ck-4.19.67
ck-4.19.81
ck-4.19.91
github/fork/deepanshu1422/fix-typo-in-comment
github/fork/haosdent/fix-typo
linux-next
v4.19.91
v4.19.90
v4.19.89
v4.19.88
v4.19.87
v4.19.86
v4.19.85
v4.19.84
v4.19.83
v4.19.82
v4.19.81
v4.19.80
v4.19.79
v4.19.78
v4.19.77
v4.19.76
v4.19.75
v4.19.74
v4.19.73
v4.19.72
v4.19.71
v4.19.70
v4.19.69
v4.19.68
v4.19.67
v4.19.66
v4.19.65
v4.19.64
v4.19.63
v4.19.62
v4.19.61
v4.19.60
v4.19.59
v4.19.58
v4.19.57
v4.19.56
v4.19.55
v4.19.54
v4.19.53
v4.19.52
v4.19.51
v4.19.50
v4.19.49
v4.19.48
v4.19.47
v4.19.46
v4.19.45
v4.19.44
v4.19.43
v4.19.42
v4.19.41
v4.19.40
v4.19.39
v4.19.38
v4.19.37
v4.19.36
v4.19.35
v4.19.34
v4.19.33
v4.19.32
v4.19.31
v4.19.30
v4.19.29
v4.19.28
v4.19.27
v4.19.26
v4.19.25
v4.19.24
v4.19.23
v4.19.22
v4.19.21
v4.19.20
v4.19.19
v4.19.18
v4.19.17
v4.19.16
v4.19.15
v4.19.14
v4.19.13
v4.19.12
v4.19.11
v4.19.10
v4.19.9
v4.19.8
v4.19.7
v4.19.6
v4.19.5
v4.19.4
v4.19.3
v4.19.2
v4.19.1
v4.19
v4.19-rc8
v4.19-rc7
v4.19-rc6
v4.19-rc5
v4.19-rc4
v4.19-rc3
v4.19-rc2
v4.19-rc1
ck-release-21
ck-release-20
ck-release-19.2
ck-release-19.1
ck-release-19
ck-release-18
ck-release-17.2
ck-release-17.1
ck-release-17
ck-release-16
ck-release-15.1
ck-release-15
ck-release-14
ck-release-13.2
ck-release-13
ck-release-12
ck-release-11
ck-release-10
ck-release-9
ck-release-7
alk-release-15
alk-release-14
alk-release-13.2
alk-release-13
alk-release-12
alk-release-11
alk-release-10
alk-release-9
alk-release-7
无相关合并请求
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
27 deletion
+42
-27
fs/btrfs/extent-tree.c
fs/btrfs/extent-tree.c
+42
-27
未找到文件。
fs/btrfs/extent-tree.c
浏览文件 @
fbdc762b
...
...
@@ -5,8 +5,9 @@
#include "transaction.h"
static
int
find_free_extent
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
orig_root
,
u64
num_blocks
,
u64
search_start
,
u64
search_end
,
struct
btrfs_key
*
ins
,
int
data
);
*
orig_root
,
u64
num_blocks
,
u64
search_start
,
u64
search_end
,
u64
hint_block
,
struct
btrfs_key
*
ins
,
int
data
);
static
int
finish_current_insert
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
extent_root
);
static
int
del_pending_extents
(
struct
btrfs_trans_handle
*
trans
,
struct
...
...
@@ -157,12 +158,6 @@ static struct btrfs_block_group_cache *lookup_block_group(struct
block_group
->
key
.
objectid
+
block_group
->
key
.
offset
)
return
block_group
;
}
WARN_ON
(
1
);
printk
(
"lookup_block_group fails for blocknr %Lu
\n
"
,
blocknr
);
printk
(
"last ret was %d
\n
"
,
ret
);
if
(
ret
)
{
printk
(
"last block group was %Lu %Lu
\n
"
,
block_group
->
key
.
objectid
,
block_group
->
key
.
offset
);
}
return
NULL
;
}
...
...
@@ -378,7 +373,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
struct
btrfs_key
ins
;
u32
refs
;
find_free_extent
(
trans
,
root
->
fs_info
->
extent_root
,
0
,
0
,
(
u64
)
-
1
,
find_free_extent
(
trans
,
root
->
fs_info
->
extent_root
,
0
,
0
,
(
u64
)
-
1
,
0
,
&
ins
,
0
);
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
...
...
@@ -495,7 +490,7 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans,
struct
btrfs_block_group_item
*
bi
;
struct
btrfs_key
ins
;
find_free_extent
(
trans
,
extent_root
,
0
,
0
,
(
u64
)
-
1
,
&
ins
,
0
);
find_free_extent
(
trans
,
extent_root
,
0
,
0
,
(
u64
)
-
1
,
0
,
&
ins
,
0
);
ret
=
btrfs_search_slot
(
trans
,
extent_root
,
&
cache
->
key
,
path
,
0
,
1
);
BUG_ON
(
ret
);
bi
=
btrfs_item_ptr
(
btrfs_buffer_leaf
(
path
->
nodes
[
0
]),
path
->
slots
[
0
],
...
...
@@ -788,7 +783,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
btrfs_set_key_type
(
&
key
,
BTRFS_EXTENT_ITEM_KEY
);
key
.
offset
=
num_blocks
;
find_free_extent
(
trans
,
root
,
0
,
0
,
(
u64
)
-
1
,
&
ins
,
0
);
find_free_extent
(
trans
,
root
,
0
,
0
,
(
u64
)
-
1
,
0
,
&
ins
,
0
);
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
btrfs_init_path
(
path
);
...
...
@@ -906,7 +901,8 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
*/
static
int
find_free_extent
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
orig_root
,
u64
num_blocks
,
u64
search_start
,
u64
search_end
,
struct
btrfs_key
*
ins
,
int
data
)
search_end
,
u64
hint_block
,
struct
btrfs_key
*
ins
,
int
data
)
{
struct
btrfs_path
*
path
;
struct
btrfs_key
key
;
...
...
@@ -926,6 +922,7 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
int
level
;
struct
btrfs_block_group_cache
*
block_group
;
int
full_scan
=
0
;
int
wrapped
=
0
;
u64
limit
;
path
=
btrfs_alloc_path
();
...
...
@@ -940,10 +937,10 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
}
if
(
search_end
==
(
u64
)
-
1
)
search_end
=
btrfs_super_total_blocks
(
info
->
disk_super
);
if
(
search_start
)
{
block_group
=
lookup_block_group
(
info
,
search_start
);
if
(
hint_block
)
{
block_group
=
lookup_block_group
(
info
,
hint_block
);
block_group
=
btrfs_find_block_group
(
root
,
block_group
,
search_start
,
data
,
1
);
hint_block
,
data
,
1
);
}
else
{
block_group
=
btrfs_find_block_group
(
root
,
trans
->
block_group
,
0
,
...
...
@@ -954,7 +951,7 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
if
(
!
block_group
->
data
)
search_start
=
find_search_start
(
root
,
&
block_group
,
search_start
,
total_needed
);
else
else
if
(
!
full_scan
)
search_start
=
max
(
block_group
->
last_alloc
,
search_start
);
btrfs_init_path
(
path
);
...
...
@@ -1039,7 +1036,7 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
start_found
=
1
;
last_block
=
key
.
objectid
+
key
.
offset
;
if
(
last_block
>=
block_group
->
key
.
objectid
+
if
(
!
full_scan
&&
last_block
>=
block_group
->
key
.
objectid
+
block_group
->
key
.
offset
)
{
btrfs_release_path
(
root
,
path
);
search_start
=
block_group
->
key
.
objectid
+
...
...
@@ -1059,10 +1056,15 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
BUG_ON
(
ins
->
objectid
<
search_start
);
if
(
ins
->
objectid
+
num_blocks
>=
search_end
)
{
if
(
full_scan
)
return
-
ENOSPC
;
if
(
full_scan
)
{
ret
=
-
ENOSPC
;
goto
error
;
}
search_start
=
orig_search_start
;
full_scan
=
1
;
if
(
wrapped
)
full_scan
=
1
;
else
wrapped
=
1
;
goto
new_group
;
}
for
(
test_block
=
ins
->
objectid
;
...
...
@@ -1132,14 +1134,20 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
new_group:
if
(
search_start
+
num_blocks
>=
search_end
)
{
search_start
=
orig_search_start
;
printk
(
"doing full scan!
\n
"
);
full_scan
=
1
;
if
(
full_scan
)
{
ret
=
-
ENOSPC
;
goto
error
;
}
if
(
wrapped
)
full_scan
=
1
;
else
wrapped
=
1
;
}
block_group
=
lookup_block_group
(
info
,
search_start
);
cond_resched
();
if
(
!
full_scan
)
block_group
=
btrfs_find_block_group
(
root
,
block_group
,
search_start
,
data
,
0
);
cond_resched
();
goto
check_failed
;
error:
...
...
@@ -1156,12 +1164,13 @@ printk("doing full scan!\n");
*/
int
btrfs_alloc_extent
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
,
u64
owner
,
u64
num_blocks
,
u64
search_start
,
u64
num_blocks
,
u64
hint_block
,
u64
search_end
,
struct
btrfs_key
*
ins
,
int
data
)
{
int
ret
;
int
pending_ret
;
u64
super_blocks_used
;
u64
search_start
=
0
;
struct
btrfs_fs_info
*
info
=
root
->
fs_info
;
struct
btrfs_root
*
extent_root
=
info
->
extent_root
;
struct
btrfs_extent_item
extent_item
;
...
...
@@ -1193,7 +1202,7 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
*/
if
(
data
)
{
ret
=
find_free_extent
(
trans
,
root
,
0
,
0
,
search_end
,
&
prealloc_key
,
0
);
search_end
,
0
,
&
prealloc_key
,
0
);
if
(
ret
)
{
return
ret
;
}
...
...
@@ -1204,9 +1213,11 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
search_start
=
info
->
extent_tree_prealloc
[
0
]
+
1
;
}
}
if
(
hint_block
<
search_start
)
hint_block
=
search_start
;
/* do the real allocation */
ret
=
find_free_extent
(
trans
,
root
,
num_blocks
,
search_start
,
search_end
,
ins
,
data
);
search_end
,
hint_block
,
ins
,
data
);
if
(
ret
)
{
return
ret
;
}
...
...
@@ -1226,8 +1237,12 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
else
search_start
=
ins
->
objectid
+
ins
->
offset
;
if
(
hint_block
<
search_start
)
hint_block
=
search_start
;
ret
=
find_free_extent
(
trans
,
root
,
0
,
search_start
,
search_end
,
&
prealloc_key
,
0
);
search_end
,
hint_block
,
&
prealloc_key
,
0
);
if
(
ret
)
{
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部