JFFS2的remount过程
博主能力有限,若博文有错误,请各位大侠不吝赐教。
本文代码基于linux4.4.198
jffs2文件系统的remount命令为:mount -t jffs2 -o remount,*** /dev/mtdblocki /mnt
这个命令最终会调用到mount系统调用,通过参数MS_REMOUNT告诉内核这是一次remount的操作,代码的调用路径为:
sys_mount->do_mount->do_remount->do_remount_sb->jffs2_remount_fs
通过mount系统调用最终调用到jffs2的s_op的jffs2_remount_fs钩子,下面我们来看代码。
static int jffs2_remount_fs(struct super_block *sb, int *flags, char *data)
{struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);int err;sync_filesystem(sb);//这里先同步文件系统数据err = jffs2_parse_options(c, data); //解析remount时传入的参数,即前文remount命令中的***if (err)return -EINVAL;return jffs2_do_remount_fs(sb, flags, data);//继续完成remount操作
}
我们先看解析挂载参数的函数jffs2_parse_options,如果我们remount传入的***为空,那么data就为NULL,本函数直接返回,即保持上一次挂载时的参数,否则,继续往下执行解析参数的代码。
static int jffs2_parse_options(struct jffs2_sb_info *c, char *data)
{substring_t args[MAX_OPT_ARGS];char *p, *name;unsigned int opt;if (!data) //若传入参数为空,直接返回return 0;while ((p = strsep(&data, ","))) { //一个一个参数解析int token;if (!*p)continue;token = match_token(p, tokens, args); //对照预设好的token表解析每个参数switch (token) {case Opt_override_compr: //压缩方式name = match_strdup(&args[0]); //获取压缩方式if (!name)return -ENOMEM;if (!strcmp(name, "none"))c->mount_opts.compr = JFFS2_COMPR_MODE_NONE;
#ifdef CONFIG_JFFS2_LZOelse if (!strcmp(name, "lzo"))c->mount_opts.compr = JFFS2_COMPR_MODE_FORCELZO;
#endif
#ifdef CONFIG_JFFS2_ZLIBelse if (!strcmp(name, "zlib"))c->mount_opts.compr =JFFS2_COMPR_MODE_FORCEZLIB;
#endifelse {pr_err("Error: unknown compressor \"%s\"\n",name);kfree(name);return -EINVAL;}kfree(name);c->mount_opts.override_compr = true;break;case Opt_rp_size: //size of reserved pool in KiBif (match_int(&args[0], &opt))return -EINVAL;opt *= 1024;if (opt > c->mtd->size) {pr_warn("Too large reserve pool specified, max ""is %llu KB\n", c->mtd->size / 1024);return -EINVAL;}c->mount_opts.rp_size = opt;break;default:pr_err("Error: unrecognized mount option '%s' or missing value\n",p);return -EINVAL;}}return 0;
}
继续看jffs2_do_remount_fs函数,代码注释里说明了停止gc线程和重启他的理由。
int jffs2_do_remount_fs(struct super_block *sb, int *flags, char *data)
{struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);if (c->flags & JFFS2_SB_FLAG_RO && !(sb->s_flags & MS_RDONLY))return -EROFS;/* We stop if it was running, then restart if it needs to.This also catches the case where it was stopped and thisis just a remount to restart it.Flush the writebuffer, if neccecary, else we loose it */if (!(sb->s_flags & MS_RDONLY)) { //如果之前不是RO方式挂载的jffs2_stop_garbage_collect_thread(c); //先停止GC线程mutex_lock(&c->alloc_sem);jffs2_flush_wbuf_pad(c); //将缓冲区的数据刷入flashmutex_unlock(&c->alloc_sem);}if (!(*flags & MS_RDONLY)) //如果本次挂载使用的不是RO方式jffs2_start_garbage_collect_thread(c); //启动GC线程*flags |= MS_NOATIME;return 0;
}
总的来说,jffs2的remount操作还是很简单的,对于remount时没有传入参数的,jffs2会保持之前的挂载参数,否则,会使用新的参数。
值得一提的是,对于busybox,remount的时候会按照remount时传入的参数进行重新挂载,若remount时传入的参数为空,则按照无参数进行mount操作;但是,systemd的情况就不一样了,systemd对于remount时传入的参数为空的情况,会通过读取/proc/mount接口获取上次挂载时使用的参数,这与busybox处理的方式是不一样的。
JFFS2的remount过程相关推荐
- JFFS2文件系统挂载过程优化的分析报告
一 问题描述 在上电启动优化中发现Linux系统下挂载JFFS2文件系统耗时较长,以128M的NOR FLASH为例,用时接近20秒.后续单板的FLASH容量为256M,时间会更长.如此长的挂载时间, ...
- JFFS2文件系统挂载过程(5)
上篇博文已经把挂载阶段讲完了,那挂载操作是不是就结束了呢? 答案是否定的,还留下了一些操作给gc线程去完成,这么做的目的是为了让挂载阶段所使用的时间减少,提升用户体验(说白了就是让用户以为已经挂载完成 ...
- jffs2的目录项查找过程
jffs2的目录项查找调用的函数是jffs2_lookup,下面一起看一下这个函数. /* We keep the dirent list sorted in increasing order of ...
- spi nor flash使用汇总
Overview SPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash, 3-wire spi, 4-wire spi, 6-wire spi. ...
- 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
目录 一.故障重现 二.救援过程 一.故障重现 近日为了解决CVE-2021-3449: 拒绝服务漏洞.CVE-2021-3450: 证书校验漏洞,自己编译了openssl-1.1.1k. 亲测发现: ...
- u-boot启动过程
目录: 一.初识u-boot 3 1,Bootloader介绍 3 2,Bootloader的启动方式 3 (1)网络启动方式 4 (2)磁盘启动方式 4 (3)Flash启动方式 4 3,U-boo ...
- Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 建设过程
安装SDK 1.Hi3531 SDK包的位置 在"Hi3531_V100R001***/01.software/board"夹,你可以看到一个 Hi3531_SDK_Vx. ...
- linux系统配置之开机启动过程(centos)
1.开机流程如下: 2.BIOS BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实 ...
- U-Boot移植教程之一:U-Boot分析与启动过程
内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.Bootloader的引出 当系统上电时,并不是直接进入Linux系统的,而是需要先执行一段程序来把单片机的硬件外围初始化好,比如 ...
最新文章
- latex 幻灯片演示模板
- Java核心类库篇6——IO
- 小米8大幅降价促销 性价比十足!
- 开源工具 PrivateBin 修复XSS 漏洞
- wincc怎么做数据库_关于WINCC通过PLCSIM来进行仿真中要怎么设置?
- mysql openwrt 编译_如何编译OpenWrt
- 农行运营合规管理心得体会_老员工写诗讲述农行40年运营风采
- java 25 - 2 网络编程之 网络通信三要素
- 前轮反馈控制(Stanley) 法
- 【excel】QUARTILE.EXC V.S. QUARTILE.INC
- 关于阿里矢量图标的普通无色和彩色的使用方法
- 3分钟快速阅读-《Effective Java》(三)
- vue中使用tinymce富文本
- 依维世苏打水让办公也可以冒出开心的小泡泡
- RK3288平台 SPI接口调试步骤
- Python爬虫——Requests 库基本使用
- 卷毛机器人抢大龙视频_世界第一机器人卷毛梦回S2 钩子抢大龙 直言钻一像人机...
- 详解 CSS3中最好用的布局方式——flex弹性布局(看完就会)
- 怎么简单快速的剪切歌曲
- 北京师范大学计算机考研资料汇总
热门文章
- WPF 项目开发入门(十)DevExpress 插件+NHibernate 登录实现
- cmd CD命令用法详解
- dnf服务器显示1234567,DNF:旭旭宝宝色盲被实锤,普雷这个机制有点意思
- SSH组合工程之-struts2hibernatespring(工程下载)
- 第1章第18节:如何利用批注功能向作者提出幻灯片的修改意见 [PowerPoint精美幻灯片实战教程]
- nodeJS优雅写代码:使用别名并配置Webstorm正确识别
- 学生宿舍计算机网络,学生宿舍计算机网络系统设计.doc
- ChatGPT的多种用法(持续更新中。。。)
- 电脑桌面有计算机网络还有什么,我的电脑桌面上面和下面怎么突然出现黑色区域...
- Assets文件夹和RAW文件夹区别