博主能力有限,若博文有错误,请各位大侠不吝赐教。
本文代码基于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过程相关推荐

  1. JFFS2文件系统挂载过程优化的分析报告

    一 问题描述 在上电启动优化中发现Linux系统下挂载JFFS2文件系统耗时较长,以128M的NOR FLASH为例,用时接近20秒.后续单板的FLASH容量为256M,时间会更长.如此长的挂载时间, ...

  2. JFFS2文件系统挂载过程(5)

    上篇博文已经把挂载阶段讲完了,那挂载操作是不是就结束了呢? 答案是否定的,还留下了一些操作给gc线程去完成,这么做的目的是为了让挂载阶段所使用的时间减少,提升用户体验(说白了就是让用户以为已经挂载完成 ...

  3. jffs2的目录项查找过程

    jffs2的目录项查找调用的函数是jffs2_lookup,下面一起看一下这个函数. /* We keep the dirent list sorted in increasing order of ...

  4. spi nor flash使用汇总

    Overview SPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash, 3-wire spi, 4-wire spi, 6-wire spi. ...

  5. 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用

    目录 一.故障重现 二.救援过程 一.故障重现 近日为了解决CVE-2021-3449: 拒绝服务漏洞.CVE-2021-3450: 证书校验漏洞,自己编译了openssl-1.1.1k. 亲测发现: ...

  6. u-boot启动过程

    目录: 一.初识u-boot 3 1,Bootloader介绍 3 2,Bootloader的启动方式 3 (1)网络启动方式 4 (2)磁盘启动方式 4 (3)Flash启动方式 4 3,U-boo ...

  7. Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 建设过程

    安装SDK 1.Hi3531 SDK包的位置     在"Hi3531_V100R001***/01.software/board"夹,你可以看到一个 Hi3531_SDK_Vx. ...

  8. linux系统配置之开机启动过程(centos)

    1.开机流程如下: 2.BIOS BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实 ...

  9. U-Boot移植教程之一:U-Boot分析与启动过程

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.Bootloader的引出 当系统上电时,并不是直接进入Linux系统的,而是需要先执行一段程序来把单片机的硬件外围初始化好,比如 ...

最新文章

  1. latex 幻灯片演示模板
  2. Java核心类库篇6——IO
  3. 小米8大幅降价促销 性价比十足!
  4. 开源工具 PrivateBin 修复XSS 漏洞
  5. wincc怎么做数据库_关于WINCC通过PLCSIM来进行仿真中要怎么设置?
  6. mysql openwrt 编译_如何编译OpenWrt
  7. 农行运营合规管理心得体会_老员工写诗讲述农行40年运营风采
  8. java 25 - 2 网络编程之 网络通信三要素
  9. 前轮反馈控制(Stanley) 法
  10. 【excel】QUARTILE.EXC V.S. QUARTILE.INC
  11. 关于阿里矢量图标的普通无色和彩色的使用方法
  12. 3分钟快速阅读-《Effective Java》(三)
  13. vue中使用tinymce富文本
  14. 依维世苏打水让办公也可以冒出开心的小泡泡
  15. RK3288平台 SPI接口调试步骤
  16. Python爬虫——Requests 库基本使用
  17. 卷毛机器人抢大龙视频_世界第一机器人卷毛梦回S2 钩子抢大龙 直言钻一像人机...
  18. 详解 CSS3中最好用的布局方式——flex弹性布局(看完就会)
  19. 怎么简单快速的剪切歌曲
  20. 北京师范大学计算机考研资料汇总

热门文章

  1. WPF 项目开发入门(十)DevExpress 插件+NHibernate 登录实现
  2. cmd CD命令用法详解
  3. dnf服务器显示1234567,DNF:旭旭宝宝色盲被实锤,普雷这个机制有点意思
  4. SSH组合工程之-struts2hibernatespring(工程下载)
  5. 第1章第18节:如何利用批注功能向作者提出幻灯片的修改意见 [PowerPoint精美幻灯片实战教程]
  6. nodeJS优雅写代码:使用别名并配置Webstorm正确识别
  7. 学生宿舍计算机网络,学生宿舍计算机网络系统设计.doc
  8. ChatGPT的多种用法(持续更新中。。。)
  9. 电脑桌面有计算机网络还有什么,我的电脑桌面上面和下面怎么突然出现黑色区域...
  10. Assets文件夹和RAW文件夹区别