Read(User - ext4)

Retired DISLab
(버전 사이의 차이)
이동: 둘러보기, 찾기
 
(한 사용자의 중간의 편집 9개 숨겨짐)
3번째 줄: 3번째 줄:
 
(*) --> "read()"
 
(*) --> "read()"
 
"read()" --> "SYSCALL_DEFINE3()"
 
"read()" --> "SYSCALL_DEFINE3()"
 +
 +
partition VFS {
 
"SYSCALL_DEFINE3()" -->  "vfs_read()"
 
"SYSCALL_DEFINE3()" -->  "vfs_read()"
"vfs_read()" -->  "do_sync_read()"
+
-->  "do_sync_read()"
 +
}
 +
 
 +
 
 +
partition EXT4 {
 
"do_sync_read()" -->"generic_file_aio_read"
 
"do_sync_read()" -->"generic_file_aio_read"
  
"generic_file_aio_read" -->"generic_segment_checks"
+
--> if "not O_DIRECT" then
"generic_segment_checks" --> if "error" then
+
-->"do_generic_file_read()"
-->[error] (*)
+
"do_generic_file_read()"-->if "no page" then
endif
+
-->"page_cache_sync_readahead()"
 +
-->"ondemand_readahead()"
 +
-->"__do_page_cache_readahead()"
 +
-->"read_pages()"
  
"generic_segment_checks" --> if "filp->f_flag  check" then
+
"do_generic_file_read()"-->if "PageReadahead(page)" then
--> [O_DIRECT]"filemap_write_and_wait_range"
+
--> "page_cache_async_readahead()"
else
+
-->"ondemand_readahead()"
-->"do_generic_file_read"
+
-->"__do_page_cache_readahead()"
"filemap_write_and_wait_range" --> if "return O" then
+
-->"read_pages()"
--> "generic_file_direct_IO"
+
endif
+
  
"filemap_write_and_wait_range" -> "filemap_fdatawrite_range"
+
"do_generic_file_read()"-->"ext4_readpages()"
"filemap_fdatawrite_range" --> "do_writepages"
+
-->"mpage_readpages()"
"do_writepages" --> "generic_writepage"
+
-->"do_mpage_readpage()"
"generic_writepage" -->"write_cache_pages"
+
-->"mpage_bio_submit()"
"write_cache_pages" --> "writepage"
+
}
  
"do_generic_file_read" --> "find_get_page(mapping, index)"
 
-->[no page] "page_cache_alloc_cold(mapping)"
 
"find_get_page(mapping, index)" --> "add_to_page_cache_lru"
 
"add_to_page_cache_lru" --> if "error" then
 
-->"page_cache_release(page)"
 
else
 
-->"ext4_readpage(struct file *file, struct page *page)"
 
"page_cache_release(page)"-->"file_accessed(filp)"
 
 
"ext4_readpage(struct file *file, struct page *page)"-->"mpage_readpage(page, ext4_get_block)"
 
"mpage_readpage(page, ext4_get_block)" -> "ext4_get_block"
 
"mpage_readpage(page, ext4_get_block)"  --> "do_mpage_readpage"
 
"do_mpage_readpage" --> if "bio exit" then
 
-->"mpage_bio_submit(READ, bio)"
 
"mpage_bio_submit(READ, bio)"-->"mpage_end_io"
 
"mpage_bio_submit(READ, bio)"-->"submit_bio(rw, bio)"
 
 
-->"generic_make_request(bio)"
 
-->"generic_make_request(bio)"
 
"generic_make_request(bio)" --> if "current process has bio"then
 
-->"bio_list_add(current->bio_list, bio)"
 
 
 
 
  
 
</uml>
 
</uml>

2014년 5월 20일 (화) 14:46 현재 판

개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기