jbd 之 handle

journal_start

journal_start函数的作用是取得一个原子操作描述符handle_t。该handle_t要么是当前进程已有的,要么是新创建的。且要保证日志中还剩下参数nblocks规定的空闲块数

start_this_handle

在journal_start函数得到一个handle_t之后,要确保日志中有nblocks块供该handle_t使用。
首先handle_t是肯定要与当前的transaction绑定的,当然如果当前没有running transaction。就需要新建一个transaction。
因为是给当前transaction新增一个handle_t,即相当于要改变journal的状态。所以需要获得自旋锁journal->j_state_lock。然后再通过is_journal_aborted(journal)检查journal是否在以前某个地方出错,出错的话就不要再新增什么handle_t了,直接返回错误好了。
关于journal的barrier我还没看懂。。先占个坑( ̄▽ ̄)”
好了。现在主要是判断hanle_t希望申请的nblocks块空间能否得到满足。首先要判断当前的transaction是否过大,过大的话会影响数据的新旧程度。所以为了不让transaction过大,当本次handle_t加上transaction已有的空间已经过大时,就等待该transaction commit吧。这段时间会调用schedule(),让transaction默默commit。然后用goto回到之前新建transaction的地方。
接下来是判断整个journal有没有空间,这中间的checkpoint与commit貌似有一个竞争条件(-__-)b。但是我没看懂。
当确定有空间的话。就可以把handle_t绑定到transaction上了。并进行相应的更新。

journal_stop

看函数注释说好像是完成一个transaction。也就是提交一个transaction。但是为什么要在transaction减掉handle_t中的credits。没看懂( ̄▽ ̄)”
不过看该函数的意思似乎对比较快的硬盘做了个优化。就是如果transaction 的运行时间小于commit 时间,那么就去睡commit time这么长的时间,不然就马上开始commit(在设置了sync标志的情况下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值