Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
2ba5f7ae
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2ba5f7ae
编写于
10月 31, 2008
作者:
A
Artem Bityutskiy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
UBIFS: introduce LPT dump function
Signed-off-by:
N
Artem Bityutskiy
<
Artem.Bityutskiy@nokia.com
>
上级
787845bd
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
186 addition
and
48 deletion
+186
-48
fs/ubifs/debug.c
fs/ubifs/debug.c
+18
-10
fs/ubifs/debug.h
fs/ubifs/debug.h
+25
-20
fs/ubifs/lpt.c
fs/ubifs/lpt.c
+14
-13
fs/ubifs/lpt_commit.c
fs/ubifs/lpt_commit.c
+126
-5
fs/ubifs/ubifs.h
fs/ubifs/ubifs.h
+3
-0
未找到文件。
fs/ubifs/debug.c
浏览文件 @
2ba5f7ae
...
@@ -646,7 +646,8 @@ void dbg_dump_lprops(struct ubifs_info *c)
...
@@ -646,7 +646,8 @@ void dbg_dump_lprops(struct ubifs_info *c)
struct
ubifs_lprops
lp
;
struct
ubifs_lprops
lp
;
struct
ubifs_lp_stats
lst
;
struct
ubifs_lp_stats
lst
;
printk
(
KERN_DEBUG
"(pid %d) Dumping LEB properties
\n
"
,
current
->
pid
);
printk
(
KERN_DEBUG
"(pid %d) start dumping LEB properties
\n
"
,
current
->
pid
);
ubifs_get_lp_stats
(
c
,
&
lst
);
ubifs_get_lp_stats
(
c
,
&
lst
);
dbg_dump_lstats
(
&
lst
);
dbg_dump_lstats
(
&
lst
);
...
@@ -657,6 +658,8 @@ void dbg_dump_lprops(struct ubifs_info *c)
...
@@ -657,6 +658,8 @@ void dbg_dump_lprops(struct ubifs_info *c)
dbg_dump_lprop
(
c
,
&
lp
);
dbg_dump_lprop
(
c
,
&
lp
);
}
}
printk
(
KERN_DEBUG
"(pid %d) finish dumping LEB properties
\n
"
,
current
->
pid
);
}
}
void
dbg_dump_lpt_info
(
struct
ubifs_info
*
c
)
void
dbg_dump_lpt_info
(
struct
ubifs_info
*
c
)
...
@@ -664,6 +667,7 @@ void dbg_dump_lpt_info(struct ubifs_info *c)
...
@@ -664,6 +667,7 @@ void dbg_dump_lpt_info(struct ubifs_info *c)
int
i
;
int
i
;
spin_lock
(
&
dbg_lock
);
spin_lock
(
&
dbg_lock
);
printk
(
KERN_DEBUG
"(pid %d) dumping LPT information
\n
"
,
current
->
pid
);
printk
(
KERN_DEBUG
"
\t
lpt_sz: %lld
\n
"
,
c
->
lpt_sz
);
printk
(
KERN_DEBUG
"
\t
lpt_sz: %lld
\n
"
,
c
->
lpt_sz
);
printk
(
KERN_DEBUG
"
\t
pnode_sz: %d
\n
"
,
c
->
pnode_sz
);
printk
(
KERN_DEBUG
"
\t
pnode_sz: %d
\n
"
,
c
->
pnode_sz
);
printk
(
KERN_DEBUG
"
\t
nnode_sz: %d
\n
"
,
c
->
nnode_sz
);
printk
(
KERN_DEBUG
"
\t
nnode_sz: %d
\n
"
,
c
->
nnode_sz
);
...
@@ -704,8 +708,8 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
...
@@ -704,8 +708,8 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
if
(
dbg_failure_mode
)
if
(
dbg_failure_mode
)
return
;
return
;
printk
(
KERN_DEBUG
"(pid %d)
Dumping LEB %d
\n
"
,
current
->
pid
,
lnum
);
printk
(
KERN_DEBUG
"(pid %d)
start dumping LEB %d
\n
"
,
current
->
pid
,
lnum
);
sleb
=
ubifs_scan
(
c
,
lnum
,
0
,
c
->
dbg
->
buf
);
sleb
=
ubifs_scan
(
c
,
lnum
,
0
,
c
->
dbg
->
buf
);
if
(
IS_ERR
(
sleb
))
{
if
(
IS_ERR
(
sleb
))
{
ubifs_err
(
"scan error %d"
,
(
int
)
PTR_ERR
(
sleb
));
ubifs_err
(
"scan error %d"
,
(
int
)
PTR_ERR
(
sleb
));
...
@@ -722,6 +726,8 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
...
@@ -722,6 +726,8 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
dbg_dump_node
(
c
,
snod
->
node
);
dbg_dump_node
(
c
,
snod
->
node
);
}
}
printk
(
KERN_DEBUG
"(pid %d) finish dumping LEB %d
\n
"
,
current
->
pid
,
lnum
);
ubifs_scan_destroy
(
sleb
);
ubifs_scan_destroy
(
sleb
);
return
;
return
;
}
}
...
@@ -769,7 +775,7 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat)
...
@@ -769,7 +775,7 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat)
{
{
int
i
;
int
i
;
printk
(
KERN_DEBUG
"(pid %d)
D
umping heap cat %d (%d elements)
\n
"
,
printk
(
KERN_DEBUG
"(pid %d)
start d
umping heap cat %d (%d elements)
\n
"
,
current
->
pid
,
cat
,
heap
->
cnt
);
current
->
pid
,
cat
,
heap
->
cnt
);
for
(
i
=
0
;
i
<
heap
->
cnt
;
i
++
)
{
for
(
i
=
0
;
i
<
heap
->
cnt
;
i
++
)
{
struct
ubifs_lprops
*
lprops
=
heap
->
arr
[
i
];
struct
ubifs_lprops
*
lprops
=
heap
->
arr
[
i
];
...
@@ -778,6 +784,7 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat)
...
@@ -778,6 +784,7 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat)
"flags %d
\n
"
,
i
,
lprops
->
lnum
,
lprops
->
hpos
,
"flags %d
\n
"
,
i
,
lprops
->
lnum
,
lprops
->
hpos
,
lprops
->
free
,
lprops
->
dirty
,
lprops
->
flags
);
lprops
->
free
,
lprops
->
dirty
,
lprops
->
flags
);
}
}
printk
(
KERN_DEBUG
"(pid %d) finish dumping heap
\n
"
,
current
->
pid
);
}
}
void
dbg_dump_pnode
(
struct
ubifs_info
*
c
,
struct
ubifs_pnode
*
pnode
,
void
dbg_dump_pnode
(
struct
ubifs_info
*
c
,
struct
ubifs_pnode
*
pnode
,
...
@@ -785,7 +792,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
...
@@ -785,7 +792,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
{
{
int
i
;
int
i
;
printk
(
KERN_DEBUG
"(pid %d)
D
umping pnode:
\n
"
,
current
->
pid
);
printk
(
KERN_DEBUG
"(pid %d)
d
umping pnode:
\n
"
,
current
->
pid
);
printk
(
KERN_DEBUG
"
\t
address %zx parent %zx cnext %zx
\n
"
,
printk
(
KERN_DEBUG
"
\t
address %zx parent %zx cnext %zx
\n
"
,
(
size_t
)
pnode
,
(
size_t
)
parent
,
(
size_t
)
pnode
->
cnext
);
(
size_t
)
pnode
,
(
size_t
)
parent
,
(
size_t
)
pnode
->
cnext
);
printk
(
KERN_DEBUG
"
\t
flags %lu iip %d level %d num %d
\n
"
,
printk
(
KERN_DEBUG
"
\t
flags %lu iip %d level %d num %d
\n
"
,
...
@@ -804,7 +811,7 @@ void dbg_dump_tnc(struct ubifs_info *c)
...
@@ -804,7 +811,7 @@ void dbg_dump_tnc(struct ubifs_info *c)
int
level
;
int
level
;
printk
(
KERN_DEBUG
"
\n
"
);
printk
(
KERN_DEBUG
"
\n
"
);
printk
(
KERN_DEBUG
"(pid %d)
Dumping the
TNC tree
\n
"
,
current
->
pid
);
printk
(
KERN_DEBUG
"(pid %d)
start dumping
TNC tree
\n
"
,
current
->
pid
);
znode
=
ubifs_tnc_levelorder_next
(
c
->
zroot
.
znode
,
NULL
);
znode
=
ubifs_tnc_levelorder_next
(
c
->
zroot
.
znode
,
NULL
);
level
=
znode
->
level
;
level
=
znode
->
level
;
printk
(
KERN_DEBUG
"== Level %d ==
\n
"
,
level
);
printk
(
KERN_DEBUG
"== Level %d ==
\n
"
,
level
);
...
@@ -816,8 +823,7 @@ void dbg_dump_tnc(struct ubifs_info *c)
...
@@ -816,8 +823,7 @@ void dbg_dump_tnc(struct ubifs_info *c)
dbg_dump_znode
(
c
,
znode
);
dbg_dump_znode
(
c
,
znode
);
znode
=
ubifs_tnc_levelorder_next
(
c
->
zroot
.
znode
,
znode
);
znode
=
ubifs_tnc_levelorder_next
(
c
->
zroot
.
znode
,
znode
);
}
}
printk
(
KERN_DEBUG
"(pid %d) finish dumping TNC tree
\n
"
,
current
->
pid
);
printk
(
KERN_DEBUG
"
\n
"
);
}
}
static
int
dump_znode
(
struct
ubifs_info
*
c
,
struct
ubifs_znode
*
znode
,
static
int
dump_znode
(
struct
ubifs_info
*
c
,
struct
ubifs_znode
*
znode
,
...
@@ -992,7 +998,8 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
...
@@ -992,7 +998,8 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
ubifs_err
(
"1st entry at %d:%d has key %s"
,
zbr1
->
lnum
,
ubifs_err
(
"1st entry at %d:%d has key %s"
,
zbr1
->
lnum
,
zbr1
->
offs
,
DBGKEY
(
&
key
));
zbr1
->
offs
,
DBGKEY
(
&
key
));
ubifs_err
(
"but it should have key %s according to tnc"
,
ubifs_err
(
"but it should have key %s according to tnc"
,
DBGKEY
(
&
zbr1
->
key
));
dbg_dump_node
(
c
,
dent1
);
DBGKEY
(
&
zbr1
->
key
));
dbg_dump_node
(
c
,
dent1
);
goto
out_free
;
goto
out_free
;
}
}
...
@@ -1001,7 +1008,8 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
...
@@ -1001,7 +1008,8 @@ static int dbg_check_key_order(struct ubifs_info *c, struct ubifs_zbranch *zbr1,
ubifs_err
(
"2nd entry at %d:%d has key %s"
,
zbr1
->
lnum
,
ubifs_err
(
"2nd entry at %d:%d has key %s"
,
zbr1
->
lnum
,
zbr1
->
offs
,
DBGKEY
(
&
key
));
zbr1
->
offs
,
DBGKEY
(
&
key
));
ubifs_err
(
"but it should have key %s according to tnc"
,
ubifs_err
(
"but it should have key %s according to tnc"
,
DBGKEY
(
&
zbr2
->
key
));
dbg_dump_node
(
c
,
dent2
);
DBGKEY
(
&
zbr2
->
key
));
dbg_dump_node
(
c
,
dent2
);
goto
out_free
;
goto
out_free
;
}
}
...
...
fs/ubifs/debug.h
浏览文件 @
2ba5f7ae
...
@@ -270,6 +270,8 @@ const char *dbg_get_key_dump(const struct ubifs_info *c,
...
@@ -270,6 +270,8 @@ const char *dbg_get_key_dump(const struct ubifs_info *c,
const
union
ubifs_key
*
key
);
const
union
ubifs_key
*
key
);
void
dbg_dump_inode
(
const
struct
ubifs_info
*
c
,
const
struct
inode
*
inode
);
void
dbg_dump_inode
(
const
struct
ubifs_info
*
c
,
const
struct
inode
*
inode
);
void
dbg_dump_node
(
const
struct
ubifs_info
*
c
,
const
void
*
node
);
void
dbg_dump_node
(
const
struct
ubifs_info
*
c
,
const
void
*
node
);
void
dbg_dump_lpt_node
(
const
struct
ubifs_info
*
c
,
void
*
node
,
int
lnum
,
int
offs
);
void
dbg_dump_budget_req
(
const
struct
ubifs_budget_req
*
req
);
void
dbg_dump_budget_req
(
const
struct
ubifs_budget_req
*
req
);
void
dbg_dump_lstats
(
const
struct
ubifs_lp_stats
*
lst
);
void
dbg_dump_lstats
(
const
struct
ubifs_lp_stats
*
lst
);
void
dbg_dump_budg
(
struct
ubifs_info
*
c
);
void
dbg_dump_budg
(
struct
ubifs_info
*
c
);
...
@@ -284,6 +286,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
...
@@ -284,6 +286,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
struct
ubifs_nnode
*
parent
,
int
iip
);
struct
ubifs_nnode
*
parent
,
int
iip
);
void
dbg_dump_tnc
(
struct
ubifs_info
*
c
);
void
dbg_dump_tnc
(
struct
ubifs_info
*
c
);
void
dbg_dump_index
(
struct
ubifs_info
*
c
);
void
dbg_dump_index
(
struct
ubifs_info
*
c
);
void
dbg_dump_lpt_lebs
(
const
struct
ubifs_info
*
c
);
/* Checking helper functions */
/* Checking helper functions */
typedef
int
(
*
dbg_leaf_callback
)(
struct
ubifs_info
*
c
,
typedef
int
(
*
dbg_leaf_callback
)(
struct
ubifs_info
*
c
,
...
@@ -419,6 +422,7 @@ void dbg_debugfs_exit_fs(struct ubifs_info *c);
...
@@ -419,6 +422,7 @@ void dbg_debugfs_exit_fs(struct ubifs_info *c);
#define dbg_get_key_dump(c, key) ({})
#define dbg_get_key_dump(c, key) ({})
#define dbg_dump_inode(c, inode) ({})
#define dbg_dump_inode(c, inode) ({})
#define dbg_dump_node(c, node) ({})
#define dbg_dump_node(c, node) ({})
#define dbg_dump_lpt_node(c, node, lnum, offs) ({})
#define dbg_dump_budget_req(req) ({})
#define dbg_dump_budget_req(req) ({})
#define dbg_dump_lstats(lst) ({})
#define dbg_dump_lstats(lst) ({})
#define dbg_dump_budg(c) ({})
#define dbg_dump_budg(c) ({})
...
@@ -431,6 +435,7 @@ void dbg_debugfs_exit_fs(struct ubifs_info *c);
...
@@ -431,6 +435,7 @@ void dbg_debugfs_exit_fs(struct ubifs_info *c);
#define dbg_dump_pnode(c, pnode, parent, iip) ({})
#define dbg_dump_pnode(c, pnode, parent, iip) ({})
#define dbg_dump_tnc(c) ({})
#define dbg_dump_tnc(c) ({})
#define dbg_dump_index(c) ({})
#define dbg_dump_index(c) ({})
#define dbg_dump_lpt_lebs(c) ({})
#define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0
#define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0
#define dbg_old_index_check_init(c, zroot) 0
#define dbg_old_index_check_init(c, zroot) 0
...
...
fs/ubifs/lpt.c
浏览文件 @
2ba5f7ae
...
@@ -557,7 +557,7 @@ static int calc_nnode_num(int row, int col)
...
@@ -557,7 +557,7 @@ static int calc_nnode_num(int row, int col)
* This function calculates and returns the nnode number based on the parent's
* This function calculates and returns the nnode number based on the parent's
* nnode number and the index in parent.
* nnode number and the index in parent.
*/
*/
static
int
calc_nnode_num_from_parent
(
struct
ubifs_info
*
c
,
static
int
calc_nnode_num_from_parent
(
const
struct
ubifs_info
*
c
,
struct
ubifs_nnode
*
parent
,
int
iip
)
struct
ubifs_nnode
*
parent
,
int
iip
)
{
{
int
num
,
shft
;
int
num
,
shft
;
...
@@ -582,7 +582,7 @@ static int calc_nnode_num_from_parent(struct ubifs_info *c,
...
@@ -582,7 +582,7 @@ static int calc_nnode_num_from_parent(struct ubifs_info *c,
* This function calculates and returns the pnode number based on the parent's
* This function calculates and returns the pnode number based on the parent's
* nnode number and the index in parent.
* nnode number and the index in parent.
*/
*/
static
int
calc_pnode_num_from_parent
(
struct
ubifs_info
*
c
,
static
int
calc_pnode_num_from_parent
(
const
struct
ubifs_info
*
c
,
struct
ubifs_nnode
*
parent
,
int
iip
)
struct
ubifs_nnode
*
parent
,
int
iip
)
{
{
int
i
,
n
=
c
->
lpt_hght
-
1
,
pnum
=
parent
->
num
,
num
=
0
;
int
i
,
n
=
c
->
lpt_hght
-
1
,
pnum
=
parent
->
num
,
num
=
0
;
...
@@ -965,7 +965,7 @@ static int check_lpt_type(uint8_t **addr, int *pos, int type)
...
@@ -965,7 +965,7 @@ static int check_lpt_type(uint8_t **addr, int *pos, int type)
*
*
* This function returns %0 on success and a negative error code on failure.
* This function returns %0 on success and a negative error code on failure.
*/
*/
static
int
unpack_pnode
(
struct
ubifs_info
*
c
,
void
*
buf
,
static
int
unpack_pnode
(
const
struct
ubifs_info
*
c
,
void
*
buf
,
struct
ubifs_pnode
*
pnode
)
struct
ubifs_pnode
*
pnode
)
{
{
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
...
@@ -995,14 +995,14 @@ static int unpack_pnode(struct ubifs_info *c, void *buf,
...
@@ -995,14 +995,14 @@ static int unpack_pnode(struct ubifs_info *c, void *buf,
}
}
/**
/**
* unpack_nnode - unpack a nnode.
* u
bifs_u
npack_nnode - unpack a nnode.
* @c: UBIFS file-system description object
* @c: UBIFS file-system description object
* @buf: buffer containing packed nnode to unpack
* @buf: buffer containing packed nnode to unpack
* @nnode: nnode structure to fill
* @nnode: nnode structure to fill
*
*
* This function returns %0 on success and a negative error code on failure.
* This function returns %0 on success and a negative error code on failure.
*/
*/
static
int
unpack_nnode
(
struct
ubifs_info
*
c
,
void
*
buf
,
int
ubifs_unpack_nnode
(
const
struct
ubifs_info
*
c
,
void
*
buf
,
struct
ubifs_nnode
*
nnode
)
struct
ubifs_nnode
*
nnode
)
{
{
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
...
@@ -1035,7 +1035,7 @@ static int unpack_nnode(struct ubifs_info *c, void *buf,
...
@@ -1035,7 +1035,7 @@ static int unpack_nnode(struct ubifs_info *c, void *buf,
*
*
* This function returns %0 on success and a negative error code on failure.
* This function returns %0 on success and a negative error code on failure.
*/
*/
static
int
unpack_ltab
(
struct
ubifs_info
*
c
,
void
*
buf
)
static
int
unpack_ltab
(
const
struct
ubifs_info
*
c
,
void
*
buf
)
{
{
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
int
i
,
pos
=
0
,
err
;
int
i
,
pos
=
0
,
err
;
...
@@ -1067,7 +1067,7 @@ static int unpack_ltab(struct ubifs_info *c, void *buf)
...
@@ -1067,7 +1067,7 @@ static int unpack_ltab(struct ubifs_info *c, void *buf)
*
*
* This function returns %0 on success and a negative error code on failure.
* This function returns %0 on success and a negative error code on failure.
*/
*/
static
int
unpack_lsave
(
struct
ubifs_info
*
c
,
void
*
buf
)
static
int
unpack_lsave
(
const
struct
ubifs_info
*
c
,
void
*
buf
)
{
{
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
int
i
,
pos
=
0
,
err
;
int
i
,
pos
=
0
,
err
;
...
@@ -1095,7 +1095,7 @@ static int unpack_lsave(struct ubifs_info *c, void *buf)
...
@@ -1095,7 +1095,7 @@ static int unpack_lsave(struct ubifs_info *c, void *buf)
*
*
* This function returns %0 on success and a negative error code on failure.
* This function returns %0 on success and a negative error code on failure.
*/
*/
static
int
validate_nnode
(
struct
ubifs_info
*
c
,
struct
ubifs_nnode
*
nnode
,
static
int
validate_nnode
(
const
struct
ubifs_info
*
c
,
struct
ubifs_nnode
*
nnode
,
struct
ubifs_nnode
*
parent
,
int
iip
)
struct
ubifs_nnode
*
parent
,
int
iip
)
{
{
int
i
,
lvl
,
max_offs
;
int
i
,
lvl
,
max_offs
;
...
@@ -1139,7 +1139,7 @@ static int validate_nnode(struct ubifs_info *c, struct ubifs_nnode *nnode,
...
@@ -1139,7 +1139,7 @@ static int validate_nnode(struct ubifs_info *c, struct ubifs_nnode *nnode,
*
*
* This function returns %0 on success and a negative error code on failure.
* This function returns %0 on success and a negative error code on failure.
*/
*/
static
int
validate_pnode
(
struct
ubifs_info
*
c
,
struct
ubifs_pnode
*
pnode
,
static
int
validate_pnode
(
const
struct
ubifs_info
*
c
,
struct
ubifs_pnode
*
pnode
,
struct
ubifs_nnode
*
parent
,
int
iip
)
struct
ubifs_nnode
*
parent
,
int
iip
)
{
{
int
i
;
int
i
;
...
@@ -1173,7 +1173,8 @@ static int validate_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
...
@@ -1173,7 +1173,8 @@ static int validate_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
* This function calculates the LEB numbers for the LEB properties it contains
* This function calculates the LEB numbers for the LEB properties it contains
* based on the pnode number.
* based on the pnode number.
*/
*/
static
void
set_pnode_lnum
(
struct
ubifs_info
*
c
,
struct
ubifs_pnode
*
pnode
)
static
void
set_pnode_lnum
(
const
struct
ubifs_info
*
c
,
struct
ubifs_pnode
*
pnode
)
{
{
int
i
,
lnum
;
int
i
,
lnum
;
...
@@ -1226,7 +1227,7 @@ int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)
...
@@ -1226,7 +1227,7 @@ int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)
err
=
ubi_read
(
c
->
ubi
,
lnum
,
buf
,
offs
,
c
->
nnode_sz
);
err
=
ubi_read
(
c
->
ubi
,
lnum
,
buf
,
offs
,
c
->
nnode_sz
);
if
(
err
)
if
(
err
)
goto
out
;
goto
out
;
err
=
unpack_nnode
(
c
,
buf
,
nnode
);
err
=
u
bifs_u
npack_nnode
(
c
,
buf
,
nnode
);
if
(
err
)
if
(
err
)
goto
out
;
goto
out
;
}
}
...
@@ -1815,7 +1816,7 @@ static struct ubifs_nnode *scan_get_nnode(struct ubifs_info *c,
...
@@ -1815,7 +1816,7 @@ static struct ubifs_nnode *scan_get_nnode(struct ubifs_info *c,
c
->
nnode_sz
);
c
->
nnode_sz
);
if
(
err
)
if
(
err
)
return
ERR_PTR
(
err
);
return
ERR_PTR
(
err
);
err
=
unpack_nnode
(
c
,
buf
,
nnode
);
err
=
u
bifs_u
npack_nnode
(
c
,
buf
,
nnode
);
if
(
err
)
if
(
err
)
return
ERR_PTR
(
err
);
return
ERR_PTR
(
err
);
}
}
...
...
fs/ubifs/lpt_commit.c
浏览文件 @
2ba5f7ae
...
@@ -320,6 +320,7 @@ static int layout_cnodes(struct ubifs_info *c)
...
@@ -320,6 +320,7 @@ static int layout_cnodes(struct ubifs_info *c)
dbg_err
(
"LPT out of space at LEB %d:%d needing %d, done_ltab %d, "
dbg_err
(
"LPT out of space at LEB %d:%d needing %d, done_ltab %d, "
"done_lsave %d"
,
lnum
,
offs
,
len
,
done_ltab
,
done_lsave
);
"done_lsave %d"
,
lnum
,
offs
,
len
,
done_ltab
,
done_lsave
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_lebs
(
c
);
dump_stack
();
dump_stack
();
return
err
;
return
err
;
}
}
...
@@ -549,6 +550,7 @@ static int write_cnodes(struct ubifs_info *c)
...
@@ -549,6 +550,7 @@ static int write_cnodes(struct ubifs_info *c)
dbg_err
(
"LPT out of space mismatch at LEB %d:%d needing %d, done_ltab "
dbg_err
(
"LPT out of space mismatch at LEB %d:%d needing %d, done_ltab "
"%d, done_lsave %d"
,
lnum
,
offs
,
len
,
done_ltab
,
done_lsave
);
"%d, done_lsave %d"
,
lnum
,
offs
,
len
,
done_ltab
,
done_lsave
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_lebs
(
c
);
dump_stack
();
dump_stack
();
return
err
;
return
err
;
}
}
...
@@ -1027,7 +1029,7 @@ static int make_node_dirty(struct ubifs_info *c, int node_type, int node_num,
...
@@ -1027,7 +1029,7 @@ static int make_node_dirty(struct ubifs_info *c, int node_type, int node_num,
* @c: UBIFS file-system description object
* @c: UBIFS file-system description object
* @node_type: LPT node type
* @node_type: LPT node type
*/
*/
static
int
get_lpt_node_len
(
struct
ubifs_info
*
c
,
int
node_type
)
static
int
get_lpt_node_len
(
const
struct
ubifs_info
*
c
,
int
node_type
)
{
{
switch
(
node_type
)
{
switch
(
node_type
)
{
case
UBIFS_LPT_NNODE
:
case
UBIFS_LPT_NNODE
:
...
@@ -1048,7 +1050,7 @@ static int get_lpt_node_len(struct ubifs_info *c, int node_type)
...
@@ -1048,7 +1050,7 @@ static int get_lpt_node_len(struct ubifs_info *c, int node_type)
* @buf: buffer
* @buf: buffer
* @len: length of buffer
* @len: length of buffer
*/
*/
static
int
get_pad_len
(
struct
ubifs_info
*
c
,
uint8_t
*
buf
,
int
len
)
static
int
get_pad_len
(
const
struct
ubifs_info
*
c
,
uint8_t
*
buf
,
int
len
)
{
{
int
offs
,
pad_len
;
int
offs
,
pad_len
;
...
@@ -1065,7 +1067,8 @@ static int get_pad_len(struct ubifs_info *c, uint8_t *buf, int len)
...
@@ -1065,7 +1067,8 @@ static int get_pad_len(struct ubifs_info *c, uint8_t *buf, int len)
* @buf: buffer
* @buf: buffer
* @node_num: node number is returned here
* @node_num: node number is returned here
*/
*/
static
int
get_lpt_node_type
(
struct
ubifs_info
*
c
,
uint8_t
*
buf
,
int
*
node_num
)
static
int
get_lpt_node_type
(
const
struct
ubifs_info
*
c
,
uint8_t
*
buf
,
int
*
node_num
)
{
{
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
int
pos
=
0
,
node_type
;
int
pos
=
0
,
node_type
;
...
@@ -1083,7 +1086,7 @@ static int get_lpt_node_type(struct ubifs_info *c, uint8_t *buf, int *node_num)
...
@@ -1083,7 +1086,7 @@ static int get_lpt_node_type(struct ubifs_info *c, uint8_t *buf, int *node_num)
*
*
* This function returns %1 if the buffer contains a node or %0 if it does not.
* This function returns %1 if the buffer contains a node or %0 if it does not.
*/
*/
static
int
is_a_node
(
struct
ubifs_info
*
c
,
uint8_t
*
buf
,
int
len
)
static
int
is_a_node
(
const
struct
ubifs_info
*
c
,
uint8_t
*
buf
,
int
len
)
{
{
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
uint8_t
*
addr
=
buf
+
UBIFS_LPT_CRC_BYTES
;
int
pos
=
0
,
node_type
,
node_len
;
int
pos
=
0
,
node_type
,
node_len
;
...
@@ -1107,7 +1110,6 @@ static int is_a_node(struct ubifs_info *c, uint8_t *buf, int len)
...
@@ -1107,7 +1110,6 @@ static int is_a_node(struct ubifs_info *c, uint8_t *buf, int len)
return
1
;
return
1
;
}
}
/**
/**
* lpt_gc_lnum - garbage collect a LPT LEB.
* lpt_gc_lnum - garbage collect a LPT LEB.
* @c: UBIFS file-system description object
* @c: UBIFS file-system description object
...
@@ -1724,6 +1726,7 @@ int dbg_chk_lpt_free_spc(struct ubifs_info *c)
...
@@ -1724,6 +1726,7 @@ int dbg_chk_lpt_free_spc(struct ubifs_info *c)
dbg_err
(
"LPT space error: free %lld lpt_sz %lld"
,
dbg_err
(
"LPT space error: free %lld lpt_sz %lld"
,
free
,
c
->
lpt_sz
);
free
,
c
->
lpt_sz
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_lebs
(
c
);
dump_stack
();
dump_stack
();
return
-
EINVAL
;
return
-
EINVAL
;
}
}
...
@@ -1808,6 +1811,7 @@ int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
...
@@ -1808,6 +1811,7 @@ int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
}
}
if
(
err
)
{
if
(
err
)
{
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_info
(
c
);
dbg_dump_lpt_lebs
(
c
);
dump_stack
();
dump_stack
();
}
}
d
->
chk_lpt_sz2
=
d
->
chk_lpt_sz
;
d
->
chk_lpt_sz2
=
d
->
chk_lpt_sz
;
...
@@ -1825,4 +1829,121 @@ int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
...
@@ -1825,4 +1829,121 @@ int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
}
}
}
}
/**
* dbg_dump_lpt_leb - dump an LPT LEB.
* @c: UBIFS file-system description object
* @lnum: LEB number to dump
*
* This function dumps an LEB from LPT area. Nodes in this area are very
* different to nodes in the main area (e.g., they do not have common headers,
* they do not have 8-byte alignments, etc), so we have a separate function to
* dump LPT area LEBs. Note, LPT has to be locked by the coller.
*/
static
void
dump_lpt_leb
(
const
struct
ubifs_info
*
c
,
int
lnum
)
{
int
err
,
len
=
c
->
leb_size
,
node_type
,
node_num
,
node_len
,
offs
;
void
*
buf
=
c
->
dbg
->
buf
;
printk
(
KERN_DEBUG
"(pid %d) start dumping LEB %d
\n
"
,
current
->
pid
,
lnum
);
err
=
ubi_read
(
c
->
ubi
,
lnum
,
buf
,
0
,
c
->
leb_size
);
if
(
err
)
{
ubifs_err
(
"cannot read LEB %d, error %d"
,
lnum
,
err
);
return
;
}
while
(
1
)
{
offs
=
c
->
leb_size
-
len
;
if
(
!
is_a_node
(
c
,
buf
,
len
))
{
int
pad_len
;
pad_len
=
get_pad_len
(
c
,
buf
,
len
);
if
(
pad_len
)
{
printk
(
KERN_DEBUG
"LEB %d:%d, pad %d bytes
\n
"
,
lnum
,
offs
,
pad_len
);
buf
+=
pad_len
;
len
-=
pad_len
;
continue
;
}
if
(
len
)
printk
(
KERN_DEBUG
"LEB %d:%d, free %d bytes
\n
"
,
lnum
,
offs
,
len
);
break
;
}
node_type
=
get_lpt_node_type
(
c
,
buf
,
&
node_num
);
switch
(
node_type
)
{
case
UBIFS_LPT_PNODE
:
{
node_len
=
c
->
pnode_sz
;
if
(
c
->
big_lpt
)
printk
(
KERN_DEBUG
"LEB %d:%d, pnode num %d
\n
"
,
lnum
,
offs
,
node_num
);
else
printk
(
KERN_DEBUG
"LEB %d:%d, pnode
\n
"
,
lnum
,
offs
);
break
;
}
case
UBIFS_LPT_NNODE
:
{
int
i
;
struct
ubifs_nnode
nnode
;
node_len
=
c
->
nnode_sz
;
if
(
c
->
big_lpt
)
printk
(
KERN_DEBUG
"LEB %d:%d, nnode num %d, "
,
lnum
,
offs
,
node_num
);
else
printk
(
KERN_DEBUG
"LEB %d:%d, nnode, "
,
lnum
,
offs
);
err
=
ubifs_unpack_nnode
(
c
,
buf
,
&
nnode
);
for
(
i
=
0
;
i
<
UBIFS_LPT_FANOUT
;
i
++
)
{
printk
(
"%d:%d"
,
nnode
.
nbranch
[
i
].
lnum
,
nnode
.
nbranch
[
i
].
offs
);
if
(
i
!=
UBIFS_LPT_FANOUT
-
1
)
printk
(
", "
);
}
printk
(
"
\n
"
);
break
;
}
case
UBIFS_LPT_LTAB
:
node_len
=
c
->
ltab_sz
;
printk
(
KERN_DEBUG
"LEB %d:%d, ltab
\n
"
,
lnum
,
offs
);
break
;
case
UBIFS_LPT_LSAVE
:
node_len
=
c
->
lsave_sz
;
printk
(
KERN_DEBUG
"LEB %d:%d, lsave len
\n
"
,
lnum
,
offs
);
break
;
default:
ubifs_err
(
"LPT node type %d not recognized"
,
node_type
);
return
;
}
buf
+=
node_len
;
len
-=
node_len
;
}
printk
(
KERN_DEBUG
"(pid %d) finish dumping LEB %d
\n
"
,
current
->
pid
,
lnum
);
}
/**
* dbg_dump_lpt_lebs - dump LPT lebs.
* @c: UBIFS file-system description object
*
* This function dumps all LPT LEBs. The caller has to make sure the LPT is
* locked.
*/
void
dbg_dump_lpt_lebs
(
const
struct
ubifs_info
*
c
)
{
int
i
;
printk
(
KERN_DEBUG
"(pid %d) start dumping all LPT LEBs
\n
"
,
current
->
pid
);
for
(
i
=
0
;
i
<
c
->
lpt_lebs
;
i
++
)
dump_lpt_leb
(
c
,
i
+
c
->
lpt_first
);
printk
(
KERN_DEBUG
"(pid %d) finish dumping all LPT LEBs
\n
"
,
current
->
pid
);
}
#endif
/* CONFIG_UBIFS_FS_DEBUG */
#endif
/* CONFIG_UBIFS_FS_DEBUG */
fs/ubifs/ubifs.h
浏览文件 @
2ba5f7ae
...
@@ -1622,6 +1622,9 @@ void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty);
...
@@ -1622,6 +1622,9 @@ void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty);
void
ubifs_add_nnode_dirt
(
struct
ubifs_info
*
c
,
struct
ubifs_nnode
*
nnode
);
void
ubifs_add_nnode_dirt
(
struct
ubifs_info
*
c
,
struct
ubifs_nnode
*
nnode
);
uint32_t
ubifs_unpack_bits
(
uint8_t
**
addr
,
int
*
pos
,
int
nrbits
);
uint32_t
ubifs_unpack_bits
(
uint8_t
**
addr
,
int
*
pos
,
int
nrbits
);
struct
ubifs_nnode
*
ubifs_first_nnode
(
struct
ubifs_info
*
c
,
int
*
hght
);
struct
ubifs_nnode
*
ubifs_first_nnode
(
struct
ubifs_info
*
c
,
int
*
hght
);
/* Needed only in debugging code in lpt_commit.c */
int
ubifs_unpack_nnode
(
const
struct
ubifs_info
*
c
,
void
*
buf
,
struct
ubifs_nnode
*
nnode
);
/* lpt_commit.c */
/* lpt_commit.c */
int
ubifs_lpt_start_commit
(
struct
ubifs_info
*
c
);
int
ubifs_lpt_start_commit
(
struct
ubifs_info
*
c
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录