Linux 软raid函数 - - align_to_barrier_unit_end

2024-01-10 15:28

本文主要是介绍Linux 软raid函数 - - align_to_barrier_unit_end,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

函数功能:获取barrier bucket对齐之后的扇区长度。

源码调用:

 good_sectors = align_to_barrier_unit_end(sector_nr, good_sectors);

其中good_sectors的值为128,也就是缺省同步chunk size 64K,kretprobe跟踪的结果来看,跟踪到的值为128?这个值是固定的? - - 不是。

函数原型:static sector_t align_to_barrier_unit_end(sector_t start_sector, sector_t sectors)

参数:

  • start_sector:操作的其实扇区号。
  • sectors:期望操作的扇区范围。

返回值:可操作扇区的范围。

static sector_t align_to_barrier_unit_end(sector_t start_sector,sector_t sectors)
{sector_t len;WARN_ON(sectors == 0);/** len is the number of sectors from start_sector to end of the* barrier unit which start_sector belongs to.*//* len 是start_sector所属的屏障单元从start_sector到末端的扇区数。 */len = round_up(start_sector + 1, BARRIER_UNIT_SECTOR_SIZE) -start_sector;if (len > sectors)len = sectors;return len;
}/** This looks more complex than it should be. But we need to* get the type for the ~ right in round_down (it needs to be* as wide as the result!), and we want to evaluate the macro* arguments just once each.*/
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
#define round_down(x, y) ((x) & ~__round_mask(x, y))

举个例子,假设要对齐的起始扇区号为7,BARRIER_UNIT_SECTOR_SIZE的值为1<<17。

A = __round_mask = (1<<17) - 1 = 0 1111 1111 1111 1111

B = x - 1 = 8 - 1 = 0111

(A | B = 0 1111 1111 1111 1111) + 1 = 1 0000 0000 0000 0000

所以此时,round_up的返回值依然为BARRIER_UNIT_SECTOR_SIZE。

那么如果当起始扇区号大于BARRIER_UNIT_SECTOR_SIZE会是怎么样呢?假设起始扇区号为x = 1 0000 0000 0000 0010

A = __round_mask = (1<<17) - 1 = 0 1111 1111 1111 1111

B = x - 1 = 1 0000 0000 0000 0001

(A | B = 1 1111 1111 1111 1111) + 1 = 10 0000 0000 0000 0000

所以此时,round_up的返回值为BARRIER_UNIT_SECTOR_SIZE << 1,就是1<<18,是BARRIER_UNIT_SECTOR_SIZE 的两倍。

所以round_up 宏的作用是返回给定数 x 向上舍入到最接近的 y 的倍数。

整明白round_up函数的能力之后,再看看align_to_barrier_unit_end这个函数。

len = round_up(start_sector + 1, BARRIER_UNIT_SECTOR_SIZE) - start_sector;

len的值是取到最接近BARRIER_UNIT_SECTOR_SIZE整数倍的值,然后再减去扇区的起始扇区的值,len的值就是是start_sector所属的屏障单元从start_sector到bucket末端的扇区数。

+---------+--------barrier bucket------------+------------+
|         |                                  |            |
|    start sector			    bucket_end - sectors     |
+---------+--------barrier bucket------------+------------+
        if (len > sectors)len = sectors;
  • 如果len大于期望操作的扇区数,表示所有扇区区间落在barrier bucket范围内,直接返回期望操作的扇区数。
  • 如果len小于等于期望操作的扇区数,表示有一部分扇区超过barrier bucket范围,只能返回在bucket范围内的长度len,以保证不越界。

这篇关于Linux 软raid函数 - - align_to_barrier_unit_end的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591252

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon