f2fs系列文章fill_super(二)

F2FS 之 元数据 Superblock 结构 Superblock保存了F2FS的核心元数据的结构,包括磁盘大小,元区域的各个部分的起始地址等。 Superblock在元数据区域的物理结构 Superblock区域是由两个struct f2fs_super_block结构组成,互为备份。 Superblock物理存放区域结构 f2fs_super_block是F2FS对Superblock的具体数据结构实现,它保存在磁盘的最开始的位置(其实偏移了0x400),F2FS进行启动的时候从磁盘的前端直接读取出来。 struct 阅读详情

    sb_set_blocksize通过函数set_blocksize对size进行检查并设置块设备的块大小。然后将super block的s_blocksize,s_blocksize_bits设置F2FS_BLKSIZE和F2FS_BLKSIZE相应的bit位数。

int sb_set_blocksize(struct super_block *sb, int size)
{
	if (set_blocksize(sb->s_bdev, size))
		return 0;
	sb->s_blocksize = size;
	sb->s_blocksize_bits = blksize_bits(size);
	return sb->s_blocksize;
}

    set_blocksize对size进行检查,[512,page_size]是文件系统的size范围,并且必须是2的幂,并且不能比设备的块大小小。并把super block的设备的块大小s_bdev设置成F2FS_BLKSIZE。

int set_blocksize(struct block_device *bdev, int size)
{
	if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size))
		return -EINVAL;

	if (size < bdev_logical_block_size(bdev))
		return -EINVAL;

	if (bdev->bd_block_size != size) {
		sync_blockdev(bdev);
		bdev->bd_block_size = size;
		bdev->bd_inode->i_blkbits = blksize_bits(size);
		kill_bdev(bdev);
	}
	return 0;
}

    read_raw_super_block:首先分配一个f2fs_super_block的空间。f2fs文件系统有着两个f2fs_super_block,调用sb_bread对其进行依次读取,直到读取到的f2fs_super_block是没有问题的。读取之后调用sanity_check_raw_super对f2fs_super_block进行一些基本的检查。如果没有问题并且raw_super是NULL(第一次肯定是NULL的,第二次读取如果第一次读取或者检查失败就会是NULL的),那么就将读取的f2fs_super_block赋值给raw_super,并且用valid_super_block记录下有效的block号(假如没有一个是有效的,那么这个是NULL,如果只有一个是有效的,那么记录的就是有效的那个,如果两个都是有效的那么记录的就是第一个)。如果读取或者检查失败过那么用recovery来标记需要对f2fs_super_block进行修复。如果两个都失败了,那么就将分配的f2fs_super_block的空间释放掉。

static int read_raw_super_block(struct f2fs_sb_info *sbi, struct f2fs_super_block **raw_super,
			int *valid_super_block, int *recovery)
{
	struct super_block *sb = sbi->sb;
	int block;
	struct buffer_head *bh;
	struct f2fs_super_block *super;
	int err = 0;

	super = kzalloc(sizeof(struct f2fs_super_block), GFP_KERNEL);
	if (!super)
		return -ENOMEM;

	for (block = 0; block < 2; block++) {
		bh = sb_bread(sb, block);
		if (!bh) {
			f2fs_msg(sb, KERN_ERR, "Unable to read %dth superblock", block + 1);
			err = -EIO;
			continue;
		}
		if (sanity_check_raw_super(sbi, bh)) {
			f2fs_msg(sb, KERN_ERR, "Can't find valid F2FS filesystem in %dth superblock",
				block + 1);
			err = -EINVAL;
			brelse(bh);
			continue;
		}

		if (!*raw_super) {
			memcpy(super, bh->b_data + F2FS_SUPER_OFFSET, sizeof(*super));
			*valid_super_block = block;
			*raw_super = super;
		}
		brelse(bh);
	}
	if (err < 0)
		*recovery = 1;
	if (!*raw_super)
		kfree(super);
	else
		err = 0;

	return err;
}

    sanity_check_raw_super:首先检查魔数magic是否为F2FS_SUPER_MAGIC,然后检查文件系统的块大小F2FS_BLKSIZE是否和页大小PAGE_SIZE相等,因为f2fs文件系统的设计上是块大小与页大小是一致的。接下来检查f2fs_super_block的字段log_blocksize经过运算后是否与块大小F2FS_BLKSIZE保持一致。接着检查segment大小是否为512个block。接着是sector的大小必须(512,PAGE_SIZE)且必须是2的幂。然后是node/meta/root inode的ino分别是1/2/3。最后通过sanity_check_area_boundary来检查CP SIT NAT SSA MAIN_AREA的界限。

static int sanity_check_raw_super(struct f2fs_sb_info *sbi, struct buffer_head *bh)
{
	struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
					(bh->b_data + F2FS_SUPER_OFFSET);
	struct super_block *sb = sbi->sb;
	unsigned int blocksize;

	if (F2FS_SUPER_MAGIC != le32_to_cpu(raw_super->magic)) {
		f2fs_msg(sb, KERN_INFO, "Magic Mismatch, valid(0x%x) - read(0x%x)",
			F2FS_SUPER_MAGIC, le32_to_cpu(raw_super->magic));
		return 1;
	}

	if (F2FS_BLKSIZE != PAGE_SIZE) {
		f2fs_msg(sb, KERN_INFO, "Invalid page_cache_size (%lu), supports only 4KB\n",
			PAGE_SIZE);
		return 1;
	}

	blocksize = 1 << le32_to_cpu(raw_super->log_blocksize);
	if (blocksize != F2FS_BLKSIZE) {
		f2fs_msg(sb, KERN_INFO, "Invalid blocksize (%u), supports only 4KB\n", blocksize);
		return 1;
	}

	if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
		f2fs_msg(sb, KERN_INFO, "Invalid log blocks per segment (%u)\n",
			le32_to_cpu(raw_super->log_blocks_per_seg));
		return 1;
	}

	if (le32_to_cpu(raw_super->log_sectorsize) > F2FS_MAX_LOG_SECTOR_SIZE ||
		le32_to_cpu(raw_super->log_sectorsize) < F2FS_MIN_LOG_SECTOR_SIZE) {
		f2fs_msg(sb, KERN_INFO, "Invalid log sectorsize (%u)",
			le32_to_cpu(raw_super->log_sectorsize));
		return 1;
	}
	if (le32_to_cpu(raw_super->log_sectors_per_block) + le32_to_cpu(raw_super->log_sectorsize) !=
			F2FS_MAX_LOG_SECTOR_SIZE) {
		f2fs_msg(sb, KERN_INFO, "Invalid log sectors per block(%u) log sectorsize(%u)",
			le32_to_cpu(raw_super->log_sectors_per_block), le32_to_cpu(raw_super->log_sectorsize));
		return 1;
	}

	if (le32_to_cpu(raw_super->node_ino) != 1 ||
		le32_to_cpu(raw_super->meta_ino) != 2 ||
		le32_to_cpu(raw_super->root_ino) != 3) {
		f2fs_msg(sb, KERN_INFO, "Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)",
			le32_to_cpu(raw_super->node_ino),
			le32_to_cpu(raw_super->meta_ino),
			le32_to_cpu(raw_super->root_ino));
		return 1;
	}
	if (sanity_check_area_boundary(sbi, bh))
		return 1;

	return 0;
}

    get_valid_checkpoint:先分配一段盛装f2fs_checkpoint和sit/nat bitmap的空间。然后调用validate_checkpoin对第一个cp pack的两个f2fs_checkpoint进行读取比对,获取稳定版本的cp pack。接着再次调用validate_checkpoin对第二个cp pack的两个f2fs_checkpoint进行读取比对,获取稳定版本的cp pack。如果两个都是稳定版本的cp pack,那么就将最新的version比较大的cp pack作为当前cp pack。如果只有一个是稳定的,那么就将这个稳定的版本作为当前cp pack。如果两个都不是稳定的,那就返回错误信息。有了稳定版本之后,首先将读取的f2fs_checkpoint拷贝到开始分配的空间,再调用函数sanity_check_ckpt对f2fs_checkpoint做一下基本的检查。然后读取sit/nat bitmap到分配的空间中。

int get_valid_checkpoint(struct f2fs_sb_info *sbi)
{
	struct f2fs_checkpoint *cp_block;
	struct f2fs_super_block *fsb = sbi->raw_super;
	struct page *cp1, *cp2, *cur_page;
	unsigned long blk_size = sbi->blocksize;
	unsigned long long cp1_version = 0, cp2_version = 0;
	unsigned long long cp_start_blk_no;
	unsigned int cp_blks = 1 + __cp_payload(sbi);
	block_t cp_blk_no;
	int i;

	sbi->ckpt = kzalloc(cp_blks * blk_size, GFP_KERNEL);
	if (!sbi->ckpt)
		return -ENOMEM;
	
	cp_start_blk_no = le32_to_cpu(fsb->cp_blkaddr);
	cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version);
	cp_start_blk_no += ((unsigned long long)1) << le32_to_cpu(fsb->log_blocks_per_seg);
	cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version);

	if (cp1 && cp2) {
		if (ver_after(cp2_version, cp1_version))
			cur_page = cp2;
		else
			cur_page = cp1;
	} else if (cp1) {
		cur_page = cp1;
	} else if (cp2) {
		cur_page = cp2;
	} else {
		goto fail_no_cp;
	}

	cp_block = (struct f2fs_checkpoint *)page_address(cur_page);
	memcpy(sbi->ckpt, cp_block, blk_size);

	if (sanity_check_ckpt(sbi))
		goto fail_no_cp;

	if (cp_blks <= 1)
		goto done;

	cp_blk_no = le32_to_cpu(fsb->cp_blkaddr);
	if (cur_page == cp2)
		cp_blk_no += 1 << le32_to_cpu(fsb->log_blocks_per_seg);

	for (i = 1; i < cp_blks; i++) {
		void *sit_bitmap_ptr;
		unsigned char *ckpt = (unsigned char *)sbi->ckpt;
		cur_page = get_meta_page(sbi, cp_blk_no + i);
		sit_bitmap_ptr = page_address(cur_page);
		memcpy(ckpt + i * blk_size, sit_bitmap_ptr, blk_size);
		f2fs_put_page(cur_page, 1);
	}
done:
	f2fs_put_page(cp1, 1);
	f2fs_put_page(cp2, 1);
	return 0;

fail_no_cp:
	kfree(sbi->ckpt);
	return -EINVAL;
}

       validate_checkpoint:首先调用get_checkpoint_version读取cp pack中的第一个f2fs_checkpoint,获取其版本号。然后再调用get_checkpoint_version读取cp pack中的第二个f2fs_checkpoint,获取其版本号。如果读取校验失败则返回NULL。接下来比对cp pack中的两个f2fs_checkpoint的version,如果是一致的,那么说明这个cp pack是个稳定的版本,返回读取的f2fs_checkpoint。否则这个cp pack是在check_point的过程中出现宕机了,返回错误信息。

static struct page *validate_checkpoint(struct f2fs_sb_info *sbi,
				block_t cp_addr, unsigned long long *version)
{
	struct page *cp_page_1 = NULL, *cp_page_2 = NULL;
	struct f2fs_checkpoint *cp_block = NULL;
	unsigned long long cur_version = 0, pre_version = 0;
	int err;

	err = get_checkpoint_version(sbi, cp_addr, &cp_block, &cp_page_1, version);
	if (err)
		goto invalid_cp1;
	pre_version = *version;

	cp_addr += le32_to_cpu(cp_block->cp_pack_total_block_count) - 1;
	err = get_checkpoint_version(sbi, cp_addr, &cp_block, &cp_page_2, version);
	if (err)
		goto invalid_cp2;
	cur_version = *version;

	if (cur_version == pre_version) {
		*version = cur_version;
		f2fs_put_page(cp_page_2, 1);
		return cp_page_1;
	}
invalid_cp2:
	f2fs_put_page(cp_page_2, 1);
invalid_cp1:
	f2fs_put_page(cp_page_1, 1);
	return NULL;
}

       get_checkpoint_version:读取f2fs_checkpoint,然后对其进行crc校验,如果校验成功就返回这个f2fs_checkpoint的version,否则返回错误信息。 

static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr,
		struct f2fs_checkpoint **cp_block, struct page **cp_page, unsigned long long *version)
{
	unsigned long blk_size = sbi->blocksize;
	size_t crc_offset = 0;
	__u32 crc = 0;

	*cp_page = get_meta_page(sbi, cp_addr);
	*cp_block = (struct f2fs_checkpoint *)page_address(*cp_page);

	crc_offset = le32_to_cpu((*cp_block)->checksum_offset);
	if (crc_offset >= blk_size) {
		f2fs_msg(sbi->sb, KERN_WARNING,
			"invalid crc_offset: %zu", crc_offset);
		return -EINVAL;
	}

	crc = le32_to_cpu(*((__le32 *)((unsigned char *)*cp_block + crc_offset)));
	if (!f2fs_crc_valid(sbi, crc, *cp_block, crc_offset)) {
		f2fs_msg(sbi->sb, KERN_WARNING, "invalid crc value");
		return -EINVAL;
	}

	*version = cur_cp_version(*cp_block);
	return 0;
}

       sanity_check_ckpt:统计f2fs_super_block中的segment_count_ckpt、segment_count_sit、segment_count_nat、segment_count_ssa加上f2fs_checkpoint中的rsvd_segment_count不能大于f2fs_super_block中的总的segment的数量segment_count,也就是main area不能是没有空间的。然后f2fs_checkpoint中不能设置CP_ERROR_FLAG。

int sanity_check_ckpt(struct f2fs_sb_info *sbi)
{
	unsigned int total, fsmeta;
	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);

	total = le32_to_cpu(raw_super->segment_count);
	fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
	fsmeta += le32_to_cpu(raw_super->segment_count_sit);
	fsmeta += le32_to_cpu(raw_super->segment_count_nat);
	fsmeta += le32_to_cpu(ckpt->rsvd_segment_count);
	fsmeta += le32_to_cpu(raw_super->segment_count_ssa);

	if (unlikely(fsmeta >= total))
		return 1;

	if (unlikely(f2fs_cp_error(sbi))) {
		f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck");
		return 1;
	}
	return 0;
}
f2fs mkfs格式化系列3 前面讲了f2fs格式化主要进行了哪些操作,本篇看一下,mount过程中是如何读取格式化写到磁盘的那些内容的。 主要说一下如果读取f2fs meta data这些信息,mount过程还有一些比较重要的步骤,像build node management, build sit management后面会分开仔细再说。 static int f2fs_fill_super(struct super... 阅读详情

相关推荐

Android 白名单保活实战:主流厂商适配指南

本文详细解析了Android应用白名单保活的实战策略,重点针对华为、小米、OPPO、vivo等主流厂商的系统特性,提供了精准的后台设置页面跳转适配方案。文章从基础的前台服务实现讲起,深入讲解了白名单的判断、申请与厂商适配的核心代码与避坑指南,旨在帮助开发者合规、稳定地提升应用后台存活率。

motor的博客 1861

ext4 exfat ntfs无法自动挂载问题

问题描述 只有fat32可以识别,其它格式无法正常挂载。 处理过程 ext4处理 # create /dev/sda create /dev/sda1 [ 340.311161] EXT4-fs (sda1): Unrecognized mount option "utf8=1" or missing value [ 340.323172] > EXT4-fs (sda1): Unrecognized mount option "utf8=1" or missing value [ > 3

Aero's WorkSpace. 4665

Ubuntu运行vmware时报错Vmware Unable to install all modules!Use shipped Linux kernel AIO access library解决。

Ubuntu运行vmware时报错Vmware Unable to install all modules! vmware --version 提示下面内容: [AppLoader] Use shipped Linux kernel AIO access library. An up-to-date "libaio" or "libaio1" package from your system is preferred. VMware Workstation 16.1.2 build-17966106

wto882dim的博客 2849

Linux 块设备原理(二)以ext2文件系统为例分析块设备工作原理

在上一篇文章中,分析了如何去写一个基于MTD的flash驱动,大概分析了整个注册流程。整个块驱动就工作起来了。那么文件的读写,与块驱动的关系。文件系统与块驱动的关系,到底是怎么样的呢。这个问题还是值得研究一下的。本文主要分析vfs层到flash驱动层的数据流走向。通过该过程的分析,力求可以看清整个块驱动的工作原理。 首先大概了解一下ext2文件系统的基本原理。 1 ext2文件系统 1.1 ...

oqqYuJi12345678的博客 1397

SA8155 QNX显示框架与WFD配置实战:从黑屏排查到高可用设计

智能座舱中,车载显示系统的稳定性直接关系到驾驶安全。QNX作为高安全性的操作系统,在座舱仪表、ADAS等关键域中承担着确定性调度与隔离职责,其图形体系Screen与显示输出框架WFD协同工作,构成从应用渲染到面板点亮的完整链路。WFD配置涉及时序、通道映射与行为控制,任何参数偏差或加载异常都可能导致黑屏、花屏等故障。为保障系统可用性,需结合心跳监控、日志采集、通路重试与备份显示切换等策略,构建兼具快速感知与恢复能力的防御体系。本文以SA8155平台为例,深入拆解QNX显示框架的架构与WFD配置要点,结合一次

weixin_29165465的博客 206

Labelme AI-Polygon闪退排查与修复指南

本文详细介绍了Labelme AI-Polygon功能闪退问题的排查与修复方法,包括环境配置检查、模型路径设置、依赖库版本控制等关键步骤。通过系统性的解决方案和实用技巧,帮助用户快速解决闪退问题,确保数据标注工作的高效进行。

weixin_29311017的博客 140

Couldn't find valid filesystem superblock.

错误现象   [root@jituan-xiaofei-docker01 ~]# resize2fs /dev/centos/root resize2fs 1.42.9 (28-Dec-2013) resize2fs: Bad magic number in super-block while trying to open /dev/centos/root Couldn't find vali...

li66934791的博客 1万+

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6121

Hitool烧写3516dv00发送起始帧失败问题

关键操作 (1)先断电:意思就是将插在主机上的USB线拔掉 (2)点击烧写 (3)按住3516开发板上的update键不放,update键 (4)上电:意思是将刚刚拔掉的USB线再插到主机上,注意是同一个USB口,别插错了 (5)松开reset键,点击控制台出现如图场景,就代表已经在烧写了.....................

shunlu5586的博客 3230

【STM32】基于STM32F103C8T6实现步进电机精准调速控制

本文详细介绍了如何使用STM32F103C8T6微控制器实现步进电机的精准调速控制。通过利用其内置定时器生成PWM脉冲,替代低效的延时方法,并结合TB6600驱动器进行硬件连接,可实现平滑、高效的电机速度控制。文章提供了基于HAL库的代码实战,包括速度与方向设置函数,并探讨了加减速规划等高级应用,帮助开发者彻底掌握步进电机驱动技术。

weixin_29169899的博客 486

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2909

SuperBlock损坏修复

什么是superblock? 可以参考下这个网站:http://homepage.smc.edu/morgan_david/cs40/analyze-ext2.htm 详细的介绍superblock组成 构成   大家可能遇到过这样的情况: [root@dhcp-0-142 ~]# mount /dev/sdb1 /mnt/sdb1 mount: wrong f

swrd 3535

9.6华为OD机试真题 新系统 - 少儿爬山闯关积分游戏 (Java/Py/C/C++/Js/Go)

2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型。

算法大师! 860

f2fs系列文章fill_super(一)

    这个系列文章将讲述文件系统的安装过程,以函数f2fs_fill_super为起点。     f2fs_fill_super:通过调用sb_set_blocksize来检查和设置super_block的块大小字段和快设备的块大小。然后调用read_raw_super_block来对物理设备上的f2fs_super_block进行读取。接下来就可以对f2fs_sb_info的某些字段进行初始...

WaterWin的博客 2222

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

f2fs系列文章fill_super(三)

    这篇文章完成f2fs的segment管理结构f2fs_sm_info的创建和恢复。         build_segment_manager:首先分配容纳f2fs_sm_info的空间,然后用f2fs_super_block中的数据对f2fs_sm_info的一些关于segment数量的信息进行初始化。接着初始化其中的三个链表discard_list、wait_list、sit_ent...

WaterWin的博客 1285

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

f2fs系列文章fill_super(四)

    这篇文章将讲述f2fs的node的管理结构f2fs_nm_info的构建和恢复。        build_node_manager:首先分配f2fs_nm_info的空间,然后调用init_node_manager初始化f2fs_nm_info并分配一些位图的空间。最后调用build_free_nids读取一定page中的f2fs_nat_entry对free_nid进行初始化,然后根...

WaterWin的博客 762

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

f2fs学习四: f2fs文件系统挂载

f2fs_mount

guozhidixian的博客 5715

F2FS保留块特性分析及如何在Android上使用

不过可以使用保留空间加一层保护, 重要系统进程可以使用保留区,其他不可用, rt?,ext4这个特性叫resgid,3.18 f2fs还不支持,我从kernel 4.9移下来,基于这份代码分析。是一个reserved feature,主要目的应该是提高性能,在sysfs下可配置。首先检查mount是否有RESERVE_BOOT选项,如果没设置就不让用。应该就是这个grp有没有加到系统里,可见mount flag要加了。resgid=0的不让用保留了,

u012296694的专栏 1034

f2fs学习笔记 - 6. f2fs初始化流程

1.前言 初始流程主要包含f2fs文件系统初始化,以及f2fs文件系统mount 2. init_f2fs_fs init_inodecache 创建f2fs_inode_cache slab描述符 create_node_manager_caches 创建nat_entry,free_nid的slab描述符 create_gc_caches 创建f2fs_gc_inodes的 slab描述符 create_checkpoint_caches 创建f2fs_orphan_entry,f2fs_dirty_

HZero 1330

[问题] lvm刷新lv空间时报错:Couldn‘t find valid filesystem superblock.

错误现象 [root@test ~]# resize2fs /dev/centos/root resize2fs 1.42.9 (28-Dec-2013) resize2fs: Bad magic number in super-block while trying to open /dev/centos/root Couldn't find valid filesystem superblock. 文件解决 由于系统为centos7系统,文件格式为xfs 所以需要使用以下命令刷新lv xfs_growf

Harland的博客 3337

f2fs学习三: 文件系统初始化

文件系统

guozhidixian的博客 1426

F2FS源码分析-1.2 [F2FS 元数据布局部分] Superblock结构

Superblock结构 Superblock保存了F2FS的核心元数据的结构,包括磁盘大小,元区域的各个部分的起始地址等。 Superblock物理存放区域结构 f2fs_super_block是F2FS对Superblock的具体数据结构实现,它保存在磁盘的最开始的位置,F2FS进行启动的时候从磁盘的前端直接读取出来。 struct f2fs_super_block { __le32 ma...

Hubery的存储点滴 4050

F2FS nat entry涉及的数据结构(linux 5.18.11)

只要内存中生成ne,都会缓存在nat cache中(最大数量10万个,见宏定义DEF_NAT_CACHE_THRESHOLD),系统内存压力大的时候,需要回收clean状态的ne,避免f2fs对系统内存的影响。f2fs_fill_super --> f2fs_build_segment_manager --> build_curseg --> restore_curseg_summaries --> read_compacted_summaries 或 read_normal_summaries。

geshifei的博客 1237

centos7 resize2fs Couldn't find valid filesystem superblock.

http://blog.chinaunix.net/uid-20767811-id-5015333.html

hknaruto的专栏 1万+
上一篇: f2fs系列文章fill_super(一)
下一篇: f2fs系列文章fill_super(三)
WaterWin
博客等级 码龄9年 29粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值