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 ...
随机推荐
- ABAP - 3D Graphs with SAP
在ABAP设计中,程序员经常需要用图形显示报表的统计结果,我们可以使用函数:GRAPH_MATRIX_3D来达到图形显示.GRAPH_MATRIX_3D函数参数很多,但只有三个参数必须需要输入:Tab ...
- Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be
Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be 今天在其他电脑配置 SQl server 2008 R2,安装完成后,发现打开配置管理工具服务 : ...
- dict和set
#dict和set #dict #Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map #使用键-值(key-value)存储,具有极快的查找速度. #字 ...
- 【原】训练自己haar-like特征分类器并识别物体(2)
在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 == ...
- Android调用Web服务
现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...
- Eclipse 启动Tomcat 超时报错的解决方案
在用eclipse开发项目 用tomcat发布项目的时候 会提示超时, Server Tomcat v7.0 Server at localhost was unable to start wit ...
- 活动与服务onbind()
- Android Listener侦听的N种写法
Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用 ...
- SQL 分页查询的四种方法
方法一 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names ) ) 然后向里面插入大约100条数据 ...
- 为TFS配置跨平台的生成服务器Xplat (Ubuntu Linux)
1. 概述 从TFS 2015开始,微软开始支持跨平台的构建代理.你可以使用TFS的Xplat代理,方便的在基于IOS, Unix和Linux的服务器上搭建生成代理,实现构建.发布等功能.本文档已Ub ...