mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 22:31:32 +00:00
f14fa693c9
dm-stripe is supposed to ensure that all the space allocated to the stripes is fully used and that all stripes are the same size. This patch fixes the test. It checks that device length is divisible by the chunk size and checks that the resulting quotient is divisible by the number of stripes (which is equivalent to testing if device length is divisible by chunk_size * stripes). Previously, the code only tested that the number of sectors in the target was divisible by each of the chunk size and the number of stripes separately, which could leave entire stripes unused. (A setup that genuinely needs some stripes to be shorter than others can be created by concatenating striped targets.) Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
58 lines
1.8 KiB
Plaintext
58 lines
1.8 KiB
Plaintext
dm-stripe
|
|
=========
|
|
|
|
Device-Mapper's "striped" target is used to create a striped (i.e. RAID-0)
|
|
device across one or more underlying devices. Data is written in "chunks",
|
|
with consecutive chunks rotating among the underlying devices. This can
|
|
potentially provide improved I/O throughput by utilizing several physical
|
|
devices in parallel.
|
|
|
|
Parameters: <num devs> <chunk size> [<dev path> <offset>]+
|
|
<num devs>: Number of underlying devices.
|
|
<chunk size>: Size of each chunk of data. Must be a power-of-2 and at
|
|
least as large as the system's PAGE_SIZE.
|
|
<dev path>: Full pathname to the underlying block-device, or a
|
|
"major:minor" device-number.
|
|
<offset>: Starting sector within the device.
|
|
|
|
One or more underlying devices can be specified. The striped device size must
|
|
be a multiple of the chunk size multiplied by the number of underlying devices.
|
|
|
|
|
|
Example scripts
|
|
===============
|
|
|
|
[[
|
|
#!/usr/bin/perl -w
|
|
# Create a striped device across any number of underlying devices. The device
|
|
# will be called "stripe_dev" and have a chunk-size of 128k.
|
|
|
|
my $chunk_size = 128 * 2;
|
|
my $dev_name = "stripe_dev";
|
|
my $num_devs = @ARGV;
|
|
my @devs = @ARGV;
|
|
my ($min_dev_size, $stripe_dev_size, $i);
|
|
|
|
if (!$num_devs) {
|
|
die("Specify at least one device\n");
|
|
}
|
|
|
|
$min_dev_size = `blockdev --getsize $devs[0]`;
|
|
for ($i = 1; $i < $num_devs; $i++) {
|
|
my $this_size = `blockdev --getsize $devs[$i]`;
|
|
$min_dev_size = ($min_dev_size < $this_size) ?
|
|
$min_dev_size : $this_size;
|
|
}
|
|
|
|
$stripe_dev_size = $min_dev_size * $num_devs;
|
|
$stripe_dev_size -= $stripe_dev_size % ($chunk_size * $num_devs);
|
|
|
|
$table = "0 $stripe_dev_size striped $num_devs $chunk_size";
|
|
for ($i = 0; $i < $num_devs; $i++) {
|
|
$table .= " $devs[$i] 0";
|
|
}
|
|
|
|
`echo $table | dmsetup create $dev_name`;
|
|
]]
|
|
|