diff options
-rw-r--r-- | drivers/md/raid1.c | 19 | ||||
-rw-r--r-- | drivers/md/raid10.c | 19 | ||||
-rw-r--r-- | fs/bio.c | 36 | ||||
-rw-r--r-- | include/linux/bio.h | 1 |
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 | ||
2062 | static void bi_complete(struct bio *bio, int error) | ||
2063 | { | ||
2064 | complete((struct completion *)bio->bi_private); | ||
2065 | } | ||
2066 | |||
2067 | static 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 | |||
2081 | static int narrow_write_error(struct r1bio *r1_bio, int i) | 2062 | static 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 | ||
2532 | static void bi_complete(struct bio *bio, int error) | ||
2533 | { | ||
2534 | complete((struct completion *)bio->bi_private); | ||
2535 | } | ||
2536 | |||
2537 | static 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 | |||
2551 | static int narrow_write_error(struct r10bio *r10_bio, int i) | 2532 | static 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; |
@@ -752,6 +752,42 @@ int bio_add_page(struct bio *bio, struct page *page, unsigned int len, | |||
752 | } | 752 | } |
753 | EXPORT_SYMBOL(bio_add_page); | 753 | EXPORT_SYMBOL(bio_add_page); |
754 | 754 | ||
755 | struct submit_bio_ret { | ||
756 | struct completion event; | ||
757 | int error; | ||
758 | }; | ||
759 | |||
760 | static 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 | */ | ||
776 | int 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 | } | ||
789 | EXPORT_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); | |||
249 | struct request_queue; | 249 | struct request_queue; |
250 | extern int bio_phys_segments(struct request_queue *, struct bio *); | 250 | extern int bio_phys_segments(struct request_queue *, struct bio *); |
251 | 251 | ||
252 | extern int submit_bio_wait(int rw, struct bio *bio); | ||
252 | extern void bio_advance(struct bio *, unsigned); | 253 | extern void bio_advance(struct bio *, unsigned); |
253 | 254 | ||
254 | extern void bio_init(struct bio *); | 255 | extern void bio_init(struct bio *); |