分类: LINUX
2015-02-03 19:23:50
fs/ceph/file.c:
ceph_aio_write() //异步写函数
generic_segment_checks() //写之前进行检查,检查将要写入的段是否正常
generic_write_checks()
//对写入的位置和写入的字节数进行适当调整
file_remove_suid()
//为什么会有这一步???作用是什么
file_update_time()
//更新文件时间属性
ceph_get_caps()
//获取文件相关属性
<1>ceph_sync_write
<2>generic_file_buffered_write() //写缓存
generic_perform_write() //执行写操作
ceph_write_begin() //
grab_cache_page_write_begin() //查找页,如果找到,则等待回写wait_on_page_writeback,没找到,则分配内存页并加入lru链表,最后同样也要等待回写。
ceph_update_writeable_page() //
page_snap_context() //获取private属性,保存为快照
在当前页被别的地方修改过,则根据iNode获取以前的快照,并释放,然后将iNode数据回写(ceph_queue_writeback)
writepage_nounlock() //创建请求并向osd发起写请求,把页回写。
============================================================
writepage_nounlock 介绍:
确认当前快照上下文是可写的,然后删除旧的快照,把当前页读入文件系统缓冲区。
set_page_writeback() ==》 test_set_page_writeback(page)设置mapping的基数为可回写状态,增加bdi计数。
ceph_osdc_writepages()
ceph_osdc_start_request ==》 __ceph_osdc_start_request()
__register_request 将请求事件加入到rb-tree
__map_request 找到osd
__send_queued ==》 __send_request 把请求加入到队列,准备发送