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了。

转载于:https://www.cnblogs.com/honpey/p/4808845.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
F2FS是Flash-Friendly File System的简称,是专门为闪存设备设计的文件系统。它采用了一些新的设计思路和数据结构,能够更好地充分利用闪存设备的性能和寿命。F2FS的代码架构可以分为以下几个部分: 1. F2FS核心模块:F2FS核心模块负责管理整个文件系统的元数据,包括超级块、inode、数据块、日志等。它也是整个F2FS文件系统的入口,提供了文件系统的操作接口。 2. Checkpoint模块:Checkpoint模块负责管理F2FS的日志和检查点机制。在F2FS中,所有的操作都是先入日志,然后再同步到数据块中。Checkpoint模块会定期将日志和数据同步到检查点中,以保证文件系统的一致性和可靠性。 3. GC模块:GC模块负责管理F2FS的垃圾回收机制。由于闪存设备的入操作是有限制的,因此需要定期进行垃圾回收以释放已经不再使用的空间。 4. Compression模块:Compression模块负责对数据进行压缩和解压缩,以节省存储空间和提高读性能。 5. Encryption模块:Encryption模块负责对文件和数据进行加密和解密,以保护用户数据的安全性。 6. Mount模块:Mount模块负责F2FS文件系统的挂载和卸载操作,以及文件系统的格式化和初始化等操作。 总之,F2FS的代码架构设计得非常清晰和模块化,各个模块之间相互独立,并且有很好的扩展性和灵活性。这也是F2FS能够在闪存设备中发挥出色性能和可靠性的重要原因之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值