dm: always allow one page in dm_merge_bvec
authorMikulas Patocka <mpatocka@redhat.com>
Wed, 1 Oct 2008 13:39:17 +0000 (14:39 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Wed, 1 Oct 2008 13:39:17 +0000 (14:39 +0100)
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>
drivers/md/dm.c

index bca448e118786a78a5e07b54f3cb3a7e3aca85d5..469cec54f371eb0a1f9b23cbbb98b3313ded60c1 100644 (file)
@@ -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;
 }