Переглянути джерело

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>
Mikulas Patocka 16 роки тому
батько
коміт
5037108acd
1 змінених файлів з 5 додано та 4 видалено
  1. 5 4
      drivers/md/dm.c

+ 5 - 4
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_table *map = dm_get_table(md);
 	struct dm_target *ti;
 	struct dm_target *ti;
 	sector_t max_sectors;
 	sector_t max_sectors;
-	int max_size;
+	int max_size = 0;
 
 
 	if (unlikely(!map))
 	if (unlikely(!map))
-		return 0;
+		goto out;
 
 
 	ti = dm_table_find_target(map, bvm->bi_sector);
 	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)
 	if (max_size && ti->type->merge)
 		max_size = ti->type->merge(ti, bvm, biovec, max_size);
 		max_size = ti->type->merge(ti, bvm, biovec, max_size);
 
 
+	dm_table_put(map);
+
+out:
 	/*
 	/*
 	 * Always allow an entire first page
 	 * Always allow an entire first page
 	 */
 	 */
 	if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT))
 	if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT))
 		max_size = biovec->bv_len;
 		max_size = biovec->bv_len;
 
 
-	dm_table_put(map);
-
 	return max_size;
 	return max_size;
 }
 }