在文件系统中,当需要执行写操作时,肯定是需要查找需要写入的块。那么如何查找块哪?

在Ext4系统中,有两个函数是可能执行查找操作的:ext4_getblk()、ext4_get_block()。

其中ext4_getblk(),原型如下:

structbuffer_head *ext4_getblk(handle_t *handle, struct inode *inode,

ext4_lblk_tblock, int create, int *errp)

该函数的主要功能:基于给定的inode,查找或创建block,并返回与其映射的buffer;create标识用于表示当查找不到时,是否执行分配块操作。

本节我们不关注块分配操作;因此create为0。

ext4_get_block()函数原型如下:

intext4_get_block(struct inode *inode, sector_t iblock,

struct buffer_head *bh, int create)

该函数的主要功能:基于给定的inode,查找文件的逻辑块iblock,并将其与bh进行映射,如果没有查找到,若create为1,则执行块分配操作为文件申请新的block,然后再与bh建立映射。这个函数用于适配VFS层接口。

无论ext4_getblk()还是ext4_get_block(),都是先初始化structext4_map_blocks map,然后调用函数ext4_map_blocks(),实现块查找功能。

先来看一下ext4_map_blocks这个结构体:

struct ext4_map_blocks{

ext4_fsblk_t m_pblk;

ext4_lblk_t m_lblk;

unsigned int m_len;

unsigned int m_flags;

};

在分析ext4_map_blocks结构体之前,我们先来熟悉两个概念:物理块号、逻辑块号。对于一个存储设备(这个设备是可以是存储分区)格式化为某个文件系统的过程中,一般,都会给予给定的block值对整个存储分区划分很多个大小为block size的单元,每个单元,我们都称之为块,每一个块都有一个块号,是以存储分区起始位置为偏移计算的,我们一般称之为物理块号。当某一个块被分配给某一个文件用来存放Data后,那么这个块给予文件起始位置又被赋予了一个块号,这个块号只对于该文件有效,这个块号我们一般称之为逻辑块号。

ext4_map_blocks结构体主要用来描述需要映射的空间信息,包含映射空间的物理块号,逻辑块号,空间大小,属性标识。在查找之前,一般都是知道逻辑块号和空间大小的。

ext4_map_blocks()的原型如下:

intext4_map_blocks(handle_t *handle, struct inode *inode,

struct ext4_map_blocks *map, int flags)

1.首先调用ext4_es_lookup_extent()查找extent status tree,extent status tree是描述extent在内存中信息与状态的树,可以理解为extent
tree在内存的中组织。在查找extent status tree的过程中,先检查cache extents是否满足条件,否则遍历整个extent status tree。

2.如果在缓存中没有查找到,那么我们就需要从磁盘上读出extent tree数据,然后查找。实现函数为ext4_ext_find_extent()。那么是如何实现的哪?

说起来,也十分的简单。

由前述[磁盘布局extent tree]可知,extent tree在磁盘上都是以extent block为单位存储的。

首先从inode中找出根节点,在根节点中的四个entry中通过二分法查找包含指定block的entry,然后通过该entry信息读取下一级extent
block到buffer中。该buffer中包含很多entry,继续通过二分法查找包含指定block的enrty,然后再读取下一级entry,依次类推;直至到叶子节点或无下级的节点。

从而我们得到与制定block最相近的extent(若查找不到,则返回小于block的最大的extent,即左侧的extent).

假如寻找到合适的包含block块号的extent,则计算出对应的物理block和在这个extent中以block为起始点到extent终点的长度(如果这个长度大约所要求的长度,则取所要求的长度)。

out:

if (allocated > map->m_len)

allocated = map->m_len;

ext4_ext_show_leaf(inode, path);

map->m_flags |= EXT4_MAP_MAPPED;

map->m_pblk = newblock;

map->m_len = allocated;

如果没有找到块,因为之前的Create标识已经说明即使没有找到,也不需要创建,所以直接返回0.

OK,块查找操作分析结束。

作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

[ext4]空间管理 - 查找块的更多相关文章

  1. [ext4]空间管理 - 与分配相关的关键数据结构

     在块分配机制中,涉及到几个主要的数据结构. 通过ext4_allocation_request描述块请求,然后基于块查找结果即上层需求来决定是否执行块分配操作. 在分配过程中,为了更好执行分配, ...

  2. [ext4]空间管理 - 分配机制

     在Ext4系统中,存在很多分配策略,比如预分配.多块分配.延迟分配等   Prealloc预分配 在ext4系统中,对于小文件和大文件的空间申请请求,都有不同的分配策略.对用小文件的空间请求,e ...

  3. [ext4]13 空间管理 - Prealloc分配机制

     作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 在ext4系统中,对于小文件和大文件的空间申请请求,都有不同的分配策略 ...

  4. Oracle表空间管理

    oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;              //修改表空间数据文件类型 2.ALT ...

  5. 本地管理表空间(LMT)与自动段空间管理(ASSM)概念

    创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management auto 定义自动段空间管理(ASSM). extent ...

  6. ORACLE表空间管理维护

    1:表空间概念 在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成. 如下图所示, ...

  7. ORACLE表空间管理方式segment和extent

    A permanent tablespace contains persistent schema objects. Objects in permanent tablespaces are stor ...

  8. 【Oracle】表空间管理

    --表空间管理为主.附带 权限管理.数据字典 /* 表空间是逻辑结构,数据文件是物理结构 一个表空间对应多个段segment 段可以对应多个数据文件.跨磁盘 一个段对应多个盘区 extent 一个盘区 ...

  9. Oracle数据库体系结构(7) 表空间管理1

    表空间是Oracle数据库最大的逻辑存储结构,有一系列段构成.Oracle数据库对象存储结构的管理主要是通过表空间的管理实现的. 1.表空间的分类 表空间根据存储类型不同分为系统表空间和非系统表空间 ...

随机推荐

  1. pageRank算法 python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  2. 【Spring】使用Spring和AMQP发送接收消息(中)

    上篇讲了RabbitMQ连接工厂的作用是用来创建RabbitMQ的连接,本篇就来讲讲RabbitMQ的发送消息.通过RabbitMQ发送消息最简单的方式就是将connectionFactory Bea ...

  3. 使用Topshelf组件构建简单的Windows服务

    很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方式也就会不同了.我个人觉得无论学习什么,都应该尝试着去了解 ...

  4. 吃透css3之3d属性--perspective和transform

    本文为原创,转载请注明出处: cnzt 写在前面:最近写了个3d轮播效果图,在此将思路和过程中遇到的问题都记录下来. 首先,我们下来了解一下perspective和transform都是做什么的. t ...

  5. node.js平台下Express的session与cookie模块包的配置

    首先下载两个模块包 session模块包:用于保持登录状态或保持会话状态等. npm install express-session --save-dev cookie模块包:用于解析cookie. ...

  6. iOS打包后收不到推送信息

    今天遇到的一个特别神奇的问题: 应用在测试环境下打的包收不到推送了,打包之后都没有推送,但是我真机测试又是可以收到推送消息的.经过好久才找到原因,感觉很坑.这里记录一下问题: 1.由于我的推送第三方使 ...

  7. MCMC(四)Gibbs采样

    MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)MCMC采样和M-H采样 MCMC(四)Gibbs采样 在MCMC(三)MCMC采样和M-H采样中,我们讲到了M-H采样已经可以很好 ...

  8. Realm数据库的简单介绍和使用

    给大家介绍一个数据库操作的框架Realm,本文主要以iOS 平台的使用场景为例. realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android: ...

  9. 从零开始学习springboot之springboot搭建

    博主刚开始实习不久,还是小白一枚,被公司的各种新奇技术搞得眼花缭乱了好久,主要是用springboot和dubbo构建起来的项目.看完之后才知道springboot真的是java开发者的福音啊 话不多 ...

  10. 【C++】智能指针详解(一):智能指针的引入

    智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...