| From stable-bounces@linux.kernel.org Thu Jul 12 09:28:00 2007 |
| From: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com> |
| Date: Thu, 12 Jul 2007 17:27:45 +0100 |
| Subject: dm io: fix another panic on large request |
| To: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com>, stable@kernel.org |
| Message-ID: <20070712162745.GP24114@agk.fab.redhat.com> |
| Content-Disposition: inline |
| |
| |
| From: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com> |
| |
| bio_alloc_bioset() will return NULL if 'num_vecs' is too large. |
| Use bio_get_nr_vecs() to get estimation of maximum number. |
| |
| Signed-off-by: Junichi Nomura <j-nomura@ce.jp.nec.com> |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/dm-io.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/md/dm-io.c |
| +++ b/drivers/md/dm-io.c |
| @@ -293,7 +293,10 @@ static void do_region(int rw, unsigned i |
| * bvec for bio_get/set_region() and decrement bi_max_vecs |
| * to hide it from bio_add_page(). |
| */ |
| - num_bvecs = (remaining / (PAGE_SIZE >> SECTOR_SHIFT)) + 2; |
| + num_bvecs = dm_sector_div_up(remaining, |
| + (PAGE_SIZE >> SECTOR_SHIFT)); |
| + num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev), |
| + num_bvecs); |
| bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); |
| bio->bi_sector = where->sector + (where->count - remaining); |
| bio->bi_bdev = where->bdev; |