当前位置: 首页 > ops >正文

Ntfs!LfsFlushLfcb函数分析之while的循环条件NextLbcb的确定和FirstLbcb->LbcbFlags的几种情况

第一部分:

VOID
LfsFlushLfcb (
IN PLFCB Lfcb,
IN LSN TargetLsn,
IN BOOLEAN RestartLsn
)
{

        while (!ContainsLastEntry) {

            ASSERT( FirstLbcb != NULL );


//
//  Find the block of Lbcb's that make up the first I/O, remembering
//  how many there are.  Also remember if this I/O contains the
//  last element on the list when we were called.
//

            LfsFindFirstIo( Lfcb,
TargetLsn,
RestartLsn,
FirstLbcb,
&NextLbcb,                 //NextLbcb的确定,和while循环有关:FirstLbcb = NextLbcb;
&FileOffset,                //FileOffset的确定
&ContainsLastEntry,
&LfsRestart,                //LfsRestart的确定
&UseTailCopy,
&IoBlocks );
.

           //
//  For the loghead pages (2 lfs restart pages and 2 ping pong pages
//  explicitly flush them down using the partial mdl we built
//  The regular cc logic w/ UserWriteData  that pares the write down
//  to the correct offsets works here as well
// 对于日志头页面(2个lfs重启页面和2个乒乓页面),使用我们构建的部分mdl明确将其刷新。
//    带有UserWriteData的常规cc逻辑(将写操作减少到正确的偏移量)在这里同样适用

            if (LfsRestart || UseTailCopy) {


Status = IoSynchronousPageWrite( Lfcb->FileObject,
Lfcb->LogHeadPartialMdl,
(PLARGE_INTEGER)&FileOffset,
&Event,
&Iosb );

            } else {

                //
//  This is a normal log page so flush through the cache
//这是一个正常的日志页面,所以请刷新缓存

                CcFlushCache( Lfcb->FileObject->SectionObjectPointer,
(PLARGE_INTEGER)&FileOffset,
Length,
&Iosb );


//
//  Remember the starting Lbcb for the next I/O.
//

            FirstLbcb = NextLbcb;
}

第二部分:

0: kd> dx -r1 (*((Ntfs!_LIST_ENTRY *)0xe135ed2c))
(*((Ntfs!_LIST_ENTRY *)0xe135ed2c))                 [Type: _LIST_ENTRY]
[+0x000] Flink            : 0xe1277b54 [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe1341860 [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe1277b54)
((Ntfs!_LIST_ENTRY *)0xe1277b54)                 : 0xe1277b54 [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe1350cec [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe135ed2c [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe1350cec)
((Ntfs!_LIST_ENTRY *)0xe1350cec)                 : 0xe1350cec [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe127bc34 [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe1277b54 [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe127bc34)
((Ntfs!_LIST_ENTRY *)0xe127bc34)                 : 0xe127bc34 [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe1341860 [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe1350cec [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe1341860)
((Ntfs!_LIST_ENTRY *)0xe1341860)                 : 0xe1341860 [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe135ed2c [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe127bc34 [Type: _LIST_ENTRY *]


0: kd> dx -r1 (*((Ntfs!_LIST_ENTRY *)0xe1341860))
(*((Ntfs!_LIST_ENTRY *)0xe1341860))                 [Type: _LIST_ENTRY]
[+0x000] Flink            : 0xe135ed2c [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe127bc34 [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe135ed2c)
((Ntfs!_LIST_ENTRY *)0xe135ed2c)                 : 0xe135ed2c [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe1277b54 [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe1341860 [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe1277b54)
((Ntfs!_LIST_ENTRY *)0xe1277b54)                 : 0xe1277b54 [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe1350cec [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe135ed2c [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe1350cec)
((Ntfs!_LIST_ENTRY *)0xe1350cec)                 : 0xe1350cec [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe127bc34 [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe1277b54 [Type: _LIST_ENTRY *]
0: kd> dx -r1 ((Ntfs!_LIST_ENTRY *)0xe127bc34)
((Ntfs!_LIST_ENTRY *)0xe127bc34)                 : 0xe127bc34 [Type: _LIST_ENTRY *]
[+0x000] Flink            : 0xe1341860 [Type: _LIST_ENTRY *]
[+0x004] Blink            : 0xe1350cec [Type: _LIST_ENTRY *]


第三部分:

0: kd> dt lbcb e135ed2c-4
Ntfs!LBCB
+0x000 NodeTypeCode     : 0n2050
+0x002 NodeByteSize     : 0n96
+0x004 WorkqueLinks     : _LIST_ENTRY [ 0xe1277b54 - 0xe1341860 ]
+0x00c ActiveLinks      : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x018 FileOffset       : 0n4096
+0x020 Length           : 0n4048
+0x028 SeqNumber        : 0n0
+0x030 BufferOffset     : 0n0
+0x038 PageHeader       : 0xe1363008 Void
+0x03c LogPageBcb       : (null)
+0x040 LastLsn          : _LARGE_INTEGER 0x8124466
+0x048 LastEndLsn       : _LARGE_INTEGER 0x8124466
+0x050 Flags            : 0
+0x054 LbcbFlags        : 0x20
+0x058 ResourceThread   : 0


0: kd> dt lbcb 0xe1277b54-4
Ntfs!LBCB
+0x000 NodeTypeCode     : 0n2050
+0x002 NodeByteSize     : 0n96
+0x004 WorkqueLinks     : _LIST_ENTRY [ 0xe1350cec - 0xe135ed2c ]
+0x00c ActiveLinks      : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x018 FileOffset       : 0n0
+0x020 Length           : 0n4048
+0x028 SeqNumber        : 0n0
+0x030 BufferOffset     : 0n0
+0x038 PageHeader       : 0xe138c008 Void
+0x03c LogPageBcb       : (null)
+0x040 LastLsn          : _LARGE_INTEGER 0x8124467
+0x048 LastEndLsn       : _LARGE_INTEGER 0x8124467
+0x050 Flags            : 0
+0x054 LbcbFlags        : 0x20
+0x058 ResourceThread   : 0


0: kd> dt lbcb 0xe1350cec-4
Ntfs!LBCB
+0x000 NodeTypeCode     : 0n2050
+0x002 NodeByteSize     : 0n96
+0x004 WorkqueLinks     : _LIST_ENTRY [ 0xe127bc34 - 0xe1277b54 ]
+0x00c ActiveLinks      : _LIST_ENTRY [ 0xe1341868 - 0xe1341868 ]
+0x018 FileOffset       : 0n9576448
+0x020 Length           : 0n4096
+0x028 SeqNumber        : 0n8
+0x030 BufferOffset     : 0n1112
+0x038 PageHeader       : 0xc11a2000 Void
+0x03c LogPageBcb       : 0x89811ce8 Void
+0x040 LastLsn          : _LARGE_INTEGER 0x8124478
+0x048 LastEndLsn       : _LARGE_INTEGER 0x8124478
+0x050 Flags            : 1
+0x054 LbcbFlags        : 0xe
+0x058 ResourceThread   : 0x8999d023


#define LBCB_LOG_WRAPPED                        (0x00000001)
#define LBCB_ON_ACTIVE_QUEUE                    (0x00000002)
#define LBCB_NOT_EMPTY                          (0x00000004)
#define LBCB_FLUSH_COPY                         (0x00000008)
#define LBCB_RESTART_LBCB                       (0x00000020)


0: kd> dt lbcb 0xe127bc34-4
Ntfs!LBCB
+0x000 NodeTypeCode     : 0n2050
+0x002 NodeByteSize     : 0n96
+0x004 WorkqueLinks     : _LIST_ENTRY [ 0xe1341860 - 0xe1350cec ]
+0x00c ActiveLinks      : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x018 FileOffset       : 0n4096
+0x020 Length           : 0n224
+0x028 SeqNumber        : 0n0
+0x030 BufferOffset     : 0n0
+0x038 PageHeader       : 0xe139d008 Void
+0x03c LogPageBcb       : (null)
+0x040 LastLsn          : _LARGE_INTEGER 0x8124479
+0x048 LastEndLsn       : _LARGE_INTEGER 0x8124479
+0x050 Flags            : 0
+0x054 LbcbFlags        : 0x20
+0x058 ResourceThread   : 0

http://www.xdnf.cn/news/15181.html

相关文章:

  • OpenVela之模拟器调试
  • Go内存分配
  • vite如何生成gzip,并在服务器上如何设置开启
  • 如何在 Windows 10 上安装 RabbitMQ
  • 如何在 Visual Studio Code 中使用 Cursor AI
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • C语言:20250712笔记
  • 系统学习Python——并发模型和异步编程:基础实例-[使用线程实现旋转指针]
  • Ruby如何采集直播数据源地址
  • tiktok 弹幕 逆向分析
  • 后端定时过期方案选型
  • Linux/Ubuntu安装go
  • ​Windows API 介绍及核心函数分类表
  • MySQL 5.7.29升5.7.42实战:等保三漏洞修复+主从同步避坑指南
  • 一分钟快速了解Apache
  • Ether and Wei
  • 【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
  • 详解缓存淘汰策略:LRU
  • python数据分析及可视化课程介绍(01)以及统计学的应用、介绍、分类、基本概念及描述性统计
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十一课——图像均值滤波的FPGA实现
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十课——图像gamma矫正的FPGA实现
  • C++11的整理笔记
  • 【LeetCode 热题 100】25. K 个一组翻转链表——迭代+哨兵
  • 【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
  • Jenkins+Gitee+Docker容器化部署
  • super task 事件驱动框架
  • 用AI做带货视频评论分析【Datawhale AI 夏令营】
  • 冒泡排序和快速排序
  • 「Linux命令基础」文本模式系统关闭与重启
  • 【C/C++】动态内存分配:从 C++98 裸指针到现代策略