aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/raid1.c19
-rw-r--r--drivers/md/raid10.c19
-rw-r--r--fs/bio.c36
-rw-r--r--include/linux/bio.h1
4 files changed, 37 insertions, 38 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index f741c9fe25c8..800748d585ca 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -2059,25 +2059,6 @@ static void fix_read_error(struct r1conf *conf, int read_disk,
2059 } 2059 }
2060} 2060}
2061 2061
2062static void bi_complete(struct bio *bio, int error)
2063{
2064 complete((struct completion *)bio->bi_private);
2065}
2066
2067static int submit_bio_wait(int rw, struct bio *bio)
2068{
2069 struct completion event;
2070 rw |= REQ_SYNC;
2071
2072 init_completion(&event);
2073 bio->bi_private = &event;
2074 bio->bi_end_io = bi_complete;
2075 submit_bio(rw, bio);
2076 wait_for_completion(&event);
2077
2078 return test_bit(BIO_UPTODATE, &bio->bi_flags);
2079}
2080
2081static int narrow_write_error(struct r1bio *r1_bio, int i) 2062static int narrow_write_error(struct r1bio *r1_bio, int i)
2082{ 2063{
2083 struct mddev *mddev = r1_bio->mddev; 2064 struct mddev *mddev = r1_bio->mddev;
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 6ffb6c08aec5..434586d43115 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -2529,25 +2529,6 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10
2529 } 2529 }
2530} 2530}
2531 2531
2532static void bi_complete(struct bio *bio, int error)
2533{
2534 complete((struct completion *)bio->bi_private);
2535}
2536
2537static int submit_bio_wait(int rw, struct bio *bio)
2538{
2539 struct completion event;
2540 rw |= REQ_SYNC;
2541
2542 init_completion(&event);
2543 bio->bi_private = &event;
2544 bio->bi_end_io = bi_complete;
2545 submit_bio(rw, bio);
2546 wait_for_completion(&event);
2547
2548 return test_bit(BIO_UPTODATE, &bio->bi_flags);
2549}
2550
2551static int narrow_write_error(struct r10bio *r10_bio, int i) 2532static int narrow_write_error(struct r10bio *r10_bio, int i)
2552{ 2533{
2553 struct bio *bio = r10_bio->master_bio; 2534 struct bio *bio = r10_bio->master_bio;
diff --git a/fs/bio.c b/fs/bio.c
index f1b4c1651089..4ce24ee5dcd0 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -752,6 +752,42 @@ int bio_add_page(struct bio *bio, struct page *page, unsigned int len,
752} 752}
753EXPORT_SYMBOL(bio_add_page); 753EXPORT_SYMBOL(bio_add_page);
754 754
755struct submit_bio_ret {
756 struct completion event;
757 int error;
758};
759
760static void submit_bio_wait_endio(struct bio *bio, int error)
761{
762 struct submit_bio_ret *ret = bio->bi_private;
763
764 ret->error = error;
765 complete(&ret->event);
766}
767
768/**
769 * submit_bio_wait - submit a bio, and wait until it completes
770 * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead)
771 * @bio: The &struct bio which describes the I/O
772 *
773 * Simple wrapper around submit_bio(). Returns 0 on success, or the error from
774 * bio_endio() on failure.
775 */
776int submit_bio_wait(int rw, struct bio *bio)
777{
778 struct submit_bio_ret ret;
779
780 rw |= REQ_SYNC;
781 init_completion(&ret.event);
782 bio->bi_private = &ret;
783 bio->bi_end_io = submit_bio_wait_endio;
784 submit_bio(rw, bio);
785 wait_for_completion(&ret.event);
786
787 return ret.error;
788}
789EXPORT_SYMBOL(submit_bio_wait);
790
755/** 791/**
756 * bio_advance - increment/complete a bio by some number of bytes 792 * bio_advance - increment/complete a bio by some number of bytes
757 * @bio: bio to advance 793 * @bio: bio to advance
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 20507eb7c979..b20a9cd776dd 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -249,6 +249,7 @@ extern void bio_endio(struct bio *, int);
249struct request_queue; 249struct request_queue;
250extern int bio_phys_segments(struct request_queue *, struct bio *); 250extern int bio_phys_segments(struct request_queue *, struct bio *);
251 251
252extern int submit_bio_wait(int rw, struct bio *bio);
252extern void bio_advance(struct bio *, unsigned); 253extern void bio_advance(struct bio *, unsigned);
253 254
254extern void bio_init(struct bio *); 255extern void bio_init(struct bio *);