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

相关文章

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li