dm: cope with access beyond end of device in dm_merge_bvec
authorMikulas Patocka <mpatocka@redhat.com>
Wed, 1 Oct 2008 13:39:24 +0000 (14:39 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Wed, 1 Oct 2008 13:39:24 +0000 (14:39 +0100)
If for any reason dm_merge_bvec() is given an offset beyond the end of the
device, avoid an oops and always allow one page to be added to an empty bio.
We'll reject the I/O later after the bio is submitted.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm.c

index 469cec54f371eb0a1f9b23cbbb98b3313ded60c1..ace998ce59f6af2616da4a24eca66de8b59c69ba 100644 (file)
@@ -843,6 +843,8 @@ static int dm_merge_bvec(struct request_queue *q,
                goto out;
 
        ti = dm_table_find_target(map, bvm->bi_sector);
+       if (!dm_target_is_valid(ti))
+               goto out_table;
 
        /*
         * Find maximum amount of I/O that won't need splitting
@@ -861,6 +863,7 @@ static int dm_merge_bvec(struct request_queue *q,
        if (max_size && ti->type->merge)
                max_size = ti->type->merge(ti, bvm, biovec, max_size);
 
+out_table:
        dm_table_put(map);
 
 out: