|
|
(한 사용자의 중간의 편집 4개 숨겨짐) |
3번째 줄: |
3번째 줄: |
| (*) --> "read()" | | (*) --> "read()" |
| "read()" --> "SYSCALL_DEFINE3()" | | "read()" --> "SYSCALL_DEFINE3()" |
− | "SYSCALL_DEFINE3()" --> "vfs_read()"
| |
| | | |
| partition VFS { | | partition VFS { |
− | "vfs_read()" --> "do_sync_read()" | + | "SYSCALL_DEFINE3()" --> "vfs_read()" |
− | "do_sync_read()" -->"generic_file_aio_read" | + | --> "do_sync_read()" |
| + | } |
| | | |
− | "generic_file_aio_read" -->"generic_segment_checks"
| |
− | "generic_segment_checks" --> if "error" then
| |
− | -->[error] (*)
| |
− | endif
| |
− |
| |
− | "generic_segment_checks" --> if "filp->f_flag check" then
| |
− | --> [O_DIRECT]"filemap_write_and_wait_range"
| |
− | else
| |
− | -->"do_generic_file_read"
| |
− | "filemap_write_and_wait_range" --> if "return O" then
| |
− | --> "generic_file_direct_IO"
| |
− | endif
| |
− |
| |
− | "filemap_write_and_wait_range" -> "filemap_fdatawrite_range"
| |
− | "filemap_fdatawrite_range" --> "do_writepages"
| |
− | "do_writepages" --> "generic_writepage"
| |
− | "generic_writepage" -->"write_cache_pages"
| |
− | "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 check" then
| |
− | -->[error]"page_cache_release(page)"
| |
− | else
| |
− | -->[error X]"ext4_readpage(struct file *file, struct page *page)"
| |
− | "page_cache_release(page)"-->"file_accessed(filp)"
| |
− | }
| |
| | | |
| partition EXT4 { | | partition EXT4 { |
− | "ext4_readpage(struct file *file, struct page *page)"-->"mpage_readpage(page, ext4_get_block)" | + | "do_sync_read()" -->"generic_file_aio_read" |
− | "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"
| + | |
| | | |
− | note left
| + | --> if "not O_DIRECT" then |
− | I/O completion handler for multipage BIOs.
| + | -->"do_generic_file_read()" |
− | end note
| + | "do_generic_file_read()"-->if "no page" then |
| + | -->"page_cache_sync_readahead()" |
| + | -->"ondemand_readahead()" |
| + | -->"__do_page_cache_readahead()" |
| + | -->"read_pages()" |
| | | |
− | "mpage_end_io" --> "end_page_writeback(page)" | + | "do_generic_file_read()"-->if "PageReadahead(page)" then |
| + | --> "page_cache_async_readahead()" |
| + | -->"ondemand_readahead()" |
| + | -->"__do_page_cache_readahead()" |
| + | -->"read_pages()" |
| | | |
− | note left
| + | "do_generic_file_read()"-->"ext4_readpages()" |
− | end writeback against a page
| + | -->"mpage_readpages()" |
− | end note
| + | -->"do_mpage_readpage()" |
− | | + | -->"mpage_bio_submit()" |
− | "mpage_end_io" --> "bio_put(bio)" | + | } |
− | | + | |
− | note right:release a reference to a bio
| + | |
− | | + | |
− | "mpage_bio_submit(READ, bio)"-->"submit_bio(rw, bio)" | + | |
− | note right:submit a bio to the block device layer
| + | |
| | | |
| -->"generic_make_request(bio)" | | -->"generic_make_request(bio)" |
− | note right: hand a buffer to its device driver
| |
− |
| |
− | "generic_make_request(bio)" --> if "current process has bio"then
| |
− | -->"bio_list_add(current->bio_list, bio)"
| |
− |
| |
− | "generic_make_request(bio)" --> if "bio exist" then
| |
− | -->"make_request_fn(q, bio)"
| |
| | | |
| </uml> | | </uml> |