Commit 88835ba2 authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] Fix md using bio on stack with bio clones

If md resides on top of a driver using bio_clone() (such as dm), it will
oops the kernel due to md submitting a botched bio that has a veclist but
doesn't have bio->bi_max_vecs set.
Signed-off-by: default avatarJens Axboe <axboe@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6aba8f35
...@@ -332,29 +332,26 @@ static int bi_complete(struct bio *bio, unsigned int bytes_done, int error) ...@@ -332,29 +332,26 @@ static int bi_complete(struct bio *bio, unsigned int bytes_done, int error)
static int sync_page_io(struct block_device *bdev, sector_t sector, int size, static int sync_page_io(struct block_device *bdev, sector_t sector, int size,
struct page *page, int rw) struct page *page, int rw)
{ {
struct bio bio; struct bio *bio = bio_alloc(GFP_KERNEL, 1);
struct bio_vec vec;
struct completion event; struct completion event;
int ret;
bio_get(bio);
rw |= (1 << BIO_RW_SYNC); rw |= (1 << BIO_RW_SYNC);
bio_init(&bio); bio->bi_bdev = bdev;
bio.bi_io_vec = &vec; bio->bi_sector = sector;
vec.bv_page = page; bio_add_page(bio, page, size, 0);
vec.bv_len = size;
vec.bv_offset = 0;
bio.bi_vcnt = 1;
bio.bi_idx = 0;
bio.bi_size = size;
bio.bi_bdev = bdev;
bio.bi_sector = sector;
init_completion(&event); init_completion(&event);
bio.bi_private = &event; bio->bi_private = &event;
bio.bi_end_io = bi_complete; bio->bi_end_io = bi_complete;
submit_bio(rw, &bio); submit_bio(rw, bio);
wait_for_completion(&event); wait_for_completion(&event);
return test_bit(BIO_UPTODATE, &bio.bi_flags); ret = test_bit(BIO_UPTODATE, &bio->bi_flags);
bio_put(bio);
return ret;
} }
static int read_disk_sb(mdk_rdev_t * rdev) static int read_disk_sb(mdk_rdev_t * rdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment