diff options
author | Tejun Heo <tj@kernel.org> | 2011-01-25 06:43:49 -0500 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-01-25 06:43:49 -0500 |
commit | 414b4ff5eecff0097d09c4a7da12e435fd503692 (patch) | |
tree | cc7cd46c1455712af672b3ff872800b3da895837 /block | |
parent | 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 (diff) |
block: add REQ_FLUSH_SEQ
rq == &q->flush_rq was used to determine whether a rq is part of a
flush sequence, which worked because all requests in a flush sequence
were sequenced using the single dedicated request. This is about to
change, so introduce REQ_FLUSH_SEQ flag to distinguish flush sequence
requests.
This patch doesn't cause any behavior change.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 4 | ||||
-rw-r--r-- | block/blk-flush.c | 1 | ||||
-rw-r--r-- | block/blk.h | 2 |
3 files changed, 4 insertions, 3 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 4ce953f1b390..fc7d8ad76f44 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -136,7 +136,7 @@ static void req_bio_endio(struct request *rq, struct bio *bio, | |||
136 | { | 136 | { |
137 | struct request_queue *q = rq->q; | 137 | struct request_queue *q = rq->q; |
138 | 138 | ||
139 | if (&q->flush_rq != rq) { | 139 | if (!(rq->cmd_flags & REQ_FLUSH_SEQ)) { |
140 | if (error) | 140 | if (error) |
141 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | 141 | clear_bit(BIO_UPTODATE, &bio->bi_flags); |
142 | else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | 142 | else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) |
@@ -1789,7 +1789,7 @@ static void blk_account_io_done(struct request *req) | |||
1789 | * normal IO on queueing nor completion. Accounting the | 1789 | * normal IO on queueing nor completion. Accounting the |
1790 | * containing request is enough. | 1790 | * containing request is enough. |
1791 | */ | 1791 | */ |
1792 | if (blk_do_io_stat(req) && req != &req->q->flush_rq) { | 1792 | if (blk_do_io_stat(req) && !(req->cmd_flags & REQ_FLUSH_SEQ)) { |
1793 | unsigned long duration = jiffies - req->start_time; | 1793 | unsigned long duration = jiffies - req->start_time; |
1794 | const int rw = rq_data_dir(req); | 1794 | const int rw = rq_data_dir(req); |
1795 | struct hd_struct *part; | 1795 | struct hd_struct *part; |
diff --git a/block/blk-flush.c b/block/blk-flush.c index 54b123d6563e..8592869bcbe7 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c | |||
@@ -130,6 +130,7 @@ static struct request *queue_next_fseq(struct request_queue *q) | |||
130 | BUG(); | 130 | BUG(); |
131 | } | 131 | } |
132 | 132 | ||
133 | rq->cmd_flags |= REQ_FLUSH_SEQ; | ||
133 | elv_insert(q, rq, ELEVATOR_INSERT_FRONT); | 134 | elv_insert(q, rq, ELEVATOR_INSERT_FRONT); |
134 | return rq; | 135 | return rq; |
135 | } | 136 | } |
diff --git a/block/blk.h b/block/blk.h index 2db8f32838e7..9d2ee8f4d9af 100644 --- a/block/blk.h +++ b/block/blk.h | |||
@@ -61,7 +61,7 @@ static inline struct request *__elv_next_request(struct request_queue *q) | |||
61 | while (!list_empty(&q->queue_head)) { | 61 | while (!list_empty(&q->queue_head)) { |
62 | rq = list_entry_rq(q->queue_head.next); | 62 | rq = list_entry_rq(q->queue_head.next); |
63 | if (!(rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) || | 63 | if (!(rq->cmd_flags & (REQ_FLUSH | REQ_FUA)) || |
64 | rq == &q->flush_rq) | 64 | (rq->cmd_flags & REQ_FLUSH_SEQ)) |
65 | return rq; | 65 | return rq; |
66 | rq = blk_do_flush(q, rq); | 66 | rq = blk_do_flush(q, rq); |
67 | if (rq) | 67 | if (rq) |