diff options
| -rw-r--r-- | block/blk-lib.c | 19 | 
1 files changed, 7 insertions, 12 deletions
| diff --git a/block/blk-lib.c b/block/blk-lib.c index eec78becb355..bd3e8df4d5e2 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -109,7 +109,6 @@ struct bio_batch  	atomic_t 		done;  	unsigned long 		flags;  	struct completion 	*wait; -	bio_end_io_t		*end_io;  };  static void bio_batch_end_io(struct bio *bio, int err) @@ -122,12 +121,9 @@ static void bio_batch_end_io(struct bio *bio, int err)  		else  			clear_bit(BIO_UPTODATE, &bb->flags);  	} -	if (bb) { -		if (bb->end_io) -			bb->end_io(bio, err); -		atomic_inc(&bb->done); -		complete(bb->wait); -	} +	if (bb) +		if (atomic_dec_and_test(&bb->done)) +			complete(bb->wait);  	bio_put(bio);  } @@ -150,13 +146,12 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,  	int ret;  	struct bio *bio;  	struct bio_batch bb; -	unsigned int sz, issued = 0; +	unsigned int sz;  	DECLARE_COMPLETION_ONSTACK(wait); -	atomic_set(&bb.done, 0); +	atomic_set(&bb.done, 1);  	bb.flags = 1 << BIO_UPTODATE;  	bb.wait = &wait; -	bb.end_io = NULL;  submit:  	ret = 0; @@ -185,12 +180,12 @@ submit:  				break;  		}  		ret = 0; -		issued++; +		atomic_inc(&bb.done);  		submit_bio(WRITE, bio);  	}  	/* Wait for bios in-flight */ -	while (issued != atomic_read(&bb.done)) +	if (!atomic_dec_and_test(&bb.done))  		wait_for_completion(&wait);  	if (!test_bit(BIO_UPTODATE, &bb.flags)) | 
