summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm.c
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2008-10-01 15:39:17 +0200
committerAlasdair G Kergon <agk@redhat.com>2008-10-01 15:39:17 +0200
commit5037108acd4dc40c210321cc83b0bf8352eda95a (patch)
tree96b8684cd33eaee6dda5f07d598c93de36b1476a /drivers/md/dm.c
parentMerge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/... (diff)
downloadlinux-5037108acd4dc40c210321cc83b0bf8352eda95a.tar.xz
linux-5037108acd4dc40c210321cc83b0bf8352eda95a.zip
dm: always allow one page in dm_merge_bvec
Some callers assume they can always add at least one page to an empty bio, so dm_merge_bvec should not return 0 in this case: 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.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index bca448e11878..469cec54f371 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -837,10 +837,10 @@ static int dm_merge_bvec(struct request_queue *q,
struct dm_table *map = dm_get_table(md);
struct dm_target *ti;
sector_t max_sectors;
- int max_size;
+ int max_size = 0;
if (unlikely(!map))
- return 0;
+ goto out;
ti = dm_table_find_target(map, bvm->bi_sector);
@@ -861,14 +861,15 @@ 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);
+ dm_table_put(map);
+
+out:
/*
* Always allow an entire first page
*/
if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT))
max_size = biovec->bv_len;
- dm_table_put(map);
-
return max_size;
}