博主能力有限,若博文有错误,请各位大侠不吝赐教。
本文代码基于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. PHP图片裁剪_图片缩放_PHP生成缩略图
  2. intent android 匿名,Android 匿名启动activity 启动系统activity
  3. 社群系统ThinkSNS+ V2.2-V2.3升级教程
  4. oracle之单行函数1
  5. ToString(C2)转人民币金额时的相关问题
  6. 解读升压电路(BOOST)与降压电路(BUCK)
  7. Matlab中imhist函数的使用及图像直方图的概念
  8. 启科量子国产量子编程软件项目或将启动开源计划
  9. 不同文件格式打开的方法
  10. 关于主机的思维导图_【思维导图大咖分享干货】关于思维导图中插图的用法细解!!...
  11. Wolf从零学编程-用Python打造简单加密程序(一)
  12. 1. -vinc- = -vict- 胜利,征服
  13. html创建站点文件夹,构建及访问Web站点
  14. android 最火框架,一个牛逼哄哄的Android框架One,秒杀最火的Xutils
  15. 解决VMbox中软连接创建错误的问题
  16. (个人翻译)Scrivener交互式手册中文版FowWindows 03基础操作
  17. Apollo 3.0代码浅析(一)
  18. 天天生鲜项目——用户订单页
  19. 使用make latexpdf, 报错The font “SourceHanMonoSC-Regular“ cannot be found.但是这个字体实际上已经安装了。
  20. Linux服务器如何做raid1,Linux下制作raid1

热门文章

  1. 文档不小心关闭但没保存怎么办?(WPS Office)
  2. 高数中的函数极限与导数
  3. 证明幂函数的导数(x^a)`=ax^(a-1)
  4. 如何利用STP理论实践品牌定位?
  5. thinkphp3.23开发的“二当家的”通用CMS系统
  6. 推荐个比较好用的协同办公软件?
  7. PMP备考笔记:项目整合管理1(五)
  8. [译 ] 云计算Cloud Computing 12章 大数据、数据流、和移动云计算 -序
  9. php php 序列化方法,PHP序列化的4种方法已公布,这是你PHP进阶之路必会的
  10. Be Focused Pro 2.1 工作和学习的计时器