Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
090d1875
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
090d1875
编写于
5月 01, 2007
作者:
C
Chris Mason
提交者:
David Woodhouse
5月 01, 2007
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Btrfs: directory readahead
Signed-off-by:
N
Chris Mason
<
chris.mason@oracle.com
>
上级
31f3c99b
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
63 addition
and
1 deletion
+63
-1
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+28
-1
fs/btrfs/disk-io.h
fs/btrfs/disk-io.h
+6
-0
fs/btrfs/extent-tree.c
fs/btrfs/extent-tree.c
+1
-0
fs/btrfs/super.c
fs/btrfs/super.c
+28
-0
未找到文件。
fs/btrfs/disk-io.c
浏览文件 @
090d1875
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
#include <linux/scatterlist.h>
#include <linux/scatterlist.h>
#include <linux/swap.h>
#include <linux/swap.h>
#include <linux/radix-tree.h>
#include <linux/radix-tree.h>
#include <linux/file.h>
#include "ctree.h"
#include "ctree.h"
#include "disk-io.h"
#include "disk-io.h"
#include "transaction.h"
#include "transaction.h"
...
@@ -253,6 +254,29 @@ static struct address_space_operations btree_aops = {
...
@@ -253,6 +254,29 @@ static struct address_space_operations btree_aops = {
.
sync_page
=
block_sync_page
,
.
sync_page
=
block_sync_page
,
};
};
int
readahead_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
)
{
struct
buffer_head
*
bh
=
NULL
;
bh
=
btrfs_find_create_tree_block
(
root
,
blocknr
);
if
(
!
bh
)
return
0
;
if
(
buffer_uptodate
(
bh
))
goto
done
;
if
(
test_set_buffer_locked
(
bh
))
goto
done
;
if
(
!
buffer_uptodate
(
bh
))
{
get_bh
(
bh
);
bh
->
b_end_io
=
end_buffer_read_sync
;
submit_bh
(
READ
,
bh
);
}
else
{
unlock_buffer
(
bh
);
}
done:
brelse
(
bh
);
return
0
;
}
struct
buffer_head
*
read_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
)
struct
buffer_head
*
read_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
)
{
{
struct
buffer_head
*
bh
=
NULL
;
struct
buffer_head
*
bh
=
NULL
;
...
@@ -270,11 +294,14 @@ struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr)
...
@@ -270,11 +294,14 @@ struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr)
wait_on_buffer
(
bh
);
wait_on_buffer
(
bh
);
if
(
!
buffer_uptodate
(
bh
))
if
(
!
buffer_uptodate
(
bh
))
goto
fail
;
goto
fail
;
csum_tree_block
(
root
,
bh
,
1
);
}
else
{
}
else
{
unlock_buffer
(
bh
);
unlock_buffer
(
bh
);
}
}
uptodate:
uptodate:
if
(
!
buffer_checked
(
bh
))
{
csum_tree_block
(
root
,
bh
,
1
);
set_buffer_checked
(
bh
);
}
if
(
check_tree_block
(
root
,
bh
))
if
(
check_tree_block
(
root
,
bh
))
BUG
();
BUG
();
return
bh
;
return
bh
;
...
...
fs/btrfs/disk-io.h
浏览文件 @
090d1875
...
@@ -5,6 +5,11 @@
...
@@ -5,6 +5,11 @@
#define BTRFS_SUPER_INFO_OFFSET (16 * 1024)
#define BTRFS_SUPER_INFO_OFFSET (16 * 1024)
enum
btrfs_bh_state_bits
{
BH_Checked
=
BH_PrivateStart
,
};
BUFFER_FNS
(
Checked
,
checked
);
static
inline
struct
btrfs_node
*
btrfs_buffer_node
(
struct
buffer_head
*
bh
)
static
inline
struct
btrfs_node
*
btrfs_buffer_node
(
struct
buffer_head
*
bh
)
{
{
return
(
struct
btrfs_node
*
)
bh
->
b_data
;
return
(
struct
btrfs_node
*
)
bh
->
b_data
;
...
@@ -21,6 +26,7 @@ static inline struct btrfs_header *btrfs_buffer_header(struct buffer_head *bh)
...
@@ -21,6 +26,7 @@ static inline struct btrfs_header *btrfs_buffer_header(struct buffer_head *bh)
}
}
struct
buffer_head
*
read_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
);
struct
buffer_head
*
read_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
);
int
readahead_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
);
struct
buffer_head
*
btrfs_find_create_tree_block
(
struct
btrfs_root
*
root
,
struct
buffer_head
*
btrfs_find_create_tree_block
(
struct
btrfs_root
*
root
,
u64
blocknr
);
u64
blocknr
);
int
write_tree_block
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
,
int
write_tree_block
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
,
...
...
fs/btrfs/extent-tree.c
浏览文件 @
090d1875
...
@@ -812,6 +812,7 @@ struct buffer_head *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
...
@@ -812,6 +812,7 @@ struct buffer_head *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
BUG_ON
(
ret
);
BUG_ON
(
ret
);
buf
=
btrfs_find_create_tree_block
(
root
,
ins
.
objectid
);
buf
=
btrfs_find_create_tree_block
(
root
,
ins
.
objectid
);
set_buffer_uptodate
(
buf
);
set_buffer_uptodate
(
buf
);
set_buffer_checked
(
buf
);
set_radix_bit
(
&
trans
->
transaction
->
dirty_pages
,
buf
->
b_page
->
index
);
set_radix_bit
(
&
trans
->
transaction
->
dirty_pages
,
buf
->
b_page
->
index
);
return
buf
;
return
buf
;
}
}
...
...
fs/btrfs/super.c
浏览文件 @
090d1875
...
@@ -585,6 +585,31 @@ printk("adding new root for inode %lu root %p (found %p)\n", inode->i_ino, sub_r
...
@@ -585,6 +585,31 @@ printk("adding new root for inode %lu root %p (found %p)\n", inode->i_ino, sub_r
return
d_splice_alias
(
inode
,
dentry
);
return
d_splice_alias
(
inode
,
dentry
);
}
}
static
void
reada_leaves
(
struct
btrfs_root
*
root
,
struct
btrfs_path
*
path
)
{
struct
btrfs_node
*
node
;
int
i
;
int
nritems
;
u64
objectid
;
u64
item_objectid
;
u64
blocknr
;
int
slot
;
if
(
!
path
->
nodes
[
1
])
return
;
node
=
btrfs_buffer_node
(
path
->
nodes
[
1
]);
slot
=
path
->
slots
[
1
];
objectid
=
btrfs_disk_key_objectid
(
&
node
->
ptrs
[
slot
].
key
);
nritems
=
btrfs_header_nritems
(
&
node
->
header
);
for
(
i
=
slot
;
i
<
nritems
;
i
++
)
{
item_objectid
=
btrfs_disk_key_objectid
(
&
node
->
ptrs
[
i
].
key
);
if
(
item_objectid
!=
objectid
)
break
;
blocknr
=
btrfs_node_blockptr
(
node
,
i
);
readahead_tree_block
(
root
,
blocknr
);
}
}
static
int
btrfs_readdir
(
struct
file
*
filp
,
void
*
dirent
,
filldir_t
filldir
)
static
int
btrfs_readdir
(
struct
file
*
filp
,
void
*
dirent
,
filldir_t
filldir
)
{
{
struct
inode
*
inode
=
filp
->
f_path
.
dentry
->
d_inode
;
struct
inode
*
inode
=
filp
->
f_path
.
dentry
->
d_inode
;
...
@@ -619,6 +644,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
...
@@ -619,6 +644,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if
(
ret
<
0
)
if
(
ret
<
0
)
goto
err
;
goto
err
;
advance
=
0
;
advance
=
0
;
reada_leaves
(
root
,
path
);
while
(
1
)
{
while
(
1
)
{
leaf
=
btrfs_buffer_leaf
(
path
->
nodes
[
0
]);
leaf
=
btrfs_buffer_leaf
(
path
->
nodes
[
0
]);
nritems
=
btrfs_header_nritems
(
&
leaf
->
header
);
nritems
=
btrfs_header_nritems
(
&
leaf
->
header
);
...
@@ -631,6 +657,8 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
...
@@ -631,6 +657,8 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
leaf
=
btrfs_buffer_leaf
(
path
->
nodes
[
0
]);
leaf
=
btrfs_buffer_leaf
(
path
->
nodes
[
0
]);
nritems
=
btrfs_header_nritems
(
&
leaf
->
header
);
nritems
=
btrfs_header_nritems
(
&
leaf
->
header
);
slot
=
path
->
slots
[
0
];
slot
=
path
->
slots
[
0
];
if
(
path
->
slots
[
1
]
==
0
)
reada_leaves
(
root
,
path
);
}
else
{
}
else
{
slot
++
;
slot
++
;
path
->
slots
[
0
]
++
;
path
->
slots
[
0
]
++
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录