blob: e8b2e5c091b1f7c5112667e239dd6f919b458cf1 [file] [log] [blame]
Jens Axboe86db1e22008-01-29 14:53:40 +01001/*
2 * Functions related to barrier IO handling
3 */
4#include <linux/kernel.h>
5#include <linux/module.h>
6#include <linux/bio.h>
7#include <linux/blkdev.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +09008#include <linux/gfp.h>
Jens Axboe86db1e22008-01-29 14:53:40 +01009
10#include "blk.h"
11
Tejun Heo28e7d182010-09-03 11:56:16 +020012static struct request *queue_next_ordseq(struct request_queue *q);
13
Jens Axboe86db1e22008-01-29 14:53:40 +010014/*
15 * Cache flushing for ordered writes handling
16 */
Adrian Bunk6f6a0362008-04-29 09:49:06 +020017unsigned blk_ordered_cur_seq(struct request_queue *q)
Jens Axboe86db1e22008-01-29 14:53:40 +010018{
19 if (!q->ordseq)
20 return 0;
21 return 1 << ffz(q->ordseq);
22}
23
Tejun Heo28e7d182010-09-03 11:56:16 +020024static struct request *blk_ordered_complete_seq(struct request_queue *q,
25 unsigned seq, int error)
Jens Axboe86db1e22008-01-29 14:53:40 +010026{
Tejun Heo28e7d182010-09-03 11:56:16 +020027 struct request *next_rq = NULL;
Jens Axboe86db1e22008-01-29 14:53:40 +010028
29 if (error && !q->orderr)
30 q->orderr = error;
31
32 BUG_ON(q->ordseq & seq);
33 q->ordseq |= seq;
34
Tejun Heo28e7d182010-09-03 11:56:16 +020035 if (blk_ordered_cur_seq(q) != QUEUE_ORDSEQ_DONE) {
36 /* not complete yet, queue the next ordered sequence */
37 next_rq = queue_next_ordseq(q);
38 } else {
39 /* complete this barrier request */
40 __blk_end_request_all(q->orig_bar_rq, q->orderr);
41 q->orig_bar_rq = NULL;
42 q->ordseq = 0;
Jens Axboe86db1e22008-01-29 14:53:40 +010043
Tejun Heo28e7d182010-09-03 11:56:16 +020044 /* dispatch the next barrier if there's one */
45 if (!list_empty(&q->pending_barriers)) {
46 next_rq = list_entry_rq(q->pending_barriers.next);
47 list_move(&next_rq->queuelist, &q->queue_head);
48 }
49 }
50 return next_rq;
Jens Axboe86db1e22008-01-29 14:53:40 +010051}
52
53static void pre_flush_end_io(struct request *rq, int error)
54{
55 elv_completed_request(rq->q, rq);
56 blk_ordered_complete_seq(rq->q, QUEUE_ORDSEQ_PREFLUSH, error);
57}
58
59static void bar_end_io(struct request *rq, int error)
60{
61 elv_completed_request(rq->q, rq);
62 blk_ordered_complete_seq(rq->q, QUEUE_ORDSEQ_BAR, error);
63}
64
65static void post_flush_end_io(struct request *rq, int error)
66{
67 elv_completed_request(rq->q, rq);
68 blk_ordered_complete_seq(rq->q, QUEUE_ORDSEQ_POSTFLUSH, error);
69}
70
Tejun Heo28e7d182010-09-03 11:56:16 +020071static void queue_flush(struct request_queue *q, struct request *rq,
72 rq_end_io_fn *end_io)
Jens Axboe86db1e22008-01-29 14:53:40 +010073{
FUJITA Tomonori2a4aa302008-04-29 09:54:36 +020074 blk_rq_init(q, rq);
FUJITA Tomonori28e18d02010-07-09 09:38:24 +090075 rq->cmd_type = REQ_TYPE_FS;
Tejun Heo28e7d182010-09-03 11:56:16 +020076 rq->cmd_flags = REQ_FLUSH;
FUJITA Tomonori16f23192010-07-09 09:38:25 +090077 rq->rq_disk = q->orig_bar_rq->rq_disk;
Jens Axboe86db1e22008-01-29 14:53:40 +010078 rq->end_io = end_io;
Jens Axboe86db1e22008-01-29 14:53:40 +010079
80 elv_insert(q, rq, ELEVATOR_INSERT_FRONT);
81}
82
Tejun Heo28e7d182010-09-03 11:56:16 +020083static struct request *queue_next_ordseq(struct request_queue *q)
84{
85 struct request *rq = &q->bar_rq;
86
87 switch (blk_ordered_cur_seq(q)) {
88 case QUEUE_ORDSEQ_PREFLUSH:
89 queue_flush(q, rq, pre_flush_end_io);
90 break;
91
92 case QUEUE_ORDSEQ_BAR:
93 /* initialize proxy request and queue it */
94 blk_rq_init(q, rq);
95 init_request_from_bio(rq, q->orig_bar_rq->bio);
96 rq->cmd_flags &= ~REQ_HARDBARRIER;
97 if (q->ordered & QUEUE_ORDERED_DO_FUA)
98 rq->cmd_flags |= REQ_FUA;
99 rq->end_io = bar_end_io;
100
101 elv_insert(q, rq, ELEVATOR_INSERT_FRONT);
102 break;
103
104 case QUEUE_ORDSEQ_POSTFLUSH:
105 queue_flush(q, rq, post_flush_end_io);
106 break;
107
108 default:
109 BUG();
110 }
111 return rq;
112}
113
114struct request *blk_do_ordered(struct request_queue *q, struct request *rq)
Jens Axboe86db1e22008-01-29 14:53:40 +0100115{
Tejun Heo8f11b3e2008-11-28 13:32:05 +0900116 unsigned skip = 0;
117
Tejun Heo28e7d182010-09-03 11:56:16 +0200118 if (!(rq->cmd_flags & REQ_HARDBARRIER))
119 return rq;
120
121 if (q->ordseq) {
122 /*
123 * Barrier is already in progress and they can't be
124 * processed in parallel. Queue for later processing.
125 */
126 list_move_tail(&rq->queuelist, &q->pending_barriers);
127 return NULL;
128 }
129
130 if (unlikely(q->next_ordered == QUEUE_ORDERED_NONE)) {
131 /*
132 * Queue ordering not supported. Terminate
133 * with prejudice.
134 */
135 blk_dequeue_request(rq);
136 __blk_end_request_all(rq, -EOPNOTSUPP);
137 return NULL;
138 }
139
140 /*
141 * Start a new ordered sequence
142 */
Jens Axboe86db1e22008-01-29 14:53:40 +0100143 q->orderr = 0;
144 q->ordered = q->next_ordered;
145 q->ordseq |= QUEUE_ORDSEQ_STARTED;
146
Tejun Heo58eea922008-11-28 13:32:06 +0900147 /*
148 * For an empty barrier, there's no actual BAR request, which
149 * in turn makes POSTFLUSH unnecessary. Mask them off.
150 */
Tejun Heo6958f142010-09-03 11:56:16 +0200151 if (!blk_rq_sectors(rq))
Tejun Heo58eea922008-11-28 13:32:06 +0900152 q->ordered &= ~(QUEUE_ORDERED_DO_BAR |
153 QUEUE_ORDERED_DO_POSTFLUSH);
154
Tejun Heof6716202008-11-28 13:32:04 +0900155 /* stash away the original request */
Tejun Heo9934c8c2009-05-08 11:54:16 +0900156 blk_dequeue_request(rq);
Jens Axboe86db1e22008-01-29 14:53:40 +0100157 q->orig_bar_rq = rq;
Jens Axboe86db1e22008-01-29 14:53:40 +0100158
Tejun Heo28e7d182010-09-03 11:56:16 +0200159 if (!(q->ordered & QUEUE_ORDERED_DO_PREFLUSH))
Tejun Heo8f11b3e2008-11-28 13:32:05 +0900160 skip |= QUEUE_ORDSEQ_PREFLUSH;
Jens Axboe86db1e22008-01-29 14:53:40 +0100161
Tejun Heo28e7d182010-09-03 11:56:16 +0200162 if (!(q->ordered & QUEUE_ORDERED_DO_BAR))
163 skip |= QUEUE_ORDSEQ_BAR;
Jens Axboe86db1e22008-01-29 14:53:40 +0100164
Tejun Heo28e7d182010-09-03 11:56:16 +0200165 if (!(q->ordered & QUEUE_ORDERED_DO_POSTFLUSH))
166 skip |= QUEUE_ORDSEQ_POSTFLUSH;
Jens Axboe86db1e22008-01-29 14:53:40 +0100167
Tejun Heo28e7d182010-09-03 11:56:16 +0200168 /* complete skipped sequences and return the first sequence */
169 return blk_ordered_complete_seq(q, skip, 0);
Jens Axboe86db1e22008-01-29 14:53:40 +0100170}
171
172static void bio_end_empty_barrier(struct bio *bio, int err)
173{
Jens Axboecc66b452008-03-04 11:47:46 +0100174 if (err) {
175 if (err == -EOPNOTSUPP)
176 set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
Jens Axboe86db1e22008-01-29 14:53:40 +0100177 clear_bit(BIO_UPTODATE, &bio->bi_flags);
Jens Axboecc66b452008-03-04 11:47:46 +0100178 }
Dmitry Monakhovf17e2322010-04-28 17:55:07 +0400179 if (bio->bi_private)
180 complete(bio->bi_private);
181 bio_put(bio);
Jens Axboe86db1e22008-01-29 14:53:40 +0100182}
183
184/**
185 * blkdev_issue_flush - queue a flush
186 * @bdev: blockdev to issue flush for
Dmitry Monakhovfbd9b092010-04-28 17:55:06 +0400187 * @gfp_mask: memory allocation flags (for bio_alloc)
Jens Axboe86db1e22008-01-29 14:53:40 +0100188 * @error_sector: error sector
Dmitry Monakhovfbd9b092010-04-28 17:55:06 +0400189 * @flags: BLKDEV_IFL_* flags to control behaviour
Jens Axboe86db1e22008-01-29 14:53:40 +0100190 *
191 * Description:
192 * Issue a flush for the block device in question. Caller can supply
193 * room for storing the error offset in case of a flush error, if they
Dmitry Monakhovf17e2322010-04-28 17:55:07 +0400194 * wish to. If WAIT flag is not passed then caller may check only what
195 * request was pushed in some internal queue for later handling.
Jens Axboe86db1e22008-01-29 14:53:40 +0100196 */
Dmitry Monakhovfbd9b092010-04-28 17:55:06 +0400197int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
198 sector_t *error_sector, unsigned long flags)
Jens Axboe86db1e22008-01-29 14:53:40 +0100199{
200 DECLARE_COMPLETION_ONSTACK(wait);
201 struct request_queue *q;
202 struct bio *bio;
Dmitry Monakhovfbd9b092010-04-28 17:55:06 +0400203 int ret = 0;
Jens Axboe86db1e22008-01-29 14:53:40 +0100204
205 if (bdev->bd_disk == NULL)
206 return -ENXIO;
207
208 q = bdev_get_queue(bdev);
209 if (!q)
210 return -ENXIO;
211
Dave Chinnerf10d9f62010-07-13 17:50:50 +1000212 /*
213 * some block devices may not have their queue correctly set up here
214 * (e.g. loop device without a backing file) and so issuing a flush
215 * here will panic. Ensure there is a request function before issuing
216 * the barrier.
217 */
218 if (!q->make_request_fn)
219 return -ENXIO;
220
Dmitry Monakhovfbd9b092010-04-28 17:55:06 +0400221 bio = bio_alloc(gfp_mask, 0);
Jens Axboe86db1e22008-01-29 14:53:40 +0100222 bio->bi_end_io = bio_end_empty_barrier;
Jens Axboe86db1e22008-01-29 14:53:40 +0100223 bio->bi_bdev = bdev;
Dmitry Monakhovf17e2322010-04-28 17:55:07 +0400224 if (test_bit(BLKDEV_WAIT, &flags))
225 bio->bi_private = &wait;
226
227 bio_get(bio);
OGAWA Hirofumi2ebca852008-08-11 17:07:08 +0100228 submit_bio(WRITE_BARRIER, bio);
Dmitry Monakhovf17e2322010-04-28 17:55:07 +0400229 if (test_bit(BLKDEV_WAIT, &flags)) {
230 wait_for_completion(&wait);
231 /*
232 * The driver must store the error location in ->bi_sector, if
233 * it supports it. For non-stacked drivers, this should be
234 * copied from blk_rq_pos(rq).
235 */
236 if (error_sector)
237 *error_sector = bio->bi_sector;
238 }
Jens Axboe86db1e22008-01-29 14:53:40 +0100239
Jens Axboecc66b452008-03-04 11:47:46 +0100240 if (bio_flagged(bio, BIO_EOPNOTSUPP))
241 ret = -EOPNOTSUPP;
242 else if (!bio_flagged(bio, BIO_UPTODATE))
Jens Axboe86db1e22008-01-29 14:53:40 +0100243 ret = -EIO;
244
245 bio_put(bio);
246 return ret;
247}
Jens Axboe86db1e22008-01-29 14:53:40 +0100248EXPORT_SYMBOL(blkdev_issue_flush);