Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9184
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2017-11-14 22:33
文章分类
文章存档

2017年(14)

我的朋友

分类: LINUX

2017-11-14 22:43:42

Ext4文件系统支持强制立即分配延迟分配给文件的数据块,本质上是强制立即进行数据同步,也就是立即刷新文件的写缓冲。在Ext4文件系统中,写文件产生新数据时,文件系统并不立即分配数据块存储这些新数据(脏数据),而是延时等待到不得不写数据到磁盘为止,才会为新数据分配磁盘空间。Ext4文件系统的Ioctl命令EXT4_IOC_ALLOC_DA_BLKS用于为单个文件破解这种延迟分配的方式,也就是与该文件相关操作产生的新数据,文件系统立即为其分配空间,不再等待以延时分配。使用以下命令就可实现调用EXT4_IOC_ALLOC_DA_BLKS命令为文件立即分配数据块:

ioctl(fd, EXT4_IOC_ALLOC_DA_BLKS, NULL)

      ioctl 命令成功执行后。其中与 fd 所引用的文件相关的新数据,系统立即为其分配存储空间,不延时分配(这一结果可以从 /dev/sys/fs/ext4//delayed_allocation_blocks中查看,如果该文件内容为0,表示没有延迟分配的数据块,否则表示延迟分配的数据块的个数,其中,表示Ext4文件系统所在的设备,如果Ext4/dev/sda5上,那么dev就表示sda5)。

    强制立即分配延迟分配给文件的数据块的操作流程

(1) 判断执行强制立即分配操作的进程是否有相应的权限;

(2) 获取对文件系统的写操作权限;

(3) 调用ext4_alloc_da_blocks()函数,强制立即分配数据块;该函数首先调用函数trace_ext4_alloc_da_blocks(inode)获取延迟分配给文件的数据块的个数,然后判断文件是否为延迟分配预留有数据块或元数据块,如果都没有预留则,直接返回(文件系统认为没有给该文件开启延迟分配的特性).否者,调用filemap_flush(inode->i_mapping)函数,立即强制分配数据块。filemap_flush(inode->i_mapping)函数的工作仅仅是调用__filemap_fdatawrite(mapping,WB_SYNC_NONE)函数,其中WB_SYNC_NONE是一个同步标志,表示不进行任何等待。__filemap_fdatawrite(mapping,WB_SYNC_NONE)函数又调用了__filemap_fdatawrite_range(mapping, 0, LLONG_MAX, sync_mode)函数,该函数最终调用了do_writepages()函数,将文件的所有脏数据写到磁盘。

 

 

 

(4) 释放对文件系统的写操作权限,操作结束

阅读(202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~