f2fs解析(二)f2fs写checkpoint时如何冻住整个文件系统
函数write_checkpoint中,会调用block_operations,函数中有这样一段代码:
retry_flush_dents:
f2fs_lock_all(sbi);
/* write all the dirty dentry pages */
if (get_pages(sbi, F2FS_DIRTY_DENTS)) {
f2fs_unlock_all(sbi);
sync_dirty_dir_inodes(sbi);
if (unlikely(f2fs_cp_error(sbi))) {
err = -EIO;
goto out;
}
goto retry_flush_dents;
}
这段代码不断循环往复,你会发现,总有一天F2FS_DIRTY_DENTRS类型的页都会被sync掉,那么到最后循环的那一次,f2fs_lock_all (sbi) 就不会被 f2fs_unlock_all(sbi)给解开了,f2fs_lock_all长这样:
929 static inline void f2fs_lock_all(struct f2fs_sb_info *sbi)
930 {
931 f2fs_down_write(&sbi->cp_rwsem, &sbi->cp_mutex);
932 }
他申请了一个非常重要的信号量:cp_rwsem!这个信号量的定义是:
struct rw_semaphore cp_rwsem; /* blocking FS operations */
阻塞对整个文件系统的操作。再看看都哪里用到了这个信号量:
919 static inline void f2fs_lock_op(struct f2fs_sb_info *sbi)
920 {
921 down_read(&sbi->cp_rwsem);
922 }
923
924 static inline void f2fs_unlock_op(struct f2fs_sb_info *sbi)
925 {
926 up_read(&sbi->cp_rwsem);
927 }
928
929 static inline void f2fs_lock_all(struct f2fs_sb_info *sbi)
930 {
931 f2fs_down_write(&sbi->cp_rwsem, &sbi->cp_mutex);
932 }
933
934 static inline void f2fs_unlock_all(struct f2fs_sb_info *sbi)
935 {
936 up_write(&sbi->cp_rwsem);
937 }
再搜f2fs_lock_op,发现不得了了,因为所有的读啊写啊操作都要在具体操作之前lock_op,操作结束后unlock_op,当你block_operations中将这个信号量申请下来之后,文件系统其他操作就不能操作了,申请不到信号量了嘛,因此用户态再也不能影响文件系统了,f2fs就可以安安心心地写checkpoint了。
f2fs解析(二)f2fs写checkpoint时如何冻住整个文件系统的更多相关文章
- f2fs解析(五)什么叫做compacted summary
f2fs中普通的summary是长这样的:每一个段的SSA block中,前半部分是这个段的SSA,然后对于HOT_DATA以及COLD_DATA段,存放是的是nat journal 和 sit jo ...
- Unity的Json解析<二>–写Json文件
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...
- f2fs解析(十)nid 如何从nat_root中删除
上面我们谈到了一个nid如何从free_nid中转移到node_info中去[分别有一个链表和一棵基数树搭伙做事],讲free_nid时,详细说明了free_nid中是如何进如何出的,上一篇说了nid ...
- Spring Security 解析(二) —— 认证过程
Spring Security 解析(二) -- 认证过程 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring Security .S ...
- iOS即时通讯之CocoaAsyncSocket源码解析二
原文 前言 本文承接上文:iOS即时通讯之CocoaAsyncSocket源码解析一 上文我们提到了GCDAsyncSocket的初始化,以及最终connect之前的准备工作,包括一些错误检查:本机地 ...
- Sentinel源码解析二(Slot总览)
写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...
- input标签写CSS时需要注意的几点(先收藏)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-05) 飞鱼的声纳顶部的搜索框让我头疼了很长时间,原因是总不能获得跨浏览器的统一样式.主要的问题有这么两个:一是inpu ...
- Java生成、解析二维码
今天遇到需求,使用Java生成二维码图片,网搜之后,大神们早就做过,个人总结一下. 目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析. 步骤如下: 1.m ...
- (转)ZXing解析二维码
1 ZXing解析二维码 上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImag ...
随机推荐
- CRM Look Up 解决方案
CRM 前瑞开发中关于lookup的开发工作肯定会遇到,例如选中一个客户或者联系人后自动把相关的信息映射到相关记录上,这样可以减少用户的输入工作.我们在CRM 的映射关系中可以配置相关字段的映射可以解 ...
- Create a “% Complete” Progress Bar with JS Link in SharePoint 2013
Create a “% Complete” Progress Bar with JS Link in SharePoint 2013 SharePoint 2013 has a lot new fea ...
- mybatis实战教程(mybatis in action),mybatis入门到精通(转)
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...
- Android 之 自动匹配字符AutoCompleteTextView
AutoCompleteTextView是自动匹配字符,当我们输入一个单词或一段话的前几个字时,就会自动为你匹配后面的内容看效果图: 下面是代码: MainActivit: package com.e ...
- Windows下Node.js+Express+WebSocket 安装配置
Linux参考: Linux安装Node.js 使用Express搭建Web服务器 Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V ...
- Git基本使用命令
整理Git的一些基本使用命令. # 1)克隆代码 boldseas@lian-PC MINGW64 /d/TestGroup $ git clone ssh://git@code.boldseas ...
- redis高可用之REDIS SENTINEL
1. Redis主从配置 1.1. 设置主从复制 Master <= Salve 10.24.6.5:6379 <= 10.24.6.7:6379 1.2. 取消主从复制 1.3. ...
- Node.js(2)-protobuf zeromq gzip
1.Node.Js环境准备 在win8 + vs.net 2012 环境下调试了很长时间没搞定安装编译问题,重装系统测试了2套环境,解决了编译问题: 1)Win8.1 + vs.net 2013 2) ...
- C语言杂谈(一)scanf()、scanf_s()与错误 C4996
错误 C4996 初学C语言时,第一个接触到的I/O函数便是scanf()了.但在高版本的 Visual Studio (包括但不限于2015.2013.2012)编译代码时,却会出现意想不到的错误. ...
- windows上用netstat查看端口/进程占用
windows上用netstat命令查看某个端口是否占用,被哪个进程所占用 1.查看端口的占用情况,获取进程的PID 命令: netstat -ano | findstr "<端口号& ...