Ext4文件系统架构分析(十一) ——ioctl源码分析之强制立即分配延迟分配给文件的数据块

原文来自 http://blog.chinaunix.net/uid-28989651-id-4552508.html

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/<dev>/delayed_allocation_blocks中查看,如果该文件内容为0,表示没有延迟分配的数据块,否则表示延迟分配的数据块的个数,其中,<dev>表示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) 释放对文件系统的写操作权限,操作结束


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值