forked from mirrors/linux
		
	block: Add submit_bio_wait(), remove from md
Random cleanup - this code was duplicated and it's not really specific to md. Also added the ability to return the actual error code. Signed-off-by: Kent Overstreet <koverstreet@google.com> CC: Jens Axboe <axboe@kernel.dk> CC: NeilBrown <neilb@suse.de> Acked-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
		
							parent
							
								
									2f477877f8
								
							
						
					
					
						commit
						9e882242c6
					
				
					 4 changed files with 37 additions and 38 deletions
				
			
		|  | @ -2059,25 +2059,6 @@ static void fix_read_error(struct r1conf *conf, int read_disk, | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void bi_complete(struct bio *bio, int error) | ||||
| { | ||||
| 	complete((struct completion *)bio->bi_private); | ||||
| } | ||||
| 
 | ||||
| static int submit_bio_wait(int rw, struct bio *bio) | ||||
| { | ||||
| 	struct completion event; | ||||
| 	rw |= REQ_SYNC; | ||||
| 
 | ||||
| 	init_completion(&event); | ||||
| 	bio->bi_private = &event; | ||||
| 	bio->bi_end_io = bi_complete; | ||||
| 	submit_bio(rw, bio); | ||||
| 	wait_for_completion(&event); | ||||
| 
 | ||||
| 	return test_bit(BIO_UPTODATE, &bio->bi_flags); | ||||
| } | ||||
| 
 | ||||
| static int narrow_write_error(struct r1bio *r1_bio, int i) | ||||
| { | ||||
| 	struct mddev *mddev = r1_bio->mddev; | ||||
|  |  | |||
|  | @ -2529,25 +2529,6 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void bi_complete(struct bio *bio, int error) | ||||
| { | ||||
| 	complete((struct completion *)bio->bi_private); | ||||
| } | ||||
| 
 | ||||
| static int submit_bio_wait(int rw, struct bio *bio) | ||||
| { | ||||
| 	struct completion event; | ||||
| 	rw |= REQ_SYNC; | ||||
| 
 | ||||
| 	init_completion(&event); | ||||
| 	bio->bi_private = &event; | ||||
| 	bio->bi_end_io = bi_complete; | ||||
| 	submit_bio(rw, bio); | ||||
| 	wait_for_completion(&event); | ||||
| 
 | ||||
| 	return test_bit(BIO_UPTODATE, &bio->bi_flags); | ||||
| } | ||||
| 
 | ||||
| static int narrow_write_error(struct r10bio *r10_bio, int i) | ||||
| { | ||||
| 	struct bio *bio = r10_bio->master_bio; | ||||
|  |  | |||
							
								
								
									
										36
									
								
								fs/bio.c
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								fs/bio.c
									
									
									
									
									
								
							|  | @ -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 | ||||
|  |  | |||
|  | @ -249,6 +249,7 @@ extern void bio_endio(struct bio *, int); | |||
| struct request_queue; | ||||
| extern int bio_phys_segments(struct request_queue *, struct bio *); | ||||
| 
 | ||||
| extern int submit_bio_wait(int rw, struct bio *bio); | ||||
| extern void bio_advance(struct bio *, unsigned); | ||||
| 
 | ||||
| extern void bio_init(struct bio *); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Kent Overstreet
						Kent Overstreet