Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Linux-御风守护者
linux
提交
509659cd
L
linux
项目概览
Linux-御风守护者
/
linux
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
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,发现更多精彩内容 >>
提交
509659cd
编写于
5月 10, 2007
作者:
C
Chris Mason
提交者:
David Woodhouse
5月 10, 2007
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Btrfs: switch to crc32c instead of sha256
Signed-off-by:
N
Chris Mason
<
chris.mason@oracle.com
>
上级
8d7be552
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
28 addition
and
23 deletion
+28
-23
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+3
-1
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+6
-6
fs/btrfs/file-item.c
fs/btrfs/file-item.c
+19
-16
未找到文件。
fs/btrfs/ctree.h
浏览文件 @
509659cd
...
...
@@ -30,6 +30,8 @@ extern struct kmem_cache *btrfs_path_cachep;
/* 32 bytes in various csum fields */
#define BTRFS_CSUM_SIZE 32
/* four bytes for CRC32 */
#define BTRFS_CRC32_SIZE 4
/*
* the key defines the order in the tree, and so it also defines (optimal)
...
...
@@ -235,7 +237,7 @@ struct btrfs_file_extent_item {
}
__attribute__
((
__packed__
));
struct
btrfs_csum_item
{
u8
csum
[
BTRFS_CSUM_SIZE
]
;
u8
csum
;
}
__attribute__
((
__packed__
));
struct
btrfs_device_item
{
...
...
fs/btrfs/disk-io.c
浏览文件 @
509659cd
...
...
@@ -196,14 +196,14 @@ int btrfs_csum_data(struct btrfs_root * root, char *data, size_t len,
ret
=
crypto_hash_digest
(
&
desc
,
&
sg
,
1
,
result
);
spin_unlock
(
&
root
->
fs_info
->
hash_lock
);
if
(
ret
)
{
printk
(
"
sha256
digest failed
\n
"
);
printk
(
"digest failed
\n
"
);
}
return
ret
;
}
static
int
csum_tree_block
(
struct
btrfs_root
*
root
,
struct
buffer_head
*
bh
,
int
verify
)
{
char
result
[
BTRFS_C
SUM
_SIZE
];
char
result
[
BTRFS_C
RC32
_SIZE
];
int
ret
;
struct
btrfs_node
*
node
;
...
...
@@ -212,14 +212,14 @@ static int csum_tree_block(struct btrfs_root *root, struct buffer_head *bh,
if
(
ret
)
return
ret
;
if
(
verify
)
{
if
(
memcmp
(
bh
->
b_data
,
result
,
BTRFS_C
SUM
_SIZE
))
{
if
(
memcmp
(
bh
->
b_data
,
result
,
BTRFS_C
RC32
_SIZE
))
{
printk
(
"checksum verify failed on %Lu
\n
"
,
bh_blocknr
(
bh
));
return
1
;
}
}
else
{
node
=
btrfs_buffer_node
(
bh
);
memcpy
(
node
->
header
.
csum
,
result
,
BTRFS_C
SUM
_SIZE
);
memcpy
(
node
->
header
.
csum
,
result
,
BTRFS_C
RC32
_SIZE
);
}
return
0
;
}
...
...
@@ -576,10 +576,10 @@ struct btrfs_root *open_ctree(struct super_block *sb)
sizeof
(
struct
btrfs_key
));
insert_inode_hash
(
fs_info
->
btree_inode
);
mapping_set_gfp_mask
(
fs_info
->
btree_inode
->
i_mapping
,
GFP_NOFS
);
fs_info
->
hash_tfm
=
crypto_alloc_hash
(
"
sha256
"
,
0
,
CRYPTO_ALG_ASYNC
);
fs_info
->
hash_tfm
=
crypto_alloc_hash
(
"
crc32c
"
,
0
,
CRYPTO_ALG_ASYNC
);
spin_lock_init
(
&
fs_info
->
hash_lock
);
if
(
!
fs_info
->
hash_tfm
||
IS_ERR
(
fs_info
->
hash_tfm
))
{
printk
(
"failed to allocate
sha256
hash
\n
"
);
printk
(
"failed to allocate
digest
hash
\n
"
);
return
NULL
;
}
mutex_init
(
&
fs_info
->
trans_mutex
);
...
...
fs/btrfs/file-item.c
浏览文件 @
509659cd
...
...
@@ -4,8 +4,8 @@
#include "transaction.h"
#define MAX_CSUM_ITEMS(r) ((((BTRFS_LEAF_DATA_SIZE(r) - \
sizeof(struct btrfs_item) * 2) / \
sizeof(struct btrfs_csum_item)
) - 1))
sizeof(struct btrfs_item) * 2) / \
BTRFS_CRC32_SIZE
) - 1))
int
btrfs_insert_file_extent
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
,
u64
objectid
,
u64
pos
,
...
...
@@ -78,7 +78,7 @@ struct btrfs_csum_item *btrfs_lookup_csum(struct btrfs_trans_handle *trans,
csum_offset
=
(
offset
-
found_key
.
offset
)
>>
root
->
fs_info
->
sb
->
s_blocksize_bits
;
csums_in_item
=
btrfs_item_size
(
leaf
->
items
+
path
->
slots
[
0
]);
csums_in_item
/=
sizeof
(
struct
btrfs_csum_item
)
;
csums_in_item
/=
BTRFS_CRC32_SIZE
;
if
(
csum_offset
>=
csums_in_item
)
{
ret
=
-
EFBIG
;
...
...
@@ -86,7 +86,8 @@ struct btrfs_csum_item *btrfs_lookup_csum(struct btrfs_trans_handle *trans,
}
}
item
=
btrfs_item_ptr
(
leaf
,
path
->
slots
[
0
],
struct
btrfs_csum_item
);
item
+=
csum_offset
;
item
=
(
struct
btrfs_csum_item
*
)((
unsigned
char
*
)
item
+
csum_offset
*
BTRFS_CRC32_SIZE
);
return
item
;
fail:
if
(
ret
>
0
)
...
...
@@ -143,8 +144,7 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
/* we found one, but it isn't big enough yet */
leaf
=
btrfs_buffer_leaf
(
path
->
nodes
[
0
]);
item_size
=
btrfs_item_size
(
leaf
->
items
+
path
->
slots
[
0
]);
if
((
item_size
/
sizeof
(
struct
btrfs_csum_item
))
>=
MAX_CSUM_ITEMS
(
root
))
{
if
((
item_size
/
BTRFS_CRC32_SIZE
)
>=
MAX_CSUM_ITEMS
(
root
))
{
/* already at max size, make a new one */
goto
insert
;
}
...
...
@@ -159,7 +159,7 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
*/
btrfs_release_path
(
root
,
path
);
ret
=
btrfs_search_slot
(
trans
,
root
,
&
file_key
,
path
,
sizeof
(
struct
btrfs_csum_item
)
,
1
);
BTRFS_CRC32_SIZE
,
1
);
if
(
ret
<
0
)
goto
fail
;
if
(
ret
==
0
)
{
...
...
@@ -180,10 +180,10 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
goto
insert
;
}
if
(
csum_offset
>=
btrfs_item_size
(
leaf
->
items
+
path
->
slots
[
0
])
/
sizeof
(
struct
btrfs_csum_item
)
)
{
u32
diff
=
(
csum_offset
+
1
)
*
sizeof
(
struct
btrfs_csum_item
)
;
BTRFS_CRC32_SIZE
)
{
u32
diff
=
(
csum_offset
+
1
)
*
BTRFS_CRC32_SIZE
;
diff
=
diff
-
btrfs_item_size
(
leaf
->
items
+
path
->
slots
[
0
]);
WARN_ON
(
diff
!=
sizeof
(
struct
btrfs_csum_item
)
);
WARN_ON
(
diff
!=
BTRFS_CRC32_SIZE
);
ret
=
btrfs_extend_item
(
trans
,
root
,
path
,
diff
);
BUG_ON
(
ret
);
goto
csum
;
...
...
@@ -193,7 +193,7 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
btrfs_release_path
(
root
,
path
);
csum_offset
=
0
;
ret
=
btrfs_insert_empty_item
(
trans
,
root
,
path
,
&
file_key
,
sizeof
(
struct
btrfs_csum_item
)
);
BTRFS_CRC32_SIZE
);
if
(
ret
!=
0
)
{
printk
(
"at insert for %Lu %u %Lu ret is %d
\n
"
,
file_key
.
objectid
,
file_key
.
flags
,
file_key
.
offset
,
ret
);
WARN_ON
(
1
);
...
...
@@ -203,10 +203,13 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
item
=
btrfs_item_ptr
(
btrfs_buffer_leaf
(
path
->
nodes
[
0
]),
path
->
slots
[
0
],
struct
btrfs_csum_item
);
ret
=
0
;
item
+=
csum_offset
;
item
=
(
struct
btrfs_csum_item
*
)((
unsigned
char
*
)
item
+
csum_offset
*
BTRFS_CRC32_SIZE
);
found:
btrfs_check_bounds
(
item
->
csum
,
BTRFS_CSUM_SIZE
,
path
->
nodes
[
0
]
->
b_data
,
root
->
fs_info
->
sb
->
s_blocksize
);
ret
=
btrfs_csum_data
(
root
,
data
,
len
,
item
->
csum
);
btrfs_check_bounds
(
&
item
->
csum
,
BTRFS_CRC32_SIZE
,
path
->
nodes
[
0
]
->
b_data
,
root
->
fs_info
->
sb
->
s_blocksize
);
ret
=
btrfs_csum_data
(
root
,
data
,
len
,
&
item
->
csum
);
btrfs_mark_buffer_dirty
(
path
->
nodes
[
0
]);
fail:
btrfs_release_path
(
root
,
path
);
...
...
@@ -222,7 +225,7 @@ int btrfs_csum_verify_file_block(struct btrfs_root *root,
struct
btrfs_key
file_key
;
struct
btrfs_path
*
path
;
struct
btrfs_csum_item
*
item
;
char
result
[
BTRFS_C
SUM
_SIZE
];
char
result
[
BTRFS_C
RC32
_SIZE
];
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
...
...
@@ -244,7 +247,7 @@ int btrfs_csum_verify_file_block(struct btrfs_root *root,
ret
=
btrfs_csum_data
(
root
,
data
,
len
,
result
);
WARN_ON
(
ret
);
if
(
memcmp
(
result
,
item
->
csum
,
BTRFS_CSUM
_SIZE
))
if
(
memcmp
(
result
,
&
item
->
csum
,
BTRFS_CRC32
_SIZE
))
ret
=
1
;
fail:
btrfs_release_path
(
root
,
path
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录