Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
2b2c1971
提交
2b2c1971
8月 28, 2014
创建
作者:
Robert Morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
write log blocks from cache only at end of transaction
上级
11183588
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
21 行增加
和
7 行删除
+21
-7
log.c
log.c
+21
-7
没有找到文件。
log.c
浏览文件 @
2b2c1971
...
...
@@ -170,10 +170,27 @@ end_op(void)
}
}
// Copy modified blocks from cache to log.
static
void
write_log
(
void
)
{
int
tail
;
for
(
tail
=
0
;
tail
<
log
.
lh
.
n
;
tail
++
)
{
struct
buf
*
to
=
bread
(
log
.
dev
,
log
.
start
+
tail
+
1
);
// log block
struct
buf
*
from
=
bread
(
log
.
dev
,
log
.
lh
.
sector
[
tail
]);
// cache block
memmove
(
to
->
data
,
from
->
data
,
BSIZE
);
bwrite
(
to
);
// write the log
brelse
(
from
);
brelse
(
to
);
}
}
static
void
commit
()
{
if
(
log
.
lh
.
n
>
0
)
{
write_log
();
// Write modified blocks from cache to log
write_head
();
// Write header to disk -- the real commit
install_trans
();
// Now install writes to home locations
log
.
lh
.
n
=
0
;
...
...
@@ -182,8 +199,9 @@ commit()
}
// Caller has modified b->data and is done with the buffer.
// Append the block to the log and record the block number,
// but don't write the log header (which would commit the write).
// Record the block number and pin in the cache with B_DIRTY.
// commit()/write_log() will do the disk write.
//
// log_write() replaces bwrite(); a typical use is:
// bp = bread(...)
// modify bp->data[]
...
...
@@ -197,17 +215,13 @@ log_write(struct buf *b)
if
(
log
.
lh
.
n
>=
LOGSIZE
||
log
.
lh
.
n
>=
log
.
size
-
1
)
panic
(
"too big a transaction"
);
if
(
log
.
outstanding
<
1
)
panic
(
"write outside of trans"
);
panic
(
"
log_
write outside of trans"
);
for
(
i
=
0
;
i
<
log
.
lh
.
n
;
i
++
)
{
if
(
log
.
lh
.
sector
[
i
]
==
b
->
sector
)
// log absorbtion
break
;
}
log
.
lh
.
sector
[
i
]
=
b
->
sector
;
struct
buf
*
lbuf
=
bread
(
b
->
dev
,
log
.
start
+
i
+
1
);
memmove
(
lbuf
->
data
,
b
->
data
,
BSIZE
);
bwrite
(
lbuf
);
brelse
(
lbuf
);
if
(
i
==
log
.
lh
.
n
)
log
.
lh
.
n
++
;
b
->
flags
|=
B_DIRTY
;
// prevent eviction
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论