Skip to content
/ linux Public

Commit ed36f6a

Browse files
Matt WhitlockSasha Levin
authored andcommitted
dm-unstripe: fix mapping bug when there are multiple targets in a table
[ Upstream commit 83c10e8 ] The "unstriped" device-mapper target incorrectly calculates the sector offset on the mapped device when the target's origin is not zero. Take for example this hypothetical concatenation of the members of a two-disk RAID0: linearized: 0 2097152 unstriped 2 128 0 /dev/md/raid0 0 linearized: 2097152 2097152 unstriped 2 128 1 /dev/md/raid0 0 The intent in this example is to create a single device named /dev/mapper/linearized that comprises all of the chunks of the first disk of the RAID0 set, followed by all of the chunks of the second disk of the RAID0 set. This fails because dm-unstripe.c's map_to_core function does its computations based on the sector number within the mapper device rather than the sector number within the target. The bug turns invisible when the target's origin is at sector zero of the mapper device, as is the common case. In the example above, however, what happens is that the first half of the mapper device gets mapped correctly to the first disk of the RAID0, but the second half of the mapper device gets mapped past the end of the RAID0 device, and accesses to any of those sectors return errors. Signed-off-by: Matt Whitlock <kernel@mattwhitlock.name> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Cc: stable@vger.kernel.org Fixes: 18a5bf2 ("dm: add unstriped target") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent fb49f20 commit ed36f6a

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/md/dm-unstripe.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ static void unstripe_dtr(struct dm_target *ti)
117117
static sector_t map_to_core(struct dm_target *ti, struct bio *bio)
118118
{
119119
struct unstripe_c *uc = ti->private;
120-
sector_t sector = bio->bi_iter.bi_sector;
120+
sector_t sector = dm_target_offset(ti, bio->bi_iter.bi_sector);
121121
sector_t tmp_sector = sector;
122122

123123
/* Shift us up to the right "row" on the stripe */

0 commit comments

Comments
 (0)