xfs:aio_write流程
2017-02-13 16:17:38 0 举报
登录查看完整内容
XFS文件系统的aio_write流程主要包括以下几个步骤:首先,用户进程通过系统调用发起异步写操作,将写请求和相关数据传递给内核;然后,内核将写请求添加到写队列中,并分配相应的资源,如AIO控制块、内存缓冲区等;接着,内核根据文件的inode信息,找到对应的文件数据块,并将数据写入到这些数据块中;在写入过程中,内核还会更新文件的元数据,如文件大小、修改时间等;最后,当所有数据都写入完成后,内核会向用户进程发送一个完成信号,通知其异步写操作已经完成。整个过程中,XFS文件系统采用了先进的AIO技术,实现了高效的并发读写,提高了文件系统的性能。
作者其他创作
大纲/内容
Y
1、IO未对齐文件系统的block?或者2、有缓存页?
N
有缓存页?mapping-nrpages
要扩文件?
等待dio完成
写前检查:xfs_file_aio_write_checks
需要写入的字节数为 0?
IO是否对齐文件系统的block?
文件系统已经shutdown?
Y:dio流程
这个地方没有把文件扩展的情况加进来是因为在后续xfs_file_aio_write_checks()会根据当前的持锁状态,重新获取EXCL锁
当前持有的是XFS_IOLOCK_SHARED?
写数据generic_file_direct_write
释放锁,重新申请XFS_IOLOCK_EXCL锁
置IO非对齐标志unaligned_io = 1;
释放锁并重新获取XFS_IOLOCK_EXCL锁
数据写入成功(ret 0)?
返回
解锁
置需要请求的IOLOCK类型为XFS_IOLOCK_SHARED
返回失败
1
锁状态改变从头检查
file_remove_suid
N:返回错误码
加锁
Y:返回0
N:buffered流程
通用检查generic_write_checks OK?
置需要请求的IOLOCK类型为XFS_IOLOCK_EXCL
请求xfs iolock
directIO流程:xfs_file_dio_aio_write
请求xfs inode lock
directIO(O_DIRECT)?
请求的IO锁类型为XFS_IOLOCK_EXCL?
buffered IO流程:xfs_file_buffered_aio_write
当前持有的是XFS_IOLOCK_EXCL?
锁降级成读锁
检查是否需要扩文件,并完成文件扩展
刷缓存并等待完成
2
请求vfs inode大锁i_mutex
将新老EOF之间的空间清0
再次检测是否有缓存页&&( iolock == XFS_IOLOCK_SHARED)?
防止在等锁的过程中,有其他线程添加了新的页
xfs_file_aio_write
generic_segment_checks OK?
根据需要处理数据同步完成generic_write_sync
Y:返回-EIO
更新文件时间戳
IO是否对齐块设备的sector?
收藏
收藏
0 条评论
回复 删除
下一页