| @@ -3630,15 +3630,83 @@ void end_that_request_last(struct request *req, int uptodate) · 3629 unmodified lines |
| 3630 | 3630 | |
| 3631 | 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 | | − add_disk_randomness(req->rq_disk); |
| 3637 | | − blkdev_dequeue_request(req); |
| 3638 | | − end_that_request_last(req, uptodate); |
| 3636 | + if (!end_that_request_chunk(rq, uptodate, nr_bytes)) { |
| 3637 | + if (dequeue) |
| 3638 | + blkdev_dequeue_request(rq); |
| 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 | 3710 | EXPORT_SYMBOL(end_request); |
| 3643 | 3711 | |
| 3644 | 3712 | static void blk_rq_bio_prep(struct request_queue *q, struct request *rq, |