diff options
author | Mikulas Patocka <mpatocka@redhat.com> | 2008-10-01 09:39:24 -0400 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2008-10-01 09:39:24 -0400 |
commit | b01cd5ac43b00c49759c126c21e7d22c7e80b245 (patch) | |
tree | ccfda9067457032999a5d2d6ed5203caa2422937 /drivers/md/dm.c | |
parent | 5037108acd4dc40c210321cc83b0bf8352eda95a (diff) |
dm: cope with access beyond end of device in dm_merge_bvec
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>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 469cec54f371..ace998ce59f6 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -843,6 +843,8 @@ static int dm_merge_bvec(struct request_queue *q, | |||
843 | goto out; | 843 | goto out; |
844 | 844 | ||
845 | ti = dm_table_find_target(map, bvm->bi_sector); | 845 | ti = dm_table_find_target(map, bvm->bi_sector); |
846 | if (!dm_target_is_valid(ti)) | ||
847 | goto out_table; | ||
846 | 848 | ||
847 | /* | 849 | /* |
848 | * Find maximum amount of I/O that won't need splitting | 850 | * Find maximum amount of I/O that won't need splitting |
@@ -861,6 +863,7 @@ static int dm_merge_bvec(struct request_queue *q, | |||
861 | if (max_size && ti->type->merge) | 863 | if (max_size && ti->type->merge) |
862 | max_size = ti->type->merge(ti, bvm, biovec, max_size); | 864 | max_size = ti->type->merge(ti, bvm, biovec, max_size); |
863 | 865 | ||
866 | out_table: | ||
864 | dm_table_put(map); | 867 | dm_table_put(map); |
865 | 868 | ||
866 | out: | 869 | out: |