| Function report | 
| Source Code: fs\mpage.c | Create Date:2022-07-28 20:15:32 | 
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick | 
| home page | Tree | 
| Annotation kernel can get tool activity | Download SCCT | Chinese | 
Name:This is the worker routine which does all the work of mapping the disk* blocks and constructs largest possible bios, submits them for IO if the* blocks are not contiguous on the disk
Proto:static struct bio *do_mpage_readpage(struct mpage_readpage_args *args)
Type:struct bio
Parameter:
| Type | Parameter | Name | 
|---|---|---|
| struct mpage_readpage_args * | args | 
| 161 | blocks_per_page = PAGE_SIZE >> blkbits | 
| 169 | first_hole = blocks_per_page | 
| 170 | struct block_device * bdev = NULL | 
| 172 | fully_mapped = 1 | 
| 178 | If is_readahead Then | 
| 181 | Else | 
| 186 | If page_has_buffers(page) Then Go to confused | 
| 190 | last_block = block_in_file + nr_pages * blocks_per_page | 
| 192 | If last_block > last_block_in_file Then last_block = last_block_in_file | 
| 194 | page_block = 0 | 
| 199 | nblocks = size of mapping >> blkbits | 
| 200 | If buffer_mapped(map_bh) && block_in_file > first_logical_block && block_in_file < first_logical_block + nblocks Then | 
| 204 | last = nblocks - map_offset | 
| 206 | cycle | 
| 207 | If relative_block == last Then | 
| 209 | Break | 
| 211 | If page_block == blocks_per_page Then Break | 
| 213 | blocks[page_block] = start block number + map_offset + relative_block | 
| 215 | page_block++ | 
| 216 | block_in_file++ | 
| 225 | When page_block < blocks_per_page cycle | 
| 226 | buffer state bitmap (see above) = 0 | 
| 227 | size of mapping = 0 | 
| 229 | If block_in_file < last_block Then | 
| 230 | size of mapping = last_block - block_in_file << blkbits | 
| 231 | If get_block(inode, block_in_file, map_bh, 0) Then Go to confused | 
| 236 | If Not buffer_mapped(map_bh) Then | 
| 237 | fully_mapped = 0 | 
| 238 | If first_hole == blocks_per_page Then first_hole = page_block | 
| 240 | page_block++ | 
| 241 | block_in_file++ | 
| 242 | Continue | 
| 253 | Go to confused | 
| 256 | If first_hole != blocks_per_page Then Go to confused | 
| 260 | If page_block && blocks[page_block - 1] != start block number - 1 Then Go to confused | 
| 262 | nblocks = size of mapping >> blkbits | 
| 263 | cycle | 
| 264 | If relative_block == nblocks Then | 
| 266 | Break | 
| 267 | Else if page_block == blocks_per_page Then Break | 
| 269 | blocks[page_block] = start block number + relative_block | 
| 270 | page_block++ | 
| 271 | block_in_file++ | 
| 276 | If first_hole != blocks_per_page Then | 
| 277 | zero_user_segment(page, first_hole << blkbits, PAGE_SIZE) | 
| 278 | If first_hole == 0 Then | 
| 279 | SetPageUptodate(page) | 
| 281 | Go to out | 
| 283 | Else if fully_mapped Then | 
| 284 | SetPageMappedToDisk(page) | 
| 287 | If fully_mapped && blocks_per_page == 1 && Not PageUptodate(page) && cleancache_get_page(page) == 0 Then | 
| 289 | SetPageUptodate(page) | 
| 290 | Go to confused | 
| 296 | If bio && last_block_in_bio != blocks[0] - 1 Then bio = mpage_bio_submit(REQ_OP_READ, op_flags, bio) | 
| 299 | alloc_new : | 
| 300 | If (bio == NULL) Then | 
| 301 | If first_hole == blocks_per_page Then | 
| 314 | length = first_hole << blkbits | 
| 315 | If bio_add_page(bio, page, length, 0) < length Then | 
| 316 | bio = mpage_bio_submit(REQ_OP_READ, op_flags, bio) | 
| 317 | Go to alloc_new | 
| 321 | nblocks = size of mapping >> blkbits | 
| 322 | If buffer_boundary(map_bh) && relative_block == nblocks || first_hole != blocks_per_page Then bio = mpage_bio_submit(REQ_OP_READ, op_flags, bio) | 
| 325 | Else last_block_in_bio = blocks[blocks_per_page - 1] | 
| 327 | out : | 
| 328 | Return bio | 
| 330 | confused : | 
| 331 | If bio Then bio = mpage_bio_submit(REQ_OP_READ, op_flags, bio) | 
| 333 | If Not PageUptodate(page) Then Generic "read page" function for block devices that have the normal* get_block functionality | 
| 337 | Go to out | 
| Name | Describe | 
|---|---|
| mpage_readpages | mpage_readpages - populate an address space with some pages & start reads against them*@mapping: the address_space*@pages: The address of a list_head which contains the target pages. These | 
| mpage_readpage | This isn't called much at all | 
| Source code conversion tool public plug-in interface | X | 
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |