|
@@ -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
|