函数逻辑报告 |
Source Code:fs\block_dev.c |
Create Date:2022-07-29 10:46:00 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| 首页 | 函数Tree |
| 注解内核,赢得工具 | 下载SCCT | English |
函数名称:__blkdev_direct_IO
函数原型:static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
返回类型:ssize_t
参数:
| 类型 | 参数 | 名称 |
|---|---|---|
| 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 | 如果pos按位或iov_iter_alignment(iter)的值按位与bdev_logical_block_size(bdev)减1则返回:负EINVAL |
| 356 | bio等于bio_alloc_bioset(GFP_KERNEL, nr_pages, & blkdev_dio_pool) |
| 359 | is_sync等于is_sync等于is_sync_kiocb(iocb) |
| 360 | 如果is_sync则 |
| 363 | 否则 |
| 367 | size等于0 |
| 368 | multi_bio = false |
| 369 | should_dirty等于is_read且iter_is_iovec(iter) |
| 375 | 如果非is_poll则blk_start_plug( & plug) |
| 378 | 循环 |
| 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 |
| 384 | bi_ioprio等于 See linux/ioprio.h |
| 386 | ret等于bio_iov_iter_get_pages(bio, iter) |
| 387 | 如果此条件成立可能性小(为编译器优化)(ret)则 |
| 393 | 如果is_read则 |
| 395 | 如果should_dirty则bio_set_pages_dirty(bio) |
| 397 | 否则 |
| 402 | size加等于 residual I/O count |
| 403 | pos加等于 residual I/O count |
| 405 | nr_pages等于iov_iter_npages(iter, BIO_MAX_PAGES) |
| 406 | 如果非nr_pages则 |
| 407 | bool polled = false |
| 409 | 如果ki_flags按位与IOCB_HIPRI则 |
| 411 | polled = true |
| 414 | qc等于submit_bio(bio) |
| 416 | 如果polled则WRITE_ONCE( for ->iopoll , qc) |
| 418 | 退出 |
| 421 | 如果非multi_bio则 |
| 429 | multi_bio = true |
| 430 | atomic_set( & ref, 2) |
| 431 | 否则 |
| 432 | atomic_inc( & ref) |
| 435 | submit_bio(bio) |
| 436 | bio等于bio_alloc(GFP_KERNEL, nr_pages) |
| 439 | 如果非is_poll则blk_finish_plug( & plug) |
| 442 | 如果非is_sync则返回:负cb queued, will get completion event |
| 445 | 循环 |
| 446 | set_current_state(深度睡眠态) |
| 450 | 如果非ki_flags按位与IOCB_HIPRI的值或非blk_poll(bdev_get_queue(bdev), qc, true)则io_schedule() |
| 456 | 如果非ret则ret等于blk_status_to_errno(bi_status) |
| 458 | 如果此条件成立可能性大(为编译器优化)(!ret)则ret等于size |
| 462 | 返回:ret |
| 名称 | 描述 |
|---|---|
| blkdev_direct_IO |
| 源代码转换工具 开放的插件接口 | X |
|---|---|
| 支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |