Function report | 
Source Code:fs\iomap\direct-io.c | 
Create Date:2022-07-28 20:32:09 | 
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick | 
| home page | Tree | 
| Annotation kernel can get tool activity | Download SCCT | Chinese | 
Name:map_dio_rw() always completes O_[D]SYNC writes regardless of whether the IO* is being issued as AIO or not. This allows us to optimise pure data writes* to use REQ_FUA rather than requiring generic_write_sync() to issue a* REQ_FLUSH post write
Proto:ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, const struct iomap_ops *ops, const struct iomap_dio_ops *dops, bool wait_for_completion)
Type:ssize_t
Parameter:
| Type | Parameter | Name | 
|---|---|---|
| struct kiocb * | iocb | |
| struct iov_iter * | iter | |
| const struct iomap_ops * | ops | |
| const struct iomap_dio_ops * | dops | |
| bool | wait_for_completion | 
| 406 | inode = file_inode(ki_filp) | 
| 407 | count = iov_iter_count(iter) | 
| 409 | end = The 'ki_filp' pointer is shared in a union for aio + count - 1 , ret = 0 | 
| 410 | flags = direct I/O | 
| 414 | lockdep_assert_held( & i_rwsem) | 
| 416 | If Not count Then Return 0 | 
| 419 | If WARN_ON(is_sync_kiocb(iocb) && !wait_for_completion) Then Return -EIO | 
| 422 | dio = Allocation memory | 
| 427 | atomic_set( & ref, 1) | 
| 428 | size = 0 | 
| 431 | error = 0 | 
| 432 | flags = 0 | 
| 435 | waiter = current process | 
| 436 | cookie = BLK_QC_T_NONE | 
| 437 | last_queue = NULL | 
| 439 | If iov_iter_rw(iter) == generic data direction definitions Then | 
| 440 | If pos >= i_size Then Go to out_free_dio | 
| 443 | If iter_is_iovec(iter) Then flags |= IOMAP_DIO_DIRTY | 
| 445 | Else | 
| 447 | flags |= IOMAP_DIO_WRITE | 
| 450 | If ki_flags & IOCB_DSYNC Then flags |= IOMAP_DIO_NEED_SYNC | 
| 459 | If (ki_flags & (IOCB_DSYNC | IOCB_SYNC)) == IOCB_DSYNC Then flags |= Private flags for iomap_dio, must not overlap with the public ones in* iomap.h: | 
| 463 | If ki_flags & IOCB_NOWAIT Then | 
| 466 | Go to out_free_dio | 
| 468 | flags |= do not block | 
| 472 | If ret Then Go to out_free_dio | 
| 485 | ret = 0 | 
| 487 | If iov_iter_rw(iter) == WRITE && Not wait_for_completion && Not s_dio_done_wq Then | 
| 490 | If ret < 0 Then Go to out_free_dio | 
| 496 | blk_start_plug( & plug) | 
| 497 | Do | 
| 498 | ret = Execute a iomap write on a segment of the mapping that spans a* contiguous range of pages that have identical block mapping state | 
| 500 | If ret <= 0 Then | 
| 510 | If iov_iter_rw(iter) == generic data direction definitions && pos >= i_size Then | 
| 516 | iov_iter_revert(iter, pos - i_size) | 
| 517 | Break | 
| 519 | When (count = iov_iter_count(iter)) > 0 cycle | 
| 520 | blk_finish_plug( & plug) | 
| 522 | If ret < 0 Then Set an error in the dio if none is set yet. We have to use cmpxchg* as the submission context and the completion context(s) can race to* update the error. | 
| 529 | If flags & Private flags for iomap_dio, must not overlap with the public ones in* iomap.h: Then flags &= ~IOMAP_DIO_NEED_SYNC | 
| 532 | WRITE_ONCE( for ->iopoll , cookie) | 
| 533 | WRITE_ONCE(private, last_queue) | 
| 551 | If Not atomic_dec_and_test( & ref) Then | 
| 552 | If Not wait_for_completion Then Return -cb queued, will get completion event | 
| 555 | cycle | 
| 560 | If Not (ki_flags & IOCB_HIPRI) || Not last_queue || Not blk_poll(last_queue, cookie, true) Then io_schedule() | 
| 569 | Return iomap_dio_complete(dio) | 
| 571 | out_free_dio : | 
| 573 | Return ret | 
| 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  |