dm stripe: Fix bounds



From: Kevin Corry <kevcorry@xxxxxxxxxx>

The dm-stripe target currently does not enforce that the size of a stripe
device be a multiple of the chunk-size. Under certain conditions, this can
lead to I/O requests going off the end of an underlying device. This
test-case shows one example.

echo "0 100 linear /dev/hdb1 0" | dmsetup create linear0
echo "0 100 linear /dev/hdb1 100" | dmsetup create linear1
echo "0 200 striped 2 32 /dev/mapper/linear0 0 /dev/mapper/linear1 0" | \
dmsetup create stripe0
dd if=/dev/zero of=/dev/mapper/stripe0 bs=1k

This will produce the output:
dd: writing '/dev/mapper/stripe0': Input/output error
97+0 records in
96+0 records out

And in the kernel log will be:
attempt to access beyond end of device
dm-0: rw=0, want=104, limit=100

The patch below will check that the table size is a multiple of the stripe
chunk-size when the table is created, which will prevent the above striped
device from being created.

This should not affect tools like LVM or EVMS, since in all the cases I can
think of, striped devices are always created with the sizes being a multiple
of the chunk-size.

The size of a stripe device must be a multiple of its chunk-size.

Signed-off-by: Kevin Corry <kevcorry@xxxxxxxxxx>
Signed-Off-By: Alasdair G Kergon <agk@xxxxxxxxxx>

dm-stripe.c | 6 ++++++
1 file changed, 6 insertions(+)

Index: linux-2.6.16-rc5/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6.16-rc5.orig/drivers/md/dm-stripe.c 2006-03-14 18:25:38.000000000 +0000
+++ linux-2.6.16-rc5/drivers/md/dm-stripe.c 2006-03-15 17:56:37.000000000 +0000
@@ -103,9 +103,15 @@ static int stripe_ctr(struct dm_target *
return -EINVAL;
}

+ if (((uint32_t)ti->len) & (chunk_size - 1)) {
+ ti->error = "dm-stripe: Target length not divisible by "
+ "chunk size";
+ return -EINVAL;
+ }
+
width = ti->len;
if (sector_div(width, stripes)) {
- ti->error = "dm-stripe: Target length not divisable by "
+ ti->error = "dm-stripe: Target length not divisible by "
"number of stripes";
return -EINVAL;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • Re: Block Size
    ... glean some usefull information from the Stripe ... significant sequentiality and a fair degree of burdstiness. ... and then make some tradeoffs in situations where multiple Io patterns are ... spindle, aided by automatic prefetching. ...
    (microsoft.public.exchange.setup)
  • Re: RAID and Partition
    ... >A relatively large multiple of 4K. ... >> any recommendations as to the stripe size to use for the RAID 10 set? ... When an IO request larger than the allocation ... >>> unit size hits the file system driver, ...
    (microsoft.public.exchange.design)
  • Re: Gvinum RAID5 performance
    ... >> a single request, ... should preferably be a multiple of the ufs block size, ... > It seems we are holding back all requests to a currently active stripe, ... > about to be overwritten), and the old parity, and recalculate the parity ...
    (freebsd-current)
  • Re: mklv coredump
    ... The problem turned out to be using the UpperBound with stripe size. ... Man page says upperbound should be a multiple of stripe size. ... error message would have been helpfule. ...
    (AIX-L)
  • Re: dm stripe: Fix bounds
    ... The dmraid utility previously would correctly configure dm to access the device and now dmraid fails to configure the dm table because this patch rejects it. ... The dm-stripe target currently does not enforce that the size of a stripe device be a multiple of the chunk-size. ... The patch below will check that the table size is a multiple of the stripe chunk-size when the table is created, which will prevent the above striped device from being created. ...
    (Linux-Kernel)