2 * Functions to sequence FLUSH and FUA writes.
4 #include <linux/kernel.h>
5 #include <linux/module.h>
7 #include <linux/blkdev.h>
12 /* FLUSH/FUA sequences */
14 QUEUE_FSEQ_STARTED
= (1 << 0), /* flushing in progress */
15 QUEUE_FSEQ_PREFLUSH
= (1 << 1), /* pre-flushing in progress */
16 QUEUE_FSEQ_DATA
= (1 << 2), /* data write in progress */
17 QUEUE_FSEQ_POSTFLUSH
= (1 << 3), /* post-flushing in progress */
18 QUEUE_FSEQ_DONE
= (1 << 4),
21 static struct request
*queue_next_fseq(struct request_queue
*q
);
23 unsigned blk_flush_cur_seq(struct request_queue
*q
)
27 return 1 << ffz(q
->flush_seq
);
30 static struct request
*blk_flush_complete_seq(struct request_queue
*q
,
31 unsigned seq
, int error
)
33 struct request
*next_rq
= NULL
;
35 if (error
&& !q
->flush_err
)
38 BUG_ON(q
->flush_seq
& seq
);
41 if (blk_flush_cur_seq(q
) != QUEUE_FSEQ_DONE
) {
42 /* not complete yet, queue the next flush sequence */
43 next_rq
= queue_next_fseq(q
);
45 /* complete this flush request */
46 __blk_end_request_all(q
->orig_flush_rq
, q
->flush_err
);
47 q
->orig_flush_rq
= NULL
;
50 /* dispatch the next flush if there's one */
51 if (!list_empty(&q
->pending_flushes
)) {
52 next_rq
= list_entry_rq(q
->pending_flushes
.next
);
53 list_move(&next_rq
->queuelist
, &q
->queue_head
);
59 static void blk_flush_complete_seq_end_io(struct request_queue
*q
,
60 unsigned seq
, int error
)
62 bool was_empty
= elv_queue_empty(q
);
63 struct request
*next_rq
;
65 next_rq
= blk_flush_complete_seq(q
, seq
, error
);
68 * Moving a request silently to empty queue_head may stall the
69 * queue. Kick the queue in those cases.
71 if (was_empty
&& next_rq
)
75 static void pre_flush_end_io(struct request
*rq
, int error
)
77 elv_completed_request(rq
->q
, rq
);
78 blk_flush_complete_seq_end_io(rq
->q
, QUEUE_FSEQ_PREFLUSH
, error
);
81 static void flush_data_end_io(struct request
*rq
, int error
)
83 elv_completed_request(rq
->q
, rq
);
84 blk_flush_complete_seq_end_io(rq
->q
, QUEUE_FSEQ_DATA
, error
);
87 static void post_flush_end_io(struct request
*rq
, int error
)
89 elv_completed_request(rq
->q
, rq
);
90 blk_flush_complete_seq_end_io(rq
->q
, QUEUE_FSEQ_POSTFLUSH
, error
);
93 static void init_flush_request(struct request
*rq
, struct gendisk
*disk
)
95 rq
->cmd_type
= REQ_TYPE_FS
;
96 rq
->cmd_flags
= WRITE_FLUSH
;
100 static struct request
*queue_next_fseq(struct request_queue
*q
)
102 struct request
*orig_rq
= q
->orig_flush_rq
;
103 struct request
*rq
= &q
->flush_rq
;
107 switch (blk_flush_cur_seq(q
)) {
108 case QUEUE_FSEQ_PREFLUSH
:
109 init_flush_request(rq
, orig_rq
->rq_disk
);
110 rq
->end_io
= pre_flush_end_io
;
112 case QUEUE_FSEQ_DATA
:
113 init_request_from_bio(rq
, orig_rq
->bio
);
115 * orig_rq->rq_disk may be different from
116 * bio->bi_bdev->bd_disk if orig_rq got here through
117 * remapping drivers. Make sure rq->rq_disk points
118 * to the same one as orig_rq.
120 rq
->rq_disk
= orig_rq
->rq_disk
;
121 rq
->cmd_flags
&= ~(REQ_FLUSH
| REQ_FUA
);
122 rq
->cmd_flags
|= orig_rq
->cmd_flags
& (REQ_FLUSH
| REQ_FUA
);
123 rq
->end_io
= flush_data_end_io
;
125 case QUEUE_FSEQ_POSTFLUSH
:
126 init_flush_request(rq
, orig_rq
->rq_disk
);
127 rq
->end_io
= post_flush_end_io
;
133 elv_insert(q
, rq
, ELEVATOR_INSERT_FRONT
);
137 struct request
*blk_do_flush(struct request_queue
*q
, struct request
*rq
)
139 unsigned int fflags
= q
->flush_flags
; /* may change, cache it */
140 bool has_flush
= fflags
& REQ_FLUSH
, has_fua
= fflags
& REQ_FUA
;
141 bool do_preflush
= has_flush
&& (rq
->cmd_flags
& REQ_FLUSH
);
142 bool do_postflush
= has_flush
&& !has_fua
&& (rq
->cmd_flags
& REQ_FUA
);
146 * Special case. If there's data but flush is not necessary,
147 * the request can be issued directly.
149 * Flush w/o data should be able to be issued directly too but
150 * currently some drivers assume that rq->bio contains
151 * non-zero data if it isn't NULL and empty FLUSH requests
152 * getting here usually have bio's without data.
154 if (blk_rq_sectors(rq
) && !do_preflush
&& !do_postflush
) {
155 rq
->cmd_flags
&= ~REQ_FLUSH
;
157 rq
->cmd_flags
&= ~REQ_FUA
;
162 * Sequenced flushes can't be processed in parallel. If
163 * another one is already in progress, queue for later
167 list_move_tail(&rq
->queuelist
, &q
->pending_flushes
);
172 * Start a new flush sequence
175 q
->flush_seq
|= QUEUE_FSEQ_STARTED
;
177 /* adjust FLUSH/FUA of the original request and stash it away */
178 rq
->cmd_flags
&= ~REQ_FLUSH
;
180 rq
->cmd_flags
&= ~REQ_FUA
;
181 blk_dequeue_request(rq
);
182 q
->orig_flush_rq
= rq
;
184 /* skip unneded sequences and return the first one */
186 skip
|= QUEUE_FSEQ_PREFLUSH
;
187 if (!blk_rq_sectors(rq
))
188 skip
|= QUEUE_FSEQ_DATA
;
190 skip
|= QUEUE_FSEQ_POSTFLUSH
;
191 return blk_flush_complete_seq(q
, skip
, 0);
194 static void bio_end_flush(struct bio
*bio
, int err
)
197 clear_bit(BIO_UPTODATE
, &bio
->bi_flags
);
199 complete(bio
->bi_private
);
204 * blkdev_issue_flush - queue a flush
205 * @bdev: blockdev to issue flush for
206 * @gfp_mask: memory allocation flags (for bio_alloc)
207 * @error_sector: error sector
210 * Issue a flush for the block device in question. Caller can supply
211 * room for storing the error offset in case of a flush error, if they
212 * wish to. If WAIT flag is not passed then caller may check only what
213 * request was pushed in some internal queue for later handling.
215 int blkdev_issue_flush(struct block_device
*bdev
, gfp_t gfp_mask
,
216 sector_t
*error_sector
)
218 DECLARE_COMPLETION_ONSTACK(wait
);
219 struct request_queue
*q
;
223 if (bdev
->bd_disk
== NULL
)
226 q
= bdev_get_queue(bdev
);
231 * some block devices may not have their queue correctly set up here
232 * (e.g. loop device without a backing file) and so issuing a flush
233 * here will panic. Ensure there is a request function before issuing
236 if (!q
->make_request_fn
)
239 bio
= bio_alloc(gfp_mask
, 0);
240 bio
->bi_end_io
= bio_end_flush
;
242 bio
->bi_private
= &wait
;
245 submit_bio(WRITE_FLUSH
, bio
);
246 wait_for_completion(&wait
);
249 * The driver must store the error location in ->bi_sector, if
250 * it supports it. For non-stacked drivers, this should be
251 * copied from blk_rq_pos(rq).
254 *error_sector
= bio
->bi_sector
;
256 if (!bio_flagged(bio
, BIO_UPTODATE
))
262 EXPORT_SYMBOL(blkdev_issue_flush
);