History

block: add end_queued_request() and end_dequeued_request() helpers

We can use this helper in the elevator core for BLKPREP_KILL, and it'll also be useful for the empty barrier patch.

Jens Axboe committed 19 years ago

Commit a0cd1281 parent 992c5dd3 files · +77 −14Browse files

Unified · Split

3 files
  1. block/elevator.c +1 −8
  2. block/ll_rw_blk.c +73 −5
  3. include/linux/blkdev.h +3 −1
block/elevator.c+1−8
@@ -751,15 +751,8 @@ struct request *elv_next_request(struct request_queue *q) · 750 unmodified lines
751751 rq = NULL;
752752 break;
753753 } else if (ret == BLKPREP_KILL) {
754− int nr_bytes = rq->hard_nr_sectors << 9;
755−
756− if (!nr_bytes)
757− nr_bytes = rq->data_len;
758−
759− blkdev_dequeue_request(rq);
760754 rq->cmd_flags |= REQ_QUIET;
761− end_that_request_chunk(rq, 0, nr_bytes);
762− end_that_request_last(rq, 0);
755+ end_queued_request(rq, 0);
763756 } else {
764757 printk(KERN_ERR "%s: bad return=%d\n", __FUNCTION__,
765758 ret);
block/ll_rw_blk.c+73−5
@@ -3630,15 +3630,83 @@ void end_that_request_last(struct request *req, int uptodate) · 3629 unmodified lines
36303630
36313631 EXPORT_SYMBOL(end_that_request_last);
36323632
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)
36343635 {
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);
36393641 }
36403642 }
36413643
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+}
36423710 EXPORT_SYMBOL(end_request);
36433711
36443712 static void blk_rq_bio_prep(struct request_queue *q, struct request *rq,
include/linux/blkdev.h+3−1
@@ -729,7 +729,9 @@ static inline void blk_run_address_space(struct address_space *mapping) · 728 unmodified lines
729729 extern int end_that_request_first(struct request *, int, int);
730730 extern int end_that_request_chunk(struct request *, int, int);
731731 extern void end_that_request_last(struct request *, int);
732−extern void end_request(struct request *req, int uptodate);
732+extern void end_request(struct request *, int);
733+extern void end_queued_request(struct request *, int);
734+extern void end_dequeued_request(struct request *, int);
733735 extern void blk_complete_request(struct request *);
734736
735737 /*

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t