| Function report | 
| Source Code: fs\block_dev.c | Create Date:2022-07-28 20:14:45 | 
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick | 
| home page | Tree | 
| Annotation kernel can get tool activity | Download SCCT | Chinese | 
Name:__blkdev_direct_IO
Proto:static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
Type:ssize_t
Parameter:
| Type | Parameter | Name | 
|---|---|---|
| struct kiocb * | iocb | |
| struct iov_iter * | iter | |
| int | nr_pages | 
| 341 | inode = bdev_file_inode(file) | 
| 346 | is_poll = (ki_flags & IOCB_HIPRI) != 0 | 
| 349 | qc = BLK_QC_T_NONE | 
| 350 | ret = 0 | 
| 352 | If (pos | iov_iter_alignment(iter)) & bdev_logical_block_size(bdev) - 1 Then Return -EINVAL | 
| 356 | bio = bio_alloc_bioset(GFP_KERNEL, nr_pages, & blkdev_dio_pool) | 
| 359 | is_sync = is_sync = is_sync_kiocb(iocb) | 
| 360 | If is_sync Then | 
| 361 | waiter = current process | 
| 363 | Else | 
| 367 | size = 0 | 
| 368 | multi_bio = false | 
| 369 | should_dirty = is_read && iter_is_iovec(iter) | 
| 375 | If Not is_poll Then blk_start_plug( & plug) | 
| 378 | cycle | 
| 379 | bio_set_dev(bio, bdev) | 
| 380 | device address in 512 byte sectors = pos >> 9 | 
| 381 | bi_write_hint = ki_hint | 
| 382 | bi_private = dio | 
| 383 | bi_end_io = blkdev_bio_end_io | 
| 384 | bi_ioprio = See linux/ioprio.h | 
| 386 | ret = bio_iov_iter_get_pages(bio, iter) | 
| 393 | If is_read Then | 
| 395 | If should_dirty Then bio_set_pages_dirty(bio) | 
| 397 | Else | 
| 402 | size += residual I/O count | 
| 403 | pos += residual I/O count | 
| 405 | nr_pages = iov_iter_npages(iter, BIO_MAX_PAGES) | 
| 406 | If Not nr_pages Then | 
| 407 | bool polled = false | 
| 409 | If ki_flags & IOCB_HIPRI Then | 
| 411 | polled = true | 
| 414 | qc = submit_bio(bio) | 
| 416 | If polled Then WRITE_ONCE( for ->iopoll , qc) | 
| 418 | Break | 
| 421 | If Not multi_bio Then | 
| 429 | multi_bio = true | 
| 430 | atomic_set( & ref, 2) | 
| 431 | Else | 
| 432 | atomic_inc( & ref) | 
| 435 | submit_bio(bio) | 
| 436 | bio = bio_alloc(GFP_KERNEL, nr_pages) | 
| 439 | If Not is_poll Then blk_finish_plug( & plug) | 
| 442 | If Not is_sync Then Return -cb queued, will get completion event | 
| 445 | cycle | 
| 450 | If Not (ki_flags & IOCB_HIPRI) || Not blk_poll(bdev_get_queue(bdev), qc, true) Then io_schedule() | 
| 456 | If Not ret Then ret = blk_status_to_errno(bi_status) | 
| 458 | If Value is more likely to compile time(!ret) Then ret = size | 
| 462 | Return ret | 
| Name | Describe | 
|---|---|
| blkdev_direct_IO | 
| 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 |