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/
(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) 释放对文件系统的写操作权限,操作结束