| @@ -3630,15 +3630,83 @@ void end_that_request_last(struct request *req, int uptodate) · 3629 unmodified lines |
| 3630 | | 3630 | |
| 3631 | EXPORT_SYMBOL(end_that_request_last); | 3631 | EXPORT_SYMBOL(end_that_request_last); |
| 3632 | | 3632 | |
| 3633 | void end_request(struct request *req, int uptodate) | 3633 | static inline void __end_request(struct request *rq, int uptodate, |
| | 3634 | unsigned int nr_bytes, int dequeue) |
| 3634 | { | 3635 | { |
| 3635 | if (!end_that_request_first(req, uptodate, req->hard_cur_sectors)) { | 3636 | if (!end_that_request_chunk(rq, uptodate, nr_bytes)) { |
| 3636 | add_disk_randomness(req->rq_disk); | 3637 | if (dequeue) |
| 3637 | blkdev_dequeue_request(req); | 3638 | blkdev_dequeue_request(rq); |
| 3638 | end_that_request_last(req, uptodate); | 3639 | add_disk_randomness(rq->rq_disk); |
| | 3640 | end_that_request_last(rq, uptodate); |
| 3639 | } | 3641 | } |
| 3640 | } | 3642 | } |
| 3641 | | 3643 | |
| | 3644 | static unsigned int rq_byte_size(struct request *rq) |
| | 3645 | { |
| | 3646 | if (blk_fs_request(rq)) |
| | 3647 | return rq->hard_nr_sectors << 9; |
| | 3648 | |
| | 3649 | return rq->data_len; |
| | 3650 | } |
| | 3651 | |
| | 3652 | /** |
| | 3653 | * end_queued_request - end all I/O on a queued request |
| | 3654 | * @rq: the request being processed |
| | 3655 | * @uptodate: error value or 0/1 uptodate flag |
| | 3656 | * |
| | 3657 | * Description: |
| | 3658 | * Ends all I/O on a request, and removes it from the block layer queues. |
| | 3659 | * Not suitable for normal IO completion, unless the driver still has |
| | 3660 | * the request attached to the block layer. |
| | 3661 | * |
| | 3662 | **/ |
| | 3663 | void end_queued_request(struct request *rq, int uptodate) |
| | 3664 | { |
| | 3665 | __end_request(rq, uptodate, rq_byte_size(rq), 1); |
| | 3666 | } |
| | 3667 | EXPORT_SYMBOL(end_queued_request); |
| | 3668 | |
| | 3669 | /** |
| | 3670 | * end_dequeued_request - end all I/O on a dequeued request |
| | 3671 | * @rq: the request being processed |
| | 3672 | * @uptodate: error value or 0/1 uptodate flag |
| | 3673 | * |
| | 3674 | * Description: |
| | 3675 | * Ends all I/O on a request. The request must already have been |
| | 3676 | * dequeued using blkdev_dequeue_request(), as is normally the case |
| | 3677 | * for most drivers. |
| | 3678 | * |
| | 3679 | **/ |
| | 3680 | void end_dequeued_request(struct request *rq, int uptodate) |
| | 3681 | { |
| | 3682 | __end_request(rq, uptodate, rq_byte_size(rq), 0); |
| | 3683 | } |
| | 3684 | EXPORT_SYMBOL(end_dequeued_request); |
| | 3685 | |
| | 3686 | |
| | 3687 | /** |
| | 3688 | * end_request - end I/O on the current segment of the request |
| | 3689 | * @rq: the request being processed |
| | 3690 | * @uptodate: error value or 0/1 uptodate flag |
| | 3691 | * |
| | 3692 | * Description: |
| | 3693 | * Ends I/O on the current segment of a request. If that is the only |
| | 3694 | * remaining segment, the request is also completed and freed. |
| | 3695 | * |
| | 3696 | * This is a remnant of how older block drivers handled IO completions. |
| | 3697 | * Modern drivers typically end IO on the full request in one go, unless |
| | 3698 | * they have a residual value to account for. For that case this function |
| | 3699 | * isn't really useful, unless the residual just happens to be the |
| | 3700 | * full current segment. In other words, don't use this function in new |
| | 3701 | * code. Either use end_request_completely(), or the |
| | 3702 | * end_that_request_chunk() (along with end_that_request_last()) for |
| | 3703 | * partial completions. |
| | 3704 | * |
| | 3705 | **/ |
| | 3706 | void end_request(struct request *req, int uptodate) |
| | 3707 | { |
| | 3708 | __end_request(req, uptodate, req->hard_cur_sectors << 9, 1); |
| | 3709 | } |
| 3642 | EXPORT_SYMBOL(end_request); | 3710 | EXPORT_SYMBOL(end_request); |
| 3643 | | 3711 | |
| 3644 | static void blk_rq_bio_prep(struct request_queue *q, struct request *rq, | 3712 | static void blk_rq_bio_prep(struct request_queue *q, struct request *rq, |