diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/bio.c | 36 | 
1 files changed, 36 insertions, 0 deletions
@@ -752,6 +752,42 @@ int bio_add_page(struct bio *bio, struct page *page, unsigned int len,  }  EXPORT_SYMBOL(bio_add_page); +struct submit_bio_ret { +	struct completion event; +	int error; +}; + +static void submit_bio_wait_endio(struct bio *bio, int error) +{ +	struct submit_bio_ret *ret = bio->bi_private; + +	ret->error = error; +	complete(&ret->event); +} + +/** + * submit_bio_wait - submit a bio, and wait until it completes + * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) + * @bio: The &struct bio which describes the I/O + * + * Simple wrapper around submit_bio(). Returns 0 on success, or the error from + * bio_endio() on failure. + */ +int submit_bio_wait(int rw, struct bio *bio) +{ +	struct submit_bio_ret ret; + +	rw |= REQ_SYNC; +	init_completion(&ret.event); +	bio->bi_private = &ret; +	bio->bi_end_io = submit_bio_wait_endio; +	submit_bio(rw, bio); +	wait_for_completion(&ret.event); + +	return ret.error; +} +EXPORT_SYMBOL(submit_bio_wait); +  /**   * bio_advance - increment/complete a bio by some number of bytes   * @bio:	bio to advance  |