【发布时间】:2018-05-23 23:09:43
【问题描述】:
在 jbd2 源代码中,文件系统中的任何修改都映射到 handle_t 结构(每个进程),该结构稍后用于将 buffer_head 映射到 transaction_t此句柄将成为其中的一部分。
据我所知,当需要对给定的buffer_head 进行修改时,调用do_get_write_access() 会将这个buffer_head 映射到handle_t 所属的事务。
但是,当使用这个handle_t 将buffer_head 映射到transaction_t 时,倒数映射就丢失了,也就是说,我无法追溯这个buffer_head 属于哪个handle_t。
问题是,在jbd2_journal_commit_transaction()(commit phase 2b in commit function)我想找到一种方法来遍历这些buffer_heads并成为如果它们与 inode、元数据 或 相关,则能够对它们进行分类>inode 位图块,或 数据位图块。此外,在源代码的这一点上,buffer_heads 似乎是不透明的,它们只是被发送到存储。
更新 1:
到目前为止,我在jbd2_journal_commit_transaction() 函数中的提交阶段2b中尝试过这个。
struct journal_head *jh;
...
jh = commit_transaction->t_buffers;
if(jh->b_jlist == BJ_Metadata) {
struct buffer_head *bh_p = NULL;
bh_p = jh2bh(jh);
if(!bh_p) printk(KERN_DEBUG "Null ptr in bh_p\n");
else {
struct address_space *as_p = NULL;
if((as_p = bh_p->b_assoc_map) == NULL)
printk(KERN_DEBUG "Null ptr in as_p\n");
else {
struct inode *i_p = NULL;
if(i_p) printk(KERN_DEBUG "Inode is %lu\n", i_p->i_ino);
}
}
}
它不起作用,它在as_p 中给出了NULL ptr,也就是说,没有为这个buffer_head 设置b_assoc_map。但是,我不知道b_assoc_map 是什么。
更新 2:
我试图从ext4_mark_iloc_dirty 的handle_t 结构中获取信息。 handle_t->h_type 有我需要的信息。但是,当我尝试比较这个值时,NULL 指针会导致内核警告。我认为这个结构在每个进程中都是独一无二的,但似乎它有一些竞争条件,我还不清楚。
【问题讨论】:
-
更多代码有助于理解问题。
-
就是这样,我没有在jbd2源代码中做任何改动,所以这里没有办法放任何代码。到目前为止,我一直在调查并试图找到一种方法来追踪
buffer_head和handle_t之间的这些关系。 -
好吧,我添加了一些我尝试过的代码,但我认为它不是很有用。
标签: c memory-management ext4 journaling